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