Autoregressive Decoding ve O(n²) → O(n) Sihri
LLM'ler tokenları teker teker üretir. Her yeni token için tüm geçmişe attention atılır. Naif yaklaşım O(n²) — patlama. KV cache trick'i bunu O(n)'e indirir. Bu dersi bitirince LLM inference'ın 'asıl optimizasyon noktası'nı göreceksin.
Şükrü Yusuf KAYA
15 dakikalık okuma
OrtaAutoregressive Decoding'in Asıl Maliyeti
LLM'in bir cümle ürettiğini düşün: "Merhaba, ben Türkiye'den geliyorum."
Bu cümle (token sayalım) ~10 token. Model her tokeni sırayla üretti:
Step 1: "Merhaba" → next = "," Step 2: "Merhaba ," → next = " ben" Step 3: "Merhaba , ben" → next = " Türkiye" ... Step N: tüm önceki tokenlar → next = "."
Her adımda model tüm geçmiş tokenları attention ile işlemek zorunda. Naif yaklaşımla (cache yok), bu çok pahalı.
Naif Maliyet: O(n²)#
(n) tokenlı bir cümle üretmek için:
- Step 1: 1 token → 1 attention hesabı (1×1 matris)
- Step 2: 2 token → 2 attention (2×2)
- Step 3: 3 token → 3 attention (3×3)
- ...
- Step n: n token → n attention (n×n)
Toplam: (1 + 2 + 3 + \ldots + n = \frac{n(n+1)}{2} \approx \frac{n^2}{2})
1000 tokenlı cümle = 500.000 attention hesabı. Yavaş, pahalı. Çözüm?
Sihirli Gözlem
Çekirdek gözlem: Step 3'te token 1 ve 2'nin K ve V matrisleri, Step 2'de hesaplanmıştı. Tekrar hesaplamaya gerek yok — yeter ki bir yere saklayalım.
KV Cache Trick: Saklayıp Tekrar Kullan#
Mantık çok basit:
- Step 1'de token 1'in K ve V'sini hesapla ve bellekte tut
- Step 2'de token 2'nin K ve V'sini hesapla, token 1'inkilerle birleştir
- Step 3'te token 3'ün K ve V'sini hesapla, önceki ikisiyle birleştir
- ...
Her step'te SADECE yeni tokenın K ve V'sini hesaplıyorsun. Diğerleri zaten saklı.
Q tarafına bakalım: Q için cache yok mu? Yok çünkü her step'te sadece son tokenın Q'su önemli (o, "next token"ı tahmin eder).
Yeni Maliyet: O(n)#
Her step'te hesaplama:
- 1 yeni K, V satırı oluştur — (O(1))
- Q_new × K_full → (O(n)) (sadece son satır için skorlar)
- × V_full → (O(n))
Toplam tüm üretim:
Aslında her step (O(n)) çünkü sadece son satır işleniyor. (n) step × (O(n)) = (O(n^2)) hesaplama. Ama memory read açısından (O(n)) read başına step.
Pratik etki: Tekrar tekrar K, V hesabı yapmıyorsun. O hesaplamalar saklı — özellikle uzun prefix için devasa tasarruf.
Sonraki ders'te memory layout'a girip rakamları görelim. Ama önce kavramı içselleştir.
Mini Egzersiz — Adımları Doğru Sırala#
Sıralama · text
Cache'in İki Yüzü: Prefill vs Decode#
Inference'in iki fazı var:
1. Prefill (input işlemesi)
- Tüm prompt'u (n token) tek seferde işle
- K ve V cache'i baştan oluştur
- Paralel hesap — GPU verimli
- Süre: ~50-200 ms / 1K token
2. Decode (output üretimi)
- Her step bir yeni token
- KV cache'i kullan, sadece yeni K, V ekle
- Sıralı — GPU az verimli (bandwidth-bound)
- Süre: ~10-50 ms / token
Prompt caching = Prefill'in cache'lenmesi. Sonraki sorguda aynı prefix gelince prefill atlanır, KV cache hazır gelir.
Aydınlanma
İşte buradayız! Prompt caching = Prefill phase'in KV matrislerini diske/RAM'e yazıp tekrar kullanmak. Bütün caching API'leri (Anthropic, OpenAI, Gemini, vLLM) bu fikirden çıkıyor.
Prefill (Cache YOK)#
n token prompt geldi → Tüm K, V'leri hesapla → KV cache'i baştan inşa et → İlk output token üret Latency: O(n) ama yüksek base
Prefill (Cache HIT)#
n token prompt geldi → Tanıdık prefix? Evet! → KV cache'i diskten yükle → Sadece yeni kısımı hesapla → İlk output token üret Latency: O(n_new) — çok düşük
Pratik Sayılar#
Claude Sonnet 4.6'da (yaklaşık değerler):
| Operasyon | Cache YOK | Cache HIT |
|---|---|---|
| 1K token prefill | ~200 ms | ~20 ms (load) |
| 10K token prefill | ~2.000 ms | ~50 ms |
| 100K token prefill | ~20.000 ms | ~100 ms |
| 200K token prefill | ~40.000 ms | ~150 ms |
200K tokenda 250× hızlanma. Modül 1 lab'inde gördüğümüz "12sn → 5sn" buradan geliyor.
✓ Pekiştir#
Bir Sonraki Derste#
KV cache bellekte ne kadar yer kaplar, hesaplayacağız. Cevap: 70B parametreli bir model için 1M context cache'i 40+ GB. Provider'ların neden caching'i karmaşık fiyatlandırdığını anlayacaksın.
Sık Sorulan Sorular
Hayır. Q sadece 'aktif tokenın' projeksiyonu — geçmiş tokenların Q'larına ihtiyacın yok çünkü attention 'kim kime bakıyor' formülünde sadece son token query yapıyor. Cache'lemek gereksiz bellek harcaması olurdu.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
1. Temeller — Context Penceresi Ekonomisi
Bu Eğitim Hakkında ve Prompt Caching Neden Önemli?
Öğrenmeye Başla1. Temeller — Context Penceresi Ekonomisi
Token Ekonomisi 101: Input vs Output Cost Asimetrisi
Öğrenmeye Başla1. Temeller — Context Penceresi Ekonomisi