İçeriğe geç

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
Orta

Autoregressive 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:
  1. Step 1'de token 1'in K ve V'sini hesapla ve bellekte tut
  2. Step 2'de token 2'nin K ve V'sini hesapla, token 1'inkilerle birleştir
  3. Step 3'te token 3'ün K ve V'sini hesapla, önceki ikisiyle birleştir
  4. ...
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):
OperasyonCache YOKCache 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