OpenMythos-Einstieg: Open-Source-Implementierung der Claude-Mythos-Loop-Reasoning-Architektur auf Basis von Claude Mythos

April 26, 2026

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")
VariantedimExpertenLoop-TiefeKontextMaximale Ausgabe
mythos_1b204864164k4k
mythos_3b307264164k4k
mythos_10b4096128248k4k
mythos_100b8192256321M128k

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

Szenariotemperaturetop_kHinweis
Code / Mathematik0.3–0.510–20niedrige ZufĂ€lligkeit
Kreatives Schreiben0.7–0.90 (aus)hohe Vielfalt
Debug / Inferenz-Validierung0.0 (greedy)1maximale Determinismus

WeiterfĂŒhrende LektĂŒre / Advanced Directions

Zentrale Paper

PaperLö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.

Updated April 26, 2026