KV-Cache
Das Modell ergänzt die Antwort Stück für Stück. Viele Informationen über den früheren Text hat es bereits berechnet; sie in jedem Schritt von Grund auf neu zu berechnen würde Arbeit wiederholen. Du möchtest die weiterhin gültigen Ergebnisse speichern.
KV Cache speichert Key und Value aus den Attention-Schichten. Das sind Listen von Zahlen, die dem Abgleich von Fragmenten beziehungsweise der Weitergabe ihrer Informationen dienen. Der Cache speichert weder eine fertige Antwort noch eine Zusammenfassung des Gesprächs.
Nach der Verarbeitung von A, B und C nutzt das neue Fragment D die gespeicherten Beschreibungen dieser Positionen und fügt seine eigenen hinzu. In einem Modell mit gesperrtem Zugang zur Zukunft verändern neue Fragmente die früheren Beschreibungen nicht; bei übereinstimmenden Einstellungen können sie deshalb wiederverwendet werden.
Wir sparen wiederholte Berechnungen, bezahlen aber mit Speicher für die aufbewahrten Zahlen. Bei langem Kontext steigt dieser Aufwand. Prefill bereitet den Cache der bekannten Eingabe vor, während Decode ihn während der Antwort ergänzt. Benötigte Informationen müssen weiterhin gelesen und vermischt werden.
Mechanismus und Details
In einem Modell mit Causal Masking verändern spätere Tokens die Repräsentationen früherer Positionen nicht. Das erlaubt die Wiederverwendung des Caches für dasselbe Präfix und dieselben Modelleinstellungen. Die Grundlage des Informationsflusses beschreibt Attention Is All You Need, §3.1 und §3.2.3, die Aktualisierung des Caches in jeder Schicht die Hugging-Face-Dokumentation: How caching works.
Was vom vorherigen Schritt bleibt
Eigene Illustration: Das Modell hat A, B und C verarbeitet. Bei der Verarbeitung von D nutzt es die gespeicherten K und V der drei vorherigen Positionen und ergänzt das Paar für D. Das Query der aktuellen Position wird mit verfügbaren Keys verglichen; das Ergebnis verwendet die entsprechenden Values. Der Cache ist weder eine fertige Antwort noch eine Textzusammenfassung der Unterhaltung.
Das Speichern von Ergebnissen kostet Ressourcen. Eigenes kleines Beispiel für eine Schicht: vier Positionen, zwei KV-Köpfe, jeweils drei Zahlen pro K- und V-Vektor und vier Byte pro Zahl:
Der erste Faktor 2 steht für getrennte Keys und Values. Das Ergebnis umfasst nur die Tensorelemente ohne Allokationsaufwand. Ein vollständiger dynamischer Cache wächst mit der Zahl gespeicherter Positionen; Varianten mit begrenztem Fenster können ältere Positionen entfernen.
Ein älterer Artikel über die Skalierung des KV-Caches [Polski] vertieft die Speicherkosten. Der Artikel über Cache-Übertragung zwischen Modellen [Polski] behandelt ein separates Problem: Übereinstimmende Tensordimensionen gewährleisten keine übereinstimmende Bedeutung. Bei einer Änderung des Modells oder Präfixes muss erneut bestimmt werden, welcher Cacheteil gültig bleibt. Siehe auch: PagedAttention beschreibt eine blockweise Speicherorganisation, Prefix Caching die Wiederverwendung von KV für ein gemeinsames Präfix.