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.

Ripple-65B: Embedding-Value-Residuals und hybride Attention

Ripples veröffentlichten Value-Residual-Mix, PeriNorm, lokales RoPE/globales NoPE und Cache-Verhalten nachvollziehen. Ein Attention-Fenster von tatsächlicher KV-Allokation trennen.

6 Min. Lesezeitflozi00
aiarchitecturerippleattentionkv-cacheinference
Direkt zum Fachartikel
Sehen · ausprobieren · verstehen

Ripple: ein Embedding-Ausgangszustand, eigene Schicht-Values

Das skalierte Eingabe-Embedding vor jeder schichtspezifischen V-Projektion beimischen. Value-Mix, Ausgabegate und KV-Speicher trennen.

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

Schritt 1 / 4Embeddings statt Erstschicht-V wiederverwenden

Der skalierte Embedding-Ausgangszustand bleibt für aktuelle Eingabepositionen über die Tiefe fest. Ein Skalar je Schicht interpoliert ihn vor der V-Projektion mit dem aktuellen normierten Zustand.

ArchitekturAktueller SchrittBaustein anklicken, um ihn zu erklären
Skaliertes Token-Embedding
Form [B,T,5120]. embed_scale vor dem gemeinsamen Ausgangszustand anwenden.
Normierter Schichtzustand
Aktuelles Pre-Attention-RMSNorm-Ergebnis; ändert sich mit Tiefe und Kontext.
Gelernter skalarer Mix
(1−α) Embedding + α aktueller Zustand; α = Sigmoid eines Parameters pro Schicht.
  1. Skaliertes Token-Embedding Gelernter skalarer Mix
    gleicher Ausgangszustand über Tiefe
  2. Normierter Schichtzustand Gelernter skalarer Mix
    aktueller Value-Inhalt
Das solltest du mitnehmen

Embedding-basierter Value-Mix ändert den Inhaltsfluss, nicht die Eigenständigkeit jedes Schicht-KV-Caches.

Mechanismusübersicht einer Schicht; wiederholte lokale/globale Schichten sind gruppiert. Keine Qualitäts- oder Latenzmessung. Cache-Aussagen betreffen den gepinnten HF-Referenzzweig und Transformers v4.57.6, nicht jede Engine.

Begriffe und vollständiger Ablauf
Value-Mix
Eine konvexe Interpolation vor der schichtspezifischen V-Projektion.
Lesefenster
Positionen, die eine Query lesen darf; allein keine Speicher-Eviction-Strategie.
  1. Embeddings statt Erstschicht-V wiederverwenden

    Der skalierte Embedding-Ausgangszustand bleibt für aktuelle Eingabepositionen über die Tiefe fest. Ein Skalar je Schicht interpoliert ihn vor der V-Projektion mit dem aktuellen normierten Zustand.

  2. Eigene Schicht-Values projizieren und speichern

    Q/K nutzen den aktuellen Zustand. V nutzt den Mix und in jeder Schicht eine eigene Matrix. Der gemeinsame Ausgangszustand teilt deshalb keine projizierten KV-Caches.

  3. Lesemaske von Eviction trennen

    Die lokale Maske erlaubt nur 1.024 Positionen; der unkonfigurierte DynamicCache der HF-Referenz behält aber die volle Historie. Kompakter Speicher braucht eine Implementierung mit korrekten Offsets.

  4. Ein anderes Ausgabegate anwenden

    Das koordinatenweise Ausgabe-Sigmoid ist eingabeabhängig, anders als der gelernte skalare Value-Mix. PeriNorm normalisiert den Attention-Zweig vor der Residualaddition.

Alle Verbindungen

  • Skaliertes Token-Embedding → Gelernter skalarer Mix: gleicher Ausgangszustand über Tiefe
  • Normierter Schichtzustand → Gelernter skalarer Mix: aktueller Value-Inhalt
  • Normierter Schichtzustand → Aktuelle Q und K: aktuelle Queries und Keys
  • Gelernter skalarer Mix → Schichtspezifische V-Projektion: eigene V-Matrix
  • Schichtspezifische V-Projektion → Schichtspezifischer K/V-Cache: gemischte Values cachen
  • Aktuelle Q und K → Schichtspezifischer K/V-Cache: Keys cachen
  • Aktuelle Q und K → Kausaler Attention-Read: Query-Vektor
  • Schichtspezifischer K/V-Cache → Kausaler Attention-Read: erlaubte K/V-Positionen
  • Kausaler Attention-Read → Gaten, projizieren, nachnormieren: Attention-Ergebnis
Du bestimmst das Tempo. Pausiere jederzeit oder wähle einen Schritt aus.

Ein veröffentlichtes dichtes Modell, kein Benchmark-Argument

Ripple-65B Preview ist Ricursive Intelligences veröffentlichtes dichtes, textbasiertes Modell. Der instruction-getunte Checkpoint besitzt BF16-Gewichte, eine Apache-2.0-Lizenz und eigenen Inferenzcode; zusätzlich bietet der Herausgeber eine separate NVFP4-Variante, einen Basis-Checkpoint und einen DFlash2-Draft an.1 Dieser Artikel untersucht das BF16-Instruct-Repository mit Revision d91aa65807bcfda98d964135230cd756be291774, geprüft am 6. November 2026.

Das interessante Architekturdetail ist ein aus Eingabe-Embeddings gespeister Value-Residual-Pfad, neben PeriNorm, gegateter Attention und einem lokalen/globalen Attention-Mix. Im veröffentlichten HF-Code werden nicht direkt die V-Tensoren der ersten Schicht wiederverwendet. Auch das Cache-Verhalten hängt von der Implementierung ab, nicht nur vom konfigurierten Fenster.2 Hier wurden keine Modellqualitäts-, GPU-Durchsatz- oder Peak-Speicher-Benchmarks ausgeführt.

Breite, Tiefe und Attention-Anordnung

Der Checkpoint hat 80 Schichten, Residualbreite 5.120, dichte FFN-Zwischenbreite 40.960, 80 Query-Heads, acht KV-Heads und Head-Dimension 128. Die Q-/Attention-Ausgabebreite beträgt daher 10.240, doppelt so viel wie die Residualbreite; die Head-Dimension darf nicht aus 5.120/80 abgeleitet werden. Je zehn Query-Heads teilen einen KV-Head. Das Vokabular umfasst 100.352 Tokens; Ein- und Ausgabe-Embeddings teilen ihre Gewichte nicht.3

Vier lokale Schichten gefolgt von einer globalen wiederholen sich sechzehnmal: 64 Sliding-Attention- und 16 Full-Attention-Schichten. Das lokale Fenster umfasst 1.024 Positionen einschließlich der aktuellen Position. Lokale Q/K erhalten headweise RMSNorm und RoPE über die volle Head-Breite mit Basis 10.000. Globale Q/K erhalten RMSNorm, aber kein RoPE; ihre Maske bleibt kausal. NoPE ist keine bidirektionale Attention.32 Zum Vergleich: Beams lokale/globale Positionsaufteilung und der Attention-Walkthrough.

Wo das Value-Residual tatsächlich einsetzt

ete_t sei das Token-Embedding nach der konfigurierten Embedding-Skalierung, hℓ,th_{\ell,t} der aktuelle vor der Attention normalisierte Residualzustand einer Schicht. Die gepinnte Konfiguration setzt den Embedding-Multiplikator auf ungefähr 71,55417528, also 5120\sqrt{5120}. Das Modell legt seinen Value-Residual-Ausgangszustand vor der Decoder-Schleife fest und übergibt denselben Ausgangszustand an jede Schicht.32

Jede Schicht lernt einen skalaren Parameter λℓ\lambda_\ell. Q und K entstehen aus hℓ,th_{\ell,t}; die Eingabe ihrer eigenen V-Projektion lautet dagegen:

αℓ=σ(λℓ),uℓ,t=(1−αℓ)et+αℓhℓ,t,vℓ,t=WℓVuℓ,t.\alpha_\ell=\sigma(\lambda_\ell),\qquad u_{\ell,t}=(1-\alpha_\ell)e_t+\alpha_\ell h_{\ell,t}, \qquad v_{\ell,t}=W^V_\ell u_{\ell,t}.

Die Orientierung folgt lerp(seed, current, blend) im Code: Ein kleines α\alpha bevorzugt den Embedding-Ausgangszustand, ein großes den aktuellen normalisierten Zustand. Weil WℓVW^V_\ell linear ist, entspricht das (1−αℓ)WℓVet+αℓWℓVhℓ,t(1-\alpha_\ell)W^V_\ell e_t+\alpha_\ell W^V_\ell h_{\ell,t}. Es entspricht nicht dem Beimischen von W0VetW^V_0 e_t aus der ersten Attention-Schicht; jede Schicht hat ihre eigene Projektion.

Damit erhält der Value-Inhaltspfad direkten Zugriff auf eine über die Tiefe unveränderte lexikalische Darstellung, während Queries und Keys weiterhin vom kontextualisierten Zustand abhängen. Das erklärt den Datenfluss, beweist aber weder besseren Recall noch bessere Gradienten. Der Skalar ist schichtspezifisch, nicht token- oder headspezifisch. Seine Nullinitialisierung bedeutet 0,5 bei der Initialisierung, nicht einen gemessenen Mischkoeffizienten der veröffentlichten Gewichte.2

Bei Batch BB und aktueller Query-Länge TT hat der wiederverwendbare Ausgangszustand die Form [B,T,5120]. Projiziertes Q hat [B,T,80,128]; K und gemischtes V jeweils [B,T,8,128] vor der Transposition. Der schichtspezifische Cache speichert die resultierenden K/V früherer Positionen. Der gemeinsame Ausgangszustand über die Tiefe bedeutet keine gemeinsamen projizierten V-Caches zwischen Schichten. Beim Decode umfasst der Ausgangszustand das aktuelle Eingabetoken, nicht eine zusätzliche vollständige Kopie aller früheren Embeddings.2

Die Embedding-Skalierung beeinflusst deshalb sowohl den Haupt-Residualstrom als auch den Value-Ausgangszustand. Ein Engine-Port muss die Konvention erhalten: Den Multiplikator entweder zur Laufzeit anwenden oder in die Embedding-Gewichte einrechnen, nicht beides. Die Referenz behandelt beide Formen explizit; diese BF16-Konfiguration enthält den Laufzeitmultiplikator.2

Zwei unterschiedliche Gates, vier Blocknormen

Ripples Ausgabegate ist von αℓ\alpha_\ell getrennt. Es projiziert die normalisierte Attention-Eingabe auf 10.240 Koordinaten, berechnet ein Sigmoid – in dieser Konfiguration in FP32 –, multipliziert das zusammengefügte Attention-Ergebnis und projiziert dann zurück auf Breite 5.120. Es ist eingabeabhängig und koordinatenweise; der Value-Mix ist ein einzelner gelernter Schichtskalar.32

Der Block verwendet PeriNorm, mit separater Pre-/Post-RMSNorm um Attention und FFN:

x′=x+Nattn,post ⁣(A(Nattn,pre(x),e)),x′′=x′+Nffn,post ⁣(F(Nffn,pre(x′))).x'=x+N_{\mathrm{attn,post}}\!\left(A(N_{\mathrm{attn,pre}}(x),e)\right), \qquad x''=x'+N_{\mathrm{ffn,post}}\!\left(F(N_{\mathrm{ffn,pre}}(x'))\right).

Das sind vier Normen auf Residualbreite, zusätzlich zu den headweisen Q-/K-Normen. Das FFN bleibt ein dichtes SiLU-gegatetes MLP. Vor der Multiplikation wird die Gate-Projektion nur nach oben bei 20 abgeschnitten, die Up-Projektion dagegen auf [-20,20] begrenzt. Das ist weder symmetrisches Clipping beider Projektionen noch eine SiTU-GLU-Definition.2 Alle dichten Schichten laufen für jedes Token; ein MoE-Budget aktiver Experts ersetzt hier nicht das vollständige Gewichtsbudget.

Eine Fenstermaske ist keine Cache-Eviction

In einer lokalen Schicht erlaubt die Referenzmaske einer Query an Position pp nur Keys mit p−1023≤j≤pp-1023\leq j\leq p. Das K/V-Update erfolgt aber vor dieser Maske. Benötigt die Referenz einen neuen Cache, erzeugt sie DynamicCache() ohne Modellkonfiguration.2

Transformers v4.57.6, die in diesem Checkpoint genannte Version, lässt diesen unkonfigurierten Cache mit vollständigen DynamicLayer-Tensoren wachsen und hängt K/V an. Aus der Maske leitet die Bibliothek keine lokale Fensteraufbewahrung ab. Konfigurationsabhängige Sliding-Caches sind dort ein anderer Pfad.4 Das ist eine statische Analyse des eigenen Cache-Konstruktionszweigs der Referenz, keine Behauptung, dass jede Engine oder jeder Aufrufer ihn verwendet.

Das sollte man nicht blind durch einen beschnittenen Cache ersetzen: Die Referenzmaske zählt Key-Positionen ab null und vergleicht sie mit absoluten Cache-Positionen. Eine kompakte Implementierung muss auch Fenster-Offsets und kausale Semantik erhalten. Hier wird kein Backend-Patch vorgeschlagen.

Für eine Anfrage in BF16 sei SS die behaltene Kontextlänge. Eine ideal kompakte Implementierung mit vollständiger globaler und begrenzter lokaler Historie besitzt folgende nominelle K/V-Nutzdaten:

Ccompact(S)=2⋅8⋅128⋅2[16S+64min⁡(S,1024)] bytes.C_{\mathrm{compact}}(S) =2\cdot8\cdot128\cdot2 \left[16S+64\min(S,1024)\right]\ \mathrm{bytes}.

Die führenden Faktoren stehen für K und V, acht KV-Heads, 128 Dimensionen und zwei Bytes pro Wert. Bei 1.048.576 Positionen ergibt das 64 GiB globale K/V + 256 MiB lokale Kapazität = 64,25 GiB. Werden dagegen alle Positionen in allen 80 Schichten behalten, sind es 320 GiB. Beide Zahlen schließen Gewichte, Allokator-Padding, temporäre GQA-Expansion, Masken, Logits, Draft-Zustände und Workspace aus. Es sind hergeleitete Nutzdaten, keine gemessenen Allokationen; eine gefensterte Laufzeit kann das aktuelle Token separat halten oder eine andere Seitengranularität nutzen.

Der globale Anteil wächst weiterhin linear mit SS. Vier lokale Schichten pro globaler Schicht machen Inferenz über eine Million Tokens nicht zu einem Verfahren mit konstantem Speicherbedarf. Siehe die allgemeine KV-Cache-Dimensionierung.

Kontext- und Serving-Grenzen

Die Model Card nennt bis zu 1Mi Tokens; in den Konfigurationsmetadaten steht max_position_embeddings = 2.097.152. Das mitgelieferte B200-Serving-Rezept verwendet standardmäßig 1.048.576 Tokens insgesamt für Prompt und Ausgabe. Diese Angaben getrennt halten, statt einen Konfigurationswert stillschweigend als getestete Deployment-Grenze zu übernehmen.135

Dieses Rezept zielt auf SGLang 0.5.19 auf zwei B200-GPUs, mit vollständigen BF16-Target- und passenden DFlash2-Checkpoints. Target-Kontext und Draft-Fenster unterscheiden sich: 16 Draft-Vorschläge sind konfiguriert, das Attention-Fenster des Drafts umfasst aber 16.384 Tokens. Keines davon garantiert 16-fachen Durchsatz. Das Rezept ist keine Anleitung, das separate NVFP4-Target unverändert einzusetzen.5

Die HF-Referenz verwendet PyTorch SDPA und wiederholt KV-Gruppen für die Attention explizit. Ihr lokaler Pfad erzeugt eine boolesche Query-mal-Key-Maske; der LM-Head projiziert außerdem alle zurückgegebenen Hidden-Positionen auf Vokabular-Logits. Diese temporären Allokationen können bei langem Prefill relevant sein, selbst wenn eine andere Serving-Engine einen kompakten hybriden Cache speichert. Ein Framework-Name belegt weder einen bestimmten fusionierten Kernel noch den Peak-Speicher.2

Was praktisch evaluiert werden sollte

Das dichte Modell und der Embedding-basierte Value-Pfad sind interessante Evaluationskandidaten für codeorientierte Deployments. Aus den Architekturgleichungen folgt aber kein kausaler Qualitätsvorteil. BF16-Target, mögliche quantisierte Targets und spekulative Konfigurationen getrennt mit denselben Prompts, derselben Parallelität, denselben Ausgabelimits und Korrektheitskriterien vergleichen. End-to-End-Latenz, Prefill-Peak-Speicher, stationäres Cache-Wachstum und akzeptierte Draft-Länge erfassen; Tool-Call-Parsing und Langkontext-Retrieval prüfen.

Die Erkenntnis ist präzise: Ein Embedding-Ausgangszustand kann verschiedene schichtspezifische V-Projektionen speisen, ohne KV-Caches zu teilen, und ein begrenztes Attention-Lesefenster braucht einen passenden Allokator, um gespeicherte lokale Historie zu begrenzen. Weder ein Benchmarkrang noch ein Fenstergrößenfeld belegt diese Implementierungseigenschaften.

Primärquellen

Footnotes

  1. Ripple BF16 instruction-tuned model card, pinned revision. ↩ ↩2

  2. Ripple pinned modeling_ricursive.py: RicursiveAttention, RicursiveDecoderLayer, RicursiveModel and RicursiveForCausalLM. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  3. Ripple pinned config.json. ↩ ↩2 ↩3 ↩4 ↩5

  4. Transformers v4.57.6 cache_utils.py: DynamicLayer.update and DynamicCache.init. ↩

  5. Ripple pinned B200/SGLang serving recipe. Recipe scope and defaults, not measurements reproduced here. ↩ ↩2