Chunked Prefill
Parçalı ön doldurma, uzun istemleri diğer isteklerin kod çözme işlemleriyle dönüşümlü olarak işlenen belirteç parçalarına böler; böylece tek bir uzun istem kuyruğun geri kalanını engellemez.
Parçalı ön doldurma, uzun bir girdi istemini daha küçük belirteç gruplarına bölüp birkaç adımda işleyen ve bu adımları diğer isteklerin belirteç üretimi ile harmanlayan bir model sunma tekniğidir. Bu özellik olmadan, uzun bir istemi kabul eden bir çıkarım motoru bir adımın tamamını bu isteme ayırır ve diğer kullanıcılara aktarılmakta olan tüm yanıtlar işlem bitene kadar duraklar. 2023'te yayımlanan SARATHI makalesi parçalı ön doldurmayı tanıttı; devamındaki Sarathi-Serve çalışması bunun üzerine "duraksamasız" zamanlama kurdu. DeepSpeed-FastGen'in Dynamic SplitFuse özelliği de aynı fikri kullanır. Parçalı ön doldurma artık vLLM'de varsayılan olarak açıktır ve birçok açık ağırlıklı büyük dil modeline (LLM) hizmet veren motorlar olan SGLang ve TensorRT-LLM'de kullanılabilir.
Ön Doldurma, Çözümleme ve Üretim Duraklamaları#
Otokendil modeli Transformer çıkarımının iki aşaması vardır:
- Ön doldurma: Model, istemdeki her belirteci paralel olarak işler, anahtarlarını ve değerlerini hesaplar ve bunları KV önbelleğinde saklar. Ön doldurma, okunan ağırlık baytı başına çok sayıda işlem yapar; bu nedenle genellikle işlem gücüyle sınırlıdır.
- Çözümleme: Model her istek için her adımda bir belirteç üretir ve her seferinde önbelleğin tamamını okur. Çözümleme, okunan bayt başına az hesaplama yapar; bu nedenle genellikle bellek bant genişliğiyle sınırlıdır.
20.000 belirteçlik ön doldurma içeren bir GPU adımı, çözümleme adımından çok daha uzun sürer; bu yüzden toplu işteki her istek bekler. Sarathi-Serve bu duraklamaları üretim duraklamaları olarak adlandırır. Bu duraklamalar, kendi istemleri kısa olan kullanıcıların belirteçler arası gecikmesinde ani artışlar olarak görülür.
Parçalı Ön Doldurma Nasıl Çalışır#
Zamanlayıcı her adım için bir belirteç bütçesi belirler; vLLM'de bu bütçe max_num_batched_tokens ile ayarlanır. Önce sürmekte olan her çözümleme işlemine bir belirteç ekler, ardından kalan bütçeyi bekleyen istemlerin parçalarıyla doldurur. Sığmayan bir istem sonraki adımda devam eder; tüm istem işlenip çözümleme başlayana kadar KV önbelleği parça parça genişler. İki aşamanın tek adımda harmanlanması GPU'nun kullanımını da iyileştirir; çünkü çözümleme işlemlerinin boş bıraktığı hesaplama kapasitesini ön doldurma parçaları doldurabilir:
Parçalara ayırma yalnızca istem belirteçlerinin ne zaman işlendiğini değiştirir. Her parça, nedensel bir maske altında, kendisinden önceki tüm parçaların ve kendi belirteçlerinin önbelleğe alınmış anahtar ve değerlerine dikkat eder; bu nedenle sonuç tek geçişli ön doldurmayla aynıdır. PyTorch içindeki bir dikkat katmanı bunu gösterir:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
prompt_len, chunk = 1000, 256
q, k, v = torch.randn(3, 1, 8, prompt_len, 64).unbind(0) # one layer: 8 heads, 64 dims each
# One-shot prefill: all prompt tokens attend causally in a single pass
full = F.scaled_dot_product_attention(q, k, v, is_causal=True)
# Chunked prefill: each chunk attends to the cached keys and values of earlier chunks plus itself
outputs = []
for start in range(0, prompt_len, chunk):
end = min(start + chunk, prompt_len)
mask = torch.ones(end - start, end, dtype=torch.bool).tril(diagonal=start) # causal over absolute positions
q_chunk, k_cached, v_cached = q[..., start:end, :], k[..., :end, :], v[..., :end, :]
outputs.append(F.scaled_dot_product_attention(q_chunk, k_cached, v_cached, attn_mask=mask))
chunked = torch.cat(outputs, dim=2)
print(f"{len(outputs)} chunks, same result as one pass: {torch.allclose(full, chunked, atol=1e-5)}")4 chunks, same result as one pass: True çıktısını verir: 1.000 belirteçlik istem 256, 256, 256 ve 232 belirteçlik parçalara bölünerek işlenir ve çıktılar tek geçişli işlemle eşleşir.
İlişkili Sunum Teknikleri#
- Sürekli toplu işleme: Tüm toplu işin tamamlanmasını beklemek yerine her adımda istek ekler ve çıkarır. Parçalı ön doldurma, bu döngü içinde uzun istemlerin zamanlanmasını sağlar.
- PagedAttention: KV önbelleğini sabit boyutlu sayfalarda saklar; böylece birkaç adıma yayılan ön doldurma sırasında istemin önbelleği, baştan tam uzunluğu için bellek ayırmadan büyüyebilir.
- İstem önbelleğe alma: Tekrarlanan bir istem önekinin önbelleğe alınmış anahtar ve değerlerini yeniden kullanır; böylece o bölüm için ön doldurma tamamen ortadan kalkar.
- Ayrıştırılmış ön doldurma ve çözümleme: İki aşamayı ayrı GPU havuzlarında çalıştırır ve KV önbelleğini aralarında aktarır; böylece her havuz kendi darboğazına göre ölçeklenip ayarlanabilir.
- Spekülatif çözümleme: Birden fazla belirteğin taslağını oluşturup bunları tek geçişte doğrulayarak çözümleme aşamasını hızlandırır.
Uygulamalar#
Parçalı ön doldurma, uzun ve kısa istemlerin aynı sunucuyu paylaştığı ortamlarda en çok fayda sağlar. Bağlam penceresini 50 sayfalık bir raporla dolduran bir geri getirimle zenginleştirilmiş üretim (RAG) asistanı, diğer kullanıcıların sohbetleri akmaya devam ederken raporu parçalar hâlinde önceden işleyebilir. Görüntü-dil modelleri (VLM) her isteme yüzlerce veya binlerce görüntü belirteci ekler; dolayısıyla açıklama için kare gönderen kamera işlem hatları tam da bu karışımı üretir. Ultralytics LLM arayüzü, kendi sunucunda barındırılan vLLM sunucusu da dâhil olmak üzere OpenAI ile uyumlu tüm uç noktalara metin ve görüntü gönderir. Burada karelerde insan algılayan bir YOLO26 işlem hattının bu kareleri açıklatma istekleri, diğer kullanıcıların trafiğiyle birlikte parçalar hâlinde önceden işlenir.
Belirteç Bütçesini Ayarlama#
Bütçe, iki gecikme ölçütü arasında ödünleşim yaratır. Küçük bütçe, her adımda ön doldurmaya az yer bırakır; bu, akış kullananların belirteçler arası gecikmesini düşük tutarken yeni istemlerin ilk belirtece ulaşma süresini uzatır. Büyük bütçe bunun tersini yapar. Uzun bir istemin sonraki her parçası, önceki parçaların büyüyen KV önbelleğini de yeniden okur; dolayısıyla çok küçük parçalar bellek trafiğini artırır. Operatörler bütçeyi gerçekçi istem uzunluklarında medyan ve kuyruk çıkarım gecikmesi, ilk belirtece ulaşma süresi ve iş hacmine göre ayarlar. vLLM optimizasyon kılavuzu, belirteçler arası gecikmeye öncelik veren bir bütçe olarak 2.048 belirteci belirtir ve büyük GPU'larda küçük modellerle en yüksek iş hacmi için 8.192'den fazla belirteç önerir.










