Zum Inhalt

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