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.

Ling-3.1-flash: Gruppen-Routing und zwei unterschiedliche MLA-Caches

KDA-Zustand, gruppiertes MoE-Routing und MLA-Gewichtsabsorption von Ling-3.1-flash herleiten und erklären, warum Referenz- und komprimierter Serving-Cache abweichen.

8 Min. Lesezeitflozi00
aillmarchitecturelingkdamlamoekv-cacheinference

KI-Hinweis: Dieser Artikel wurde mit Unterstützung generativer KI erstellt. Redaktionell verantwortlich: Florian Zimmermeister (flozi00). Impressum und Kontakt.

Mit Stand vom 15. Oktober 2026 sind die Gewichte von inclusionAIs Ling-3.1-flash in 54 Safetensors-Shards herunterladbar; eine eigene Implementierung und Serving-Anleitungen liegen ebenfalls vor. Der Checkpoint kombiniert innerhalb jeder Gruppe von acht Schichten sieben Schichten mit Kimi Delta Attention (KDA) und eine mit Gated Multi-head Latent Attention (MLA). Ein wichtiger technischer Punkt: MLA allein legt das Cache-Layout noch nicht fest. Die veröffentlichte Referenz expandiert Keys und Values vor dem Cachen; ein Serving-Pfad mit MLA-Absorption kann stattdessen ihre gemeinsame latente Darstellung behalten.123

Dieser Guide prüft Checkpoint-Revision a4ccd6b45c002ddb236f9cb77d52cc427482bf19 und SGLang-Revision f2b73d4f9b4e64415b8d775b0f811c7801f1728b. Die folgenden Zahlen sind hergeleitete logische Nutzlasten, keine GPU-Messungen. Der vorhandene Kimi-K3-Guide behandelt ein anderes veröffentlichtes KDA-/MLA-Modell; Ling verwendet ein eigenes Schichtverhältnis, Positions-Encoding und Experten-Routing.

Zuerst die Konfiguration, dann die Schlagzeilenzahlen

Die Model Card bewirbt eine Million Kontexttokens. Die festgelegte config.json enthält dagegen max_position_embeddings: 262144, rope_scaling: null und RoPE-Theta 6 000 000. Auch das festgelegte SGLang-Cookbook nennt 262 144 als Kontextgrenze. Eine größere Kapazitätsangabe liefert weder eine ausführbare Anleitung zur Erweiterung noch einen Nachweis zuverlässiger Qualität bei langem Kontext. Dieser Artikel verwendet die veröffentlichte Konfiguration mit 262 144 Positionen.145

Formeln und Tabellen verwenden die internationale Zahlenschreibweise mit Kommas für Tausendergruppen und Punkten für Dezimalstellen.

Backbone-KonfigurationWert
Hidden-Breite / Backbone-Schichten4,096 / 72
KDA- / MLA-Schichten63 / 9
MLA-Indizes, ab null7, 15, 23, 31, 39, 47, 55, 63, 71
Anfängliche dichte FFNs / geroutete FFNs4 / 68
Geroutete / ausgewählte / geteilte Experten512 / 8 / 1
Zwischenbreite dicht / pro Experte10,240 / 1,280
Attention-Heads64
KDA-Key-/Value-Head-Breite / kurze Faltung128 / 4
Latenter MLA-Query-Rang / KV-Rang1,536 / 512
MLA-Key-Breite ohne Rotation / mit Rotation / Value-Breite pro Head128 / 64 / 128
Vokabular / geteilte Eingabe-Ausgabe-Embeddings157,184 / false
Zusätzliche MTP-Schichten1

Die Werte stammen aus der Konfiguration und dem Code zur Schichtauswahl. Die ersten vier Schichten behalten KDA als Token-Mixer, verwenden aber dichte Feed-forward-Netze. Spätere Schichten setzen unabhängig davon, ob KDA oder MLA Tokens mischt, MoE ein. Die zusätzliche MTP-Schicht liegt außerhalb des Backbones mit 72 Schichten und verwendet in der Referenzimplementierung MLA.42

KDA ersetzt eine Token-Liste durch eine rekurrente Matrix

Jede KDA-Schicht projiziert einen Hidden-Stream der Form [B,T,4096][B,T,4096] in Query-, Key- und Value-Streams der Breite 64×128=819264\times128=8192. Jede Projektion durchläuft eine eigene kausale kurze Faltung der Breite vier mit SiLU-Aktivierung. Nach dem Umformen besitzen die Streams die Form [B,T,64,128][B,T,64,128]. Der KDA-Kernel normalisiert Queries und Keys, wendet kanalabhängiges Beibehalten und ein Delta-Regel-Update an und liest anschließend aus einer rekurrenten Matrix pro Head. Ausgabenormalisierung und ein Sigmoid-Gate liegen vor der Rückprojektion auf Breite 4 096.26

Das Delta-Update korrigiert die Vorhersage des Zustands für den aktuellen Key in Richtung des aktuellen Values, statt lediglich ein unkorrigiertes äußeres Produkt von Key und Value zu addieren. Die Konfiguration aktiviert das sichere Forget-Gate mit der unteren Log-Retentionsgrenze −5-5. Eine begrenzte Abklingrate pro Schritt belegt weder verlustfreie Speicherung noch beliebigen Abruf der gesamten Historie. KDAs Zustandsform bleibt bei wachsender Kontextlänge gleich; die eingestreuten MLA-Schichten behalten einen nach Sequenzpositionen indizierten Cache.

Mit einer FP32-Matrix der Form [64,128,128][64,128,128] pro KDA-Schicht benötigen 63 Schichten 252 MiB pro Sequenz. SGLang verwendet standardmäßig FP32 für den zeitlichen Zustand; Konfiguration oder Umgebungsvariablen können diesen Datentyp ändern. Gezählt wird eine aktive Matrix pro Schicht über die vollständige Head-Menge. Faltungsbuffer, Präfix-Checkpoints, Zustände für spekulative Rollbacks, Allokations-Padding und Replikation kommen hinzu.7

Mrecurrent=63×64×128×128×4=264,241,152 bytes=252 MiB.M_{\rm recurrent}=63\times64\times128\times128\times4 =264,241,152\ \text{bytes}=252\ \text{MiB}.

Der expandierte MLA-Referenzpfad

Pro MLA-Schicht komprimiert der Query-Pfad die Breite 4 096 auf 1 536, wendet RMSNorm an und projiziert anschließend auf 64×19264\times192 Query-Komponenten. Jeder Head wird in 128 nicht rotierte und 64 rotierte Komponenten geteilt. Eine separate Projektion erzeugt einen KV-Latentvektor mit 512 Komponenten und einen gemeinsamen Positions-Key mit 64 Komponenten. Der normalisierte Latentvektor wird zu 64 Sätzen mit je 128 nicht rotierten Key- und 128 Value-Komponenten expandiert. RoPE wirkt auf die rotierenden Query-/Key-Komponenten; der Positions-Key wird zwischen Heads geteilt.42

Die Referenz verkettet nicht rotierte und rotierte Keys und ruft past_key_values.update mit expandierten K:[B,64,T,192]K:[B,64,T,192] und V:[B,64,T,128]V:[B,64,T,128] auf. Das ist direkt in BailingMoeV3MultiLatentAttention.forward zu sehen. Wer nur kv_lora_rank: 512 liest und einen Request-Cache der Breite 512 annimmt, übersieht sowohl diese Expansion als auch den Positions-Key.

Der Attention-Skalierungsfaktor beträgt 1/1921/\sqrt{192}. Nach der Attention erzeugt eine separate Projektion des aktuellen Hidden-Vektors ein Sigmoid-Gate pro Head. Dieses multipliziert dessen Ausgabe mit 128 Komponenten vor der abschließenden dichten Projektion. Es ist ein Ausgabe-Gate, kein Gate zur Auswahl gecachter Tokens oder Experten. Die Konfiguration setzt use_mla_nope: false; der Positions-Key bleibt deshalb Bestandteil des logischen Caches.24

Warum Gewichtsabsorption dieselbe Attention-Funktion erhält

Sei ct∈R512c_t\in\mathbb{R}^{512} der normalisierte Latentvektor an Cache-Position tt. Für Head ii wird die latente Aufwärtsprojektion in WK,i,WV,i∈R128×512W_{K,i},W_{V,i}\in\mathbb{R}^{128\times512} geteilt. rt∈R64r_t\in\mathbb{R}^{64} bezeichnet den rotierten Positions-Key. Für die aktuelle Query gelten die Komponenten qiN∈R128q_i^N\in\mathbb{R}^{128} und qiR∈R64q_i^R\in\mathbb{R}^{64}. Der kausale Score lautet:

ℓi,t=(qiN)⊤WK,ict+(qiR)⊤rt192.\ell_{i,t}=\frac{(q_i^N)^\top W_{K,i}c_t+(q_i^R)^\top r_t}{\sqrt{192}}.

Das Assoziativgesetz verschiebt die nicht rotierende Key-Aufwärtsprojektion von jedem gecachten Token zur aktuellen Query. Definiert wird q~i=WK,i⊤qiN∈R512\widetilde q_i=W_{K,i}^{\top}q_i^N\in\mathbb{R}^{512}. Derselbe Score ergibt sich aus der verketteten Query [q~i;qiR][\widetilde q_i;q_i^R] und dem gemeinsamen gecachten Key [ct;rt][c_t;r_t], jeweils mit Breite 576. Nach demselben maskierten Softmax erlaubt die Linearität, die Value-Aufwärtsprojektion hinter die gewichtete Summe der Latentvektoren zu verschieben:

ai,t=softmax⁡t(ℓi,t+Mt),oi=∑tai,tWV,ict=WV,i(∑tai,tct).a_{i,t}=\operatorname{softmax}_{t}(\ell_{i,t}+M_t),\qquad o_i=\sum_t a_{i,t}W_{V,i}c_t =W_{V,i}\left(\sum_t a_{i,t}c_t\right).

Der Cache kann deshalb 512 latente plus 64 Positionskomponenten pro Token und MLA-Schicht behalten und den Latentvektor selbst als Attention-Value verwenden. Das Ausgabe-Gate pro Head wirkt weiterhin nach der entsprechenden Value-Projektion. Dies ist eine algebraische Umorganisation von MLA, keine näherungsweise Token-Eviction. Endliche Akkumulationsgenauigkeit und Quantisierung können numerische Abweichungen verursachen; bitweise Gleichheit ist damit nicht belegt.

SGLangs Ling-MLA-Klasse erbt die DeepSeek-MLA-Implementierung einschließlich der absorbierten Ausführung. Ihr MLA-Attention-Objekt verwendet einen KV-Head, Key-Breite kv_lora_rank + qk_rope_head_dim und Value-Breite kv_lora_rank; MLATokenToKVPool reserviert den gemeinsamen Latent-/Positionsbuffer. Der Laufzeit-Dispatch kann unterschiedliche Prefill- und Decode-Implementierungen verwenden. Temporäre expandierte Tensoren und Workspaces müssen deshalb separat eingeplant werden.683

Zwei Cache-Budgets für einen Checkpoint

Angenommen werden BF16-Werte im KV-Cache, eine Sequenz, alle neun MLA-Backbone-Schichten und eine logische Kopie über das vollständige Modell. Keine der Formeln enthält KDA-Zustand, Padding oder Workspaces. Die absorbierte Darstellung benötigt keinen zweiten unabhängigen Value-Buffer: Ihr Value ist ein Ausschnitt des gecachten Latentvektors.

Mexpanded=9×64×(192+128)×2T=368,640T bytes,M_{\rm expanded}=9\times64\times(192+128)\times2T=368,640T\ \text{bytes}, Mabsorbed=9×(512+64)×2T=10,368T bytes.M_{\rm absorbed}=9\times(512+64)\times2T=10,368T\ \text{bytes}.
Gecachte Positionen TTExpandierter Referenz-KVAbsorbierter logischer KV
8,1922.8125 GiB0.0791015625 GiB
32,76811.25 GiB0.31640625 GiB
262,14490 GiB2.53125 GiB

Das Verhältnis beträgt ungefähr 35,56 für diesen KV-Anteil, nicht für den gesamten Speicher oder die Laufzeit. Andere Cache-Datentypen, Tensor-Parallel-Replikation oder -Sharding und Seitenlayouts verändern die tatsächlichen Geräteallokationen. Parallele Sequenzen und gespeicherte KDA-Checkpoints erhöhen die Kosten; Präfix-Wiederverwendung muss rekurrente und MLA-Zustände an derselben Token-Grenze wiederherstellen. Siehe den KV-Cache-Guide.

Die Tabelle enthält die zusätzliche MTP-Schicht nicht. Die Referenz gibt dieser Schicht ein weiteres MLA-Modul. Spekulatives Decoding benötigt außerdem Verwaltung für Draft-Cache und Verifikation. Die Zählung von 72 Backbone-Schichten allein ergibt kein vollständiges Serving-Speicherbudget.2

MoE-Auswahl beschränkt zuerst die Gruppen

Für den zusammengefassten Hidden-Stream X:[BT,4096]X:[BT,4096] berechnet der Referenz-Router FP32-Logits für 512 Experten und wendet Sigmoid an. Für die Auswahl kommt der gespeicherte Korrektur-Bias hinzu. Die Experten werden dann in acht Gruppen mit je 64 Experten geteilt. Der Gruppenscore ist die Summe ihrer beiden höchsten Experten-Scores mit Bias. Vier Gruppen bleiben übrig; aus ihren 256 Kandidaten werden acht Experten ausgewählt. Dies ist keine unbeschränkte globale Top-8-Auswahl.2

p=σ(XWr⊤),s=p+b,Gj=sumTop2⁡(sj,1:64),J=Top4⁡(G),S=Top8⁡(s∣J),p=\sigma(XW_r^\top),\quad s=p+b,\quad G_j=\operatorname{sumTop2}(s_{j,1:64}),\quad J=\operatorname{Top4}(G),\quad S=\operatorname{Top8}(s\mid J), αe=2.5pe∑k∈Spk+10−20,y=Eshared(x)+∑e∈SαeEe(x).\alpha_e=2.5\frac{p_e}{\sum_{k\in S}p_k+10^{-20}},\qquad y=E_{\rm shared}(x)+\sum_{e\in S}\alpha_eE_e(x).

Die Mischung verwendet die ursprünglichen Sigmoid-Scores ohne Auswahl-Bias und den Routing-Skalierungsfaktor 2,5. Die gerouteten Gewichte summieren sich deshalb näherungsweise auf 2,5 statt auf eins; der geteilte Experte wird separat addiert. Logische Expertengruppen belegen weder eine physische Zuordnung zu acht GPUs noch gleichmäßige Auslastung im Betrieb. Der LFM2.5-Guide erklärt die Auswahl mit Bias ohne diese Gruppenbeschränkung.

Auch Aktivierungsdetails sind relevant. Die Konfiguration gibt Clipping-Grenzen für geroutete Experten in den Schichten 65–71 und geteilte Experten in den Schichten 64–71 vor. SGLang setzt diese Grenzen in seinen Experten- und Shared-MLP-Pfaden um. Der Shared-Pfad begrenzt das aktivierte Gate nach oben auf 10 und den anderen multiplikativen Zweig auf [−10,10][-10,10]. Diese harten Begrenzungen sind Teil der Laufzeitfunktion; eine generische unveränderte SwiGLU-Implementierung sollte nicht als gleichwertig angenommen werden.46

Das veröffentlichte Referenz-MLP verwendet diese schichtweisen Clipping-Listen nicht, SGLang dagegen schon. Die Cache-Herleitung vergleicht Attention-Darstellungen; sie belegt keine identischen Ausgaben des vollständigen Modells über diese Engines hinweg.26

Grenzen für den Produktivbetrieb

Der Checkpoint spezifiziert blockweise FP8-E4M3-Gewichte mit 128×128128\times128-Skalierungsblöcken und dynamischer Aktivierungsquantisierung sowie explizite Ausnahmen für bestimmte Module. Der Safetensors-Index meldet 573 753 281 152 Tensor-Bytes, ungefähr 534,35 GiB, über die veröffentlichten Dateien. Darin stecken Checkpoint-Tensoren und Skalierungsdaten; es ist keine Messung maximaler VRAM-Belegung. Die Model-Card-Angaben von 560B insgesamt und 25B aktiven Parametern ersetzen nicht die Prüfung tatsächlich gespeicherter Tensoren, MTP-Gewichte und Laufzeitallokationen.491

Das SGLang-Cookbook kennzeichnet H200- und GB300-Rezepte als verifiziert, mehrere andere Hardware-Rezepte sowie getrennte Prefill-/Decode-Bereitstellung dagegen als unverifiziert. Diese Unterschiede sind wichtiger, als jeden dokumentierten Befehl als getestete Produktivkonfiguration zu behandeln. Außerdem deaktiviert es Prefill-Kontextparallelität für diesen KDA-Pfad. Image-Digest, Laufzeit- und Modellrevision müssen festgelegt, eigener Code und Abhängigkeiten geprüft und Cache-Layout, Ausrichtung der Präfixzustände, spekulative Akzeptanz, Latenz und Genauigkeit am vorgesehenen Workload verifiziert werden.5

Hier dient weder eine Geschwindigkeitsangabe des Anbieters noch ein Benchmark-Score als Beleg für diese Mechanismen. Für den Artikel wurde keine Modellinferenz ausgeführt. Die Algebra erklärt die Speichermöglichkeit; die Codeprüfung identifiziert die entsprechenden Pfade. Ein Deployment braucht weiterhin Messungen zur Validierung der gewählten Kernel, Präzision und Kontextlänge.

Primärquellen

Footnotes

  1. Ling-3.1-flash model card at a4ccd6b45c002ddb236f9cb77d52cc427482bf19. ↩ ↩2 ↩3

  2. Released custom model implementation at the same revision: BailingMoeV3MultiLatentAttention, BailingMoeV3KimiDeltaAttention, BailingMoeV3Gate, BailingMoeV3MTPLayer. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  3. SGLang cache allocation, MLATokenToKVPool, at the same revision. ↩ ↩2

  4. Released checkpoint configuration at the same revision. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  5. SGLang Ling-3.1-flash deployment cookbook, pinned to the inspected runtime revision. ↩ ↩2

  6. SGLang Bailing implementation at f2b73d4f9b4e64415b8d775b0f811c7801f1728b. ↩ ↩2 ↩3 ↩4

  7. SGLang Kimi-linear state shapes and dtypes at the same revision. ↩

  8. SGLang DeepSeek MLA definition and absorbed forward methods, at that runtime revision. ↩

  9. Safetensors index at the same revision. ↩