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.

Fibo 2.0: Gist-Kompression, doppelte Textinjektion und Clean-Latent-Editing

Eine Source-Level-Analyse von Bria Fibo 2.0: Qwen3-VL-Konditionierung, Perceiver-Gist-Tokens, saubere Edit-Latents, 3D-RoPE, CFG-Kosten und Produktionsgrenzen.

8 Min. Lesezeitflozi00
aiarchitekturdiffusionmultimodalbildgenerierungbildbearbeitungattentionperceiverqweninferenz

Bria veröffentlichte Fibo 2.0 Dev für Bildgenerierung und -bearbeitung sowie Fibo 2.0 Edit Turbo für destilliertes Editing in vier Schritten. Hugging Face mergte die produktive Diffusers-Integration am 20. Oktober 2026. Dieser Artikel prüft die gemergte Implementierung am Commit de988b7ee77c393a63865d265d19e267ef9c7bf5; er leitet die Architektur nicht aus Produktversprechen ab.123

Der interessante Mechanismus ist eine Konditionierung über zwei Pfade. Qwen3-VL-Features werden zu 256–512 Gist-Tokens komprimiert, die an jedem Haupt-DiT-Block teilnehmen. Fünf ausgewählte Blöcke führen zusätzlich Cross-Attention auf die vollständige Qwen-Feature-Sequenz aus. Beim Editing gelangt jedes Quellbild ein zweites Mal als saubere VAE-Latents in denselben Self-Attention-Strom wie das verrauschte Ziel. Die Kompression begrenzt damit einen teuren Pfad, ohne die vollständige Textsequenz unerreichbar zu machen.45

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

Die veröffentlichte Pipeline, nicht nur das 8,1B-Label

Die Diffusers-Dokumentation bezeichnet den Denoiser als Flow-Matching-Transformer mit 8,1 Milliarden Parametern. Diese Zahl beschreibt nicht die vollständig residente Pipeline: Für die Inferenz werden außerdem Qwen3-VL-4B-Instruct als multimodaler Encoder und eine FLUX.2-VAE geladen. Die Checkpoint-Repositories sind zugriffsbeschränkt. Modellseiten und gemergte Implementierung waren prüfbar, die Gewichts-Payloads und gelernten Gate-Werte wurden in dieser Analyse jedoch nicht heruntergeladen.16

KomponenteVeröffentlichte Implementierung
Eingabe der Ziel-Latents[B, 32, H/8, W/8]; 2×2-Latent-Patches
DiT-Tokenbreite3.584
Haupt- / Noise-Refiner-Blöcke44 / 2
Self-Attention28 Heads × 128 Dimensionen
Feed-Forward-Zwischenbreite9.536, SiLU-Gating
Qwen-Feature-Bundledrei RMS-normalisierte Layer, konkateniert auf Breite 7.680
Direkte Injektionsblöckenullbasierte IDs 6, 14, 22, 30 und 38
Perceiverzwei Layer; 256–512 gelernte Queries
RoPE-Achsen32 Plane + 48 Zeile + 48 Spalte
Editing-Eingabenbis zu fünf Quellbilder; eine optionale Maske

Ein 2×2-Patch der 32-kanaligen Latents enthält 128 Skalare und wird auf Breite 3.584 projiziert. Weil das VAE-Latentgitter ein Achtel der Pixelauflösung besitzt, deckt ein DiT-Token eine Region von 16×16 Pixeln ab. Ein Ziel mit 1.024×1.024 Pixeln erzeugt daher 64×64=4,09664\times64=4{,}096 Ziel-Tokens. Das ist eine Ableitung aus Tensorformen, keine Messung von Bildqualität oder Durchsatz.45

Die 128 Dimensionen jedes Attention-Heads verteilen sich auf drei RoPE-Achsen. Gist-Tokens laufen auf der ersten Achse fort. Das verrauschte Ziel belegt immer Plane 513, weil der Code die maximalen 512 Gist-Positionen reserviert und nicht die tatsächliche Gist-Anzahl des Prompts verwendet. Quellbild kk liegt auf Plane 513+k513+k und besitzt ein eigenes Zeilen-/Spaltengitter. So bleibt die Bildgeometrie getrennt, obwohl alle Tokens gewöhnliche nichtkausale Self-Attention teilen.4

Qwen3-VL wird in sechs unterschiedlichen Bundles gelesen

Die Pipeline führt Qwen3-VL mit aktivierter Hidden-State-Ausgabe aus. Sie verwendet tokenweise RMS-Normalisierung in FP32 mit Epsilon 10−610^{-6} und castet zurück in den Encoder-Datentyp. Je drei ausgewählte Zustände werden zu einem 7.680 Werte breiten Bundle pro Token konkateniert. Die folgenden Zahlen sind Indizes des zurückgegebenen hidden_states-Tupels; Index 0 enthält die Embedding-Ausgabe. Sie sind keine nullbasierten Decoder-Blocknummern. Tupelindex 9 folgt beispielsweise auf Decoder-Block 8.57

VerbraucherQwen3-VL-Hidden-State-Tupelindizes
Perceiver9, 20, 31
Injektion an DiT-Block 65, 16, 27
Injektion an DiT-Block 147, 18, 29
Injektion an DiT-Block 229, 20, 31
Injektion an DiT-Block 3011, 22, 33
Injektion an DiT-Block 3813, 24, 35

Qwen3-VL wird dafür nicht sechsmal ausgeführt. Ein Encoder-Durchlauf stellt mehrere Hidden Layer bereit; die Pipeline ordnet sie zu einem Tensor der Form [B, 6, L, 7680] an. Das erste Bundle speist den Perceiver. Jedes der übrigen fünf wird einmal von seinem zugeordneten DiT-Block verbraucht.5

In einem Injektionsblock stammen die Queries aus dem 3.584 Werte breiten DiT-Strom, während Keys und Values aus dem 7.680 Werte breiten Qwen-Bundle projiziert werden. Das Residuum wird mit anh(gℓ) anh(g_\ell) multipliziert. gℓg_\ell ist ein gelernter Skalar, der in der Implementierungsklasse mit null initialisiert wird. Diese Initialisierung beschreibt den Codepfad, nicht den gelernten Skalarwert des veröffentlichten Checkpoints; dieser wurde nicht auditiert.4

Dynamische Gist-Kompression und ihre Mathematik

Sei LL die Anzahl realer Qwen-Tokens nach einer Kürzung auf höchstens 4.096. Fibo bildet Textlängen von 256 bis 2.048 linear auf 256 bis 512 Gist-Queries ab, rundet in 64er-Schritten auf und begrenzt Werte außerhalb dieses Intervalls. Die exakte Implementierung lautet:4

G(L)=clip⁡256512 ⁣(64⌈256+256 clip⁡01 ⁣(L−2561792)64⌉).G(L)=\operatorname{clip}_{256}^{512}\!\left( 64\left\lceil \frac{256+256\,\operatorname{clip}_{0}^{1}\!\left(\frac{L-256}{1792}\right)} {64} \right\rceil \right).
Reale Qwen-Tokens LLGist-Tokens G(L)G(L)Kompression L/GL/G
2562561,00×
5123201,60×
1.0243842,67×
1.5364483,43×
2.0485124,00×
4.0965128,00×

Jeder der zwei Perceiver-Layer führt zuerst Cross-Attention von gelernten Queries [B, G, 3584] auf das Qwen-Bundle [B, L, 7680] aus, danach Self-Attention zwischen den GG Queries und schließlich einen Feed-Forward-Block. Der führende Attention-Aufwand skaliert damit wie GL+G2GL+G^2 und nicht wie L2L^2. Die resultierenden Gist-Vektoren gelangen in den gemeinsamen DiT-Strom.4

Die Kompression ist verlustbehaftet: 512 Vektoren können im Allgemeinen nicht jeden Freiheitsgrad von 4.096 Quellvektoren erhalten. Sie ist jedoch nicht der einzige Textpfad. Fünf Hauptblöcke führen weiterhin Cross-Attention auf alle LL Qwen-Positionen aus. Die Architektur tauscht einen kontinuierlichen Vollsequenz-Zugriff in allen 44 Self-Attention-Blöcken gegen eine überall verfügbare begrenzte Zusammenfassung plus fünf Refresh-Punkte mit voller Auflösung. Ob das die Bildqualität verbessert, ist eine empirische Frage; der Quellcode belegt den Datenfluss, nicht die Effektgröße.

Warum der begrenzte Strom zählt

Für ein Ziel mit NN Tokens, Kontextbilder mit jeweils CkC_k Tokens und GG Gist-Tokens führt jeder Hauptblock Self-Attention über folgende Länge aus:

S=G+N+∑kCk,Score-Paare je Head=S2.S=G+N+\sum_k C_k, \qquad \text{Score-Paare je Head}=S^2.

Bei einem langen Prompt (G=512G=512) und Bildern mit 1.024×1.024 Pixeln (N=Ck=4,096N=C_k=4{,}096) wachsen Sequenz und quadratische Anzahl der Score-Paare wie folgt. IO-effiziente Kernel können die Materialisierung der vollständigen Score-Matrix vermeiden, entfernen aber nicht die paarweisen Skalarprodukte.4

QuellbilderLänge des Hauptstroms SSS2S^2 je HeadRelativ ohne Quellbild
04.60821.233.6641,00×
18.70475.759.6163,57×
525.088629.407.74429,64×

Würden anstelle von 512 Gist-Tokens alle 2.048 Qwen-Positionen dem Strom beitreten, hätte die Sequenz ohne Quellbild eine Länge von 6.144; der Score-Paar-Term wäre 1,78× größer. Dieser Vergleich isoliert nur den Textbeitrag des Hauptstroms. Qwen-Encoding verursacht weiterhin Arbeit, beide Perceiver-Layer führen weiterhin Cross-Attention über LL aus und fünf Injektionsblöcke behalten Volltext-Cross-Attention. Die Gist-Kompression macht die vollständige Pipeline nicht unabhängig von der Promptlänge.

Die Tabelle zeigt zugleich die Editing-Grenze: Fünf Quellbilder zu unterstützen ist ein funktionales Maximum, keine Aussage über günstige Ausführung. Bei gleicher Größe von ungefähr einem Megapixel erhöhen fünf saubere Kontexte den Self-Attention-Paarterm des Hauptstroms um fast den Faktor 30 – noch ohne die zwei Noise-Refiner-Blöcke. Der reale Speicherverbrauch hängt stark von Attention-Backend, Präzision und Aktivierungsstrategie ab.

Editing schickt jedes Quellbild durch zwei Pfade

Ein Quellbild wird zunächst für Qwen3-VL skaliert, wobei jede Seite auf höchstens 768 Pixel begrenzt wird. Der Encoder kann diese visuellen Tokens zur Interpretation von Objekten, Text und Editing-Anweisung nutzen. Separat codiert die FLUX.2-VAE das zugeschnittene Bild in einen 32-kanaligen Latent-Tensor. Das DiT zerlegt diesen Tensor mit derselben Projektion wie das verrauschte Ziel in Patches und hängt ihn als saubere Kontext-Tokens an.58

Die Zielpositionen erhalten den aktuellen Flow-Zeitpunkt. Gist- und Kontextpositionen erhalten das Embedding für t=0t=0. Per-Token-AdaLN-Skalen und Residual-Gates wählen zwischen den verrauschten und sauberen Timestep-Embeddings. Alle Positionen interagieren per Self-Attention, doch der abschließende Layer schneidet ausschließlich die Zielpositionen aus und sagt nur diese voraus; saubere Kontextpositionen werden nie als Ausgabe decodiert.4

Diese doppelte Repräsentation hat eine konkrete Arbeitsteilung:

  • Der Qwen-Pfad liefert semantische, anweisungsbezogene Features in Text-Token-Auflösung.
  • Der VAE-Pfad liefert räumlich angeordnete Bild-Latents an jeden Self-Attention-Block.
  • Ein Quellbild kann die Generierung damit sowohl über semantische Features als auch über direkten Latent-Kontext beeinflussen.

Dieser Datenfluss kann Informationen bewahren, die ein einzelner Pfad auslässt; der Code beweist jedoch keinen Qualitätsvorteil. Er verdoppelt außerdem Arbeit: Quellbilder werden sowohl von Qwen3-VL als auch von der VAE verarbeitet, anschließend vergrößern ihre Latent-Tokens jeden DiT-Attention-Layer.

Eine Maske ist Vorverarbeitung und keine harte Ausgabebedingung. Die Implementierung setzt bei 128 einen Schwellwert und ersetzt ausgewählte Quellpixel vor Skalierung und VAE-/Qwen-Encoding durch flaches RGB (128,128,128)(128,128,128). Es gibt keinen abschließenden Pixel-Compositor, der unmaskierte Quellpixel zurückkopiert. „Masked Edit“ bedeutet daher konditionierte Regenerierung aus einer ausgegrauten Quelle und keine mathematisch garantierte Unveränderlichkeit außerhalb der Maske.86

Dev gegenüber Edit Turbo: exakte Aufrufzahl, kein Speed-Benchmark

Die Dev-Standards sind 30 Denoising-Schritte mit Guidance-Skala 5. Jeder Guidance-Wert über eins aktiviert Classifier-Free Guidance: Pro Schritt läuft der Transformer einmal für die positive und einmal für die negative Konditionierung. Der Standardpfad von Dev führt damit 60 Transformer-Aufrufe aus.56

Edit Turbo ist für vier Editing-Schritte mit Guidance-Skala 1 dokumentiert; damit entfällt der negative Durchlauf. Dieser Pfad führt vier Transformer-Aufrufe aus, also 15× weniger Denoiser-Aufrufe. Das ergibt nicht automatisch 15× weniger Latenz oder Kosten: Qwen3-VL- und VAE-Arbeit, Modellladen, Attention-Sequenzlänge, Kernel-Effizienz, Offloading und Scheduling bleiben bestehen. Die Turbo-Model-Card begrenzt den Checkpoint außerdem auf Editing; Text-to-Image bleibt der unterstützte Pfad von Dev.26

Produktionsgrenzen

  • Batches mit variabler Länge brauchen ein maskenfähiges Backend. Aufgefüllte Gist-Tokens werden ans Ende verschoben, weil Varlen-FlashAttention-Backends die ersten gültigen Keys behalten. Ein Backend ohne Masken wie _flash_3_hub eignet sich nur für einen einzelnen Prompt oder gleiche Längen. Diffusers weist darauf hin, dass sich gepaddete und ungepaddete BF16-Kernel in feinen Details unterscheiden können.63
  • Full-Graph-Kompilierung bricht an dynamischen Gist-Anzahlen. Die Implementierung wandelt Längen je Prompt mit .tolist() um. Die Integration dokumentiert dies als Graph Break für torch.compile(transformer); regionale Kompilierung wiederholter Blöcke bleibt möglich.3
  • Textbild-Konditionierung ändert sich während der Generierung. Fordert eine Caption gerenderten Text an, lässt die Generierung die zusätzlichen Textbilder zunächst weg und aktiviert sie ab einem Noise-Level von t≤0,9t\le0{,}9. Editing verwendet sie in jedem Schritt. Das ist ein bewusster Konditionierungszeitplan und kein invariantes Prompt-Embedding.5
  • Die Modellseiten sind zugriffsbeschränkt. Der Zugriff erfordert die Annahme der Repository-Bedingungen. Die Hub-Metadaten nennen die Lizenz bria-fibo; die Cards beschreiben nichtkommerzielle Modellnutzung und eine separate kommerzielle Vereinbarung. Dieser Artikel trifft keine Aussage zur rechtlichen Kompatibilität.12
  • Es wird kein lokales Performance-Ergebnis behauptet. Der Diffusers-PR berichtet Referenz-Paritätstests auf A100 und H100. Diese Analyse prüfte nur Quellcode und Rechnungen; sie führte die Gewichte nicht aus und maß weder VRAM, Durchsatz, Latenz noch Ausgabequalität.3

Was tatsächlich neu ist

Fibo 2.0 ersetzt Attention nicht durch ein neues Grundelement. Der Architekturbeitrag liegt in der Kombination bekannter Mechanismen: multimodaler Encoder, längenadaptive Perceiver-Queries, Single-Stream-Flow-Transformer, wenige Volltext-Refresh-Punkte und saubere Bild-Latents, die durch Timestep und 3D-RoPE-Koordinaten unterschieden werden.

Der entscheidende Produktionstradeoff wird in den Gleichungen sichtbar. Gist-Tokens begrenzen den Textbeitrag zur quadratischen Self-Attention aller Blöcke, während fünf Vollsequenz-Injektionen einen hochauflösenden Pfad erhalten. Saubere Kontexte vermeiden ein separates Image-Cross-Attention-Subsystem, lassen die Editing-Kosten aber quadratisch mit der kombinierten Anzahl aus Ziel- und Quell-Tokens wachsen. Zum Vergleich nutzt der Guide zu Qwen-Image 2.1 blockkausale Attention und einen wiederverwendbaren Prefix-Cache; Fibo 2.0 hält Ziel- und Quell-Latents stattdessen in jedem Schritt in einem gemeinsamen bidirektionalen Strom.

Footnotes

  1. Bria AI, Fibo 2.0 Dev model card (checked 21 October 2026). ↩ ↩2 ↩3

  2. Bria AI, Fibo 2.0 Edit Turbo model card (checked 21 October 2026). ↩ ↩2 ↩3

  3. Hugging Face Diffusers PR #14991 and merge commit, merged 20 October 2026. ↩ ↩2 ↩3 ↩4

  4. Diffusers BriaFibo2Transformer2DModel at merge commit. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  5. Diffusers BriaFibo2Pipeline at merge commit. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  6. Diffusers Fibo 2.0 pipeline documentation at merge commit. ↩ ↩2 ↩3 ↩4 ↩5

  7. Diffusers Fibo 2.0 conversion script at merge commit. ↩

  8. Diffusers Fibo 2.0 image processor at merge commit. ↩ ↩2