OpenMythos 입문: Claude Mythos 순환 추론 아키텍처의 오픈소스 구현

April 26, 2026

TIP

GitHub: kyegomez/OpenMythos | PyPI: open-mythos | License: MIT

프로젝트 소개

2026년 4월, Anthropic은 Claude 시리즈의 차세대 추론 모델인 Claude Mythos를 공개했습니다. 소프트웨어 공학, 네트워크 보안(특히 제로데이 취약점의 발견과 활용) 같은 작업에서 지금까지와는 전혀 다른 수준의 능력을 보여주고 있습니다. 다만 Mythos는 현재 "Project Glasswing"을 통해 일부 방어적 보안 연구 협력 파트너에게만 제한적으로 제공되고 있으며, 아직 전면 공개 단계와는 거리가 멉니다.

OpenMythos는 이러한 폐쇄형 아키텍처에 대한 커뮤니티의 오픈소스 응답입니다. 독립 개발자 Kye Gomez가 공개 논문과 연구 문헌을 바탕으로 Mythos의 핵심 아키텍처를 제1원리부터 재구성했습니다. 이는 공식 버전도 아니고, 가중치 유출도 아닙니다. 대신 이론적 재구성(theoretical reconstruction) 이며, 연구자와 개발자가 비슷한 아이디어를 실험적으로 검증할 수 있게 하는 것이 목적입니다.

그 핵심 혁신은 Recurrent-Depth Transformer(RDT) 입니다. 동일한 Transformer 가중치를 단 한 번의 순전파 동안 최대 16번(설정 가능)까지 반복 실행하여, 전통적인 모델처럼 수백 개의 독립 가중치를 층층이 쌓는 대신 연속된 잠재 공간에서 반복적으로 "사고"를 수행합니다. 770M 파라미터의 순환 모델은 약 1.3B 표준 Transformer와 비슷한 품질에 도달할 수 있는데, 같은 능력을 절반가량의 파라미터로 달성하는 셈입니다.


난이도 / 소요 시간 / 얻는 것

입문 난이도, 약 30분. 첫 번째 OpenMythos 순전파를 직접 돌려 보며, 순환 추론의 본질, LTI 안정 주입(Stable Injection)의 원리, 그리고 MoE FFN이 활성 파라미터를 늘리지 않고도 어떻게 모델 폭을 확장하는지 이해하게 됩니다.


목표 독자

LLM 아키텍처에 대한 기본 지식이 있고, "순환 추론" 메커니즘과 그 엔지니어링 구현을 더 깊게 이해하고 싶은 1~5년차 개발자라면 적합합니다. 아래 질문들에 관심이 있다면 OpenMythos는 좋은 출발점이 될 것입니다.

  • "더 많은 순환 = 더 깊은 추론"이라는 말이 왜 그 자체로 이론적 근거를 갖는가
  • LTI 동역학 제약이 순환 학습이 발산하지 않도록 어떻게 보장하는가
  • MoE + 순환 가중치 공유가 파라미터 수와 연산량 사이에서 새로운 균형점을 어떻게 찾아내는가

핵심 의존성 및 환경

  • Python 3.10+
  • PyTorch 2.0+ (CUDA 지원 시 추론 가속)
  • 선택: flash-attn >= 2.8.3 (GQA 어텐션 가속, IO 최적)
  • 최소 하드웨어: CPU로도 toy demo 실행 가능, GPU에서는 전체 학습 가능
# CPU only
pip install open-mythos

# Flash Attention 2 사용 (CUDA + 빌드 도구 필요)
pip install "open-mythos[flash]"

전체 프로젝트 구조

open_mythos/
├── main.py              # 핵심: OpenMythos 클래스, MythosConfig, 전체 아키텍처 컴포넌트
├── moda.py              # MoE / LoRA 등 모듈
├── tokenizer.py         # MythosTokenizer (openai/gpt-oss-20b 래핑)
├── variants.py          # 사전 제공 규모: mythos_1b ~ mythos_1t
├── docs/
│   ├── open_mythos.md   # 전체 API 레퍼런스 문서
│   └── datasets.md      # 학습 데이터셋 선택 가이드
training/
└── 3b_fine_web_edu.py   # 3B 모델 단일 카드 / 멀티 카드 학습 스크립트
examples/
├── moda_example.py          # MoE FFN + LoRA 어댑터 데모
└── variants_example.py     # 여러 규모 변형 간 파라미터 비교
tests/
├── test_main.py             # 핵심 모듈 단위 테스트
├── bench_vs_transformer.py  # 표준 Transformer와의 벤치마크 비교
└── small_benchmark.py       # 소규모 성능 벤치마크

단계별 따라하기

1단계 — 설치

pip install open-mythos

WARNING

flash-attn은 컴파일에 CUDA Toolkit과 nvcc가 필요합니다. nvcc가 없는 환경에서 설치가 실패하면, OpenMythos가 자동으로 표준 PyTorch 어텐션 구현으로 다운그레이드합니다. 이로 인해 정합성(정확성)은 영향을 받지 않으며, 속도만 영향을 받습니다.

2단계 — 구성(config) 만들기

모든 하이퍼파라미터는 MythosConfig로 전달됩니다. 몇 가지 핵심 필드를 이해해 봅시다.

from open_mythos.main import MythosConfig

cfg = MythosConfig(
    vocab_size=1000,        # 어휘(토큰) 크기, 데모에서는 작은 어휘 사용
    dim=256,                # 은닉 차원
    n_heads=8,              # Query 헤드 수
    n_kv_heads=2,          # KV 헤드 수 (GQA: Q 헤드보다 적게 해서 메모리 절약)
    max_seq_len=128,        # 최대 시퀀스 길이 (RoPE 사전 계산 상한)
    max_loop_iters=4,       # 루프 깊이 T, 추론 시 더 높게 조절 가능
    prelude_layers=1,       # Prelude 구간의 표준 Transformer 레이어 수
    coda_layers=1,          # Coda 구간의 표준 Transformer 레이어 수
    attn_type="mla",        # "mla" 또는 "gqa" (5단계 참고)
    n_experts=8,            # MoE 라우팅 전문가 총수
    n_shared_experts=1,     # 상주(shared) 전문가 수 (각 토큰마다 항상 활성)
    n_experts_per_tok=2,    # 각 토큰이 활성화하는 top-K 전문가 수
    expert_dim=64,          # 각 전문가의 은닉 차원
    lora_rank=8,            # 깊이 LoRA 어댑터의 랭크
)

MythosConfig에는 기본 생성자가 있으며, MythosConfig()만 호출하면 중간 규모의 사전 설정값을 사용합니다.

3단계 — 모델 초기화 후 순전파 실행

import torch
from open_mythos.main import OpenMythos, MythosConfig

cfg = MythosConfig()
model = OpenMythos(cfg)

# 파라미터 수 집계
total = sum(p.numel() for p in model.parameters())
print(f"Parameters: {total:,}")

# 순전파: 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회 순환 추론
print(f"Logits shape: {logits.shape}")            # torch.Size([2, 16, 32000])

n_loops는 순환 깊이를 제어합니다. 기본값은 cfg.max_loop_iters에서 오며, 추론 시 더 높게 조절할 수 있습니다. 이것이 RDT의 핵심 특징입니다. 깊이 외삽(depth extrapolation) 즉, 학습 시 N번의 순환을 쓰고 추론 시 N+k번을 사용하여 더 복잡한 문제를 처리하는 방식입니다.

4단계 — 자가회귀 생성

# 새로운 토큰 생성, 최대 8개, 순환 깊이 8
out = model.generate(ids, max_new_tokens=8, n_loops=8)
print(f"Generated shape: {out.shape}")  # torch.Size([2, 24])

generate 메서드 내부에서는 KV 캐시를 유지합니다. 첫 호출에서는 전체 프롬프트를 처리하고, 이후에는 매번 토큰 하나만 디코딩합니다. temperature는 샘플링의 무작위성을 제어하고, top_k는 샘플링 범위를 제한합니다.

out = model.generate(
    ids,
    max_new_tokens=64,
    n_loops=16,
    temperature=0.8,   # 낮을수록 더 확정적
    top_k=40,          # 0 = 비활성화
)

5단계 — 어텐션 메커니즘 선택: MLA vs GQA

# Multi-Latent Attention(기본값, 큰 컨텍스트에 권장)
cfg_mla = MythosConfig(
    attn_type="mla",
    kv_lora_rank=512,      # 캐시되는 KV 잠재 차원(작을수록 메모리 절약)
    q_lora_rank=1536,      # Q 압축 차원
    qk_rope_head_dim=64,   # RoPE가 포함된 헤드당 차원
    qk_nope_head_dim=128,  # RoPE가 없는 헤드당 차원
    v_head_dim=128,
)

# Grouped Query Attention(메모리 친화적, flash-attn이 있으면 효율이 좋음)
cfg_gqa = MythosConfig(
    attn_type="gqa",
    n_kv_heads=4,         # n_heads보다 적게, KV 캐시가 n_heads/n_kv_heads 만큼 줄어듦
)

둘의 선택 기준: MLA는 KV를 저랭크 잠재 벡터 캐시로 압축해 메모리를 약 10~20배 줄입니다. 하지만 매번 K/V를 재구성해야 하며(선형 투영), GQA는 완전한 KV 헤드를 그대로 캐시합니다. Flash Attention 2와 함께 쓰면 IO가 최적으로 나옵니다. 프로덕션 규모에서는 MLA가 메모리를 더 절약하고, 개발 단계에서는 GQA가 디버깅이 더 쉽습니다.

6단계 — 순환 안정성 검증: 스펙트럴 반지름 체크

RDT 학습에서 가장 흔한 문제는 순환 발산입니다. 즉, 매 루프마다 hidden state가 지수적으로 커집니다. OpenMythos는 LTI 안정 주입을 통해 구성 단계에서 안정성을 보장하며, 검증 방법은 스펙트럴 반지름 ρ(A)를 확인하는 것입니다.

# 이산화된 상태 행렬 A_discrete 얻기
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

커스텀 학습에서 rho >= 1이 나온다면, 수동 튜닝으로 고치려 하지 마세요. 이는 LTI 주입 파라미터화가 우회(bypassed)되었다는 뜻입니다. injection.log_A 또는 injection.log_dt를 잘못 직접 할당하고 있지는 않은지 확인하세요.

7단계 — 사전 제공 규모 변형 사용

MythosConfig를 직접 손으로 맞추고 싶지 않다면, variants.py가 1B부터 1T까지의 사전 설정을 제공합니다.

from open_mythos import mythos_1b, mythos_3b, mythos_10b, mythos_50b, mythos_100b

# mythos_7b()는 MythosConfig를 반환
cfg = mythos_3b()
model = OpenMythos(cfg)
print(f"Variant 3B: {sum(p.numel() for p in model.parameters()):,} params")
변형dimExperts순환 깊이컨텍스트최대 출력
mythos_1b204864164k4k
mythos_3b307264164k4k
mythos_10b4096128248k4k
mythos_100b8192256321M128k

8단계 — 학습 스크립트 실행

프로젝트에는 FineWeb-Edu 데이터셋에서 3B 모델을 학습하는 스크립트가 내장돼 있습니다.

# 단일 GPU
python training/3b_fine_web_edu.py

# 멀티 GPU(자동으로 GPU 개수 감지)
torchrun --nproc_per_node=$(python -c "import torch; print(torch.cuda.device_count())") \
    training/3b_fine_web_edu.py

TIP

학습은 기본적으로 sample-10BT 서브셋(30B 토큰)을 사용합니다. 빠른 검증에 적합합니다. 전체 100BT 서브셋을 실행하려면 스크립트의 dataset_name 파라미터를 "sample-100BT"로 바꾸세요.

핵심 학습 설정:

# training/3b_fine_web_edu.py(핵심 파라미터)
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.1)
# 정밀도: H100/A100은 bfloat16, 구형 카드는 float16 + GradScaler
# 스케줄: 2000 step warmup → 이후 코사인 감쇠
# 토크나이저: MythosTokenizer를 통한 openai/gpt-oss-20b

자주 발생하는 문제 해결

1. 메모리 폭발: 순환 횟수 × 배치 크기 조합 함정

RDT의 순환 단계는 표준 Transformer처럼 레이어 간에 독립적이지 않습니다. 각 순환 단계에서 모든 토큰의 KV 상태가 캐시에 누적되기 때문입니다. 16회 순환 × 시퀀스 4096 × 배치 8이면, 일반 모델 대비 훨씬 큰 메모리 압박이 발생합니다.

해법: 먼저 작은 n_loops(예: 4)로 검증하고, 수렴한 뒤에 점진적으로 늘리세요. 배치는 고정이 아니라 선형 스케일로 조절합니다.

2. Flash Attention이 없지만 속도를 높이고 싶을 때

flash-attn 컴파일이 실패하면(특히 Windows + CUDA 환경에서 흔함), OpenMythos는 자동으로 PyTorch 기본 어텐션으로 다운그레이드합니다. 이 다운그레이드는 정확성(정합성) 에 영향을 주지 않고 속도만 영향을 줍니다. 기본 구현은 소배치 상황에서는 차이가 크지 않습니다.

3. 스펙트럴 반지름 체크 실패: 학습 발산

LTIInjection의 파라미터화를 직접 바꿨거나, 파인튜닝 중 잘못된 레이어를 freeze해서 주입(injection) 파라미터가 망가졌다면 ρ(A) >= 1이 나타날 수 있습니다. 파라미터를 바로 clip 하지 마세요. 기본 초기화로 되돌린 뒤 다시 시작하세요. LTI 제약은 사후 보정이 아니라 파라미터화 구조 자체에 달려 있습니다.

4. ACT의 조기 종료로 실제 순환 횟수가 부족

act_threshold=0.99는 각 위치에서 확률이 99%에 도달하면 그 시점에 조기 종료한다는 뜻입니다. 어떤 작업에서 실제 순환 횟수가 n_loops보다 훨씬 적게 나온다면, 데이터의 토큰 난이도 분포를 확인해 보세요. 너무 쉬운 토큰은 일찍 halting을 유발하여, 복잡한 토큰이 충분한 깊이를 얻지 못하게 됩니다.

5. MoE 라우팅 붕괴: 어떤 전문가들은 영원히 비활성

DeepSeekMoE 스타일의 보조 손실-free 로드 밸런싱은 router_bias의 동적 조정에 의존합니다. 처음부터 학습할 때 이 조정 로직을 호출하지 않으면, 라우터는 빠르게 소수 전문가만 활성화하도록 수렴합니다(보통 처음 1~2개). 프로젝트의 MoEFFN.forward에는 bias 조정에 대한 자리표시자(placeholders)가 이미 내장되어 있지만, 커스텀 학습 스크립트에서는 bias 업데이트 로직을 주기적으로 호출해 줘야 합니다.

6. 생성 품질이 나쁠 때: temperature와 top_k 조합

상황temperaturetop_k비고
코드 / 수학0.3–0.510–20낮은 무작위성
창의적 글쓰기0.7–0.90(끔)높은 다양성
디버깅 / 추론 검증0.0(그리디)1가장 확정적

추가 읽을거리 / 고급 방향

핵심 논문

논문해결하는 문제
Loop, Think & Generalize (2025)은닉 공간에서 순환 Transformer가 암묵적 추론을 수행하는 방법
Parcae (Prairie et al., 2026)LTI 제약이 순환 안정성을 보장하는 Scaling Law
DeepSeekMoE (Dai et al., 2024)세밀한 MoE + 공유 전문가를 위한 라우팅 설계
DeepSeek-V2 MLA (2024)Multi-Latent Attention의 KV 압축 원리
Relaxed Recursive Transformers (Bae et al., 2024)LoRA 어댑터가 파라미터를 크게 늘리지 않으면서 순환 표현력을 높이는 방법

고급 방향

1. 커스텀 LoRA 어댑터: 현재 lora_rank는 전역에서 일괄 적용됩니다. 레이어별 설정으로 바꿔서, 서로 다른 순환 깊이가 다른 어댑터 강도를 쓰게 만들 수 있습니다.

2. ACT 임계값 스캔: 기본값 0.99는 경험적 값입니다. 0.8–0.999 범위로 그리드 서치를 돌려 보면, 어떤 작업에서는 0.99보다 0.95가 더 좋을 수 있습니다(조기 종료로 overthinking을 피함).

3. Depth Extrapolation 실험: 고정된 n_loops로 학습한 뒤, 추론에서 n_loops를 스윕하고 "순환 횟수 → 하위(다운스트림) 작업 정확도" 곡선을 그려보세요. 이론적으로는 지수 감쇠 형태가 나타날 것으로 기대되며, 이는 RDT의 가장 중요한 검증 가능한 성질 중 하나입니다.

4. 표준 Transformer와의 비교: bench_vs_transformer.py 스크립트를 사용해, 동일한 파라미터 수에서 순환 모델과 표준 모델의 compositional / systematic generalization 성능 차이를 비교하세요. 이는 RDT의 가장 두드러진 강점이 드러나는 시나리오입니다.

Updated April 26, 2026