Bloga dön

Masaüstünde 128k bağlam bir yalan. KV önbelleği onu yedi.

22 Eylül 2026

Yerel model kartlarının hepsi artık 128k pencereyle övünüyor. Masaüstünde bu sayı, RAM’inizin okumadan imzaladığı bir kira sözleşmesidir. Uzun bir belgeyi ne kadar ileri itebileceğinize karar veren şey ağırlıklar değil — KV önbelleğidir, ve bağlamla birlikte, başkasının para birimiyle pazarlık edilmiş bir vergi gibi ölçeklenir.

Bağlam penceresi açıp kapattığınız bir özellik değildir. Sunucu her çalıştığı saniye ödediğiniz bir bellek kirasıdır.

128k bağlam gerçekte ne kadar RAM kullanır?

Aritmetik herkese açık ve kısa. Transformer Inference Arithmetic yazısının açıkladığı gibi, KV önbelleği her katman, her KV kafası, her token için iki tensör tutar — key ve value:

cache_bytes = 2 × katman × bağlam × kv_kafası × head_dim × eleman_başı_bayt

Llama 3.1 8B’yi alın: 32 katman, 8 KV kafası, head_dim 128 — doğrudan Hugging Face üzerindeki config.json dosyasından. fp16’da (2 bayt) 131.072 token’da:

2 × 32 × 131072 × 8 × 128 × 2 = 17.179.869.184 bayt ≈ 16 GiB

Aynı modelin fp16 ağırlıkları yaklaşık 16 GiB. Maksimum bağlamda, önbellek ait olduğu model kadar büyüktür. “16 GiB’ye sığan 8B model”, num_ctx‘yi 128k’ya çektiğiniz anda sessizce 32 GiB’lik bir probleme dönüşür.

Önbellek pencereyle neden büyür?

Çünkü dikkat mekanizması her tokeni kendinden öncekilerin tümüyle karşılaştırmak zorundadır ve çıkarım otoregresiftir — hiçbir şey yeniden hesaplanmaz, her şey hatırlanır. Üretimi hızlı yapan tüm numara budur: her tokenin key ve value’ları bir kez hesaplanır ve saklanır. Token başına depolama sabittir; toplam depolama bağlamla doğrusaldır. 128k “daha büyük bir sayı” değildir — 1k pencerenin önbelleğinin 128 katıdır ve tüm oturum boyunca ayrılır.

Grouped-query attention (GQA) model tarafındaki indirgendir: daha az KV kafası, daha ince önbellek. Qwen2.5 7B yalnızca 4 KV kafasıyla 28 katman kullanır (config burada); böylece aynı 128k pencere fp16’da yaklaşık 7 GiB tutar — gerçek bir rahatlama, ve bu modellerin mütevazı makinelerde daha hoş görünmesinin bir nedeni.

Model (fp16)Katman × KV kafasıKV önbelleği @ 128kAğırlıklarÖnbellek / ağırlıklar
Llama 3.1 8B32 × 8~16 GiB~16 GiB~%100
Qwen2.5 7B28 × 4~7 GiB~15 GiB~%47

Hesabı kendiniz yapın — doğrulamanın tamamı bu:

def kv_cache_gib(layers, kv_heads, head_dim, ctx, bytes_per=2):
    return 2 * layers * ctx * kv_heads * head_dim * bytes_per / 2**30

print(kv_cache_gib(32, 8, 128, 131_072))  # Llama 3.1 8B  -> 16.0
print(kv_cache_gib(28, 4, 128, 131_072))  # Qwen2.5 7B    -> 7.0

Pazarlama sayısının atladıkları

Bu argümanın dürüst defteri burada — nerede büküldüğü dahil:

  • Prefill ikinci faturadır. İlk yanıt tokeninden önce, promptun tamamı tek seferde işlenir. 100k tokenlik bir prompt, ilk karakteri görmeden önce çiğnenecek 100k token demektir. Bir 3060’da bu milisaniye değil, dakikadır.
  • Sliding-window modeller hesabı bozar — sizin lehinize. Mistral tarzı mimariler dikkati katman başına sabit bir pencereyle sınırlar; önbellek büyümeyi bırakır. Basit formül onları abartır. Bu yazı tam dikkatli transformerlar hakkındadır — ki insanların çalıştırdığı şeyin çoğu odur.
  • KV quantization gerçek ama kısmî. llama.cpp KV’yi q8_0’da tutabilir; önbelleği kabaca yarıya indirir, belli bir kalite riskiyle. 16 GiB’nin yarısı hâlâ 8 GiB’dir.
  • Spec’ler KV kafalarını nadiren yazar. Onları bulmak için config.json’ı karıştırmak zorunda kalırsınız — bu da sayının nasıl okunmak üzere tasarlandığı hakkında bir şey söyler.

Bunun hiçbiri uzun bağlamı işe yaramaz kılmıyor. RAG, tam da pencereyi doldurmanın “4. bölümü oku” demenin pahalı yolu olması yüzünden vardır. Ama bellek faturasını basmadan “128k” yazan bir kart, arabayı son hızla satıp depoyu hiç anılmayan bir ayrıntı saymaktır.

Kimse 128.000 token okumaz. RAM’iniz hepsini yine de ödüyor.

Çare sıkıcıdır: bağlamı iş yükünüzün gerçekten kullandığı değere ayarlayın. 32k pencere, 128k önbelleğin dörtte birine mal olur ve tek bir geliştiricinin gerçekten gönderdiği neredeyse her promptu karşılar. Bu, yerel LLM’ler için RAM aritmetiği yazısındaki defter disiplininin aynısı — model boyutu bütçenin yarısıdır, ve quantization seviyeleri ağırlıkları küçültür ama önbellek hesabına dokunmaz.

Önbellek bağlamın gerçek bedeliyse, model kartları neden pencereyi satıyor da faturayı satmıyor? Ve itiraf turu: son tokenine kadar gerçekten doldurduğunuz en büyük bağlam hangisiydi — çıktı gigabaytlara değdi mi? Yorumlar açık; serinin bir sonraki yazısı kaybeden tarafı tutacak.

FAQ

128k bağlam penceresi ne kadar RAM kullanır?

Llama 3.1 8B için fp16'da yalnızca KV önbelleği 131.072 token'da yaklaşık 16 GiB tutar — modelin ağırlıkları kadar. Formül: 2 × katman × bağlam × KV kafası × head_dim × bayt.

Uzun bağlam neden daha fazla bellek kullanır?

Önbellekteki her token, her dikkat katmanı için key ve value tensörleri tutar. Bağlamı ikiye katlayın, önbellek ikiye katlanır. Pencereyi hiç doldurmasanız da ayırma vardır.

Yerel LLM'lerde KV önbelleği belleğini nasıl azaltırım?

Gerçekten kullandığınız bağlamı ayarlayın, grouped-query attention'lı modeller seçin (daha az KV kafası), runtime'ın izin verdiği yerde KV önbelleğini q8'e quantize edin ya da sliding-window ve hibrit mimarileri kullanın.

— mrsaynothing

— mrsaynothing

Görüşler yayın öncesi yük testinden geçti. Genellikle.

Sıradaki argümanı e-postayla al

Yazı başına bir e-posta. Katıl ya da söküp at.

self-hosted · üçüncü taraf yok · tek tıkla abonelikten çık

bu nedir?

git stash: tek dosyayı, gerisini kaybetmeden

Yazıları beğendiniz mi? Ben geçim için böyle inşa ederim. beni işe al