Servis Motor İçleri PagedAtention, Sürekli Batching, parçalanmış Prefill
code/main.pyProgramlar vLLM'nin yaptığı gibi önceden doldurulur ve çözülür.Type: Learn
Languages: Python (stdlib, toy continuous batching scheduler)
Prerequisites: Phase 17 · 01 (Model Serving), Phase 11 (LLM Engineering)
Time: ~75 minutes
Öğrenme Hedefleri
- PagedAttention'u KV önbelleği tahsiscisi olarak açıklayın: bloklar, blok tabloları ve neden parçalanma üretim yükünde% 4'ten düşük kalır.
- İterasyon düzeyinde sürekli serileme diyalogu: bitmiş dizilerin seriyi nasıl terk ettiğini ve yeni dizilerin boşaltılmadan nasıl birleştiğini gösterir.
- Bir cümlede parçalanmış prefill'i tanımlayın ve hangi gecikme metrikini koruduğunu belirtin (söyleme: TTFT kuyruk, geçiş anlamına gelmez).
- Her optimizasyonu bir anda etkinleştirmeden önce, vLLM özellik kombinasyonunu sürümünüz için uyumluluk matrisine karşı kontrol edin.
Sorun
Saf bir PyTorch servis döngüsü bir seferde bir istek çalışır: tokenize, prefill, EOS'a kadar dekode, geri. Bir kullanıcı için bu işe yarıyor. Yüzde, sabırlı insanların bir kuyrukları. Açıkça görülen düzeltme statik parti her talebi penceredeki en uzun çağrısına, her dekodunu en uzun beklenen çıkışa kapatır ve tüm partiyi en yavaş dizide durdurur. Hiç kullanmadığın dolgu için para ödüyorsun ve hızlı talepler yavaş talepler için bekliyor.
VLLM üç sorunu bir anda çözer. PagedAttention, KV önbelleğinin parçalanmasını, klasik bir arada tahsis edilme gibi GPU belleğinin %60-80'ini tüketmekten alıkoyar. Sürekli serileme, isteklerin her dekodlama iterasyonu arasında bir araya gelmesine ve partiyi terk etmesine izin verir, bu nedenle parti her zaman gerçek işle dolu olur. Parça dolandırıcılığı, 32k işaretli bir işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli işaretli olarak bölgeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeyeye
2026 üretim standartı üçü de çalıştırılmış. Her birinin ne yaptığını anlamalısınız çünkü başarısızlık modları tümüyle planlamacıda, modelde değil.
Anlaşım
PagedAttention sanal bellek sistemi olarak
KV önbelleği .num_layers × 2 × num_heads × head_dim × seq_len × bytes_per_elementLlama 3.3 70B için 8192 token, yani BF16'da yaklaşık 1.25 GB bir dizi. Eğer her talebe 8192 slot önceden rezervasyon yaparsanız ancak ortalama talebe sadece 1500 token kullanırsanız, rezervasyon yaptığınız HBM'nin yaklaşık %82'ini harcıyorsunuz. Klasik parti bu harcamaları öder.
PagedAttention, bu fikri OS sanal bellekinden ödünç alır. KV önbelleği dizi başına bitişik değildir. Sıkı boyutlu bloklara (öntemli 16 token) tahsis edilir. Her dizi, mantıklı token konumlarını fiziksel blok kimliklerine harcayacak bir blok tablosuna sahiptir. Bir dizi tahsis edilen blokların ötesinde büyüdüğünde, bir blok daha eklenir. Bitirdiğinde, blokları havuza geri döner.
Fragmentasyon %60-80%'den (klasik) %4'ten (PagedAttention) aşağıya düşüyor.--gpu-memory-utilization(devay 0.9), vLLM'ye yükleme ağırlıkları ve etkinleştirmelerinden sonra KV blokları için ne kadar HBM rezervasyonu yapması gerektiğini söyler.
Sürekli iterasyon düzeyinde serileme
Eski "dinamik parti" bir parti doldurmak için bir pencereyi (deyelim 10 ms) bekledi, sonra her dizisi bitene kadar önceden doldur + dekode + dekode + dekode çalıştı.
Her dekodlama aşamasında sürekli seri çalışması yürütülür.RUNNINGlistesi. her iterasyonda:
- Herhangi bir sırada .
RUNNINGEOS'u vurmak veya max_tokens kaldırılır. - Programlayıcı bekleme sırasına bakıyor. Eğer ücretsiz KV blokları varsa, yeni diziler kabul eder (öncelme veya yeniden başlatılır).
- Ön geçit şimdi ne varsa üzerinde geçer .
RUNNING, her sekvense yeni bir token gönderir.
İsteğe bağlı olarak, bir seri seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, bir seri olarak, 2026 vLLM olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir dizi olarak, bir olarak, bir olarak, bir olarak,V1 schedulerAnahtar değişmezliği: programlayıcı, her dekodlama iterasyonunda bir kez çalıştırılır, istek için değil.
Parçalama prefill TTFT kuyruğunu korur
Prefill hesaplama bağlıdır. Llama 3.3 70B'de 32k-token istek bir H100'de ~800 ms saf prefill alır. Prefill çalışırken, seri bekleyen diğer her dizi için tokenleri çözün. Bir servis döngüsünde, bir uzun istek için ilk token gecikmesi (TTFT) onlarca diğer kullanıcı için inter-token gecikme (ITL) blip olur.
Çüklü prefill, sabit boyutlu parçalara bölünür (devay 512 token) ve her parçayı bir birim olarak programlar. Çükler arasında programlayıcı dekod dizilerini bir token ile ileriye atabilir. Yayınlanan referanslarda çok daha düşük dekod zaman jitter için küçük mutlak prefill latency hit (bir parça başına birkaç ms) değiştirirsiniz.
Üç defalarca etkileşime giren
Tüm üç özellik birbirini kabul eder. PagedAttention programcıya ticaret için ince tohumlu bir KV kaynağı verir. Sürekli serileme bu ince tohumlu kaynağa ihtiyaç duyar, bu nedenle yeni bir dizini kabul etmek küresel bir yeniden düzenleme zorlamaz.RUNNINGlist bu bir programcı politika daha, ayrı bir sistem değil.
Her bayrağı bilmenize gerek yok.Sedülerin neyi optimize ettiğini bilmelisiniz: KV blok bütçesine uygun, parçalara ayırılmış prefill slicing'e tabi.
Uygunluk matrisini kontrol edin
Her özellik kombinasyonunu vLLM sürümünüz için uyumluluk matrisine karşı kontrol edin, çünkü tümünü bir anda etkinleştirmeden önce, yayınlar arasında değişiklikler yapılır. V0.18.0'da özellik matrisi spekülasyonsal çözümü parçalara ayık prefill ve prefix önbelleği ile uyumlu olarak işaretler ve spekülasyonsal çözümü sayfasında bilinen iki uyumsuzluk listesi bulunur: v0.15.0'den yoluyla boru paralelliği ve v0.10.0'dan yoluyla taslak model spekülasyonu. Özetleme yönteminin kendisi için, 2026'da belirlenmiş durum genellikle EAGLE-3 ("method": "eagle3"), 17 · 05. aşamada kapsamlıdır.
Hatırlamalısın numaralar
- Llama 3.3 70B FP8, H100 SXM5, 128 eşzamanlı, üçü de: 2.200-2.400 tok/s.
- Aynı model, varsayılan vLLM (çıkılmış ön doldurma yok): ~1,800 tok/s.
- Aynı model, saf PyTorch ileri döngüsü: ~600 tok/s.
- KV parçalanması atıkları: %4
- Karışık yük altında P99 ITL: ~ 15 ms parçalı prefill ile, ~ 50 ms olmadan.
Programcı nasıl görünüyor?
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 callcode/main.pyStdlib Python'da sahte token sayıları ve sahte ileri gecikme ile aynı döngüdür.
Kullan
code/main.pyvLLM tarzı bir programcı simüle eder.
NAIVEMod: Tek seferde bir talep, serileme yapılmıyor.STATICMod: bekleme ve bekleme, klasik parti.CONTINUOUSMod: İterasyon düzeyinde kabul ve serbest bırakma.CONTINUOUS + CHUNKEDMod: Decode ile birbirine karışmış prefill parçalar.
Çıktı toplam geçiş (virtual saniyede tokenler), TTFT ortalaması ve P99 ITL gösterir.CONTINUOUS + CHUNKEDsıra karışık trafikte baskın olmalıdır.
Gönder
Bu ders bize çok yararlı .outputs/skill-vllm-scheduler-reader.md. Bir servis yapılandırmasını (batch boyutu, KV bellek kullanımı, parçalanmış prefill boyutu, spekülatör yapılandırması) göz önüne alındığında, üç standarttan hangisinin şişek boynuzlu olduğunu ve hangi ayarlanacağını belirleyen bir planlamacı teşhisini üretir.
Egzersizler
- Çık .
code/main.py- Ben de .STATIC- ...CONTINUOUSPrefill verimliliği, dekode verimliliği veya kuyruğu gecikmeliliği ile birlikte, geçiş boşluğu nereden geliyor? - Eklemek için oyuncak programlayıcısını değiştir
--max-num-batched-tokensLlama 3.3 70B FP8 çalışan bir H100 için doğru değer nedir? (İpucu: KV blok boyutunun ve serbest blokların sayısının, ham HBM değil, fonksiyonu.) - VLLM v0.18.0'un açıklama notlarını tekrar okuyun. Hangi bayrak kombinasyonları karşılıklı dışı?
- KV önbelleği parçalanma atıklarını, ortalama 1.500 çıkış tokeni, std 600 tokeni ile 1000 talebinin izini hesaplayın, a) talep başına 8192 maksimum, b) 16 token bloklu PagedAttention altında.
- Bir paragrafda, parçalanmış prefill'in neden P99 ITL'ye yardımcı olduğunu, ancak özelleştirilmiş olarak üretimi yapmadığını açıklayın.
Anahtar Terimler
| Term | What people say | What 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 |
Daha Fazla Okumak
- vLLM documentation — Speculative Decoding parçalı prefill ve spekülatör dekodlama uyumluluğu hakkında resmi kaynak.
- vLLM Release Notes (NVIDIA) 2026'da yayın cadence ve sürüm spesifik davranış.
- vLLM Blog — PagedAttention hala tahsisci hakkında nasıl düşünüleceğini belirleyen orijinal yazısı.
- PagedAttention paper (arXiv:2309.06180) parçalanma analizi ve programlayıcı tasarımı.
- Aleksa Gordic — Inside vLLM V1 programlayıcısı, alev grafikleriyle ayrıntılı bir şekilde yürüyüşe devam ediyor.
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.