TIP
GitHub: kyegomez/OpenMythos | PyPI: open-mythos | Lizenz: MIT
ProjektĂŒberblick
Im April 2026 stellte Anthropic Claude Mythos vor â das nĂ€chste Modell der Claude-Serie fĂŒr Inferenz und Reasoning. In Aufgaben wie Software Engineering und Cybersicherheit (insbesondere das Finden und Ausnutzen von Zero-Days) zeigt es bisher unerreichte FĂ€higkeiten. Mythos ist jedoch aktuell nur im Rahmen von âProject Glasswingâ begrenzt fĂŒr ausgewĂ€hlte Kooperationspartner aus dem defensiven Security-Bereich verfĂŒgbar und wurde noch nicht umfassend veröffentlicht.
OpenMythos ist die Open-Source-Antwort der Community auf diese geschlossene Architektur: Der unabhĂ€ngige Entwickler Kye Gomez rekonstruiert die Kernarchitektur von Mythos ausgehend von öffentlich verfĂŒgbaren Paper(s) und Forschungsarbeiten nach dem Prinzip âFirst Principlesâ. Es ist keine offizielle Version, keine Gewichts-Leakage, sondern eine theoretische Rekonstruktion â mit dem Ziel, dass Forschende und Entwickler Ă€hnliche Ideen experimentell verifizieren können.
Der zentrale Durchbruch ist Recurrent-Depth Transformer (RDT): Dieselben Transformer-Gewichte werden in einem einzelnen Forward-Pass bis zu 16-mal (konfigurierbar) zyklisch ausgefĂŒhrt. So wird âDenkenâ iterativ im kontinuierlichen latenten Raum erledigt â nicht, indem man wie bei klassischen Modellen hunderte unabhĂ€ngige Layer mit unterschiedlichen Gewichten stapelt. Das rekurrente Modell mit 770M Parametern erreicht etwa die QualitĂ€t eines Standard-Transformers mit ca. 1,3B Parametern â bei gleicher FĂ€higkeit also mit rund der halben Parameteranzahl.
Schwierigkeit / Dauer / Nutzen
Einstiegsniveau, ca. 30 Minuten: Du bringst deinen ersten OpenMythos-Forward-Pass zum Laufen, verstehst das Wesen des rekurrenten Reasonings, die Prinzipien des LTI-stabilen Injections sowie wie ein MoE-FFN die Modellbreite erweitern kann, ohne die Aktivierungs-Parameter zu erhöhen.
Zielgruppe
Entwickler mit grundlegender Erfahrung in LLM-Architekturen, die die Mechanik und die technische Umsetzung von ârekursivem Reasoningâ (1â5 Jahre) tiefer verstehen möchten. Wenn dich die folgenden Fragen interessieren, ist OpenMythos ein guter Startpunkt:
- Warum âmehr Loops = tieferes Reasoningâ selbst theoretisch untermauert ist
- Wie LTI-dynamische Nebenbedingungen sicherstellen, dass rekurrentes Training nicht ausgast
- Wie MoE plus rekurrentes Weight-Sharing eine neue Balance zwischen Parameteranzahl und Rechenaufwand findet
Zentrale AbhÀngigkeiten & Umgebung
- Python 3.10+
- PyTorch 2.0+ (CUDA-UnterstĂŒtzung beschleunigt die Inferenz)
- Optional:
flash-attn >= 2.8.3(beschleunigt GQA-Attention, IO optimal) - Mindesthardware: CPU kann ein toy demo laufen lassen, GPU kann das volle Training durchfĂŒhren
# Nur CPU
pip install open-mythos
# mit Flash Attention 2 (benötigt CUDA + Build-Tools)
pip install "open-mythos[flash]"
VollstÀndige Projektstruktur
open_mythos/
âââ main.py # Kern: OpenMythos-Klasse, MythosConfig, alle Architekturbausteine
âââ moda.py # MoE / LoRA u. Ă€. Module
âââ tokenizer.py # MythosTokenizer (Wrapper um openai/gpt-oss-20b)
âââ variants.py # vordefinierte GröĂen: mythos_1b ~ mythos_1t
âââ docs/
â âââ open_mythos.md # vollstĂ€ndige API-Referenzdokumentation
â âââ datasets.md # Empfehlungen zur Auswahl von TrainingsdatensĂ€tzen
training/
âââ 3b_fine_web_edu.py # 3B Modell Training-Skript fĂŒr Single-Card / Multi-Card
examples/
âââ moda_example.py # MoE-FFN + LoRA-Adapter-Demo
âââ variants_example.py # Parametervarianten ĂŒber mehrere GröĂen hinweg im Vergleich
tests/
âââ test_main.py # Unit-Tests fĂŒr die Kernmodule
âââ bench_vs_transformer.py # Benchmark-Vergleich mit Standard-Transformer
âââ small_benchmark.py # Small-Scale-Performance-Benchmark
Schritt-fĂŒr-Schritt
Schritt 1 â Installation
pip install open-mythos
WARNING
Das Kompilieren von flash-attn benötigt CUDA Toolkit und nvcc. Wenn die Installation in einer Umgebung ohne nvcc fehlschlÀgt, reduziert OpenMythos automatisch auf die Standard-PyTorch-Implementierung der Attention. Das beeintrÀchtigt die Korrektheit nicht, sondern nur die Geschwindigkeit.
Schritt 2 â Konfiguration bauen
Alle Hyperparameter werden ĂŒber MythosConfig ĂŒbergeben. Um ein paar zentrale Felder zu verstehen:
from open_mythos.main import MythosConfig
cfg = MythosConfig(
vocab_size=1000, # WortschatzgröĂe; Demo mit kleinem Vokabular
dim=256, # Dimension der latenten ReprÀsentation
n_heads=8, # Anzahl der Query-Head(s)
n_kv_heads=2, # Anzahl der KV-Head(s) (GQA: weniger als Q-Heads spart VRAM)
max_seq_len=128, # maximale SequenzlÀnge (RoPE-Precompute-Limit)
max_loop_iters=4, # Loop-Tiefe T; Inferenz kann höher gesetzt werden
prelude_layers=1, # Standard-Transformer-Layer fĂŒr den Prelude-Abschnitt
coda_layers=1, # Standard-Transformer-Layer fĂŒr den Coda-Abschnitt
attn_type="mla", # "mla" oder "gqa"; siehe Schritt 5
n_experts=8, # Gesamtzahl der MoE-Router-Expert(s)
n_shared_experts=1, # Anzahl der dauerhaft aktivierten Expert(s) (pro Token wird jeder aktiviert)
n_experts_per_tok=2, # Wie viele Top-K Expert(s) pro Token aktiviert werden
expert_dim=64, # Versteckte Dimension pro Expert
lora_rank=8, # Rang der Depth-LoRA-Adapter
)
MythosConfig besitzt einen Default-Konstruktor. Ein simples MythosConfig() verwendet eine Reihe vordefinierter Werte mittlerer GröĂe.
Schritt 3 â Modell initialisieren und Forward-Pass ausfĂŒhren
import torch
from open_mythos.main import OpenMythos, MythosConfig
cfg = MythosConfig()
model = OpenMythos(cfg)
# Parameteranzahl ausgeben
total = sum(p.numel() for p in model.parameters())
print(f"Parameters: {total:,}")
# Forward-Pass: input_ids shape (B, T), logits shape (B, T, vocab_size)
ids = torch.randint(0, cfg.vocab_size, (2, 16)) # batch=2, seq=16
logits = model(ids, n_loops=4) # 4-mal rekursive Inferenz
print(f"Logits shape: {logits.shape}") # torch.Size([2, 16, 32000])
n_loops steuert die Loop-Tiefe. Der Default kommt aus cfg.max_loop_iters. In der Inferenz kannst du ihn erhöhen â das ist eine SchlĂŒssel-Eigenschaft von RDT: Depth Extrapolation. Das heiĂt: Man trainiert mit N Loops, nutzt in der Inferenz N+k Loops, um auch komplexere Probleme zu lösen.
Schritt 4 â Autoregressives Generieren
# neue Tokens erzeugen; maximal 8, Loop-Tiefe 8
out = model.generate(ids, max_new_tokens=8, n_loops=8)
print(f"Generated shape: {out.shape}") # torch.Size([2, 24])
Die generate-Methode verwaltet intern einen KV-Cache. Beim ersten Aufruf wird das komplette Prompt verarbeitet; danach wird bei jedem Schritt jeweils nur ein Token dekodiert. temperature steuert die ZufÀlligkeit beim Sampling, top_k begrenzt den Sampling-Bereich:
out = model.generate(
ids,
max_new_tokens=64,
n_loops=16,
temperature=0.8, # je niedriger, desto deterministischer
top_k=40, # 0 = aus
)
Schritt 5 â Attention-Machanismus wĂ€hlen: MLA vs. GQA
# Multi-Latent Attention (Default; empfohlen fĂŒr groĂe Kontextfenster)
cfg_mla = MythosConfig(
attn_type="mla",
kv_lora_rank=512, # latente KV-Dimension im Cache (kleiner = spart VRAM)
q_lora_rank=1536, # Kompressionsdimension fĂŒr Q
qk_rope_head_dim=64, # pro Head-Dimension mit RoPE
qk_nope_head_dim=128, # pro Head-Dimension ohne RoPE
v_head_dim=128,
)
# Grouped Query Attention (VRAM-freundlich; mit flash-attn oft effizient)
cfg_gqa = MythosConfig(
attn_type="gqa",
n_kv_heads=4, # weniger als n_heads; KV-Cache wird um den Faktor n_heads/n_kv_heads verkleinert
)
Die AbwĂ€gung: MLA komprimiert KV in einen Low-Rank-latenten Vektor-Cache â das spart etwa 10â20Ă Speicher, erfordert aber pro Schritt das Rekonstruieren von K/V (eine lineare Projektion). GQA cached direkt vollstĂ€ndige KV-Heads; in Kombination mit Flash Attention 2 ist IO ideal. FĂŒr Produktions-Skalen ist MLA meist speichersparender, wĂ€hrend GQA in der Entwicklungsphase einfacher zu debuggen ist.
Schritt 6 â Rekurrente StabilitĂ€t prĂŒfen: Spektralradius-Check
Das hĂ€ufigste Problem beim RDT-Training ist rekurrentes Auseinanderlaufen: Der Hidden State wird in jeder Loop exponentiell verstĂ€rkt. OpenMythos stellt die StabilitĂ€t konstruktiv durch LTI-stabile Injection sicher. Die Validierung erfolgt ĂŒber die ĂberprĂŒfung des Spektralradius Ï(A):
# diskretisiertes Zustands-Matrix A_discrete holen
A = model.recurrent.injection.get_A() # shape (dim,)
rho = torch.linalg.eigvals(A).abs().max().item()
print(f"Spectral radius Ï(A) = {rho:.4f}")
assert rho < 1.0, f"Unstable: Ï(A) = {rho:.4f} >= 1"
WARNING
Wenn du in deinem benutzerdefinierten Training rho >= 1 findest, versuche nicht, das durch manuelles Nachjustieren zu âreparierenâ â das bedeutet, dass deine LTI-Injections-Parametrisierung umgangen wurde. PrĂŒfe, ob du injection.log_A oder injection.log_dt fĂ€lschlicherweise direkt ĂŒberschrieben/zugewiesen hast.
Schritt 7 â Vordefinierte GröĂen-Varianten nutzen
Wenn du MythosConfig nicht selbst zusammenstellen willst: variants.py bietet vordefinierte Konfigurationen von 1B bis 1T:
from open_mythos import mythos_1b, mythos_3b, mythos_10b, mythos_50b, mythos_100b
# mythos_7b() liefert MythosConfig
cfg = mythos_3b()
model = OpenMythos(cfg)
print(f"Variant 3B: {sum(p.numel() for p in model.parameters()):,} params")
| Variante | dim | Experten | Loop-Tiefe | Kontext | Maximale Ausgabe |
|---|---|---|---|---|---|
mythos_1b | 2048 | 64 | 16 | 4k | 4k |
mythos_3b | 3072 | 64 | 16 | 4k | 4k |
mythos_10b | 4096 | 128 | 24 | 8k | 4k |
mythos_100b | 8192 | 256 | 32 | 1M | 128k |
Schritt 8 â Trainingsskript ausfĂŒhren
Das Projekt enthĂ€lt ein Trainingsskript fĂŒr das 3B-Modell auf dem FineWeb-Edu-Datensatz:
# Single GPU
python training/3b_fine_web_edu.py
# Multi GPU (erkennt automatisch die Anzahl der GPUs)
torchrun --nproc_per_node=$(python -c "import torch; print(torch.cuda.device_count())") \
training/3b_fine_web_edu.py
TIP
Das Training nutzt standardmĂ€Ăig den sample-10BT-Subset (30B Tokens), ideal zum schnellen Validieren. Um den vollstĂ€ndigen 100BT-Subset zu trainieren, Ă€ndere im Skript den Parameter dataset_name auf "sample-100BT".
Wichtige Trainingskonfiguration:
# training/3b_fine_web_edu.py (kritische Parameter)
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.1)
# PrÀzision: H100/A100 nutzen bfloat16; Àltere Karten float16 + GradScaler
# Scheduler: 2000 Steps Warmup â dann Kosinus-Abklingen
# Tokenizer: openai/gpt-oss-20b via MythosTokenizer
HĂ€ufige Probleme & Troubleshooting
1. VRAM explodiert: Loop-Anzahl Ă Batch-GröĂe als Kombinationsfalle
Die Loop-Phasen von RDT sind nicht so unabhÀngig zwischen Layern wie beim Standard-Transformer: Jeder Loop-Schritt sammelt die KV-ZustÀnde aller Tokens in den Cache. Wenn du 16 Loops à SequenzlÀnge 4096 à Batch 8 kombinierst, ist der Speicherbedarf ein Vielfaches eines Standardmodells.
Lösung: Starte mit einem kleinen n_loops (z. B. 4) zur Validierung; nach Erreichen der Konvergenz schrittweise erhöhen. AuĂerdem den Batch nicht fix lassen, sondern linear skalieren.
2. Flash Attention fehlt, aber du willst beschleunigen
Wenn das Kompilieren von flash-attn fehlschlĂ€gt (hĂ€ufig Windows + CUDA-Setup), degradiert OpenMythos automatisch auf die native PyTorch-Attention. Wichtig: Dieses Degrading beeintrĂ€chtigt nicht die Korrektheit, sondern nur die Geschwindigkeit â in Szenarien mit kleinen Batches ist der Unterschied meist nicht groĂ.
3. Spektralradius-Check schlÀgt fehl: Training lÀuft auseinander
Wenn du die Parametrisierung von LTIInjection verĂ€ndert hast oder beim Fine-Tuning versehentlich die falschen Layer eingefroren hast, sodass die Injection-Parameter beschĂ€digt werden, kann Ï(A) >= 1 auftreten. Clippe nicht einfach die Parameter â setze stattdessen zurĂŒck auf die Default-Initialisierung und starte neu. Die StabilitĂ€tsgarantie der LTI-Bedingungen liegt in der parametrisierten Struktur, nicht in einem nachtrĂ€glichen Fix.
4. ACT: Vorzeitiges Stoppen fĂŒhrt zu zu wenigen effektiven Loops
act_threshold=0.99 bedeutet: Sobald an jeder Position 99% Wahrscheinlichkeit akkumuliert sind, wird vorzeitig abgebrochen. Wenn du in manchen Aufgaben feststellst, dass die effektive Loop-Anzahl deutlich unter n_loops liegt, prĂŒfe die Token-Schwierigkeit in deinen Daten: Zu einfache Tokens lösen das Halting zu frĂŒh aus, sodass komplexere Tokens nicht genug Tiefe bekommen.
5. MoE-Routing bricht zusammen: Einige Experten werden nie aktiviert
DeepSeekMoE-artige, auxiliary Loss-freie Load-Balancing-Mechanismen basieren auf einer dynamischen Anpassung des router_bias. Wenn du von Anfang an trainierst und diese Anpassungslogik nicht aufrufst, konvergiert der Router schnell dahin, nur wenige Experten zu aktivieren (typischerweise die ersten 1â2). In dem Projekt ist zwar MoEFFN.forward mit einem Platzhalter fĂŒr das Bias-Adjustment versehen, aber in benutzerdefinierten Trainingsskripten muss die Bias-Update-Logik regelmĂ€Ăig aufgerufen werden.
6. Schlechte GenerierungsqualitÀt: Temperatur und top_k richtig kombinieren
| Szenario | temperature | top_k | Hinweis |
|---|---|---|---|
| Code / Mathematik | 0.3â0.5 | 10â20 | niedrige ZufĂ€lligkeit |
| Kreatives Schreiben | 0.7â0.9 | 0 (aus) | hohe Vielfalt |
| Debug / Inferenz-Validierung | 0.0 (greedy) | 1 | maximale Determinismus |
WeiterfĂŒhrende LektĂŒre / Advanced Directions
Zentrale Paper
| Paper | Löst welches Problem |
|---|---|
| Loop, Think & Generalize (2025) | Wie rekursive Transformer im latenten Raum implizites Reasoning durchfĂŒhren |
| Parcae (Prairie et al., 2026) | LTI-Bedingungen garantieren rekurrente StabilitĂ€t ĂŒber ein Scaling Law |
| DeepSeekMoE (Dai et al., 2024) | Feingranulares MoE + Routing-Design mit shared Experts |
| DeepSeek-V2 MLA (2024) | Prinzip der KV-Kompression in Multi-Latent Attention |
| Relaxed Recursive Transformers (Bae et al., 2024) | Wie LoRA-Adapter die rekursive Ausdruckskraft verbessern, ohne zu viele zusĂ€tzliche Parameter hinzuzufĂŒgen |
Advanced Directions
1. LoRA-Adapter selbst anpassen: Aktuell ist lora_rank global einheitlich. Du kannst es auf eine Schicht-fĂŒr-Schicht-Konfiguration umstellen, sodass unterschiedliche Loop-Tiefen unterschiedliche Adapter-StĂ€rken verwenden.
2. ACT-Threshold-Scanning: Der Default 0.99 ist ein Erfahrungswert. FĂŒhre ein Grid-Search ĂŒber 0.8â0.999 aus. Du wirst sehen, dass es bei manchen Aufgaben besser ist, 0.95 statt 0.99 zu verwenden (frĂŒheres Stoppen vermeidet âoverthinkingâ).
3. Depth-Extrapolation-Experimente: Trainiere mit festem n_loops und skaliere dann in der Inferenz n_loops durch. Zeichne eine Kurve âAnzahl der Loops â Accuracy der Downstream-Aufgabeâ. Theoretisch solltest du eine exponentiell abklingende Form sehen â das ist eine der wichtigsten nachweisbaren Eigenschaften von RDT.
4. Standard-Transformer vergleichen: Verwende das Skript bench_vs_transformer.py, um mit gleicher Parameteranzahl die LĂŒcke zwischen rekurrenten Modellen und Standardmodellen in compositional / systematic generalization-Aufgaben zu vergleichen. Das ist der deutlichste Vorteil von RDT.