KV-Cache und PagedAttention: Warum Ihr LLM-Server langsamer wird

Ihr LLM-Server läuft langsam.

Sie haben ein 70B-Modell auf vier A100-GPUs bereitgestellt. Um 8 Uhr morgens sieht alles gut aus. Bis zur Mittagszeit hat sich die Latenz verdoppelt. Sie überprüfen Ihren Speicher. Der Großteil wird von „Tensor-Buffern“ eingenommen. Dabei handelt es sich eigentlich um zwischengespeicherte Zustände (cached states) aus alten Konversationen.

Das ist das KV-Cache-Problem. Es ist der größte Flaschenhals beim LLM-Serving in der Produktion.

Was ist der KV-Cache?

Jedes Transformer-Modell generiert Token nacheinander. Um ein neues Token zu erstellen, benötigt das Modell die Key- und Value-Tensoren aller vorherigen Token. Diese jedes Mal neu zu berechnen, ist zu langsam. Stattdessen speichert die Engine sie. Dieser Speicher ist der KV-Cache.

Das Speicherproblem:

Für ein Llama 3.1 70B-Modell benötigt eine einzige 4096-Token-Sequenz etwa 1,3 GB Speicher.

Wenn Sie 256 Benutzer gleichzeitig haben, benötigen Sie 336 GB Speicher. Das ist mehr, als vier A100-GPUs aufnehmen können. Der KV-Cache wächst so schnell, dass er oft mehr Speicher verbraucht als die Modellgewichte selbst.

Traditionelles Speichermanagement scheitert, weil:

  • Interne Fragmentierung: Sie reservieren Platz für 4096 Token, nutzen aber nur 300. Sie verschwenden 93 % dieses Platzes.
  • Kein Teilen: Zwei Benutzer mit demselben System-Prompt speichern jeweils ihre eigene Kopie dieses Prompts.
  • All-or-nothing-Eviction: Wenn der Speicher voll ist, müssen Sie die gesamte Sequenz auf die CPU auslagern. Dies blockiert die GPU.

Wie PagedAttention das löst:

PagedAttention funktioniert wie ein Betriebssystem. Es unterteilt den KV-Cache in kleine Blöcke fester Größe, sogenannte Pages.

Dies löst drei Hauptprobleme:

  • On-Demand-Allokation: Eine Sequenz belegt nur so viele Pages, wie sie tatsächlich wächst. Sie verschwenden keinen Speicher für ungenutzte Kapazitäten.
  • Unterstützung für geteilte Präfixe (Shared Prefix Support): Mehrere Benutzer können dieselben physischen Pages für einen gemeinsamen System-Prompt nutzen. Dies verwendet eine „Copy-on-Write“-Logik, um massive Mengen an Speicher zu sparen.
  • Feingranulare Eviction: Wenn der Speicher voll ist, verschiebt das System kleine Pages auf die CPU anstatt riesiger Sequenzen.

Das Ergebnis:

Die Verwendung von PagedAttention (die Technologie hinter vLLM) kann den Durchsatz im Vergleich zu herkömmlichen Methoden um das 2- bis 4-fache steigern.

Wann man es verwenden sollte:

  • Hohe Nebenläufigkeit (Concurrency).
  • Sequenzen unterschiedlicher Länge.
  • Prompts, die denselben Anfang teilen.

Wann man es vermeiden sollte:

  • Lokale Inferenz für einzelne Benutzer.
  • Sehr kleine Modelle.
  • Aufgaben, bei denen jede Sequenz exakt die gleiche Länge hat.

Quelle: https://dev.to/tech_nuggets/kv-cache-and-pagedattention-what-they-do-and-why-they-matter-jce

Optionale Lern-Community: https://t.me/GyaanSetuAi