- autoresearch๋ LLM ์์ด์ ํธ๊ฐ ์์จ์ ์ผ๋ก ML ์ฐ๊ตฌ๋ฅผ ์ํํ๊ฒ ํ๋ ํ๋ ์์ํฌ (by Andrej Karpathy)
- ์ฌ๋์ด ์๋ ๋์ GPU 1๋๋ก ์์ญ~์๋ฐฑ ๊ฐ์ ์คํ์ ์๋ ๋ฐ๋ณตํ๋ ์ผ๊ฐ ์์จ ์ฐ๊ตฌ ์์คํ
- ์ฝ๋ ์์ โ ํ์ต โ ํ๊ฐ โ ์์ฉ/๊ฑฐ๋ถ์ ์คํ ๋ฃจํ๋ฅผ AI๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ํ๋ ํจ๋ฌ๋ค์
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ๊ธฐ์กด ML ์ฐ๊ตฌ๋ ์ฐ๊ตฌ์๊ฐ ์ง์ ์ฝ๋๋ฅผ ์์ ํ๊ณ , ํ์ต์ ์คํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํ๋ ์๋ ๋ฐ๋ณต ์์ ์ ๋ง๋ํ ์๊ฐ์ด ์์๋จ
- 5๋ถ์ง๋ฆฌ ์คํ ํ๋๋ฅผ ์ํด ์ฝ๋ ์์ โ ์คํ โ ๋๊ธฐ โ ๋ถ์์ ์ ์ฒด ์ฌ์ดํด์ ์ฐ๊ตฌ์์ ์ฃผ์๋ ฅ์ด ๋ฌถ์
- ๋ฐค ์๊ฐ ๋ฑ ์ ํด GPU ์๊ฐ์ ํ์ฉํ์ฌ ์ฐ๊ตฌ ์์ฐ์ฑ์ ๊ทน์ ์ผ๋ก ๋์ผ ์ ์์
AS-IS
sequenceDiagram autonumber participant R as ์ฐ๊ตฌ์ participant C as ์ฝ๋ (train.py) participant G as GPU R->>C: ์ฝ๋ ์์ (์ํคํ ์ฒ/ํ์ดํผํ๋ผ๋ฏธํฐ) R->>G: ํ์ต ์คํ G-->>R: ๊ฒฐ๊ณผ ๋๊ธฐ (5๋ถ~์์๊ฐ) R->>R: ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ ํ๋จ R->>C: ๋ค์ ์คํ์ ์ํ ์ฝ๋ ์์ Note over R,G: ์ฐ๊ตฌ์๊ฐ ๋ชจ๋ ๋จ๊ณ์ ๊ด์ฌ โ ๋ณ๋ชฉ
TO-BE
sequenceDiagram autonumber participant H as ์ฐ๊ตฌ์ participant A as LLM Agent participant C as train.py participant G as GPU H->>A: program.md ์์ฑ (์ฐ๊ตฌ ๋ฐฉํฅ ์ง์) loop ์์จ ์คํ ๋ฃจํ (๋ฌดํ ๋ฐ๋ณต) A->>C: ์ฝ๋ ์์ A->>A: git commit (autoresearch/tag) A->>G: uv run train.py (5๋ถ ๊ณ ์ ) G-->>A: val_bpb ๊ฒฐ๊ณผ alt ๊ฐ์ ๋จ A->>A: ๋ณ๊ฒฝ ์ ์ง, results.tsv ๊ธฐ๋ก else ์ ํ๋จ A->>A: git reset์ผ๋ก ๋๋๋ฆผ end end H->>A: (๋ค์ ๋ ์์นจ) ๊ฒฐ๊ณผ ํ์ธ Note over H,G: ์ฐ๊ตฌ์๋ ์๊ณ ์๊ณ , Agent๊ฐ ๋ฐค์ ์คํ
3๊ฐ์ง ํต์ฌ ํ์ผ ๊ตฌ์กฐ
autoresearch์ ์ ์ฒด ์์คํ ์ ๋ฑ 3๊ฐ์ ํ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์ด ๊ทน๋จ์ ์ธ ๋จ์ํจ์ด ํต์ฌ ์ค๊ณ ์ฒ ํ์ด๋ค.
program.md โ ์ฐ๊ตฌ ์ง์์
์ฌ๋์ด ์์ฑํ๋ ๋งํฌ๋ค์ด ํ์์ ์ฐ๊ตฌ ๊ณํ์. LLM ์์ด์ ํธ๊ฐ ์ด ํ์ผ์ ์ฝ๊ณ ์ฐ๊ตฌ ๋ฐฉํฅ์ ์ดํดํ๋ค.
- ๋ฌด์์ ์ต์ ํํ ์ง (val_bpb ์ต์ํ)
- ์ด๋ค ํ์ผ์ ์์ ํ ์ ์๋์ง (train.py๋ง)
- ์ด๋ค ํ์ผ์ ์ ๋ ์์ ํ๋ฉด ์ ๋๋์ง (prepare.py, pyproject.toml)
- ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ๊ธฐ๋กํ ์ง (results.tsv)
ํต์ฌ ์ง์: โDo NOT pause to ask the human if you should continueโฆ The loop runs until the human interrupts you, period.โ
train.py โ ์ ์ผํ ์์ ๋์
์์ด์ ํธ๊ฐ ์์ ํ ์ ์๋ ์ ์ผํ ํ์ผ. GPT ๋ชจ๋ธ ์ ์, ์ตํฐ๋ง์ด์ , ํ์ต ๋ฃจํ๋ฅผ ๋ชจ๋ ํฌํจํ๋ค.
| ๊ตฌ์ฑ ์์ | ์ธ๋ถ ์ฌํญ |
|---|---|
| ๋ชจ๋ธ ์ํคํ ์ฒ | Transformer, 8-layer, Sliding Window Attention (SSSL ํจํด) |
| ์ดํ ์ | Flash Attention v3 + Rotary Embeddings |
| ํ์ฑํ ํจ์ | ReLU-squared: F.relu(x).square() |
| ์ตํฐ๋ง์ด์ | MuonAdamW (Muon + AdamW ํ์ด๋ธ๋ฆฌ๋) |
| ์ํ์ค ๊ธธ์ด | 2048 tokens |
| ์ดํ ํฌ๊ธฐ | 32,768 tokens (train) / 8,192 (tokenizer) |
| ํ์ต ์ ๋ฐ๋ | bfloat16 mixed precision |
| ์ปดํ์ผ | torch.compile(dynamic=False) |
prepare.py โ ๋ถ๋ณ์ ์ธํ๋ผ
๋ฐ์ดํฐ ์ค๋น์ ํ๊ฐ ํจ์๋ฅผ ๋ด๋นํ๋ ์ ๋ ์์ ๋ถ๊ฐ ํ์ผ.
- ๋ฐ์ดํฐ์
:
climbmix-400b-shuffle(HuggingFace) - BPE ํ ํฌ๋์ด์ ํ์ต (rustbpe ๊ธฐ๋ฐ, GPT-4 ์คํ์ผ ์ ๊ท์)
evaluate_bpb()ํจ์ ์ ๊ณต โ ๋ชจ๋ ์คํ์ ํ๊ฐ ๊ธฐ์ค
์์จ ์คํ ๋ฃจํ์ ์๋ ์๋ฆฌ
์์ด์ ํธ๋ ๋ค์ 6๋จ๊ณ๋ฅผ ์ฌ๋์ ๊ฐ์ ์์ด ๋ฌดํ ๋ฐ๋ณตํ๋ค:
1. program.md ์ฝ๊ธฐ โ ์ฐ๊ตฌ ๋ฐฉํฅ ํ์
2. train.py ์์ โ ์ํคํ
์ฒ/ํ์ดํผํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ
3. git commit โ autoresearch/<tag> ๋ธ๋์น์ ๊ธฐ๋ก
4. uv run train.py โ 5๋ถ ๊ณ ์ ํ์ต ์คํ
5. grep "val_bpb" run.log โ ๊ฒฐ๊ณผ ์ถ์ถ
6. ํ๋จ โ ๊ฐ์ ์ด๋ฉด ์ ์ง, ์
ํ๋ฉด git reset
์๊ฐ๋น ์ฝ 12๊ฐ, ํ๋ฃป๋ฐค์ ์ฝ 100๊ฐ์ ์คํ์ด ๊ฐ๋ฅํ๋ค.
5๋ถ ๊ณ ์ ์๊ฐ ์์ฐ์ ์ค๊ณ ์๋
๋ชจ๋ ์คํ์ด ์ ํํ 300์ด(5๋ถ)์ wall-clock time์ผ๋ก ์ ํ๋๋ค. ์ด๋ ๋จ์ํ ํธ์๊ฐ ์๋๋ผ ํต์ฌ ์ค๊ณ ๊ฒฐ์ ์ด๋ค.
- ๊ณต์ ํ ๋น๊ต: ์ํคํ ์ฒ A์ B๊ฐ ๋์ผํ ์๊ฐ ์์์ ์ด๋ค val_bpb๋ฅผ ๋ฌ์ฑํ๋์ง ๋น๊ต ๊ฐ๋ฅ
- ํ๋ซํผ ์ต์ ํ: ๊ณ ์ ์๊ฐ์ด๋ฏ๋ก ํด๋น GPU์์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ชจ๋ธ ํฌ๊ธฐ/๊ตฌ์กฐ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ํ์
- ๋น ๋ฅธ ๋ฐ๋ณต: 5๋ถ์ด๋ฉด ์ถฉ๋ถํ ์๋ฏธ ์๋ ํ์ต์ด ๊ฐ๋ฅํ๋ฉด์๋ ํ๋ฃป๋ฐค์ ์๋ฐฑ ํ ๋ฐ๋ณต ๊ฐ๋ฅ
- ์งํ๋ฅ ๊ธฐ๋ฐ ์ค์ผ์ค๋ง:
progress = total_training_time / TIME_BUDGET๋ก LR warmup/warmdown์ ์๊ฐ ๋น์จ๋ก ์ ์ด
val_bpb โ ๋จ์ผ ํ๊ฐ ์งํ
Validation bits per byte. ๋ชจ๋ธ์ด ๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ ์์ถํ๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ.
- ํฌ๋ก์ค์ํธ๋กํผ ์์ค์ bits-per-byte ๋จ์๋ก ๋ณํ
- ์ดํ ํฌ๊ธฐ์ ๋ฌด๊ดํ๊ฒ ๊ณต์ ๋น๊ต ๊ฐ๋ฅ (32K vocab vs 8K vocab ๋น๊ต ๊ฐ๋ฅ)
- ๋ฎ์์๋ก ์ข๋ค โ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ๋ ์ ์ดํดํ๊ณ ์๋ค๋ ์๋ฏธ
- ๋ชจ๋ ์คํ์ ์ ์ผํ ์ฑ๊ณต/์คํจ ํ๋จ ๊ธฐ์ค
๋จ์ํจ ์ฐ์ ์์น
program.md์ ๋ช ์๋ ํต์ฌ ์ฒ ํ: โ๋์ผํ 0.001 val_bpb ๊ฐ์ ์ด๋ผ๋, ์ฝ๋๋ฅผ ์ญ์ ํด์ ์ป์๋ค๋ฉด ์ ์งํ๊ณ , 20์ค์ ์ถ๊ฐํด์ ์ป์๋ค๋ฉด ๋ฒ๋ฆฐ๋ค.โ
- ์์ด์ ํธ์ ์ฝ๋ ์์ ์ ๋จ์ผ ํ์ผ(train.py)๋ก ์ ํ
- diff๊ฐ ๋ฆฌ๋ทฐ ๊ฐ๋ฅํ ์์ค์ผ๋ก ์ ์ง๋จ
- ๋ณต์กํ ๋ถ์ฐ ํ์ต, config ์์คํ , ์ธ๋ถ ํ๋ ์์ํฌ ์์
- ์์กด์ฑ ์ต์ํ๋ก ์์ด์ ํธ๊ฐ ์ฝ๋๋ฅผ ์์ ํ ์ดํดํ ์ ์์
MuonAdamW ํ์ด๋ธ๋ฆฌ๋ ์ตํฐ๋ง์ด์
train.py์ ๊ธฐ๋ณธ ์ตํฐ๋ง์ด์ ๋ Muon๊ณผ AdamW ๋ ๊ฐ์ง ์ ๋ต์ ๊ฒฐํฉํ๋ค:
| ํ๋ผ๋ฏธํฐ ์ ํ | ์ตํฐ๋ง์ด์ | Learning Rate |
|---|---|---|
| Embedding ๋ ์ด์ด | AdamW | 0.6 |
| Unembedding (lm_head) | AdamW | 0.004 |
| ๋ ์ด์ด๋ณ ์ค์นผ๋ผ | AdamW | 0.5 |
| 2D ํ๋ ฌ (์ดํ ์ /MLP) | Muon | orthogonalization ๊ธฐ๋ฐ |
Muon์ Newton-Schulz ์ง๊ตํ์ NorMuon ๋ถ์ฐ ๊ฐ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, Cautious weight decay (๊ทธ๋๋์ธํธ์ ํ๋ผ๋ฏธํฐ์ ๊ณฑ์ด โฅ 0์ผ ๋๋ง ์ ์ฉ)๋ฅผ ๋์ ํ๋ค.