Sofortantwort
KV-Cache einfach erklärt
Caching von Attention-Berechnungen für schnellere Inferenz.
- Kurz gesagt
- Speichert Key-Value-Paare aus vorherigen Tokens
- Typischer Einsatz
- Chat-Anwendungen, Lange Kontexte, Batch-Inferenz
- Wichtig zu wissen
- Hauptgrund, warum LLM-Inferenz viel VRAM braucht
KV-Cache im Überblick
Der KV-Cache speichert Zwischenergebnisse der Attention-Berechnung. Ohne Cache müsste das Modell bei jedem neuen Token alle vorherigen Tokens neu verarbeiten – das wäre extrem langsam.
Warum ist das wichtig?
Ohne KV-Cache (Token 100 generieren):
-> Berechne Attention für Token 1-99 neu
-> Dann Token 100
-> O(n²) Komplexität pro Token
Mit KV-Cache:
-> Keys/Values für Token 1-99 aus Cache
-> Nur Token 100 neu berechnen
-> O(n) Komplexität pro Token
Der Trade-off:
Schnellere Inferenz ↔ Mehr VRAM-Verbrauch
Der KV-Cache ist oft der Flaschenhals für lange Kontexte und große Batch-Größen.
Technisch betrachtet
Wie Attention funktioniert
Attention(Q, K, V) = softmax(QK^T / √d) × V
Q = Query (aktuelles Token)
K = Keys (alle bisherigen Tokens)
V = Values (alle bisherigen Tokens)
Der KV-Cache speichert K und V für alle bisherigen Tokens.
Speicherverbrauch
KV-Cache-Größe = 2 × num_layers × num_heads × head_dim × seq_len × batch_size × dtype_size
Beispiel (Llama 70B, 4K Kontext, Batch 1):
= 2 × 80 × 64 × 128 × 4096 × 1 × 2 bytes
≈ 10.7 GB
Optimierungen
| Technik | Beschreibung | Ersparnis |
|---|---|---|
| PagedAttention | Nicht-kontinuierlicher Speicher | 50-90% |
| Quantisierung | FP16 → INT8 Cache | 50% |
| Sliding Window | Nur letzte N Tokens cachen | Variabel |
| Prefix Caching | Gemeinsamer Cache für gleiche Prefixe | Variabel |
vLLM PagedAttention
# vLLM verwaltet KV-Cache automatisch
from vllm import LLM
llm = LLM(model="meta-llama/Llama-2-70b-chat-hf")
# PagedAttention ist standardmäßig aktiviertSchritt für Schritt
Wie der KV-Cache die Generierung beschleunigt
Beim autoregressiven Decoding wächst der Kontext mit jedem Token. Der Cache bewahrt bereits berechnete Attention-Informationen für die folgenden Schritte.
Kontext einmal verarbeiten
Prefill
Beim Prefill erzeugt der Transformer für alle Eingangstokens Key- und Value-Repräsentationen.
Prompt → Keys und ValuesZwischenergebnisse ablegen
Cache
Diese Repräsentationen bleiben im schnellen Speicher für den weiteren Verlauf der Anfrage verfügbar.
K und V → KV-CacheNeues Token berechnen
Decode
Für das nächste Token müssen nur dessen neue Werte berechnet werden; frühere Werte kommen aus dem Cache.
neues Token + Cache → nächste VorhersageSpeicher steuern
Betrieb
Engine und Anwendung verwalten Batch-Größe, Kontextlänge, Cache-Lebensdauer und gemeinsame Präfixe.
Latenz ↔ VRAM ↔ Durchsatz
Konkretes Beispiel
Beispiel: Eine lange Chat-Antwort
Ein Modell beantwortet eine Frage auf Basis eines umfangreichen Gesprächsverlaufs.
Ohne Zwischenspeicher
Für jedes neue Antworttoken müsste das System den gesamten Verlauf noch einmal vollständig verarbeiten.
Mit KV-Cache
Die Attention-Werte des Verlaufs bleiben verfügbar. Für das nächste Token ergänzt das Modell nur die neue Berechnung.
Der Cache macht Decoding schneller, benötigt aber mit wachsendem Kontext und mehr parallelen Anfragen zunehmend Speicher.
Einordnung
Vorteile und Grenzen
Das spricht dafür
- Beschleunigt autoregressive Generierung erheblich.
- Vermeidet wiederholte Berechnungen für bereits verarbeiteten Kontext.
- Ermöglicht effiziente Chat- und Long-Context-Anwendungen.
- Kann gemeinsame Präfixe mehrerer Anfragen wiederverwenden.
Das solltest du beachten
- Verbraucht viel Speicher bei langen Kontexten und großen Batches.
- Cache-Verwaltung wird im Mehrnutzerbetrieb komplex.
- Der Cache verbessert nicht die inhaltliche Qualität der Antwort.
- Speichergrenzen können Kontextlänge und Parallelität begrenzen.
Vertiefung · für FortgeschritteneKV-Cache im Decode-Schritt
Keys und Values aus dem bisherigen Kontext werden für jedes neue Token wiederverwendet.
Attention speichern