senn-techsenn-tech
KI-Hardware
KI-Hardware2026-10-02· Von Franz Senn

KV-Cache in 4 Bit: 8,8 statt 4,7 volle Sitzungen auf denselben vier RTX 5090

Seit dem Abend des 2. Oktober läuft unsere Produktions-Lane für Qwen3.8-Flash-Next mit einem KV-Cache in 4 Bit. Der Pool wächst dadurch von 1.041.901 auf 1.944.081 Token. Bei 220.000 Token Kontext pro Anfrage heißt das: 8,8 statt 4,7 volle Sitzungen passen gleichzeitig in den Grafikspeicher. Die Antwortqualität blieb in allen Prüfungen unverändert, die Geschwindigkeit im Einzelstrom sank um acht Prozent. Gleiches Modell, gleiche vier RTX 5090, gleiches Speicherbudget je Karte.

Logo von Qwen
Vier Bit pro Wert statt acht: Der KV-Cache von Qwen3.8-Flash-Next halbiert seinen Platz, der Mamba-State bleibt, wie er ist. (Quelle: Alibaba Cloud / Wikimedia, CC0)

Was wir geändert haben

Der KV-Cache ist der Teil des Grafikspeichers, in dem das Modell den bisherigen Verlauf einer Anfrage vorhält. Bisher lag er bei uns in FP8, also mit einem Byte pro Wert. Der Schalter int4_per_token_head speichert jeden Wert in 4 Bit und legt die Skalierungsfaktoren pro Token und Attention-Kopf dazu. Das ergibt 264 Byte pro Kopf und Token bei einer Kopfdimension von 256, rund die Hälfte der bisherigen Belegung.

Zwei Details mussten dafür gelöst werden. Unsere vLLM-Fassung kennt den Schreibpfad für INT4 bereits, die Sparse-Attention-Schichten des Modells lasen den Cache aber weiterhin als FP8. Wir haben die Leseseite auf denselben Stand gebracht und gegen die Referenzimplementierung geprüft. Außerdem verweigerte der Server mit der üblichen Blockgröße von 800 Token den Start. Der Mamba-State belegt je Sitzung 408.576 Byte und teilt sich die Seiten mit dem KV-Cache. Eine 800er-Seite fasst bei INT4 nur 211.200 Byte. Mit Blockgröße 1600 passen 422.400 Byte auf eine Seite, und der Server startet.

Derselbe Mamba-State ist auch der Grund, warum der Pool um das 1,7- bis 1,87-Fache wächst und nicht exakt auf das Doppelte. Sein Platzbedarf bleibt gleich, während der KV-Anteil schrumpft.

Die Messwerte

KV-Pool in Token bei gleichem Byte-Budget je KarteFP8 (Stand September)1041901 · 4,74 Sitzungen à 220kINT4 (seit 02.10.)1944081 · 8,84 Sitzungen à 220k02000000
Startmeldungen des Servers, beide Läufe mit identischem Cache-Budget und 220.000 Token Kontext. (Quelle: senn-tech, eigene Messung vom 2. Oktober 2026)
Decode im Einzelstrom, Token pro SekundeFP898.6 · 98,6 tok/sINT490.7 · 90,7 tok/s (−8 %)0110
Dieselben Prompts bei Temperatur null, beide Läufe am 2. Oktober 2026. (Quelle: senn-tech, eigene Messung vom 2. Oktober 2026)

Beim Dekodieren ist der INT4-Lauf im Einzelstrom langsamer: 90,7 gegen 98,6 Token pro Sekunde, gemessen an denselben Prompts bei Temperatur null. Unter paralleler Last fällt das kaum ins Gewicht, weil Anfragen seltener auf freien Cache-Platz warten. Der erste Start mit dem neuen Image dauerte knapp zehn Minuten, weil neue Kernel-Pfade kompiliert werden. Folgestarts liegen bei etwa fünf Minuten.

Cloud Codes vom 28. August 2026 zur Speicherrechnung des Modells: warum auf Consumer-Karten der Cache und nicht die Gewichte der Engpass sind.

Die Zahl der gleichzeitigen Anfragen bleibt bei acht, dieser Deckel ist unverändert. Was sich ändert: Alle acht Plätze dürfen jetzt gleichzeitig den vollen Kontext belegen. Vorher teilten sich acht Plätze rechnerisch 4,7 volle Sitzungen, und sehr lange Dokumente mussten warten oder gekürzt werden.

Wie wir die Qualität geprüft haben

Vier Prüfungen, alle am 2. Oktober gelaufen. Ein Kernel-Harness vergleicht die INT4-Ausgabe direkt mit der Torch-Referenz: minimale Kosinus-Ähnlichkeit 0,99982. Dazu Nadel-Tests, bei denen ein versteckter Satz in langen Texten wiedergefunden werden muss. Die Nadel wurde bei 180.000 Token in der Mitte und bei 215.000 Token an den Tiefen 0,3 und 0,9 gefunden. Tiefer geht es auf dieser Konfiguration nicht, weil die Engine bei 220.000 Token begrenzt.

Vier Coding-Aufgaben bei Temperatur null lieferten auf beiden Cache-Formaten dieselben Algorithmen und Strukturen, mit kleinen Unterschieden in Variablennamen und Kommentaren. Zwei der Lösungen, eine LRU-Tabelle und ein Dijkstra, haben wir extrahiert und ausgeführt, beide funktional korrekt. Der letzte Test war ein gemischter Lauf mit vier parallelen Anfragen à rund 128.000 Token, sauber durchgelaufen.

Externer Test vom 27. August 2026: Er zeigt, wann die Sparse Attention des Modells Inhalte aus langen Kontexten verliert, und welche Einstellung das abfängt. Unsere Nadel-Prüfungen messen genau dieses Risiko.

Der Kernel-Zwischenfall am selben Tag

Der Kernel-Zwischenfall am 2. Oktoberapt full-upgradeKernel 7.0.0-38DKMS-NeubauP2P-Patch fehltRebuild der Modulegegen neue HeadersNeustart und PrüfungP2P OK auf allen Paarenapt-mark holdPakete angepinnt
Der Rebuild dauerte eine Viertelstunde, danach lief die Lane wieder auf dem schnellen Pfad. (Quelle: senn-tech, eigenes Protokoll vom 2. Oktober 2026)

Der Tag hatte noch eine zweite Baustelle. Ein Routinelauf von apt full-upgrade installierte Kernel 7.0.0-38. Dabei baute DKMS das NVIDIA-Modul neu, allerdings aus dem unveränderten Quellbaum. Der Patch, der den direkten Speichertransfer zwischen unseren vier Karten ermöglicht, fehlte danach. Ohne ihn läuft der Austausch zwischen den Karten über den Hauptspeicher, und genau dieser direkte Pfad macht die Tensorparallelität schnell.

NVIDIA-Logo
Der P2P-Patch lebt außerhalb des NVIDIA-Quellbaums. Jedes Kernel-Update baut das Modul neu, und ohne Patch ist der direkte Weg zwischen den Karten wieder geschlossen. (Quelle: Simple Icons, Datei nvidia.svg (CC0))

Wir haben die gepatchten Module aus unserem Klon von open-gpu-kernel-modules gegen die neuen Kernel-Headers gebaut, die Originalmodule vorher gesichert, den Server neu gestartet und mit nvidia-smi topo -p2p r geprüft: alle Kartenpaare wieder OK. Danach haben wir die Kernel- und NVIDIA-Pakete mit apt-mark hold angepinnt. Ein Kernel-Wechsel passiert jetzt nur noch bewusst, mit dem Rebuild im selben Zeitfenster.

Was das für den Betrieb heißt

Der Engpass der letzten Wochen war der Speicher für lange parallele Anfragen, nicht die Rechenleistung. Mit fast neun vollen Sitzungen im Cache rutschen lange Dokumente seltener in die Warteschlange, und die Agenten, die bei uns den ganzen Tag lesen und schreiben, bekommen ihren Kontext vollständig. Das FP8-Image bleibt auf der Maschine, dazu liegt ein Snapshot des Standes vor dem Wechsel. Wenn im Alltag bei sehr langen Kontexten Qualitätsauffälligkeiten auftreten, geht die Lane mit einem Befehl zurück auf FP8, bis die Ursache steht.

Weiterführende Quellen

Fragen?
Warum wächst der Pool nicht auf genau das Doppelte?+

Der lineare Anteil des Modells, der Mamba-State, belegt je Sitzung 408.576 Byte und teilt sich die Speicherseiten mit dem KV-Cache. Sein Platzbedarf bleibt gleich, während der KV-Anteil halbiert wird. Gemessen landen wir je nach Start bei dem 1,7- bis 1,87-Fachen.

Wird die Antwortqualität durch 4-Bit-KV schlechter?+

In unseren Prüfungen vom 2. Oktober nicht. Der Kernel lag bei einer Kosinus-Ähnlichkeit von 0,99982 zur Referenz, Nadeln in 215.000 Token langen Texten wurden gefunden, und vier Coding-Aufgaben lieferten funktional identische Ergebnisse. Wir beobachten den Betrieb trotzdem weiter, weil kein Test den Alltag vollständig abbildet.

Was passiert, wenn sich im Betrieb doch ein Problem zeigt?+

Der Rückweg ist ein einziger Befehl und dauert gut sechs Minuten. Das FP8-Image und ein Snapshot vom 2. Oktober liegen dafür bereit. Danach läuft die Lane wieder mit dem Pool von 1.041.901 Token.