Zum Inhalt springen
Kurzer Hinweis: flozi00 TechHub ist ein Solo-Nebenprojekt neben einem Vollzeitjob — persönliche Lernnotizen, keine offiziellen Aussagen. Kritische Schritte selbst prüfen.

KV-Cache-Tensordekomposition: Vollrangige Kopf- und Layer-Modi in zwei Modellen

Eine Spektralstudie auf Mistral-7B-v0.3 und LLaMA-2-13B mit 1.024 Tokens zeigt hohen Rekonstruktionsfehler bei Rangreduktion über Köpfe und gruppierte Layer. Tucker gewinnt den getesteten Formatvergleich bei 2x–5x; bei getrenntem gemeinsamen Budget liefern 2D-Verfahren niedrigeren Key-Fehler und 4D-Tucker niedrigeren Value-Fehler. Mit einer illustrativen synthetischen Simulation statt einer Reproduktion der Messwerte.

12 Min. Lesezeitflozi00
aimachine-learningllminferencekv-cachetensor-decompositionlineare-algebragpu-memory
Direkt zum Fachartikel
Sehen · ausprobieren · verstehen

Komprimierbare Achsen vor der Rangreduktion finden

Ein KV-Tensor hat mehrere Achsen. Das Entfernen einer energiereichen Richtung erzeugt eine Fehlergrenze, die anderer Speicher nicht behebt.

KI-gestützte Lernvisualisierung · schematische Erklärung zum Artikel

Schritt 1 / 4Jede Achse einzeln betrachten

Entfalten macht einen mehrdimensionalen Tensor ohne Änderung seiner Werte zu einer Matrix. Singulärwerte zeigen, wie viel Information als quadratische Zahlenenergie verloren geht, wenn Richtungen geringeren Rangs entfallen.

AlgorithmusAktueller SchrittBaustein anklicken, um ihn zu erklären
Gemessener KV-Tensor
Achsen: Köpfe, Tokens, Merkmale und gruppierte Schichten.
Jeweils eine Achse entfalten
Eine Tensorachse als Matrixzeilen und die übrigen als Spalten darstellen.
Singuläre Richtungen messen
Das Spektrum zeigt die Energie jeder Richtung.
  1. Gemessener KV-Tensor Jeweils eine Achse entfalten
    Achse wählen
  2. Jeweils eine Achse entfalten Singuläre Richtungen messen
    Spektrum berechnen
Das solltest du mitnehmen

Ein Speicherbudget kann das Verwerfen einer energiereichen Richtung nicht ausgleichen; zuerst die reduzierbaren Achsen messen.

Die Messungen umfassen zwei Modelle bei 1.024 Tokens und gruppierte Schichten. Sie schließen Neutraining, andere Darstellungen oder andere Qualitätsabwägungen nicht aus.

Begriffe und vollständiger Ablauf
Rang
Die Zahl unabhängiger Richtungen, die eine Matrix oder Tensorachse behält.
Singulärwertspektrum
Die geordneten Stärken orthogonaler Richtungen einer entfalteten Matrix.
Rekonstruktionsfehler
Der numerische Unterschied zwischen dem ursprünglichen Tensor und seiner Näherung.
  1. Jede Achse einzeln betrachten

    Entfalten macht einen mehrdimensionalen Tensor ohne Änderung seiner Werte zu einer Matrix. Singulärwerte zeigen, wie viel Information als quadratische Zahlenenergie verloren geht, wenn Richtungen geringeren Rangs entfallen.

  2. Eine Fehleruntergrenze vor dem Anpassen erkennen

    In den untersuchten Caches tragen Kopf- und Schichtgruppenrichtungen genug Energie, dass schon eine entfernte Richtung praktische Fehlerbudgets überschreitet. Mehr Token- oder Merkmalsrang stellt eine an anderer Achse entfernte Richtung nicht wieder her.

  3. Rang nach Tensor und Achse zuteilen

    Tucker erlaubt eigene Ränge je Achse und kann Kopf- und Schichtachsen erhalten. Keys und Values haben andere Spektren; die getrennten Vergleiche des Papers bevorzugen verschiedene Formate für K und V statt eines universellen Kompressors.

  4. Zahlenfehler von Modellqualität trennen

    Die Versuche messen Tensorrekonstruktion, einschließlich des Unterschieds vor und nach rotierender Positionskodierung bei Keys. Eine Aussage über Modellqualität oder Generierungstempo braucht weiterhin eigene Tests.

Alle Verbindungen

  • Gemessener KV-Tensor → Jeweils eine Achse entfalten: Achse wählen
  • Jeweils eine Achse entfalten → Singuläre Richtungen messen: Spektrum berechnen
  • Singuläre Richtungen messen → Rang bei abfallenden Spektren sparen: geringe Restenergie
  • Singuläre Richtungen messen → Teure Achsen mit vollem Rang halten: große verlorene Richtung
  • Rang bei abfallenden Spektren sparen → K- und V-Budgets getrennt wählen: gezielt reduzieren
  • Teure Achsen mit vollem Rang halten → K- und V-Budgets getrennt wählen: Dimensionen erhalten
  • K- und V-Budgets getrennt wählen → Rekonstruktionsfehler prüfen: anpassen und vergleichen
Du bestimmst das Tempo. Pausiere jederzeit oder wähle einen Schritt aus.

Manche KV-Cache-Kompressoren verwenden Niedrigrang-Approximationen mit gemeinsamen Basen über Köpfe oder Layer. Ein Papier vom September 2026 misst den Rekonstruktionsfehler bei Rangreduktion entlang jeder Achse auf zwei Modellen mit 1.024 Tokens. Es untersucht weder die nachgelagerte Sprachmodellqualität noch lange Unterhaltungen oder alle Kompressionsverfahren. Das Ergebnis ist ein Spektraltest für die untersuchten Niedrigrang-Formate und Modell-Caches.1

Das Papier ist Tensor Decomposition of Transformer Key-Value Caches: Spectral Structure and Format Comparison (arXiv:2609.28029, math.NA, eingereicht am 23. September 2026, von Rahul Krishnan und Volker Schulz)1. Was es tut, ist systematisch und ungewöhnlich ehrlich: echte KV-Caches aus zwei Produktionsmodellen extrahieren — Mistral-7B-v0.3 (Grouped-Query-Attention, 32 Layer, 8 KV-Köpfe, Kopfdimension 128) und Llama-2-13B (Multi-Head-Attention, 40 Layer) —, den Cache entlang jeder seiner vier Achsen entfalten, das Singulärwertspektrum jeder Entfaltung messen und dann vier Standard-Tensordekompositionen (Tucker, CP, Tensor Train, t-SVD) bei gleichem Speicher fitten. Jede Aussage unten ist gelabelt: papierverifiziert, wo ich sie im Papier gelesen habe; eigene Nachrechnung, wo wir die Arithmetik geprüft haben; Simulation, wo die Zahl aus einem synthetischen Modell stammt, das den Mechanismus isoliert.

Der KV-Cache ist ein vierwegiger Tensor, und seine Achsen sind nicht gleichberechtigt

Beim autoregressiven Decoding hält der KV-Cache in jeder Schicht für jedes vergangene Token und jeden Attention-Kopf einen Key-Vektor und einen Value-Vektor. Stapelt man die Cache-Slices der Layer, entsteht ein Tensor vierter Ordnung mit den Achsen Köpfe, Tokens, Features (die per-Kopf-Featuredimension, bei beiden untersuchten Modellen 128) und Layern — das Papier gruppiert benachbarte Layer, die Layer-Achse meint also die Anzahl gruppierter Layer, nicht alle 32 oder 40 auf einmal2. Eine Tensordekomposition nutzt Korrelationen über mehrere Achsen gleichzeitig; welche Dekomposition die richtige ist, hängt vollständig davon ab, wo diese Korrelationen tatsächlich liegen.

Das erste Ergebnis des Papiers ist eine saubere Zweiteilung der vier Achsen — eine „Mode-Count-Dichotomie"2:

  • Token-Achse: komprimierbar. Die Entfaltung der Key-Caches entlang der Tokens fällt um mehrere Größenordnungen; substanzielle Rangreduktion ist bei kleinem Fehler verfügbar.
  • Feature-Achse: komprimierbar für Keys, fast inkomprimierbar für Values. Bei Keys lässt das Feature-Spektrum Rangabschnitt zu; bei Values bleibt es nahezu flach.
  • Kopf-Achse: praktisch vollrangig. Die Kopf-Entfaltung braucht ihren vollen Rang bei jeder im Papier getesteten Fehlerschwelle. Jeder Kopf trägt vergleichbare Energie; Köpfe zu beschneiden kostet echten Fehler — konsistent mit der Per-Kopf-Outlier-Struktur, die auch aggressive Attention-Kompression überdauert: jeder Kopf ist ein eigener Informationskanal, keine redundante Kopie seiner Nachbarn.
  • Layer-Achse (Gruppen): praktisch vollrangig. Dasselbe Bild über gruppierte Layer — die kleinste Singulärrichtung allein trägt mehr Energie als jedes praktische Fehlerbudget.

Das Papier nennt die letzten beiden indexartig (Definition 3.1 im Papier): Ein Modus ist indexartig auf Fehlerniveau ε, wenn die kleinste Singulärwert seiner Entfaltung mehr als ε² der quadrierten Energie trägt — dann kann keine Approximation mit abgesenktem Rang entlang dieses Modus den relativen Fehler ε erreichen. Das ist keine Aussage über einen bestimmten Algorithmus; es folgt aus dem Satz von Eckart–Young–Mirsky, angewandt auf die Modus-Entfaltung, und ist formatagnostisch: das Papier zeigt, dass die gemessenen Fehler erzwungener Ränge innerhalb weniger Prozent an diese untere Schranke heranreichen2. Diese Schranke gilt für Approximationen des gemessenen Tensors, die den Modusrang reduzieren. Sie beschränkt keine Methoden, die das Modell neu trainieren, die Darstellung ändern oder eine andere Qualitätsmetrik optimieren.

Warum das ein Anti-Hype-Vorschlagshammer ist

Für einen Kompressor, der diese gemessenen KV-Tensoren direkt mit reduziertem Kopf- oder gruppiertem Layer-Rang approximiert, macht die Ablation des Papiers die Kosten konkret: Den Layer-Gruppen-Rang nur eine Stufe unter Vollrang zu erzwingen (auf Mistral-Gruppen 4 → 3) verdreifacht fast den Key-Rekonstruktionsfehler, und die Halbierung des Kopf-Rangs erzeugt einen noch größeren Sprung beim gemessenen Key-Fehler. Schlimmer: Die erzwungenen Konfigurationen verbessern sich kaum, wenn das Speicherbudget von 2x- auf 4x-Kompression gelockert wird — der abgeschnittene Rang, nicht das Budget, setzt den Fehlerfloor, und zusätzlicher Speicher kauft ihn nicht zurück3.

Die gemessenen flachen Spektren erklären den hohen Fehlerfloor dieser Niedrigrang-Rekonstruktionen. Sie belegen nicht die Ursache des Qualitätsverlusts eines beliebigen Produkts. Für vergleichbare Tensordekomposition der untersuchten Caches folgt:

  1. Entlang Tokens und Features komprimieren, Keys zuerst. Dort liegt die Niedrigrang-Struktur.
  2. Kopf- und gruppierten Layer-Rang bei den getesteten Rekonstruktionsfehlerschwellen nicht reduzieren; die gemessenen Spektren setzen für diese Tensoren einen Fehlerfloor.
  3. Keys und Values brauchen getrennte Rangbudgets — das Value-Spektrum ist überall flacher, und beide zusammen zu budgetieren verschwendet Key-Kompressibilität (eine „K/V-Asymmetrie", die das Papier auf die Rollen der Projektionsmatrizen W_V und W_K zurückführt: Values müssen Energie über Features streuen, um Inhalt unter beliebigen Attention-Gewichtungen zu erhalten; Keys brauchen nur wenige diskriminative Richtungen zum Scoring4).
  4. Keys vor RoPE komprimieren, nicht danach. Die positionsabhängige Rotation des Rotary Embedding flattet die Token- und Feature-Spektren; Post-RoPE-Keys verlieren 41 %–64 % ihrer Pre-RoPE-Kompressibilität auf beiden Modellen4.

Die Einschränkung schneidet in beide Richtungen, und das Papier nennt sie selbst: Alle Rekonstruktionssweeps nutzen eine einzige Sequenzlänge (1.024 Tokens, WikiText-2-Validierungsabschnitte), die Spektren decken zwei Modelle ab, und „praktisch vollrangig" ist eine Aussage auf praktischen Fehlerniveaus, keine ewige Konstante. Extreme Toleranzen, andere Architekturen, deutlich längere Kontexte können abweichen; ob die Token-Struktur beim inkrementellen Generieren besteht, bleibt ausdrücklich offen3. Vollrangig bei 1 % Fehler ist nicht vollrangig bei 50 % Fehler. Nachgelagerte Modellqualität, andere Architekturen und Methoden brauchen eigene Messungen; diese Rekonstruktionsschranke allein bestätigt oder widerlegt kein Produktversprechen.

Tucker gewinnt, weil es die vollrangigen Modi in Ruhe lassen kann

Angesichts der Spektren ist der Formatvergleich fast deterministisch. Das Papier fittet Tucker, CP, Tensor Train und t-SVD auf jeden Layer beider Modelle bei gleichem Speicher über Kompressionsverhältnisse von 2x bis 5x. Ergebnis: Tucker erreicht den niedrigsten Rekonstruktionsfehler bei jedem Verhältnis auf beiden Modellen (CP wurde auf Llama-2-13B weggelassen, weil das Fitten bei gleichem Speicher den Speicher des Versuchs-GPUs überstieg; die Llama-Reihenfolge ist Tucker, dann t-SVD, dann TT)5.

Der Grund ist strukturell, kein Tuning-Zufall. Tuckers multilineare Ränge sind pro Modus und unabhängig wählbar — der Allokator kann die Kopf- und Layer-Ränge auf Vollrang pinnen, für diese Faktoren nichts speichern (ein vollrangiger Tucker-Faktor ist die Identität und kann aus dem Speicher entfallen) und das gesamte Budget auf die Token- und Feature-Achsen verwenden, wo der Abfall wirklich liegt. CP verwendet eine gemeinsame Komponentenzahl über die Modi, Tucker kann die Ränge dagegen separat wählen. Eine CP-Komponentenzahl bedeutet nicht automatisch einen reduzierten Matrixrang des Kopf-Modus. Tensor Train verwendet gekoppelte Bond-Ränge, t-SVD schneidet Slices im Frequenzraum ab. Bei den untersuchten Speicherbudgets hatten diese Formate höheren Rekonstruktionsfehler als Tucker; das Experiment beweist nicht, dass sie in jeder Implementierung die Kopf-Achse abschneiden müssen.

Und das Papier lässt die Empfehlung „pinne einfach die vollrangigen Modi" nicht als Folklore stehen: Theorem 5.1, das Mode-Pinning-Theorem, liefert eine hinreichende Bedingung, allein aus den gemessenen Modus-Spektren prüfbar (ein Worst-Case-Argument über Austauschkosten gegen die Restenergie des Modus), unter der der optimale Lagrange-Rangallokator einen Modus nachweisbar auf Vollrang hält. Auf jeder getesteten Kopf-Modus-Konfiguration beider Modelle über die Verhältnisse 2x–5x hält das Zertifikat — das Papier meldet es erfüllt auf allen 160 Mistral- und allen 224 Llama-Kopf-Konfigurationen, plus der großen Mehrheit der Layer-Gruppen-Zellen6. Das ist der Teil, den Praktiker verinnerlichen sollten: Man kann die Modus-Spektren des eigenen Modells messen (eine SVD pro Entfaltung, billig) und im Voraus zertifizieren, welche Achsen ein Rangallokator sich weigert abzuschneiden — bevor man irgendetwas fittet.

Keys und Values wollen verschiedene Formate

Der Formatsweep des Papiers birgt eine weitere Asymmetrie, die erst gegen zweidimensionale Baselines sichtbar wird. Gegen Per-Kopf-SVD und gegen Cross-Layer-2D-Faktorisierungen im Stil von Palu und xKV spaltet sich die bevorzugte Darstellung an der K/V-Grenze7:

  • Keys: 2D-Entfaltungen gewinnen. Der Key-Tensor fällt entlang beider großer Achsen (Tokens und Features) stark ab, also ist eine Matrixfaktorisierung, die ihr gesamtes Budget auf diese beiden Achsen konzentriert, am effizientesten. Cross-Layer-2D (xKV-Stil) ist ab 3x am niedrigsten.
  • Values: vierwegiger Tucker gewinnt. Das Value-Feature-Spektrum ist nahezu flach, 2D-Faktorisierungen stoßen an ihren Fehlerfloor; Tucker umgeht ihn, indem er kompakte Basen über Köpfe teilt und unabhängige Ränge pro Modus vergibt. Tucker-4D schlägt Tucker-3D und beide 2D-Baselines bei jedem getesteten Verhältnis auf Values.

Die praktische Lehre ist nicht „Tucker überall", sondern: das optimale Cache-Format hängt von der Achse und vom Tensor ab — 2D für Keys, 4-Wege-Tucker für Values, in jedem Fall vollrangig gepinnte Köpfe und Layer. Eine einzige Kompressorarchitektur, identisch auf K und V angewandt, lässt in einem der beiden Qualität liegen.

Die Mathematik modellieren: Mixed-Rank-Spektren und die Kosten der Kompression eines vollrangigen Modus

Die Spektrumstabellen des Papiers sind auf echten Caches aus zwei Checkpoints gemessen. Mistral-7B-v0.3 liegt offen auf HuggingFace, seine Zahlen sind damit grundsätzlich für Leser nachrechenbar (das Papier verweist auch auf sein Code-Repositorium)8; Llama-2-13B (meta-llama/Llama-2-13b-hf) liegt hinter Metas Lizenzvereinbarung — gegated, „aus öffentlichen Gewichten nachrechenbar" gilt also nur für Leser mit genehmigtem Zugang, und das sagen wir klipp und klar, statt so zu tun, als sei es offen.

Um den Mechanismus ohne den Download mehrerer GB Gewichte sichtbar zu machen, hier ein synthetischer KV-ähnlicher Tensor, gebaut mit der Dichotomie des Papiers: Niedrigrang-Struktur entlang Tokens und Features, vollrangiges (flachspektrumiges) Kopf- und Layer-Mixing. Alles Folgende ist eine Simulation — sie isoliert die Lineare Algebra, sie reproduziert nicht die gemessenen Zahlen des Papiers.

python
import numpy as np
rng = np.random.default_rng(42)
 
# ---------- (a) synthetischer KV-Cache-ähnlicher 4-Wege-Tensor ----------
H, S, F, L = 8, 512, 128, 4      # Köpfe, Tokens, Features, Layer-Gruppen (Mistral-7B-v0.3-ähnlich)
r_token, r_feat = 16, 24        # Niedrigrang-Struktur Token/Feature; Köpfe/Layer vollrangig
T = np.empty((H, S, F, L))
for h in range(H):
    for l in range(L):
        Ut = rng.standard_normal((S, r_token)); Wt = rng.standard_normal((F, r_feat))
        C  = rng.standard_normal((r_token, r_feat)) / (1.0 + np.arange(r_token)[:, None])**2
        T[h, :, :, l] = (Ut @ C @ Wt.T) * (1.0 + 0.3 * rng.standard_normal())
T += 0.01 * rng.standard_normal(T.shape)
 
def rel_err(X, T): return np.linalg.norm(X - T) / np.linalg.norm(T)
 
def unfold(T, ax):
    return np.moveaxis(T, ax, 0).reshape(T.shape[ax], -1)
 
# ---------- (b) SVD-Spektren pro Modus: die zwei Klassen ----------
print(f"tensor shape (heads, tokens, features, layer groups) = {T.shape}")
for name, ax in [('heads', 0), ('tokens', 1), ('features', 2), ('groups', 3)]:
    s = np.linalg.svd(unfold(T, ax), compute_uv=False)
    e = s**2 / (s**2).sum()
    cum = np.cumsum(e)
    r95, r99 = int(np.searchsorted(cum, 0.95) + 1), int(np.searchsorted(cum, 0.99) + 1)
    print(f"{name:9s} dim={T.shape[ax]:4d}  SV/SV1[:4]={np.round(s[:4]/s[0], 3)}  "
          f"rank(95%)={r95:3d}  rank(99%)={r99:3d}  min-SV energy={e[-1]:.5f}")
text
tensor shape (heads, tokens, features, layer groups) = (8, 512, 128, 4)
heads     dim=   8  SV/SV1[:4]=[1.    0.946 0.942 0.861]  rank(95%)=  8  rank(99%)=  8  min-SV energy=0.07563
tokens    dim=512  SV/SV1[:4]=[1.    0.938 0.831 0.804]  rank(95%)= 36  rank(99%)= 69  min-SV energy=0.00000
features  dim=128  SV/SV1[:4]=[1.    0.933 0.866 0.818]  rank(95%)= 32  rank(99%)= 57  min-SV energy=0.00001
groups    dim=   4  SV/SV1[:4]=[1.    0.854 0.83  0.825]  rank(95%)=  4  rank(99%)=  4  min-SV energy=0.21968

Die letzte Spalte lesen. Die Kopf- und Layer-Entfaltungen brauchen ihre volle Dimension, um überhaupt 95 % der Energie zu erreichen — die kleinsten Singulärwerte tragen 7,6 % bzw. 22 % der Energie, jede Abschneidung unter Vollrang zahlt also sofort. Die Token- und Feature-Entfaltungen erreichen 95 % der Energie bei Rang 36 von 512 bzw. 32 von 128. Zwei Spektrumsklassen, exakt wie in Tabelle 1 des Papiers — hier per Konstruktion, dort per Messung.

Jetzt der Teil, der „warum ist die Kompression eines vollrangigen Modus nicht gratis" beantwortet: ein Speicher-gematchter Sweep von ST-HOSVD (sequenziell abgeschnittener Tucker) mit zwei Armen. Im gepinnten Arm bleiben Kopf- und Layer-Faktoren vollrangig — als weggelassene Identitätsfaktoren gespeichert —, und das Budget geht vollständig in die Token- und Feature-Ränge. Im erzwungenen Arm wird der Kopf-Rang zuerst halbiert (der „Köpfe mergen"-Zug), und der Allokator verteilt das frei gewordene Budget optimal. Beide Arme haben dasselbe Speicherbudget.

python
# ---------- (c) Tucker bei gleichem Speicher: Kopf-Modus gepinnt vs. halbiert ----------
def tucker_pin_tf(T, r_s, r_f):
    """ST-HOSVD, nur Token (Modus 1) und Feature (Modus 2) abgeschnitten; Köpfe+Layer voll."""
    M1 = np.transpose(T, [1, 0, 2, 3]).reshape(S, -1)
    U1 = np.linalg.svd(M1, full_matrices=False)[0][:, :r_s]
    core = (U1.T @ M1).reshape(r_s, H, F, L)
    M2 = np.transpose(core, [2, 0, 1, 3]).reshape(F, -1)
    U2 = np.linalg.svd(M2, full_matrices=False)[0][:, :r_f]
    c2 = (U2.T @ M2).reshape(r_f, r_s, H, L)
    X = np.transpose((U2 @ c2.reshape(r_f, -1)).reshape(F, r_s, H, L), [1, 2, 0, 3])
    X = (U1 @ X.reshape(r_s, -1)).reshape(S, H, F, L)
    return np.transpose(X, [1, 0, 2, 3])
 
def tucker_force_head(T, r_h, r_s, r_f):
    """Gleiches Budget, aber Kopf-Modus zuerst auf r_h abgeschnitten (Spektrum-Floor greift)."""
    M0 = T.reshape(H, -1)
    U0 = np.linalg.svd(M0, full_matrices=False)[0][:, :r_h]
    Tp = (U0.T @ M0).reshape(r_h, S, F, L)
    M1 = np.transpose(Tp, [1, 0, 2, 3]).reshape(S, -1)
    U1 = np.linalg.svd(M1, full_matrices=False)[0][:, :r_s]
    core = (U1.T @ M1).reshape(r_s, r_h, F, L)
    M2 = np.transpose(core, [2, 0, 1, 3]).reshape(F, -1)
    U2 = np.linalg.svd(M2, full_matrices=False)[0][:, :r_f]
    c2 = (U2.T @ M2).reshape(r_f, r_s, r_h, L)
    X = np.transpose((U2 @ c2.reshape(r_f, -1)).reshape(F, r_s, r_h, L), [1, 2, 0, 3])
    X = (U1 @ X.reshape(r_s, -1)).reshape(S, r_h, F, L)
    X = np.transpose(X, [1, 0, 2, 3])
    return np.einsum('ij,jsfl->isfl', U0, X)
 
orig = H * S * F * L
r_h = H // 2
print(f"\nmatchter Speicher-Sweep, Original = {orig:,} Skalare, Kopfdim {H} erzwungen auf {r_h}")
for ratio in (2, 4, 8):
    budget = orig / ratio
    best_p = best_f = None
    for r_s in range(32, S + 1, 16):
        rf = (budget - r_s * S) / (r_s * H * L + F)      # gepinnt: Kern + 2 Faktoren
        r_f = max(1, min(F, int(rf)))
        st = r_s * r_f * H * L + r_s * S + r_f * F
        if st > budget: continue
        e = rel_err(tucker_pin_tf(T, r_s, r_f), T)
        if best_p is None or e < best_p[0]: best_p = (e, (r_s, r_f), st)
    for r_s in range(32, S + 1, 16):
        for r_f in range(16, F + 1, 16):
            st = r_h * r_s * r_f * L + r_h * H + r_s * S + r_f * F  # + Kopffaktor
            if st > budget: continue
            e = rel_err(tucker_force_head(T, r_h, r_s, r_f), T)
            if best_f is None or e < best_f[0]: best_f = (e, (r_s, r_f), st)
    print(f"ratio {ratio:>2}x Budget {int(budget):>7,}:  gepinnt (H,L voll) Fehler {best_p[0]:.4f}  "
          f"Ränge {best_p[1]}  |  erzwungen head={r_h} Fehler {best_f[0]:.4f}  Ränge {best_f[1]}")
text
matched-storage sweep, original = 2,097,152 scalars, head dim 8 forced to 4
ratio  2x budget 1,048,576:  pinned (H,L full) err 0.0130  ranks (224, 128)  |  forced head=4 err 0.6222  ranks (400, 128)
ratio  4x budget 524,288:  pinned (H,L full) err 0.0411  ranks (128, 108)  |  forced head=4 err 0.6222  ranks (192, 128)
ratio  8x budget 262,144:  pinned (H,L full) err 0.0837  ranks (80, 82)  |  forced head=4 err 0.6224  ranks (112, 96)

Zwei Dinge fallen auf, beide spiegeln die Ablation aus Abschnitt 5.3 des Papiers auf echten Caches. Erstens: Pinning funktioniert — mit unangetasteten Kopf- und Layer-Modi steigt der Fehler sanft, wenn das Budget sinkt (1,3 % → 8,4 % von 2x bis 8x), weil das Budget nur Achsen abschneidet, die Abfallüberschuss haben. Zweitens: Der erzwungene Arm ist flach — 62,2 % Fehler bei jedem Budget, denn sobald der Kopf-Rang unter Vollrang liegt, ist die Energie der verworfenen Richtungen unwiederbringlich, egal wie viel Token- und Feature-Rang man mit dem freigemachten Budget kauft. Den Fehlerfloor setzt der Rang, nicht der Speicher — der Speicher-Regler arbeitet nicht mehr. Diese flache Linie ist die lineare-algebraische Signatur hinter jedem enttäuschenden Head-Mixing-Kompressor-Demo.

Eine Ehrlichkeitsanmerkung zur Simulation: Der erzwungene Arm profitiert hier leicht davon, dass das Kopf-Mixing eine orthogonal-artige Projektion ist, die die verlorene Energie über überlebende Richtungen verteilt. Echte Caches, deren Köpfe unabhängigen Inhalt tragen (die indexartige Definition des Papiers), erreichen denselben Floor über dieselbe Eckart–Young-Restenergie. Die Zahlen oben sind konstruktionsabhängig; die Form des Arguments — flacher Floor gegen sanft steigende Kurve — ist es nicht.

Ich habe eine Live-Messung einer echten KV-Entfaltung aus Mistral-7B-v0.3 erwogen (Range-Read der K-Projektion via safetensors, SVD eines Kurzprompt-Caches), aber verworfen: Der Checkpoint ist ein Multi-GB-Download für ein einzelnes illustratives Spektrum, und die gemessenen Tabellen des Papiers plus diese Simulation zeigen den Mechanismus bereits. Leser mit lokal gecachtem Modell können die Spektren des Papiers mit dem Code der Autoren reproduzieren8.

Was Montag damit anfangen kann

Für alle, die KV-Cache-Kompression bauen oder kaufen, übersetzt sich das Papier in eine kurze Checkliste:

  1. Fragen, welche Achsen der Kompressor abschneidet. Token-/Feature-Abschnitt ist spektral begründet; Kopf-/Layer-Abschnitt bei moderatem Fehler kämpft gegen einen vollrangigen Modus. Wenn ein „gratis 2x"-Angebot Köpfe oder Layer mischt: die Modus-Spektren verlangen.
  2. Die eigenen Spektren messen, bevor irgendwas getunt wird — das Mode-Pinning-Zertifikat ist mit einer SVD pro Modus-Entfaltung prüfbar, und andere Modelle, Kontexte und Layer-Gruppierungen können die beobachtete Dichotomie ändern. Das ist dieselbe „erst messen, dann tunen"-Disziplin wie beim Working-Set-Sizing für Prefix-Caches (siehe auch das KV-Cache-Glossar).
  3. Keys und Values getrennt budgetieren. Values brauchen grob den doppelten Token-Rang der Keys bei gleichem Fehler; ein gemeinsamer Rang verschwendet die eine Seite oder hungert die andere aus4.
  4. Keys vor RoPE komprimieren — 41 %–64 % der Key-Kompressibilität verdunsten nach der Rotation4.
  5. Die Speicherökonomie im Kopf behalten. KV-Cache-Kompression ist keine Ästhetikübung; Cache-Bytes sind der bindende Constraint für die Batchgröße und damit die Serving-Kosten — dieselbe HBM-Knappheits-Arithmetik, die eine glaubhafte 2x-Reduktion überhaupt erst wert macht.

Die gemessenen Spektren zeigen geeignete Ränge für diese zwei Modelle und die untersuchten Formate. Für das nächste Modell liefern sie eine Messmethode, keine Vorhersage. Nachgelagerte Qualität und Serving-Leistung müssen gesondert getestet werden.

Footnotes

  1. Rahul Krishnan und Volker Schulz, „Tensor Decomposition of Transformer Key-Value Caches: Spectral Structure and Format Comparison", arXiv:2609.28029 [math.NA], eingereicht am 23. September 2026 (18 Seiten, 3 Abbildungen, 8 Tabellen; eingereicht bei SIMAX): https://arxiv.org/abs/2609.28029 ↩ ↩2

  2. Papier Definition 3.1 und Abschnitt 3, Tabelle 1: Ein Modus ist „indexartig" auf Fehlerniveau ε, wenn der kleinste Singulärwert seiner Entfaltung allein mehr als ε² der quadrierten Energie trägt — dann erreicht keine rangabgeschnittene Approximation den relativen Fehler ε; die Definition folgt aus dem Satz von Eckart–Young–Mirsky (Abschnitt 5.3, Tabelle 7 zeigt die gemessenen Fehler erzwungener Ränge innerhalb weniger Prozent an dieser formatagnostischen unteren Schranke). Die Kopf-Modi brauchen bei beiden getesteten Schwellen Vollrang, während Token-/Feature-Modi substanzielle Reduktion erlauben, Keys mehr als Values. Layer-Spektren und Zertifikat gelten pro Gruppen-Tensor (benachbarte Layer gestapelt), nicht über alle 32 (Mistral, GQA: 8 KV-Köpfe, Kopfdimension 128) bzw. 40 (Llama-2-13B, MHA) Layer gleichzeitig. ↩ ↩2 ↩3

  3. Papier Abschnitt 5.3, Tabelle 6: Kopf- oder Layer-Rang unter Vollrang zu erzwingen erhöht den Fehler auf beiden Modellen bei jedem Verhältnis scharf; schon die mildeste Einschränkung verdreifacht fast den Key-Fehler; die erzwungenen Fehler rühren sich kaum, wenn das Verhältnis von 2x auf 4x gelockert wird — der Rang, nicht das Budget, setzt den Floor (auf Llama übersteigt allein ein Pin das Speicherziel; diese Zellen entfallen). Limitierungen aus Abschnitt 8: eine einzige Sequenzlänge (1024, WikiText-2-Validierungsabschnitte) in allen Rekonstruktionssweeps, zwei Modelle abgedeckt, CP auf Llama innerhalb der Versuchshardware nicht fittbar, Verhalten beim inkrementellen Generieren offen. Das Begleitpapier JoLT (arXiv:2607.12550) operationalisiert die Constraints in einen partiellen Tucker-Kompressor mit rotiertem Low-Bit-Residuum. ↩ ↩2

  4. Papier Abschnitte 6.1 und 7: Values erreichen bei jedem Verhältnis einen höheren Fehlerfloor als Keys, zurückgeführt auf die flacheren Spektren der Projektion W_V (die Energie über Featurerichtungen streuen muss, um Inhalt unter beliebigen Attention-Gewichtungen zu erhalten) gegenüber dem steil abfallenden W_K — Value-Token-Entfaltungen brauchen grob den doppelten Rang der Key-Token-Entfaltungen bei gleicher Schwelle (Charakterisierung des Papiers; von uns nicht aus Gewichten nachgerechnet). Post-RoPE-Keys verlieren 41 %–64 % ihrer Pre-RoPE-Kompressibilität auf beiden Modellen (Tabelle 8); Keys vor der Rotation komprimieren. ↩ ↩2 ↩3 ↩4

  5. Papier Abschnitt 4, Tabellen 2–3: Tucker am niedrigsten bei jedem Verhältnis auf beiden Modellen; Mistral-Reihenfolge Tucker, CP, t-SVD, TT; Llama-Reihenfolge Tucker, t-SVD, TT (CP entfallen — der speichergematchte CP-Rang überstieg den Gerätespeicher). Der Bereich 2x–5x ist der getestete Sweep bei gleichem Speicher. ↩

  6. Papier Abschnitt 5.4, Theorem 5.1 (Spektrum-Zertifikat für Vollrang-Erhalt) und numerische Verifikation: alle 160 getesteten Mistral- und alle 224 Llama-Kopf-Modus-Konfigurationen erfüllen das Zertifikat über Zielverhältnisse 2x–5x; das Layer-Gruppen-Zertifikat hält auf 240 von 256 Mistral- und 305 von 320 Llama-Zellen, und der Allokator behält den Vollrang auch auf den unzertifizierten Zellen — hinreichend, nicht notwendig. ↩

  7. Papier Abschnitt 5.2, Tabelle 5: gemeinsames K/V-Budget, Pre-RoPE-Keys, drei Prompt-Durchläufe, über Palu-artiges gruppiertes 2D, xKV-gestapeltes 2D, Tucker-3D und Tucker-4D — Keys gewonnen durch 2D (xKV ab 3x am niedrigsten), Values gewonnen durch Tucker-4D bei jedem Verhältnis auf beiden Modellen. ↩

  8. Der Reproducibility-Statement des Papiers verweist auf https://github.com/rahulk98/JoLT-Master-Thesis für Code und Daten. Mistral-7B-v0.3 ist offen unter https://huggingface.co/mistralai/Mistral-7B-v0.3 abrufbar; meta-llama/Llama-2-13b-hf verlangt das Annehmen der Meta-Lizenz und eine Zugangsfreigabe — gegated, für Leser ohne Freigabe also nicht testbar. ↩ ↩2