KV-Cache¶
Der KV-Cache speichert berechnete Key- und Value-Vektoren aus vorherigen Tokens, um sie nicht neu berechnen zu müssen. Er ist essenziell für schnelle LLM-Inferenz.
Das Problem¶
Bei der Attention muss jedes neue Token auf alle vorherigen Tokens schauen. Ohne Cache würde das bedeuten:
- Token 1: 1 Attention-Berechnung
- Token 2: 2 Berechnungen
- Token 100: 100 Berechnungen
- Token 1000: 1000 Berechnungen
Quadratischer Aufwand!
Die Lösung¶
Keys und Values ändern sich nicht für bereits generierte Tokens. Also speichern wir sie:
# Ohne Cache (ineffizient)
for pos in range(seq_len):
K = all_tokens @ W_k # Immer neu berechnen
V = all_tokens @ W_v
attention(Q, K, V)
# Mit KV-Cache (effizient)
for pos in range(seq_len):
k = new_token @ W_k # Nur neues Token
v = new_token @ W_v
K_cache.append(k)
V_cache.append(v)
attention(q, K_cache, V_cache)
VRAM-Verbrauch¶
Der KV-Cache wächst mit der Sequenzlänge:
\[
\text{KV-Cache} = 2 \times \text{layers} \times \text{heads} \times \text{seq\_len} \times \text{head\_dim} \times \text{bytes}
\]
| Modell | Context | KV-Cache (FP16) |
|---|---|---|
| Llama 7B | 4K | ~1 GB |
| Llama 70B | 4K | ~10 GB |
| Llama 70B | 128K | ~320 GB |
Optimierungen¶
- Multi-Query Attention (MQA): Weniger K/V-Heads
- Grouped-Query Attention (GQA): Kompromiss
- Quantisierter KV-Cache: 8-bit statt 16-bit
Siehe auch¶
- Attention – Warum K und V gebraucht werden
- VRAM – Wo der Cache liegt
- Inferenz – Der Kontext