Phase 17: Infrastructure & Production

سرویس داخلی موتور صفحه توجه، دسته بندی مداوم، پر کردن پیش از قطعه

تولید موتورهای خدمتگری مدرن بر سه اشتباهات مخلوط، نه یک ترفند، تکیه می کند. "پاگاد اتاشن" هميشه فعاله دسته بندی مداوم درخواست های جدید را در دسته فعال بین تکرار های رمزگذاری تزریق می کند. قطعات پر کردن از قبل قطعات طولانی به عنوان نشان دهنده های رمزگذاری هرگز گرسنگی. تمام سه را روشن کنید و Llama 3.3 70B FP8 در یک H100 SXM5 2,200-2,400 توک / ثانیه را در 128 همزمان فشار می دهد حدود 25٪ بالاتر از پیش فرض vLLM و 3-4x یک حلقه PyTorch ساده. این درس برنامه ریزی کننده و هسته توجه vLLM را می خواند موتور مرجع برای سه تکنیک در سطح شما می توانید نمودار را ببینید، و با یک بازی مداوم دسته بندی در code/main.pyکه برنامه ها مثل vLLM قبل از پر کردن و رمزگذاری کردنش رو انجام میده

Type: Learn

Languages: Python (stdlib, toy continuous batching scheduler)

Prerequisites: Phase 17 · 01 (Model Serving), Phase 11 (LLM Engineering)

Time: ~75 minutes

اهداف یادگیری

  • PagedAttention را به عنوان یک توزیع کننده حافظه کش KV توضیح دهید: بلوک ها، جدول های بلوک و اینکه چرا شکاف در بار تولید کمتر از 4٪ باقی می ماند.
  • نمودار دسته بندی مداوم در سطح تکرار: چگونه دنباله های نهایی دسته را ترک می کنند و جدید بدون تخلیه به هم می پیوندند.
  • پیش پر کردن قطعه ای را در یک جمله و نامگذاری کنید که کدام متریک تاخیر را محافظت می کند (توصیه: این دم TTFT است، نه متوسط تولید).
  • قبل از فعال کردن هر بهینه سازی یکبار، ترکیبی از ویژگی های vLLM را با ماتریس سازگاری برای نسخه خود بررسی کنید.

مشکل

یک حلقه خدمت ساده PyTorch یک درخواست را در یک زمان اجرا می کند: توکن سازی، پیش پر کردن، رمزگذاری تا EOS، بازگشت. در یک کاربر این کار می کند. در صدتا، این یک صف از افراد صبر است. درست کردن واضح بسته بندی ثابت هر درخواست را به طولانی ترین پرامپت در پنجره، هر کد را به طولانی ترین خروجی انتظار می رود، و تمام دسته را در آهسته ترین ترتیب متوقف می کند. شما برای پوشیدن که هرگز استفاده نمی کنید پول می پردازید و درخواست های سریع منتظر درخواست های آهسته هستند.

vLLM سه مشکل را به یکباره حل می کند. PagedAttention مانع از شکاف کش KV می شود تا 60-80% حافظه GPU را به همان شیوه ای که اختصاصی متصل کلاسیک انجام می دهد. دسته بندی مداوم اجازه می دهد تا درخواست ها بین هر تکرار رمزگذاری دسته را به هم پیوسته و ترک کنند، بنابراین دسته همیشه پر از کار واقعی است. پر کردن پیش از قطعه ای یک پرامپت 32k-توکن را به ~512 توکن تقسیم می کند که با رمزگذاری متقابل هستند، بنابراین یک پرامپت طولانی هر رمز رمزگذاری در GPU را منجمد نمی کند.

در سال 2026 تولید پیش فرض سه مورد فعال شده است. شما باید بفهمید هر یک از آنها چه می کند چون حالت های شکست همه در برنامه ریزی کننده هستند، نه مدل.

مفهوم

PagedAttention به عنوان یک سیستم حافظه مجازی

یک KV cache استnum_layers × 2 × num_heads × head_dim × seq_len × bytes_per_elementدر هر ترتیب. برای Llama 3.3 70B در 8192 توکن، که تقریبا 1.25 GB در هر ترتیب در BF16 است. اگر شما از قبل 8192 اسلات برای هر درخواست اما در میانگین درخواست تنها از 1500 توکن استفاده می کند، شما تقریبا 82% از HBM شما را ذخیره می کنید.

PagedAttention ایده را از حافظه مجازی OS قرض می گیرد. کیش KV در هر ردیف متصل نیست. آن را در بلوک های اندازه ثابت (توکن 16 پیش فرض) اختصاص داده می شود. هر ردیف دارای یک جدول بلوک است که موقعیت توکن منطقی خود را به شناسه های بلوک فیزیکی نقشه می زند. هنگامی که یک ردیف از بلوک های اختصاص یافته خود فراتر می رود، یک بلوک بیشتر اضافه می شود. هنگامی که آن را به پایان می رساند، بلوک های آن به پول باز می گردند.

فراقتی از 60-80% (کلاسیکی) به کمتر از 4% (PagedAttention) کاهش می یابد. شما نمی توانید PagedAttention را با پرچم فعال کنید این تنها توزیع کننده کشتی vLLM است. دکمه --gpu-memory-utilization(پیش فرض 0.9) که به vLLM می گوید HBM چقدر برای بلوک های KV پس از بارگذاری وزنه ها و فعال سازی ها ذخیره کند.

دسته بندی مداوم در سطح تکرار

"بخش های پویا" قدیمی منتظر پنجره ای (بگو 10 ms) برای پر کردن یک دسته بودند، سپس پیش از پر کردن + رمزگذاری + رمزگذاری + رمزگذاری + رمزگذاری تا زمانی که هر ردیف تکمیل شد. ردیف های سریع زود ترک کردند و بیکار ماندند در حالی که GPU به سرعت آنها را تمام کرد.

دسته بندی مداوم بین هر مرحله رمزگذاری عمل می کند. مجموعه ی دنباله های اجرا را RUNNINGدر هر تکرار:

  1. هر دنباله ای درRUNNINGکه فقط EOS را ضربه زد یا max_tokens حذف شد.
  2. برنامه نویس به صف انتظار نگاه می کند. اگر بلوک های KV رایگان وجود داشته باشد، دنباله های جدید (پیش از پر کردن یا شروع مجدد) را پذیرفته است.
  3. . گذرگاه جلو به هر چيزي که الان داره ميادRUNNING، به هر تثليثي يه رمز جديد صادر ميکنه

اندازه دسته هرگز به یک عدد ثابت پوشیده نمی شود. دنباله های در موقعیت های مختلف در خروجی خود به اشتراک می گذارند یک مخلوط به جلو. در vLLM 2026 این به نام V1 scheduler. غیر متغیر کلید: برنامه ریزی کننده یک بار در هر تکرار رمزگذاری اجرا می شود، نه یک بار در هر درخواست.

پر کردن پیش از قطعه ای از دم TTFT محافظت می کند

Prefill محدود به محاسبه است. یک پیام 32k-token در Llama 3.3 70B حدود 800 ms از prefill خالص را در یک H100 مصرف می کند. در حالی که prefill اجرا می شود، توکن ها را برای هر ردیف دیگر در دسته انتظار کنید. در یک حلقه ارائه، تاخیر اولین توکن (TTFT) یک پیام طولانی به بین دوجن دیگر کاربران تبدیل می شود.

از این رو، برنامه ریزی کننده می تواند ردیف های رمزگذاری را با یک رمز عبور کند. شما یک ضربه تاخیر کامل کامل پیش از تکمیل (چند ms در هر قطعه) را برای یک jitter زمان رمزگذاری بسیار پایین تر معامله می کنید. P99 ITL تحت بار مخلوط از ~ 50 ms به ~ 15 ms در معیار های منتشر شده کاهش می یابد.

سه حالت پیش فرض با هم تعامل دارند

همه سه ویژگی همدیگر را فرض می کنند. PagedAttention به برنامه نویس یک منبع KV ذره ای را برای تجارت با. دسته بندی مداوم نیاز به این منبع ذره ای دارد بنابراین پذیرش یک ردیف جدید مجبور به تغییر جهانی نمی کند. پیشکش پاره شده یک تصمیم است که برنامه نویس در همان مورد می گیرد.RUNNINGاین یک سیاست برنامه ریزی کننده دیگر است، نه یک سیستم جداگانه.

شما نیازی به دانستن هر پرچم ندارید، شما باید بدانید که برنامه نویس چه چیزی را بهینه می کند: مقدار خوبی در زیر بودجه بلاک KV، تحت پوشش قطعات پیش از پر کردن.

ماتریس سازگاری را بررسی کنید

هر ترکیب ویژگی را با ماتریس سازگاری برای نسخه vLLM دقیق خود بررسی کنید قبل از فعال کردن همه آنها به یکباره، زیرا آنچه که بین نسخه ها تغییر می کند. در v0.18.0 ماتریس ویژگی ها، رمزنگاریات حدس زدنی را با ذخیره سازی پیشپوش و پیشپوشه های قطعی سازگار می کند و صفحه رمزنگاریات حدس زدنی دو ناسازگاری شناخته شده را فهرست می کند: موازی خط لوله از طریق v0.15.0 و حدس زدنی مدل طرح از طریق v0.10.0. برای خود طرح روش، پیش فرض 2026 اغلب EAGLE-3 ("method": "eagle3") که در مرحله 17 · 05 پوشش داده می شود.

شماره هایی که باید به یاد داشته باشی

  • Llama 3.3 70B FP8، H100 SXM5، 128 همزمان، همه سه تا: 2,200-2,400 توک/س.
  • همان مدل، vLLM پیش فرض (هیچ پر کردن قطعه ای): ~1,800 توک/ ثانیه.
  • همون مدل، ساده پيترچ جلو: ~600 توک/س
  • زباله های فرگنتاسیون KV تحت PagedAttention در بار تولید: <4%.
  • P99 ITL تحت بار مخلوط: ~15 ms با پر کردن مقدم، ~50 ms بدون.

برنامه ریزی کننده چه شکلی است

while True:
    finished = [s for s in RUNNING if s.is_done()]
    for s in finished: release_blocks(s); RUNNING.remove(s)

    while WAITING and have_free_blocks_for(WAITING[0]):
        s = WAITING.pop(0)
        allocate_initial_blocks(s)
        RUNNING.append(s)

    # schedule prefill chunks + decode in one batch
    batch = []
    for s in RUNNING:
        if s.in_prefill:
            batch.append(next_prefill_chunk(s))   # e.g. 512 tokens
        else:
            batch.append(decode_one_token(s))     # 1 token

    run_forward(batch)                            # one fused GPU call

code/main.pyاین دقیقاً این حلقه در stdlib Python با شمارش توکن های جعلی و تاخیر پیشروی جعلی است. اجرا آن نشان می دهد که چگونه prefill شکسته در طول یک prefill طولانی دنباله های رمزگذاری زنده نگه می دارد.

ازش استفاده کن

code/main.pyیک برنامه نویس سبک vLLM با ویژگی های قابل تغییر را شبیه سازی می کند. آن را اجرا کنید تا ببینید:

  • NAIVEحالت: یک درخواست در یک زمان، هیچ دسته بندی.
  • STATICحالت: پاد و منتظر، دسته بندی کلاسیک
  • CONTINUOUSحالت: پذیرش و انتشار در سطح تکرار.
  • CONTINUOUS + CHUNKEDحالت: شقایق پیش از پر کردن با کد گذاری متقابل.

تولید تولید تولید کل (توکین ها در هر ثانیه مجازی) ، متوسط TTFT و P99 ITL را نشان می دهد. CONTINUOUS + CHUNKEDقطار باید در ترافیک مخلوط غالب باشد.

-باده

این درس به ما کمک می کندoutputs/skill-vllm-scheduler-reader.md. با توجه به یک پیکربندی (حجم دسته، استفاده از حافظه KV، اندازه پر کردن پیش از بسته، پیکربندی حدس زده) ، این یک تشخیص برنامه ریزی کننده را تولید می کند که نام هایی را از سه معیاری است که گلو شکنی و چه چیزی را تنظیم می کند.

تمرینات

  1. فرار کنcode/main.py. مقایسه کنیدSTATICبهCONTINUOUSدر یک بار کاری با درخواست های کوتاه و طولانی مخلوط. شکاف تولید از بهره وری پیش از پر کردن، بهره وری رمزگذاری یا تاخیر دم کجا می آید؟
  2. برنامه ریزی بازی را تغییر دهید تا اضافه کنید--max-num-batched-tokens. ارزش صحیح برای H100 با Llama 3.3 70B FP8 چیست؟ (توصیه: این یک تابع از اندازه بلوک KV و تعداد بلوک های آزاد است، نه HBM خام.)
  3. نوتیس های انتشار vLLM v0.18.0 را دوباره بخوانید. کدام ترکیب های پرچم ها متقابل است؟ آنها را لیست کنید.
  4. تخلفات شکاف کش KV را برای یک ردیابی از 1000 درخواست با متوسط 1500 توکن خروجی، std 600 توکن محاسبه کنید، تحت (a) تخصیص متناظر هر درخواست در 8192 حداکثر، (b) PagedAttention با بلوک های 16 توکن.
  5. در یک پاراگراف توضیح دهید که چرا پر کردن پیش از قطعه به P99 ITL کمک می کند اما در حالت جداگانه تولید نمی کند.

اصطلاحات کلیدی

TermWhat people sayWhat it actually means
PagedAttention"the KV trick"Fixed-size block allocator for KV cache; fragmentation <4%
Block table"the page table"Per-sequence map from logical token position to physical KV block
Continuous batching"dynamic batching, but right"Admit/release decisions made every decode iteration
Chunked prefill"prefill splitting"Break long prefill into 512-token slices interleaved with decode
TTFT"first token time"Prefill + queue + network; dominated by prefill at long prompts
ITL"inter-token latency"Time between consecutive decode tokens; dominated by batch size
Goodput"throughput that meets SLO"Tokens/sec where every request still hit TTFT and ITL targets
V1 scheduler"the new scheduler"vLLM's 2026 scheduler; runs continuous batching with chunked prefill
--gpu-memory-utilization"the memory knob"Fraction of HBM reserved for KV blocks after weights and activations

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.