https://github.com/pathcosmos/frankenstallm
Korean 3B LLM (pure Transformer) pretrained from scratch on 8ร NVIDIA B200 GPUs with SFT + ORPO alignment
https://github.com/pathcosmos/frankenstallm
flash-attention fp8 gguf gqa korean-llm nvidia-b200 orpo pretraining sft transformer
Last synced: about 2 months ago
JSON representation
Korean 3B LLM (pure Transformer) pretrained from scratch on 8ร NVIDIA B200 GPUs with SFT + ORPO alignment
- Host: GitHub
- URL: https://github.com/pathcosmos/frankenstallm
- Owner: pathcosmos
- Created: 2026-03-04T15:50:06.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-03-26T06:54:55.000Z (4 months ago)
- Last Synced: 2026-03-26T23:35:05.012Z (4 months ago)
- Topics: flash-attention, fp8, gguf, gqa, korean-llm, nvidia-b200, orpo, pretraining, sft, transformer
- Language: Python
- Homepage: https://huggingface.co/pathcosmos/frankenstallm
- Size: 5.1 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# FRANKENSTALLM
> ๐ [English Version](./README_en.md)

[](https://huggingface.co/pathcosmos/frankenstallm)



[](https://huggingface.co/pathcosmos/frankenstallm)
> **ํ๊ตญ์ด 3B LLM์ 8ร NVIDIA B200 ์์์ ์ฒ์๋ถํฐ ์ง์ ๋ง๋ ๋ค.**
> Frankenstein์ฒ๋ผ ์กฐ๊ฐ์ ์ด์ด ๋ถ์ด๊ณ , ์ฒ ๊ฐ์ฒ๋ผ ๋จ๋จํ๊ฒ ๋จ๋ จํ๋ค.
GitHub: [`pathcosmos/FRANKENSTALLM`](https://github.com/pathcosmos/FRANKENSTALLM)
๐ค HuggingFace: [`pathcosmos/frankenstallm`](https://huggingface.co/pathcosmos/frankenstallm) โ **๋ชจ๋ธ ๋ฐฐํฌ ์๋ฃ (GGUF + safetensors)**
---
## ๋ชฉ์ฐจ
1. [์ ์ด ํ๋ก์ ํธ์ธ๊ฐ](#1-์-์ด-ํ๋ก์ ํธ์ธ๊ฐ)
2. [ํ์ฌ ์ํ โ ํ๋์ ๋ณด๊ธฐ](#2-ํ์ฌ-์ํ--ํ๋์-๋ณด๊ธฐ)
3. [ํ๋์จ์ด ํ๊ฒฝ](#3-ํ๋์จ์ด-ํ๊ฒฝ)
4. [ํ๋ก์ ํธ ๊ตฌ์กฐ](#4-ํ๋ก์ ํธ-๊ตฌ์กฐ)
5. [ํ๋ก์ ํธ ์ฌ์ ํ์๋ผ์ธ](#5-ํ๋ก์ ํธ-์ฌ์ -ํ์๋ผ์ธ)
6. [๋ชจ๋ธ ์ํคํ
์ฒ](#6-๋ชจ๋ธ-์ํคํ
์ฒ)
7. [ํ์ต ๋ฐ์ดํฐ](#7-ํ์ต-๋ฐ์ดํฐ)
8. [ํ์ต ์ค์ ๋ฐ ์ต์ ํ](#8-ํ์ต-์ค์ -๋ฐ-์ต์ ํ)
9. [์คํ ๊ฒฐ๊ณผ โ 1B ๋ฒ ์ด์ค๋ผ์ธ](#9-์คํ-๊ฒฐ๊ณผ--1b-๋ฒ ์ด์ค๋ผ์ธ)
10. [์คํ ๊ฒฐ๊ณผ โ 3B Base ์ข
ํฉ ํ๊ฐ (v2)](#10-์คํ-๊ฒฐ๊ณผ--3b-base-์ข
ํฉ-ํ๊ฐ-v2)
- [10.1 ํ์ต ์ปค๋ธ](#101-ํ์ต-์ปค๋ธ)
- [10.2 PPL (Perplexity) โ 19๊ฐ ๋ฐ์ดํฐ์
](#102-ppl-perplexity--19๊ฐ-๋ฐ์ดํฐ์
)
- [10.3 ํ๊ตญ์ด ๋ฒค์น๋งํฌ](#103-ํ๊ตญ์ด-๋ฒค์น๋งํฌ)
- [10.4 ์์ด ๋ฒค์น๋งํฌ](#104-์์ด-๋ฒค์น๋งํฌ)
- [10.5 Calibration](#105-calibration)
- [10.6 0-shot vs 5-shot ๋น๊ต](#106-0-shot-vs-5-shot-๋น๊ต)
- [10.7 ์ฐธ๊ณ ๋ชจ๋ธ ๋น๊ต](#107-์ฐธ๊ณ -๋ชจ๋ธ-๋น๊ต)
- [10.8 ์์ฑ ํ์ง ๋ฐ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น](#108-์์ฑ-ํ์ง-๋ฐ-ํ๋ผ๋ฏธํฐ-๊ทธ๋ฆฌ๋-์์น)
- [10.9 ํ๊ฐ ํ์ดํ๋ผ์ธ](#109-ํ๊ฐ-ํ์ดํ๋ผ์ธ)
11. [์คํ ๊ฒฐ๊ณผ โ 3B SFT ์ข
ํฉ ํ๊ฐ](#11-์คํ-๊ฒฐ๊ณผ--3b-sft-์ข
ํฉ-ํ๊ฐ)
- [11.1 SFT ํ์ต ๊ฒฐ๊ณผ](#111-sft-ํ์ต-๊ฒฐ๊ณผ)
- [11.2 6์ฐจ์ ํ๊ฐ ์์ฝ](#112-6์ฐจ์-ํ๊ฐ-์์ฝ)
- [11.3 Base vs SFT ๋น๊ต](#113-base-vs-sft-๋น๊ต)
- [11.4 ์ฝ๋ ๊ฐ์ ์ฌํญ](#114-์ฝ๋-๊ฐ์ -์ฌํญ)
- [11.5 ORPO ์งํ ํ์ ](#115-orpo-์งํ-ํ์ )
12. [Phase 3 โ ORPO (์ ํธ๋ ์ ๋ ฌ)](#12-phase-3--orpo-์ ํธ๋-์ ๋ ฌ)
20. [HuggingFace ๋ฐฐํฌ ํํฉ](#20-huggingface-๋ฐฐํฌ-ํํฉ)
21. [Ollama ์ฌ์ฉ๋ฒ โ ์์ธ ์ค๋ช
๋ฐ ์ฃผ์์ฌํญ](#21-ollama-์ฌ์ฉ๋ฒ--์์ธ-์ค๋ช
-๋ฐ-์ฃผ์์ฌํญ)
22. [๋ชจ๋ธ ์ฑ๋ฅ ๋น๊ต](#22-๋ชจ๋ธ-์ฑ๋ฅ-๋น๊ต--base--sft--orpo--ollama)
23. [์ฌํ ๊ฐ์ด๋ โ ์ ๋จ๊ณ ์ค์ ์์ธ](#23-์ฌํ-๊ฐ์ด๋--์ -๋จ๊ณ-์ค์ -์์ธ)
- [12.1 ORPO ์ ํ ๋ฐฐ๊ฒฝ](#121-orpo-์ ํ-๋ฐฐ๊ฒฝ)
- [12.2 ๋ฐ์ดํฐ](#122-๋ฐ์ดํฐ)
- [12.3 HP Sweep ์ค๊ณ](#123-hp-sweep-์ค๊ณ-6-config)
- [12.4 ์๋ ์ด๋ ฅ](#124-์๋-์ด๋ ฅ--5๋ฒ์-์คํจ)
- [12.5 ์ค์ ๊ฒฐ๊ณผ (์๋ฃ)](#125-์ค์-๊ฒฐ๊ณผ-์งํ-์ค)
- [12.7 ORPO ๋ณธ ํ์ต (์๋ฃ)](#127-orpo-๋ณธ-ํ์ต-์งํ-์ค-2026-03-09)
- [12.8 ORPO ์ข
ํฉ ํ๊ฐ ํ์ดํ๋ผ์ธ](#128-orpo-์ข
ํฉ-ํ๊ฐ-ํ์ดํ๋ผ์ธ)
13. [์คํ ๋ฐฉ๋ฒ](#13-์คํ-๋ฐฉ๋ฒ)
14. [๋ก๋๋งต](#14-๋ก๋๋งต)
15. [์ฐธ๊ณ ๋ฌธ์](#15-์ฐธ๊ณ -๋ฌธ์)
16. [๊ธฐ์ ์คํ ์์ฝ](#16-๊ธฐ์ -์คํ-์์ฝ)
17. [๊ด๋ จ ํ๋ก์ ํธ](#๊ด๋ จ-ํ๋ก์ ํธ)
18. [๋ค์ ์ต์ ํ ๊ณํ](#18-๋ค์-์ต์ ํ-๊ณํ--mfu-335--47-๋ชฉํ)
19. [GPU ํ๋์จ์ด & ๋น์ฉ ๋ถ์](#19-gpu-ํ๋์จ์ด--๋น์ฉ-๋ถ์--3b--60b-ํ๋ฆฌํธ๋ ์ธ)
---
## 1. ์ ์ด ํ๋ก์ ํธ์ธ๊ฐ
ํ๊ตญ์ด LLM ์ํ๊ณ๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ณต๊ฐ ๋ชจ๋ธ์ ์์ด ๊ธฐ๋ฐ ์ฌ์ ํ์ต ์์ ํ๊ตญ์ด ํ์ธํ๋์ ์น์ ํํ๊ฑฐ๋, ํ์ต ๊ณผ์ ์ด ๊ณต๊ฐ๋์ง ์์ ์ฌํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ด ํ๋ก์ ํธ๋ ๋ค๋ฅด๋ค.
- **์ฒ์๋ถํฐ(from scratch)**: ํ ํฌ๋์ด์ ํ์ต๋ถํฐ ํ๋ฆฌํธ๋ ์ธ, SFT, ์ ํธ๋ ์ ๋ ฌ๊น์ง ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ง์ ๊ตฌํํ๋ค.
- **์์ ๊ณต๊ฐ ๋น๋ ๋ก๊ทธ**: ์ฑ๊ณต๋ง ๊ธฐ๋กํ์ง ์๋๋ค. ๋ฒ๊ทธ, ์คํจ, ํ๋จ ์ฐฉ์ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ธ ๋ถ์๊น์ง ๋ชจ๋ ๊ธฐ๋กํ๋ค.
- **์ค์ฉ์ ์ธ ๊ท๋ชจ**: ํ์ ๋
ผ๋ฌธ์ฉ ์ฅ๋๊ฐ ๋ชจ๋ธ(125M)๋ ์๋๊ณ , ์ฐ๊ตฌ์๊ฐ ์๋๋ฉด ์ฌํ ๋ถ๊ฐ๋ฅํ 70B๋ ์๋, **3B ๊ท๋ชจ**์ ์ค์ฉ์ ํ๊ตญ์ด ๋ชจ๋ธ์ด ๋ชฉํ๋ค.
- **B200 ์ต์ ํ**: NVIDIA B200์ FP8 Tensor Core, NVLink 5.0, FlashAttention-2๋ฅผ ์ต๋ํ ํ์ฉํ๋ค. ์ต์ ํ๋์จ์ด๋ฅผ ์ต๋๋ก ์ฅ์ด์ง๋ ๊ณผ์ ์์ฒด๊ฐ ํ์ต์ด๋ค.
์ด README๋ **์ฒ์๋ถํฐ ๋๊น์ง์ ๋น๋ ๋ก๊ทธ**๋ค. ์คํจ์ ์ฑ๊ณต์ ๋ชจ๋ ๊ธฐ๋กํ๋ค.
---
## 2. ํ์ฌ ์ํ โ ํ๋์ ๋ณด๊ธฐ
```
2026-03-26 ๊ธฐ์ค (์ ๋จ๊ณ ์๋ฃ)
```
| ๋จ๊ณ | ์ํ | ์ธ๋ถ ๋ด์ฉ |
|------|------|-----------|
| Phase 0: ๊ธฐ๋ฐ ๊ตฌ์ถ | โ
์๋ฃ | OOM ์์ , GQA FA ์ต์ ํ, NCCL NVLS, ํ์ดํ๋ผ์ธ ์ค๋น |
| Phase 1: 3B Pretrain | โ
์๋ฃ | 57,000 steps, loss 1.466, ~63์๊ฐ |
| Phase 2: SFT | โ
์๋ฃ | 25,500 steps (early stop), val_loss 1.8851, ~15.5์๊ฐ |
| Phase 2.5: SFT ํ๊ฐ | โ
์๋ฃ | 6์ฐจ์ ํ๊ฐ 4/6 PASS, ORPO ์งํ ๊ฒฐ์ |
| Phase 3: ORPO Sweep | โ
์๋ฃ | 6-config sweep ์๋ฃ, best: lr=1.2e-5, beta=0.25 |
| **Phase 3: ORPO ๋ณธ ํ์ต** | **โ
์๋ฃ** | **9,997 steps ์กฐ๊ธฐ์๋ ด, eval_loss 1.625, pref_acc 76.02%, 7/10 PASS** |
| **Phase 4: GGUF ๋ณํยท๋ฐฐํฌ** | **โ
์๋ฃ** | **byte-fallback ์์ , v1/v2 ๊ฐ 3์ข
์์ํ, HuggingFace + Ollama ๋ฐฐํฌ** |
### Phase 2 (SFT) ์ต์ข
๊ฒฐ๊ณผ
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| ์ต์ข
step | **25,500 / 33,000** (77.3%, early stopping) |
| **Val loss (best)** | **1.8851** (step 23,000) |
| ํ์ต ์๊ฐ | **~15์๊ฐ 41๋ถ** (2026-03-05 22:15 ~ 2026-03-06 13:56) |
| VRAM ์ฌ์ฉ | **24.2GB** / 183GB per GPU (13.2%) |
| Base ๋ชจ๋ธ | checkpoint-0057000 (pretrain loss 1.466) |
| SFT ๋ฐ์ดํฐ | **2,439,397 samples** (24๊ฐ ์์ค, 7.48 GB) |
| ์ฌ๊ณ | 0๊ฑด (OOM, NCCL, NaN ์์) |
**SFT Val Loss ์ ์ฒด ์ถ์ด**:
```
Step 500: 2.073
Step 2,000: 1.956 (-0.117)
Step 5,000: 1.911 (-0.045)
Step 10,000: 1.892 (-0.019)
Step 15,000: 1.886 (-0.006)
Step 20,000: 1.885 (-0.001)
Step 23,000: 1.8851 โ BEST
Step 25,500: 1.8851 โ Early Stop (patience 5/5)
```
### SFT 6์ฐจ์ ํ๊ฐ ์์ฝ
| ์ฐจ์ | ๊ฒฐ๊ณผ | ํต์ฌ ์์น |
|------|------|-----------|
| Perplexity (์ง์ ๋ณด์กด) | **PASS** | forgetting 0.9% |
| ์์ฑ ํ์ง | **FAIL** | Greedy ๋ฐ๋ณต๋ฅ 72.97% |
| ํ๊ตญ์ด ๋ฒค์น๋งํฌ | **FAIL** | KoBEST ํ๊ท 43.26% |
| ์์ด ๋ฒค์น๋งํฌ | **PASS** | ์ ํ์คํฌ ํํ ์ด๊ณผ |
| Calibration | **PASS** | Top-1 68.59% |
| SFT Chat ๋ฅ๋ ฅ | **PASS** | EOS ์ข
๋ฃ์จ 60% (Base 0%) |
> **ํ์ : ORPO ์งํ** โ ์ง์ ๋ณด์กด ์ฐ์(0.9%), ๋ฐ๋ณต๋ฅ ์ ์ ํธ๋ ์ ๋ ฌ๋ก ํด๊ฒฐ.
> ์์ธ: `reports/2026-03-06_3B_SFT_COMPLETION_AND_EVAL_SUMMARY.md`
---
## 3. ํ๋์จ์ด ํ๊ฒฝ
### GPU
| ํญ๋ชฉ | ์ฌ์ |
|------|------|
| ๋ชจ๋ธ | 8ร NVIDIA B200 |
| VRAM | 183GB HBM3e per GPU (~1.47TB ํฉ๊ณ) |
| FP8 Tensor Core | 2,250 TFLOPS/GPU (์ด 18,000 TFLOPS) |
| BF16 | 1,125 TFLOPS/GPU |
| HBM3e ๋์ญํญ | ~7.67 TB/s per GPU |
| ์ธํฐ์ปค๋ฅํธ | NVLink 5.0 (900 GB/s bidirectional per GPU) |
| ํ ํด๋ก์ง | NVSwitch โ ๋ชจ๋ GPUโGPU ๋จ์ผ ํ All-to-All Mesh |
| ์ ๋ ฅ | 940W ์ค์ธก / 1000W cap |
B200์ FP8 ๋ค์ดํฐ๋ธ ์ง์ ๋ชจ๋ธ์ด๋ค. `torch.float8_e4m3fn` ์ TransformerEngine์ MXFP8 ๋ ์ํผ์ ๊ฒฐํฉํด ํ์ตํ๋ค. BF16 ๋๋น ์ฐ์ฐ๋์ด ์ด๋ก ์ 2๋ฐฐ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ๋ ํฅ์๋๋ค.
### CPU ๋ฐ ์์คํ
๋ฉ๋ชจ๋ฆฌ
| ํญ๋ชฉ | ์ฌ์ |
|------|------|
| CPU | 2ร AMD EPYC 9365 (Turin / Zen 5) |
| ๋ฌผ๋ฆฌ ์ฝ์ด | 72๊ฐ (36์ฝ์ด ร 2์์ผ) |
| NUMA ๊ตฌ์ฑ | 2๋
ธ๋: node0 (core 0-35) / node1 (core 36-71) |
| GPUโNUMA ๋งคํ | GPU 0-3 โ NUMA node 0, GPU 4-7 โ NUMA node 1 |
| RAM | 2.21TB DDR5 (~2.03TB ์ฌ์ ) |
| L3 ์บ์ | 384MB (12 CCX ร 32MB) |
**NUMA ์ฃผ์**: ์ด๊ธฐ DDP ๋ฐ์นญ ์ 5/8 rank๊ฐ ์๋ชป๋ NUMA ๋
ธ๋์์ ์คํ๋๋ ๋ฌธ์ ๋ฐ์. 69%์ DataLoader worker๊ฐ ํฌ๋ก์ค-NUMA์๋ค. NUMA affinity ์ต์ ํ๋ ๋ฏธ์ ์ฉ ์ํ(๋ก๋๋งต ํญ๋ชฉ).
### ์คํ ๋ฆฌ์ง
| ๊ฒฝ๋ก | ์ฉ๋ | ์ฌ์ ๊ณต๊ฐ |
|------|------|-----------|
| `/PROJECT/0325120031_A/ghong/taketimes/llm-bang/` | ๋ฉ์ธ ์์
(์ฒดํฌํฌ์ธํธ, ๋ฐ์ดํฐ) | 2.2TB |
| `/home/ghong/` | ์๊ท๋ชจ ์ฝ๋ | 5GB (์ ํ) |
> **์ฃผ์**: ์ฒดํฌํฌ์ธํธ(์์ญ GB), ํ์ต ๋ฐ์ดํฐ(82GB+), ์ค๊ฐ ์ฐ์ถ๋ฌผ์ ๋ชจ๋ `/PROJECT/...` ๊ฒฝ๋ก์ ์ ์ฅํ๋ค. ํ ๋๋ ํ ๋ฆฌ ์ฉ๋ ์ด๊ณผ ์ํ.
### ์ํํธ์จ์ด ํ๊ฒฝ
| ํจํค์ง | ๋ฒ์ |
|--------|------|
| PyTorch | `2.10.0a0+b4e4ee81d3.nv25.12` (NVIDIA ์ปค์คํ
) |
| FlashAttention | 2.7.4.post1+25.12 |
| TransformerEngine | 2.10.0 |
| NCCL | 2.28.9 |
| Triton | 3.5.1 |
| CUDA | 13.1 |
| Driver | 580.95.05 |
> **๊ฒฝ๊ณ **: PyTorch๋ NVIDIA B200 ์ต์ ํ ์ปค์คํ
๋น๋๋ค. `pip install torch`๋ก ์ฌ์ค์นํ๋ฉด B200 ์ต์ ํ๊ฐ ๊นจ์ง๋ค. **์ ๋ ์ฌ์ค์น ๊ธ์ง.**
---
## 4. ํ๋ก์ ํธ ๊ตฌ์กฐ
```
llm-bang/
โโโ CLAUDE.md # Claude Code ๊ฐ์ด๋
โโโ README.md # ์ด ํ์ผ
โโโ PROGRESS.md # ์งํ ๊ธฐ๋ก (๋ ์ง๋ณ ๋ก๊ทธ)
โโโ Modelfile.3b # Ollama ๋ชจ๋ธ ํ์ผ
โ
โโโ configs/
โ โโโ korean_3b_fp8.yaml # 3B FP8 ํ์ต ์ค์ (ํ์ฌ ์ฌ์ฉ ์ค)
โ โโโ 3b_pretrain.yaml # 3B ํ๋ฆฌํธ๋ ์ธ ์ค์ (๋์ฒด)
โ โโโ korean_1b_fp8.yaml # 1B FP8 ์ค์ (์์นด์ด๋ธ)
โ โโโ korean_3b_sft.yaml # 3B SFT v1 ์ค์ (์๋ฃ)
โ โโโ korean_3b_sft_v2.yaml # 3B SFT v2 ์ค์ (lr=5e-5, data mixing)
โ โโโ korean_3b_orpo.yaml # 3B ORPO ์ค์ (lr=5e-6, beta=0.1)
โ โโโ hybrid_3b.yaml # Hybrid 3B (Mamba-2 + Attention)
โ โโโ small_fp8.yaml # 125M FP8 ๊ฒ์ฆ์ฉ
โ โโโ medium.yaml # ์คํ ๋ชจ๋ธ ์ค์
โ โโโ small.yaml # ์ํ ๋ชจ๋ธ ์ค์
โ
โโโ data/
โ โโโ 3b_train.bin # ํ๋ฆฌํธ๋ ์ธ ํ์ต ๋ฐ์ดํฐ (82GB, 41.12B tokens)
โ โโโ 3b_val.bin # ๊ฒ์ฆ ๋ฐ์ดํฐ (151MB)
โ โโโ cc100_ko_train.bin # CC100 ํ๊ตญ์ด (4.5GB)
โ โโโ cosmo_auto_math_text_train.bin # ์ํ ํ
์คํธ (2.6GB)
โ โโโ build scripts, __init__.py
โ
โโโ model/
โ โโโ attention.py # GQA FlashAttention (Phase 0 ์ต์ ํ ์ ์ฉ)
โ โโโ transformer.py # ํธ๋์คํฌ๋จธ ๋ฉ์ธ ์ํคํ
์ฒ
โ โโโ config.py # ๋ชจ๋ธ ์ค์ dataclass
โ โโโ layers.py # ์ปค์คํ
๋ ์ด์ด (RMSNorm, SwiGLU ๋ฑ)
โ
โโโ train/
โ โโโ pretrain.py # ํ๋ฆฌํธ๋ ์ธ ์คํฌ๋ฆฝํธ (DDP ์ต์ ํ)
โ โโโ sft.py # SFT ํ์ต
โ โโโ orpo.py # ORPO ํ์ต
โ โโโ trainer.py # ํตํฉ ํธ๋ ์ด๋ (loss sync ์ต์ ํ)
โ โโโ utils.py # ์ ํธ๋ฆฌํฐ (NCCL 7200s timeout ๋ฑ)
โ
โโโ scripts/
โ โโโ launch_3b_pretrain.sh # 3B ํ๋ฆฌํธ๋ ์ธ ๋ฐ์ฒ (NCCL ํ๊ฒฝ๋ณ์ ํฌํจ)
โ โโโ launch_3b_sft.sh # 3B SFT v1 ๋ฐ์ฒ
โ โโโ launch_3b_sft_v2.sh # 3B SFT v2 ๋ฐ์ฒ (data mixing)
โ โโโ launch_3b_orpo.sh # 3B ORPO ๋ฐ์ฒ
โ โโโ monitor_3b.sh # ์ค์๊ฐ ํ์ต ๋ชจ๋ํฐ
โ โโโ training_watchdog.sh # ์์น๋
(10๋ถ ๊ฐ๊ฒฉ, ํฌ๋ก )
โ โโโ convert_3b_gguf.sh # GGUF ๋ณํ ์คํฌ๋ฆฝํธ
โ โโโ deploy_3b_ollama.sh # Ollama ๋ฐฐํฌ
โ โโโ quality_gate.sh # ๋ฐฐํฌ ์ ํ์ง ๊ฒ์ดํธ
โ โโโ telegram_notify.py # ํ
๋ ๊ทธ๋จ ์๋ฆผ (urllib ์ฌ์ฉ, curl ์ฐจ๋จ)
โ โโโ hourly_status.sh # 1์๊ฐ ๊ฐ๊ฒฉ ์ํ ๋ฆฌํฌํธ
โ
โโโ eval/
โ โโโ debate/
โ โ โโโ justice_league_3b_case.md # 3B ์ ํ ๋
ผ์ฆ (์ ์คํฐ์ค๋ฆฌ๊ทธ ๋ฉํฐ์์ด์ ํธ)
โ โโโ decision/
โ โ โโโ FINAL_DECISION_REPORT.md # SFT ์ฌ์์ ํ๊ฒฐ๋ฌธ
โ โโโ plan/
โ โ โโโ 3B_MASTER_PLAN.md # 3B ๋ง์คํฐ ํ๋
โ โโโ tasks/ # ๋ชจ๋ํ๋ ํ๊ฐ ํ์คํฌ
โ โ โโโ task_runner.py # 8-GPU ๋ณ๋ ฌ ํ์คํฌ ์คํ๊ธฐ
โ โ โโโ ppl_task.py # Perplexity ํ๊ฐ ํ์คํฌ
โ โ โโโ lm_eval_task.py # lm-evaluation-harness ๋ํผ
โ โ โโโ calibration_task.py # Calibration ๋ถ์
โ โ โโโ generation_task.py # ์์ฑ ํ์ง + ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น
โ โ โโโ token_nll_task.py # Token NLL ๋ถํฌ ๋ถ์
โ โโโ outputs/ # ํ๊ฐ ๊ฒฐ๊ณผ (์๋ ์์ฑ, .gitignore)
โ โโโ full_eval_pipeline.py # v2 ์ข
ํฉ ํ๊ฐ ํ์ดํ๋ผ์ธ (8-GPU ๋ณ๋ ฌ)
โ โโโ sft_eval_pipeline.py # SFT 6์ฐจ์ ํ๊ฐ ํ์ดํ๋ผ์ธ
โ โโโ reeval_pipeline.py # ์ฌํ๊ฐ ํ์ดํ๋ผ์ธ (0+5-shot ์ฐ์)
โ โโโ report_generator.py # ๋งํฌ๋ค์ด ๋ฆฌํฌํธ ์๋ ์์ฑ
โ โโโ comprehensive_eval.py # v1 ์ข
ํฉ ํ๊ฐ (๋ ๊ฑฐ์)
โ โโโ test_generation_params.py # ์์ฑ ํ๋ผ๋ฏธํฐ ํ์
โ
โโโ tokenizer/
โ โโโ korean_sp/ # SentencePiece 64K ๋ชจ๋ธ ํ์ผ
โ โโโ tokenizer.json # HuggingFace ํฌ๋งท (2.4MB)
โ โโโ train_sp_tokenizer.py # ํ ํฌ๋์ด์ ํ์ต ์คํฌ๋ฆฝํธ
โ โโโ convert_sp_to_hf.py # SentencePiece โ HF ๋ณํ
โ
โโโ checkpoints/ # ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ (๋์ฉ๋, .gitignore)
โ
โโโ docs/
โ โโโ PROJECT_HISTORY.md # ํ๋ก์ ํธ ์ ์ฒด ์ฌ์ ์์ธ ๊ธฐ๋ก
โ โโโ 3B_WORKPLAN.md # 3B ์์
๊ณํ
โ
โโโ reports/
โโโ 2026-03-02_0200_FRANKENSTALLM_phase0_optimization_report.md
โโโ 2026-03-05_3B_BASE_EVALUATION_REPORT.md
โโโ 2026-03-05_3B_SFT_PROGRESS_REPORT.md # SFT ํ์ต ๋ณด๊ณ ์ (Phase 2)
โโโ 2026-03-05_3B_NEXT_STEPS_REFERENCE.md
โโโ 2026-03-05_NEMOTRON_NANO_FEASIBILITY_STUDY.md
โโโ 2026-03-05_PPL_EVALUATION.md
โโโ 2026-03-05_BENCHMARK_RESULTS.md
โโโ 2026-03-05_GENERATION_QUALITY.md
โโโ 2026-03-06_3B_SFT_EVAL_PLAN.md # SFT 6์ฐจ์ ํ๊ฐ ๊ณํ์
โโโ 2026-03-06_3B_SFT_EVALUATION_REPORT.md # SFT 6์ฐจ์ ํ๊ฐ ๊ฒฐ๊ณผ
โโโ 2026-03-06_3B_SFT_COMPLETION_AND_EVAL_SUMMARY.md # SFT ์๋ฃ + ์ฝ๋ ๊ฐ์ ์ข
ํฉ
```
---
## 5. ํ๋ก์ ํธ ์ฌ์ ํ์๋ผ์ธ
์ด ์น์
์ด ์ด README์ ํต์ฌ์ด๋ค. ๊ฒฐ๊ณผ๋ง์ด ์๋๋ผ **์** ๊ทธ๋ฐ ๊ฒฐ์ ์ ๋ด๋ ธ๋์ง, **์ด๋์** ์คํจํ๋์ง๋ฅผ ์์งํ๊ฒ ๊ธฐ๋กํ๋ค.
---
### Day 1 (Feb 25) โ ์ฒซ ๋ถ์จ: 125M FP8 ๊ฒ์ฆ
ํ๋ก์ ํธ์ ์์์ ์์ ์๋ฌธ์์ ์ถ๋ฐํ๋ค. B200์์ FP8์ด ์ค์ ๋ก ์์ ์ ์ผ๋ก ํ์ต๋๋๊ฐ?
TransformerEngine์ MXFP8 ๋ ์ํผ๋ฅผ 125M ์ํ ๋ชจ๋ธ์ ์ ์ฉํด ๊ฒ์ฆํ๋ค. ๊ฒฐ๋ก ์ **์์ ์ ์ผ๋ก ๋์ํ๋ค**. loss ์๋ ด๋ ์ ์์ด์๊ณ , VRAM ํจ์จ๋ BF16 ๋๋น ํ์ฐํ ๊ฐ์ ์ด ์์๋ค. ์ด ๊ฒ์ฆ์ด ์ ์ฒด ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ ๋
น์ ์ ํธ์๋ค.
๊ฐ์ ๋ , ์ธํ๋ผ ์ธํ
๋ ์๋ฃํ๋ค. DDP 8-GPU ํ๊ฒฝ, NCCL ํ๊ฒฝ๋ณ์, ์ฒดํฌํฌ์ธํธ ์ ์ฅ ๊ฒฝ๋ก, ํ
๋ ๊ทธ๋จ ์๋ฆผ ์์คํ
์ ์ด์์ด ์ด๋ ๊ฐ์ถฐ์ก๋ค.
---
### Day 1~2 (Feb 25~26) โ 1B ํ๋ฆฌํธ๋ ์ธ: 34K ์คํ
, PPL 5.67
125M ๊ฒ์ฆ ์งํ 1B ๋ชจ๋ธ ํ๋ฆฌํธ๋ ์ธ์ ๋์
ํ๋ค.
- **์ํคํ
์ฒ**: d_model=2048, 24 layers, GQA 4:1, SwiGLU, RoPE
- **๋ฐ์ดํฐ**: C4 Korean ๊ธฐ๋ฐ
- **ํ์ต**: 34,000 ์คํ
, FP8, 8ร B200 DDP
์ต์ข
๊ฒฐ๊ณผ:
- **Loss: 1.904**
- **PPL (C4 Korean): 5.67**
์์น๋ง ๋ณด๋ฉด ๊ทธ๋ญ์ ๋ญ ๊ด์ฐฎ๋ค. ๊ทธ๋ฌ๋ ์ค์ ํ
์คํธ ์์ฑ์ ์์ผ๋ณด๋ฉด ๋ฌธ์ ๊ฐ ๋ณด์๋ค. ๋ฐ๋ณต ํจํด, ์ด์ํ ๋ฌธ์ฅ ๊ตฌ์กฐ, ๋งฅ๋ฝ ์ดํ. ํ๋ฆฌํธ๋ ์ธ ๋ชจ๋ธ์ด๋ ๋น์ฐํ๋ค. ์ด์ SFT ์ฐจ๋ก์๋ค.
---
### Day 2 (Feb 26) โ SFT v1: 0.0์ด๋ผ๋ ์ฌ์
SFT๋ฅผ ๋๋ ธ๋ค. ํ์ต์ด ์์๋์๋ง์ loss๊ฐ ๋น ๋ฅด๊ฒ ๋จ์ด์ง๊ธฐ ์์ํ๋ค. ์ฒ์์ ์ข์ ์ ํธ๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ loss๊ฐ **0.0**์ด ๋๋ค.
val loss๋ 0.0. ์์ฑ ๊ฒฐ๊ณผ๋ ์์ ํ ์ฐ๋ ๊ธฐ์๋ค.
์์ธ์ ์ฐพ์๋ค: **label off-by-one ๋ฒ๊ทธ**. ์
๋ ฅ ํ ํฐ๊ณผ ๋ ์ด๋ธ ํ ํฐ์ด ํ ์นธ์ฉ ๋ฐ๋ ค ์์๋ค. ๋ชจ๋ธ์ด ์ค์ ๋ก ๋ค์ ํ ํฐ์ ์์ธกํ๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ฏธ ์๊ณ ์๋ ์ ๋ต์ ๋ง์ถ๋ ๊ตฌ์กฐ๊ฐ ๋ผ ์์๋ค. loss๊ฐ 0์ด ๋ ๊ฑด "์๋ฒฝํ ํ์ต"์ด ์๋๋ผ **๋ฐ์ดํฐ ๋์(label leakage)** ์๋ค.
ํ๋ฃจ๋ฅผ ๋ ๋ ธ๋ค.
---
### Day 3 (Feb 27) โ 5๊ฐ์ง ๋ฒ๊ทธ, ๋ฃจํธ ์ฝ์ฆ ๋ถ์
์คํจ๋ฅผ ๋ถ์ํ๊ธฐ ์ํด **5-์์ด์ ํธ ๋ฃจํธ ์ฝ์ฆ ๋ถ์**์ ์ํํ๋ค. ๊ฒฐ๋ก ์ ๋ฒ๊ทธ ํ๋๊ฐ ์๋์๋ค. SFT ํ์ดํ๋ผ์ธ ์ ์ฒด์ ๋ฌธ์ ๊ฐ ์์๋ค.
๋ฐ๊ฒฌ๋ 5๊ฐ์ง ํต์ฌ ๋ฒ๊ทธ:
| ๋ฒ๊ทธ | ์ฆ์ | ์ํฅ |
|------|------|------|
| Static padding (no packing) | ์งง์ ์ํ๋ max_len์ผ๋ก ํจ๋ฉ | GPU ๋ญ๋น, ํ์ต ๋นํจ์จ |
| EOS ํ ํฐ ์ ๋จ | ์๋ต ๋์ EOS๊ฐ ์์ | ๋ชจ๋ธ์ด "๋ฌธ์ฅ ๋"์ ๋ชป ๋ฐฐ์ |
| ๋จ์ผ ์ํญ | ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ๋ง ๋ด | ์ธ๋ํผํ
|
| ๊ฒ์ฆ ๋ถ๋ฆฌ ์์ | val_loss ์ธก์ ๋ถ๊ฐ | ์ค๋ฒํผํ
๊ฐ์ง ๋ถ๊ฐ |
| ๋ฐ์ดํฐ ํ์ง | ๋
ธ์ด์ฆ, ์ค๋ณต, ๋ถ๊ท ํ | ๋ฐ๋ณต ์์ฑ ํจํด ์ ๋ |
ํนํ EOS ์ ๋จ ๋ฒ๊ทธ๋ subtleํ๋ค. ๋ชจ๋ธ์ด ์๋ต์ ๋ง์น๋ ์์ ์ ๋ฐฐ์ฐ์ง ๋ชปํ๋ฉด, ์์ฑ ์ ๋์์์ด ๊ฐ์ ํจํด์ ๋ฐ๋ณตํ๊ฑฐ๋ ์๋ฏธ ์๋ ํ ํฐ์ ์ด์ด๋ถ์ธ๋ค. 18% ๋ฐ๋ณต๋ฅ ์ ์์ธ ์ค ํ๋์๋ค.
---
### Day 3 (Feb 27) โ SFT v2: ์ฑ๊ณต์ด์ง๋ง 18% ๋ฐ๋ณต
5๊ฐ์ง ๋ฒ๊ทธ๋ฅผ ๋ชจ๋ ์์ ํ๊ณ SFT v2๋ฅผ ๋๋ ธ๋ค.
- **val_loss: 2.2062** โ ํฉ๋ฆฌ์ ์์ค
- **๋ฐ๋ณต๋ฅ : 18%** (rep_penalty=1.1 ์ ์ฉ ํ)
์์ฑ ํ์ง์ v1์ ๋นํด ํ์ฐํ ๊ฐ์ ๋๋ค. ํ์ง๋ง 18% ๋ฐ๋ณต๋ฅ ์ ์ฌ์ ํ ๋๋ค. `rep_penalty`๋ฅผ ๋์ด๋ฉด ๋ฐ๋ณต์ ์ค์ง๋ง ์์ฑ ๋ค์์ฑ๋ ์ค๊ณ ์ด์ํด์ง๋ค. ๋์ฝ๋ฉ ํ๋ผ๋ฏธํฐ๋ก ํด๊ฒฐํ๊ธฐ์ ๊ตฌ์กฐ์ ํ๊ณ๊ฐ ์๋ค.
kobest_copa ๊ธฐ์ค 0.646. ๊ด์ฐฎ์ ์์น์ด์ง๋ง ๋ชฉํ์๋ ๋ฏธ์น์ง ๋ชปํ๋ค.
---
### Day 3 (Feb 27) โ "์ ์คํฐ์ค๋ฆฌ๊ทธ vs ์ด๋ฒค์ ์ค": 3B ์ ํ ๊ฒฐ์
๋ฐ๋ณต๋ฅ 18%๋ฅผ ๋๊ณ ํ ๋ด๋ถ ํ ๋ก ์ด ๋ฒ์ด์ก๋ค. ํต์ฌ ์ง๋ฌธ์ ํ๋์๋ค:
> **ORPO๋ก ๋ฐ๋ณต์ ์ก์ ์ ์๋๊ฐ, ์๋๋ฉด 3B๋ก ๊ฐ์ผ ํ๋๊ฐ?**
์ด ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด **๋ฉํฐ์์ด์ ํธ ํ ๋ก **์ ์ํํ๋ค (์ฝ๋๋ช
: "์ ์คํฐ์ค๋ฆฌ๊ทธ vs ์ด๋ฒค์ ์ค"). ๊ฐ ์์ด์ ํธ๊ฐ ๋ค๋ฅธ ์
์ฅ์ ๋งก์ ๋
ผ์ฆํ๋ค.
ํ ๋ก ์ ํต์ฌ ๋ฐ๊ฒฌ:
1. **18% ๋ฐ๋ณต์ 1B ํ๋ผ๋ฏธํฐ์ ๊ตฌ์กฐ์ ํ๊ณ**๋ค. 1B ๋ชจ๋ธ์ ์ฅ๊ฑฐ๋ฆฌ ์์กด์ฑ(long-range dependency)์ ์ถฉ๋ถํ ํฌ์ฐฉํ์ง ๋ชปํ๋ค. ORPO ๊ฐ์ ์ ํธ๋ ์ ๋ ฌ์ ๋ฐ๋ณต์ ์ค์ด๋ ๋ฐ ์ผ๋ถ ๋์์ด ๋์ง๋ง, ๊ทผ๋ณธ ์์ธ(ํ๋ผ๋ฏธํฐ ๋ถ์กฑ)์ ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค.
2. **์ค์ผ์ผ๋ง ๋ฒ์น ๋ถ์**: Chinchilla ๋ฒ์น๊ณผ ์คํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 3B ๋ชจ๋ธ์ ๋์ผ ๋ฐ์ดํฐ์์ ๋ฐ๋ณต๋ฅ ์ 5~8%๊น์ง ๋ฎ์ถ ์ ์๋ค๋ ์ถ์ ์ด ๋์๋ค.
3. **๋น์ฉ-ํธ์ต ๋ถ์**: ORPO๋ฅผ 1B์ ํฌ์ํ๋ ๊ฒ๋ณด๋ค 3B ํ๋ฆฌํธ๋ ์ธ์ ํฌ์ํ๋ ๊ฒ์ด ์ต์ข
๋ชจ๋ธ ํ์ง ์ธก๋ฉด์์ ์ฐ์ํ๋ค.
**๊ฒฐ๋ก : 3B ์ ํ**. 1B๋ ์์นด์ด๋ธํ๊ณ 3B ํ๋ฆฌํธ๋ ์ธ์ ์์ํ๋ค.
์ด ๊ฒฐ์ ์ `eval/debate/justice_league_3b_case.md`์ ์ ์ฒด ๋
ผ์ฆ๊ณผ ํจ๊ป ๊ธฐ๋ก๋ผ ์๋ค.
---
### Day 3 (Feb 27) โ 640GB+ ๋ฐ์ดํฐ ์กฐ๋ฆฝ
3B ์ ํ์ด ๊ฒฐ์ ๋์๋ง์ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ฐ๋ํ๋ค. 1B์ ๋นํด ํจ์ฌ ๋ง์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค (Chinchilla ์ต์ ๋น์จ: 3B ๋ชจ๋ธ ร 20 = 60B tokens).
์ต์ข
์ ์ผ๋ก ์กฐ๋ฆฝํ ๋ฐ์ดํฐ:
- **์ด ํ ํฐ**: 41.12B tokens (์ต์ข
์ด์ง ํ์ผ)
- **์์ ๋ฐ์ดํฐ**: 640GB+ ๋ค๊ตญ์ด ํ
์คํธ
- **์์ค**: C4 Korean, ๋๋ฌด์ํค, Wikipedia Korean, korean_extra ๋ฐ์ดํฐ์
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(ํ ํฌ๋์ด์ฆ, ์
ํ, ์ด์ง ๋ณํ)๊ฐ ์๋ฃ๋ `data/3b_train.bin`์ 82GB๋ค. ๊ฒ์ฆ์
`data/3b_val.bin`์ 151MB.
---
### Mar 2 โ Phase 0: OOM ๊ฒฉํด ๋ฐ ์ต์ ํ
3B ํ์ต์ ์ฒ์ ์์ํ์ OOM(Out of Memory)์ด ๋ฐ์ํ๋ค. 183GB VRAM์ธ๋ฐ 3B ๋ชจ๋ธ์ด OOM์ด ๋๋ค๋ ๊ฒ ์ด์ํ์ง๋ง, ์์ธ์ ์์๋ค.
**GQA FlashAttention ๊ตฌํ ๋ฌธ์ **์๋ค. GQA(Grouped-Query Attention)์์ KV ์บ์๋ฅผ expandํ๋ ๋ฐฉ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ์ํ๊ฒ ๋ณต์ฌํ๊ณ ์์๋ค. FlashAttention์ native GQA support๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ์์ ๊ฒ์ด๋ค.
Phase 0์์ ์ํํ ์ต์ ํ ๋ชฉ๋ก:
| ์ต์ ํ | ๋ฐฉ๋ฒ | ํจ๊ณผ |
|--------|------|------|
| GQA FA Native | `flash_attn_varlen_func` native GQA ๊ฒฝ๋ก ์ฌ์ฉ | VRAM 60.4GB โ 48.3GB (**-20%**) |
| DDP ์ต์ ํ | `gradient_as_bucket_view=True` | GPU-CPU ๋๊ธฐํ ์ค๋ฒํค๋ -87.5% |
| NCCL NVLS | Ring+Tree ํ ํด๋ก์ง, NVLS ํ์ฑํ | AllReduce ํจ์จ ๊ฐ์ |
| ๋ฐฐ์น ํฌ๊ธฐ ๋ถ์ | GPU 2,4,6์ NCCL relay node ์ญํ ํ์
| bs=5 ์ต์ , bs=6 ์ํ ํ์ |
| SIGHUP ๋ฐฉ์ด | nohup+setsid + Python signal handler + emergency ckpt | 3์ค ๋ณดํธ |
| ๋ชจ๋ํฐ๋ง | Telegram Bot (B200Bot) + cron | 10๋ถ ์์น๋
, 1์๊ฐ ์ํ ๋ฆฌํฌํธ |
**torch.compile ํ
์คํธ**: ํจ๊ณผ ์์(1.00x). ์์ธ์ TransformerEngine์ opaque kernel์ด graph break๋ฅผ ์ ๋ฐํ๊ณ , `/tmp` ๋๋ ํ ๋ฆฌ์ noexec ํ๋๊ทธ๊ฐ ๊ฑธ๋ ค ์์ด ์ปดํ์ผ๋ kernel ์บ์๊ฐ ์ฐ์ด์ง ์์๋ค. ์๊ฐ ๋ญ๋น๋ฅผ ํ ์
์ด์ง๋ง, "ํจ๊ณผ ์๋ค"๋ ๊ฒ์ ์ค์ธก์ผ๋ก ํ์ธํ ๊ฒ๋ ์ฑ๊ณผ๋ค.
**bs=5์ ์ด์ **: NCCL ring topology์์ GPU 2, 4, 6์ด relay node ์ญํ ์ ๋งก๋๋ค. ์ด GPU๋ค์ ๋ค๋ฅธ GPU๋ณด๋ค ์ฝ 11GB๋ฅผ ๋ ์ฌ์ฉํ๋ค. bs=5์์๋ ์ฌ์ ๊ฐ ์์ง๋ง, bs=6์ผ๋ก ์ฌ๋ฆฌ๋ฉด ์ด relay GPU๋ค์ด 183GB ๊ฒฝ๊ณ์ ๋๋ฌด ๊ฐ๊น์์ง๋ค. ์์ ๋ง์ง์ ์ํด bs=5๋ฅผ ์ ์งํ๋ค.
---
### Mar 2~Mar 5 โ Phase 1: 3B ํ๋ฆฌํธ๋ ์ธ ์๋ฃ
Phase 0 ์ต์ ํ๊ฐ ์๋ฃ๋ ํ Phase 1์ด ์์๋๋ค.
์ด๊ธฐ ์งํ (step 3150):
- Loss: 2.38
- ์ฒ๋ฆฌ ์๋: 36K tok/s per rank
- ์์คํ
์ ์ฒด: ~292K tok/s (8 GPU)
- MFU: ~33.5%
MFU 33.5%๋ ์ฒ์์๋ ๋ฎ์ ๋ณด์ผ ์ ์๋ค. ํ์ง๋ง TE MXFP8๊ฐ ์ด๋ฏธ ์ต์ ํ๋ ์ํ์์ ๋์จ ์์น๋ค. ์ด๋ก ์ ํผํฌ(18,000 TFLOPS) ๋๋น ์คํจ์จ์ด๋ค. ์ถ๊ฐ ์ต์ ํ ์ฌ์ง๋ก QKV fusion (+8~12%), NUMA affinity (+4~9%), FA2 native RoPE (+3~5%)๊ฐ ๋จ์์๋ค.
**Phase 1 ์๋ฃ (2026-03-05)**:
- **57,000 steps ์๋ฃ**, ์ต์ข
loss **1.466**
- 41.12B ํ ํฐ ์ฒ๋ฆฌ, ์ด ํ์ต ์๊ฐ ์ฝ 63์๊ฐ
- ๋ฌด์ฌ๊ณ ์๋ฃ (SIGHUP, OOM, NCCL ์ด์ ์์)
์ข
ํฉ ํ๊ฐ ๊ฒฐ๊ณผ ์์ฝ (v2 ์ฌํ๊ฐ ๋ฐ์):
| ํญ๋ชฉ | ๊ฒฐ๊ณผ |
|------|------|
| PPL (ํตํฉ ๊ฒ์ฆ์
) | 5.2263 (์ด๊ธฐ v1 ํ๊ฐ: 5.709) |
| PPL (C4 Korean) | 5.717 |
| KoBEST ํ๊ท (5ํ์คํฌ) | 43.69% |
| MMLU-KO ํ๊ท (6์นดํ
๊ณ ๋ฆฌ) | 22.75% |
| HAE-RAE | 19.71% |
| winogrande / piqa | 50.59% / 52.50% |
| Calibration Top-1 | 68.75% |
| Greedy 3-gram ๋ฐ๋ณต๋ฅ | 60.99% (SFT ํ ๊ฐ์ ์์ ) |
| ์ต์ ์์ฑ ํ๋ผ๋ฏธํฐ | temp=0.7, rep_penalty=1.3 โ ๋ฐ๋ณต๋ฅ 0% |
**SFT ์งํ ๊ฒฐ์ **: loss 1.466์ ๊ฑด๊ฐํ ํ์ต ์๋ฃ ์๊ทธ๋. PPL/๋ฐ๋ณต๋ฅ /๋ฒค์น๋งํฌ ๋ชจ๋ SFT๊ฐ ํด๊ฒฐํ ์์ญ. ๋ชจ๋ธ ๊ตฌ์กฐ ๋ฌธ์ ์งํ ์์. โ Phase 2 SFT ์งํ.
---
### Mar 5~ โ Phase 2: 3B SFT ์์ โ 2.44M ์ํ, val_loss 1.956
Phase 1 ์๋ฃ ์งํ, ๋๊ท๋ชจ SFT ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ณ ํ์ต์ ์์ํ๋ค.
**๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ**:
- **24๊ฐ ์์ค**์์ 6.59M raw samples ์์ง
- `prepare_sft_combined.sh`: ํฌ๋งท ํต์ผ(6๊ฐ์ง ํฌ๋งท โ messages), MD5 ์ค๋ณต ์ ๊ฑฐ, 98:2 split
- `filter_sft_v2.py`: 5๋จ๊ณ ํ์ง ํํฐ (EOS strip, QA marker ์ ๊ฑฐ, ๊ธธ์ด ํํฐ, 4-gram ๋ฐ๋ณต ํํฐ)
- ์ต์ข
: **2,439,397 train + 49,801 val** (7.48 GB)
๋ฐ์ดํฐ ๊ตฌ์ฑ์ ์ถ๋ก /CoT(38%), ํ๊ตญ์ด ์ง์(22.5%), ์์ด ๋ค๋ชฉ์ (16%), ์ํ(12%), ๋ํ/์ฝ๋(11.5%)๋ก ๊ท ํ์ ๋ง์ท๋ค. 1B SFT์ 161K์์ **15๋ฐฐ ํ๋**ํ ๊ท๋ชจ๋ค.
**SFT ์ค๊ณ โ 1B ์คํจ์์ ๋ฐฐ์ด ๊ตํ ๋ฐ์**:
| 1B ๊ตํ | 3B SFT ์ ์ฉ |
|---------|-------------|
| Label off-by-one โ loss=0 | Loss masking ๊ฒ์ฆ (prompt=-1, response๋ง ํ์ต) |
| EOS ์ ๋จ โ ์ข
๋ฃ ๋ถ๊ฐ | Chat template `<\|user\|>...<\|assistant\|>...` EOS ํฌํจ |
| Static padding โ GPU ๋ญ๋น | Dynamic padding (64-token ์ ๋ ฌ) |
| ๊ฒ์ฆ ์์ โ ์ค๋ฒํผํ
๋ฏธ๊ฐ์ง | 49,801 val samples, 500 step ๊ฐ๊ฒฉ eval |
| ๋ฐ์ดํฐ ๋
ธ์ด์ฆ | 5๋จ๊ณ ํ์ง ํํฐ (1B์๋ ์์์) |
| ๋ฐ๋ณต๋ฅ 18% | **NEFTune alpha=5.0** ์ถ๊ฐ (์๋ฒ ๋ฉ ๋
ธ์ด์ฆ ์ฃผ์
) |
**ํ์ต ์ค์ **:
- LR: **1e-5** (pretrain์ 1/15 โ catastrophic forgetting ๋ฐฉ์ง)
- Effective batch: 2 ร 8 GPU ร 4 accum = 64 sequences
- 33,000 steps (~3.3 epochs)
- MXFP8, gradient checkpointing, NCCL Ring+Tree
**์ด๊ธฐ ๊ฒฐ๊ณผ** (step 2,000, 6%):
- Val loss: 2.073 โ 2.004 โ 1.975 โ **1.956** (๋จ์กฐ ๊ฐ์)
- Train-Val ๊ฐญ ~0.1 (์ค๋ฒํผํ
์งํ ์์)
- VRAM 24.2 GB (13.2%) โ pretrain์ ์ ๋ฐ, ๋งค์ฐ ์์
- Grad norm 1.0 ์ผ์ (ํ์ต๋ฅ ์ ์ )
์์ธ ๋ณด๊ณ ์: `reports/2026-03-05_3B_SFT_PROGRESS_REPORT.md`
---
### Mar 6 โ Phase 2 ์๋ฃ: SFT Early Stopping (val_loss 1.8851)
SFT๋ 33,000 steps ์ค **25,500 steps**์์ early stopping์ผ๋ก ์ข
๋ฃ๋์๋ค. Val loss๋ step 23,000์์ 1.8851์ ๋๋ฌํ ๋ค, 5ํ ์ฐ์ ๊ฐ์ ์์ด ํ์ต์ด ์๋ ์ค๋จ๋์๋ค.
**์ด ํ์ต ์๊ฐ**: ~15์๊ฐ 41๋ถ (2026-03-05 22:15 ~ 2026-03-06 13:56)
์ด ๊ฒฐ๊ณผ๋ LR 1e-5์ cosine decay๊ฐ step 20K ์ดํ ์ฌ์ค์ 0์ ์๋ ดํ ๊ฒ๊ณผ ์ผ์นํ๋ค. ๋ชจ๋ธ์ ์ฃผ์ด์ง LR schedule ํ์์ ํ์ต ๊ฐ๋ฅํ ๋งํผ ์์ ํ ํ์ตํ๋ค.
---
### Mar 6 โ SFT 6์ฐจ์ ์ข
ํฉ ํ๊ฐ: 4/6 PASS โ ORPO ๊ฒฐ์
SFT ์ฒดํฌํฌ์ธํธ(`checkpoint-best`, step 23000)์ ๋ํด 6์ฐจ์ ์ข
ํฉ ํ๊ฐ๋ฅผ ์ํํ๋ค. 49๋ถ 27์ด ์์.
**ํต์ฌ ๊ฒฐ๊ณผ**:
- **Perplexity**: forgetting 0.9% (19๊ฐ ๋ฐ์ดํฐ์
์ ์ฒด PASS) โ ์ง์ ๋ณด์กด ์ฐ์
- **๋ฐ๋ณต๋ฅ **: greedy 72.97% (Base 60.99%๋ณด๋ค **์
ํ**) โ FAIL
- **EOS ์ข
๋ฃ์จ**: 0% โ 60% โ ๊ฐ์ ๋์ง๋ง ๋ชฉํ(90%) ๋ฏธ๋ฌ
- **KoBEST**: 43.26% (Base 43.69%์ ๊ฑฐ์ ๋์ผ) โ FAIL
- **MMLU-KO**: 22.75% โ 26.00% (+3.2pp) โ ๋ถ๋ถ ๊ฐ์
- **Calibration**: Top-1 68.59% โ PASS
**๊ฒฐ์ **: greedy ๋ฐ๋ณต๋ฅ 72.97%๋ SFT๋ง์ผ๋ก ํด๊ฒฐ ๋ถ๊ฐ. ๊ทธ๋ฌ๋ `rep_penalty=1.2` ์ ์ฉ ์ ๋ฐ๋ณต๋ฅ 0%๊ฐ ๋ฌ์ฑ๋๋ฏ๋ก, ORPO(์ ํธ๋ ์ ๋ ฌ)๋ก ์ด ํ๋์ ๋ด์ฌํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก๋ค.
---
### Mar 6 โ ์ฝ๋ ๊ฐ์ ๋ฐ ORPO ์ค๋น
SFT ํ๊ฐ์ ๋ณํํ์ฌ ๋ค์์ ์ฝ๋ ๊ฐ์ ๋ฐ Phase 3 ์ค๋น๋ฅผ ์๋ฃํ๋ค:
| ๋ณ๊ฒฝ | ๋ด์ฉ | ์ํฅ |
|------|------|------|
| `train/sft.py` +238์ค | MixingDataLoader (SFT+pretrain ์ธํฐ๋ฆฌ๋น), DDP rank 0 ํ ํฌ๋์ด์ง | forgetting ๋ฐฉ์ง, ๋ฉ๋ชจ๋ฆฌ 8๋ฐฐ ์ ๊ฐ |
| `train/trainer.py` +17์ค | DDP early stopping broadcast (hang ๋ฐฉ์ง), patience 5โ10 | DDP ์์ ์ฑ |
| `train/orpo.py` +30์ค | YAML config ์ง์, 3B ๊ธฐ๋ณธ๊ฐ | ORPO ์คํ ์ค๋น |
| `eval/report_generator.py` +831์ค | Base vs SFT ๋น๊ต ๋ณด๊ณ ์ ์๋ ์์ฑ | ํ๊ฐ ์๋ํ |
| `eval/sft_eval_pipeline.py` ์ ๊ท | SFT 6์ฐจ์ ํ๊ฐ ํ์ดํ๋ผ์ธ | ์ข
ํฉ ํ๊ฐ |
| `eval/tasks/generation_task.py` +75์ค | Chat template, ๋ค์์ฑ ๋ฉํธ๋ฆญ | SFT ํ๊ฐ |
| `configs/korean_3b_sft_v2.yaml` ์ ๊ท | SFT v2 ์ค์ (lr=5e-5, data mixing 70/30) | ๋ฐฑ์
๊ฒฝ๋ก |
| `configs/korean_3b_orpo.yaml` ์ ๊ท | ORPO ์ค์ (lr=5e-6, beta=0.1) | Phase 3 |
์์ธ: `reports/2026-03-06_3B_SFT_COMPLETION_AND_EVAL_SUMMARY.md`
---
## 6. ๋ชจ๋ธ ์ํคํ
์ฒ
### 1B (์์นด์ด๋ธ)
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| vocab_size | 64,000 |
| d_model | 2,048 |
| n_layers | 24 |
| n_heads | 16 |
| n_kv_heads | 4 (GQA 4:1) |
| d_ffn | 5,461 (SwiGLU) |
| ํ๋ผ๋ฏธํฐ ์ | ~1.19B |
| context | 2,048 |
| rope_theta | 500,000 |
### 3B (ํ์ฌ)
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| vocab_size | 64,000 |
| d_model | 3,072 |
| n_layers | 28 |
| n_heads | 24 |
| n_kv_heads | 8 (GQA 3:1) |
| d_ffn | 8,192 (SwiGLU) |
| ํ๋ผ๋ฏธํฐ ์ | ~3.0B |
| context | 2,048 |
| rope_theta | 500,000 |
### ๊ณตํต ์ค๊ณ ์์น
| ์ปดํฌ๋ํธ | ์ ํ | ์ด์ |
|----------|------|------|
| ์ ๊ทํ | Pre-norm RMSNorm | Post-norm๋ณด๋ค ํ์ต ์์ ์ |
| ํ์ฑํ | SwiGLU FFN | Llama ๊ณ์ด์์ ๊ฒ์ฆ๋ ์ ํ |
| ์์น ์ธ์ฝ๋ฉ | RoPE (ฮธ=500K) | ๊ธด ์ปจํ
์คํธ ํ์ฅ ๊ฐ๋ฅ์ฑ |
| ์ดํ
์
| GQA (Grouped-Query Attention) | KV ์บ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ |
| ๊ตฌํ | FlashAttention-2 | IO-aware, VRAM ํจ์จ |
| ์ ๋ฐ๋ | FP8 (MXFP8 via TransformerEngine) | B200 ์ต์ ํ์ฉ |
### GQA ๋น์จ ์ ํ ๊ทผ๊ฑฐ
1B๋ GQA 4:1 (head 16๊ฐ, kv_head 4๊ฐ), 3B๋ GQA 3:1 (head 24๊ฐ, kv_head 8๊ฐ)์ ์ ํํ๋ค. 3B์์ ๋น์จ์ ๋ค์ ์ํํ ์ด์ ๋, ํ๋ผ๋ฏธํฐ ์๊ฐ ๋์ด๋๋ฉด์ ์ดํ
์
ํ์ง์ ๋ค์ ํฌ์ํ๋ ๊ฒ์ด 3B ๊ท๋ชจ์์๋ ์ํด๋ผ๋ ํ๋จ์ด์๋ค. Mistral 7B (GQA 8:1)์ Llama 3 (GQA 8:1)๋ฅผ ์ฐธ๊ณ ํ๋ค.
### rope_theta=500,000์ ์๋ฏธ
ํ์ค RoPE์ ฮธ=10,000์์ 500,000์ผ๋ก ๋๋ฆฐ ๊ฒ์ ๊ธด ์ปจํ
์คํธ์์ ์ฃผํ์ ๊ฐ์ญ์ ์ค์ด๊ธฐ ์ํด์๋ค. Code Llama, Llama 3 ๋ฑ์ด ์ฑํํ ๋ฐฉ์์ด๋ค. ํ์ฌ max_seq_len=2048์ด๋ฏ๋ก ๋น์ฅ ํจ๊ณผ๋ฅผ ๋ณด๊ธฐ๋ ์ด๋ ต์ง๋ง, ํฅํ ์ปจํ
์คํธ ํ์ฅ ํ์ธํ๋์ ์ํ ๊ธฐ๋ฐ์ด๋ค.
---
## 7. ํ์ต ๋ฐ์ดํฐ
### 7.1 ํ ํฌ๋์ด์
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| ์ข
๋ฅ | SentencePiece Unigram |
| ์ดํ ํฌ๊ธฐ | 64,000 |
| ํ๊ตญ์ด ๋ฌธ์ ์ปค๋ฒ๋ฆฌ์ง | 99.95% |
| ์์น | `tokenizer/korean_sp/` |
| HF ํฌ๋งท | `tokenizer/tokenizer.json` (2.4MB) |
64K ์ดํ๋ 32K(๋๋ฌด ์์, ํ๊ตญ์ด ์๋ธ์๋ ๋จํธํ ์ฌํจ)์ 128K(๋๋ฌด ํผ, ์๋ฒ ๋ฉ ๋ ์ด์ด ์ค๋ฒํค๋ ์ฆ๊ฐ) ์ฌ์ด์ ๊ท ํ์ด๋ค. Llama 3(128K)์ GPT-4(100K)๊ฐ ํฐ ์ดํ๋ฅผ ์ฌ์ฉํ๋ ์ถ์ธ์ง๋ง, 3B ๋ชจ๋ธ์์ 128K ์ดํ๋ ์๋ฒ ๋ฉ ๋ ์ด์ด๋ง์ผ๋ก๋ ํ๋ผ๋ฏธํฐ ๋น์ค์ด ์ง๋์น๊ฒ ์ปค์ง๋ค.
### 7.2 ํ๋ฆฌํธ๋ ์ธ ๋ฐ์ดํฐ โ ์ ์ฒด ๊ตฌ์ฑ
์ต์ข
ํ์ต ํ์ผ: `data/3b_train.bin` (77GB, ~38.5B tokens) + `data/3b_val.bin` (145MB)
Chinchilla ๋ฒ์น ๊ธฐ์ค: 3B ร 20 = **60B ํ ํฐ**์ด ์ต์ ์ด๋ค. ํ์ฌ 38.5B ํ ํฐ์ 57,000 ์คํ
(batch 5 ร accum 8 ร seq 2048 ร 8 GPU)์ผ๋ก ๋ฐ๋ณต ์๋นํ๋ฉฐ, ์ฒ์ 3B ํ์ต์ผ๋ก์ ํฉ๋ฆฌ์ ์ธ ๋ฒ์๋ค.
#### ํ๊ตญ์ด โ ์นํฌ๋กค (Web Crawl)
| ๋ฐ์ดํฐ์
| HuggingFace ID | ํ ํฐํ ํ์ผ | ํฌ๊ธฐ | ์ถ์ ํ ํฐ | ์ค๋ช
|
|----------|---------------|------------|------|----------|------|
| C4 Korean | `allenai/c4` (ko subset) | `korean_c4_train.bin` | 15GB | ~7.5B | Google C4 ํ๊ตญ์ด ํํฐ๋ง, ๋๊ท๋ชจ ํด๋ฆฐ ์น ํ
์คํธ |
| CC-100 Korean | `cc100` (ko subset) | `cc100_ko_train.bin` | 4.3GB | ~2.15B | Common Crawl ๊ธฐ๋ฐ ๋จ์ผ์ธ์ด ์ฝํผ์ค |
| HPLT Korean | `HPLT/hplt_monolingual_v2` (ko) | `hplt_ko_train.bin` | 15GB | ~7.5B | High Performance Language Technologies ์น ๋ฐ์ดํฐ |
#### ํ๊ตญ์ด โ ๋ฐฑ๊ณผ์ฌ์ (Encyclopedia)
| ๋ฐ์ดํฐ์
| HuggingFace ID | ํ ํฐํ ํ์ผ | ํฌ๊ธฐ | ์ถ์ ํ ํฐ | ์ค๋ช
|
|----------|---------------|------------|------|----------|------|
| ์ํค๋ฐฑ๊ณผ ํ๊ตญ์ด | `wikimedia/wikipedia` (20231101.ko) | `wikipedia_ko_train.bin` | 566MB | ~283M | ํ๊ตญ์ด ์ํค๋ฐฑ๊ณผ ์ ์ฒด, ๊ตฌ์กฐํ๋ ๋ฌธ์ด์ฒด |
| ์ํค๋ฐฑ๊ณผ ํ๊ตญ์ด (v2) | `wikimedia/wikipedia` (ko) | `korean_wiki_train.bin` | 500MB | ~250M | ์ํค๋ฐฑ๊ณผ ๋ณ๋ ๋ฒ์ |
| ๋๋ฌด์ํค | `heegyu/namuwiki-extracted` | `korean_namuwiki_train.bin` | 2.1GB | ~1.05B | ๋๋ฌด์ํค ์ถ์ถ๋ณธ, ์๋ธ์ปฌ์ฒยท์์ฌ ํ๋ถ |
| ๋๋ฌด์ํค 2023b | `heegyu/namuwiki-extracted` (2023b) | `namuwiki_2023b_train.bin` | 2.5GB | ~1.25B | 2023๋
์
๋ฐ์ดํธ ์ค๋
์ท |
#### ์์ด/๋ค๊ตญ์ด โ ๊ต์ก (Educational)
| ๋ฐ์ดํฐ์
| HuggingFace ID | ํ ํฐํ ํ์ผ | ํฌ๊ธฐ | ์ถ์ ํ ํฐ | ์ค๋ช
|
|----------|---------------|------------|------|----------|------|
| Cosmopedia Stories | `HuggingFaceTB/cosmopedia` | `cosmo_stories_train.bin` | 5.9GB | ~2.95B | ํฉ์ฑ ๊ต์ก์ฉ ์คํ ๋ฆฌ |
| Cosmopedia Web v2 | `HuggingFaceTB/cosmopedia` | `cosmo_web_v2_train.bin` | 2.7GB | ~1.35B | ์น ๊ธฐ๋ฐ ๊ต์ก ํ
์คํธ |
| Cosmopedia Stanford | `HuggingFaceTB/cosmopedia` | `cosmo_stanford_train.bin` | 2.1GB | ~1.05B | Stanford ๊ฐ์ ๊ธฐ๋ฐ |
| Cosmopedia WikiHow | `HuggingFaceTB/cosmopedia` | `cosmo_wikihow_train.bin` | 382MB | ~191M | WikiHow ๊ฐ์ด๋ |
| Cosmopedia OpenStax | `HuggingFaceTB/cosmopedia` | `cosmo_openstax_train.bin` | 224MB | ~112M | ์คํ ๊ต๊ณผ์ |
| Cosmopedia Khan Academy | `HuggingFaceTB/cosmopedia` | `cosmo_khanacademy_train.bin` | 46MB | ~23M | ์นธ ์์นด๋ฐ๋ฏธ |
#### ์์ด/๋ค๊ตญ์ด โ ์ํยท๊ณผํ (Math & Science)
| ๋ฐ์ดํฐ์
| HuggingFace ID | ํ ํฐํ ํ์ผ | ํฌ๊ธฐ | ์ถ์ ํ ํฐ | ์ค๋ช
|
|----------|---------------|------------|------|----------|------|
| Open Web Math | `open-web-math/open-web-math` | `open_web_math_train.bin` | 4.8GB | ~2.4B | ์น์์ ์ถ์ถํ ์ํ ํ
์คํธ |
| MathPile | `GAIR/MathPile` | `mathpile_train.bin` | 2.9GB | ~1.45B | ์ํ ๊ต๊ณผ์ยท๋
ผ๋ฌธยทํฌ๋ผ |
| Cosmopedia AutoMath | `HuggingFaceTB/cosmopedia` | `cosmo_auto_math_text_train.bin` | 2.5GB | ~1.25B | ํฉ์ฑ ์ํ ๋ฌธ์ ยทํ์ด |
#### ํ๊ตญ์ด โ ํผํฉ (Legacy Merged)
| ๋ฐ์ดํฐ์
| ํ ํฐํ ํ์ผ | ํฌ๊ธฐ | ์ถ์ ํ ํฐ | ์ค๋ช
|
|----------|------------|------|----------|------|
| ์ด๊ธฐ ํผํฉ (C4+๋๋ฌด+์ํค) | `korean_train.bin` | 17GB | ~8.5B | 1B ํ์ต์ ์ฌ์ฉ๋ ์๋ณธ ํผํฉ ๋ฐ์ดํฐ |
| 125M ๊ฒ์ฆ์ฉ | `train.bin` | 1.2GB | ~600M | ์ต์ด FP8 ๊ฒ์ฆ์ ์ฌ์ฉ |
#### ๋ฏธ์ฌ์ฉ ์์ง ๋ฐ์ดํฐ (korean_extra/ โ 640GB+)
`data/korean_extra/` ์ 39๊ฐ ์๋ธ๋๋ ํ ๋ฆฌ๋ก ์์ง๋์์ผ๋, ํ ํฐํยท๋ณํฉ์ ์ผ๋ถ๋ง ์๋ฃ๋ ๋๊ท๋ชจ ์์ ๋ฐ์ดํฐ:
| ๋ถ๋ฅ | ๋ฐ์ดํฐ์
| ์ค๋ช
| ๋น๊ณ |
|------|----------|------|------|
| ์นํฌ๋กค | CulturaX Korean | ๋๊ท๋ชจ ๋ค๊ตญ์ด ์น ์ฝํผ์ค ํ๊ตญ์ด | ~50B+ tokens |
| ์นํฌ๋กค | FineWeb2 Educational Korean | ๊ต์ก์ ํ์ง ํํฐ๋ง ์น ๋ฐ์ดํฐ | 234GB raw |
| ์นํฌ๋กค | Korean Web Collection | KORMo ์น ์ปฌ๋ ์
| 175GB raw |
| ์นํฌ๋กค | OSCAR Korean | ๋ค๊ตญ์ด ์น ์ฝํผ์ค ํ๊ตญ์ด | |
| ๊ต์ก | Korean Textbooks | ํ๊ตญ์ด ๊ต๊ณผ์ ํ
์คํธ | 45๊ฐ ์๋ธ์นดํ
๊ณ ๋ฆฌ |
| ๊ต์ก | FinePDFs Educational Korean | PDF ๊ธฐ๋ฐ ๊ต์ก ์๋ฃ | |
| ๋ฒ๋ฅ | Korean Law | ํ๊ตญ ๋ฒ๋ฅ ํ
์คํธ | 15GB |
| ๋ด์ค | Korean News Archive | ํ๊ตญ์ด ๋ด์ค ์์นด์ด๋ธ | |
| ๊ณต๊ฐ์ฝํผ์ค | Korean Public Corpus | KORMo ๊ณต๊ฐ ์ฝํผ์ค | 26GB |
| ์ฝ๋ | Code Pretrain | ํ๋ก๊ทธ๋๋ฐ ์ฝ๋ | |
| ํ์ | Academic Pretrain | ํ์ ๋
ผ๋ฌธยท๋ฆฌํฌํธ | |
| ๋ฒ์ฉ | SlimPajama | RedPajama ๊ฒฝ๋ ๋ฒ์ | |
> ์ด ๋ฐ์ดํฐ๋ Extended Pretrain (80-100B tokens) ๋จ๊ณ์์ ํ์ฉ ์์ ์ด๋ค.
#### ํ๋ฆฌํธ๋ ์ธ ๋ฐ์ดํฐ ๋ถ์ผ๋ณ ๋น์จ
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 3b_train.bin ํ ํฐ ๊ตฌ์ฑ (~38.5B) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ํ๊ตญ์ด ์นํฌ๋กค 44.7% โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ํผํฉ ๋ ๊ฑฐ์ 22.1% โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๊ต์ก (EN) 14.7% โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ์ํยท๊ณผํ 13.2% โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๋ฐฑ๊ณผ์ฌ์ (KO) 5.3% โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### 7.3 SFT ๋ฐ์ดํฐ โ 2.44M ์ํ (ํ์ฌ ํ์ต ์ค)
**24๊ฐ ์์ค**์์ 6.59M raw โ ํตํฉยท์ค๋ณต ์ ๊ฑฐ โ ํ์ง ํํฐ๋ง โ **2,439,397 train + 49,801 val**
#### ์ฃผ์ SFT ์์ค (์์ 12, ์ ์ฒด์ 96%)
| # | ๋ฐ์ดํฐ์
| ์ํ ์ | ํฌ๊ธฐ | ๋๋ฉ์ธ |
|---|---------|---------|------|--------|
| 1 | reasoning_r1_1.4m | 1,400,000 | 14.77 GB | ์ถ๋ก (CoT) |
| 2 | openhermes_2.5 | 1,001,551 | 1.82 GB | ์์ด ๋ค๋ชฉ์ |
| 3 | AI-MO_NuminaMath-CoT | 859,494 | 2.51 GB | ์ํ CoT |
| 4 | korean_instruction_mix | 515,911 | 1.39 GB | ํ๊ตญ์ด ํผํฉ |
| 5 | lemon-mint_smol-koreantalk | 460,281 | 5.23 GB | ํ๊ตญ์ด ๋ํ |
| 6 | open_korean_instructions | 375,159 | 0.73 GB | ํ๊ตญ์ด ์ง์ |
| 7 | magpie_reasoning_v2 | 249,922 | 3.99 GB | ์ถ๋ก (์์ด) |
| 8 | magpie_reasoning_ko | 224,929 | 3.19 GB | ์ถ๋ก (ํ๊ตญ์ด) |
| 9 | ultrachat_200k | 207,865 | 1.34 GB | ๋ํ |
| 10 | kuotient_orca-math-ko | 193,789 | 0.61 GB | ์ํ (ํ๊ตญ์ด) |
| 11 | data/sft/train.jsonl (์๋ณธ) | 161,848 | 0.27 GB | ์๋ณธ SFT |
| 12 | kullm_v2 | 152,630 | 0.42 GB | ํ๊ตญ์ด ์ง์ |
๊ธฐํ 12๊ฐ ์์ค: DeepMath-103K, Evol-Instruct-Code-80k-ko, ShareGPT-74k-ko, evol-instruct-korean, alpaca-gpt4-korean, ko_wikidata_QA, Ko.WizardLM, KOR-OpenOrca-Platypus-v3, korean-writing-style-instruct, ko_lima, koalpaca_v1_1a, OpenAssistant_oasst1_ko
#### ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
```
24๊ฐ ์์ค (6.59M raw)
โ prepare_sft_combined.sh (ํฌ๋งท ํต์ผ, MD5 ์ค๋ณต ์ ๊ฑฐ, 98:2 split)
ํตํฉ: 2,559,492 train + 52,234 val (7.95 GB)
โ filter_sft_v2.py (5๋จ๊ณ: EOS strip, QA marker ์ ๊ฑฐ, ๊ธธ์ด 50~20K, 4-gram ๋ฐ๋ณต >30% ์ ๊ฑฐ)
์ต์ข
: 2,439,397 train + 49,801 val (7.63 GB) โ ์ ๊ฑฐ์จ 4.69%
```
#### ๋๋ฉ์ธ ๋น์จ
```
์ถ๋ก /CoT 38.0% โโโโโโโโโโโโโโโโโโโโโโโโ
ํ๊ตญ์ด ์ง์ 22.5% โโโโโโโโโโโโโโ
์์ด ๋ค๋ชฉ์ 16.0% โโโโโโโโโโ
์ํ 12.0% โโโโโโโโ
๋ํ/์ฝ๋/๊ธฐํ 11.5% โโโโโโโ
```
### 7.4 ์ ํธ๋ ๋ฐ์ดํฐ (ORPO์ฉ) โ 795K ์
์ด **795,468 preference pairs** (7.9GB, `data/preference/combined_preference.jsonl`)
| HuggingFace ID | ํฌ๊ธฐ | ๋ถ์ผ | ํฌ๋งท |
|---------------|------|------|------|
| `nayohan/preference-collection-ko-full` | 4.9GB | ๋ฒ์ฉ ์ ํธ๋ ํ๊ฐ | instruction + response_A/B + preference |
| `heegyu/orca-math-korean-preference-cleaned` | 1.6GB | ์ํ ์ถ๋ก | prompt + chosen + rejected |
| `kuotient/orca-math-korean-dpo-pairs` | 750MB | ์ํ DPO | prompt + chosen + rejected |
| `maywell/ko_Ultrafeedback_binarized` | 394MB | ํผ๋๋ฐฑ ๊ธฐ๋ฐ ์ ๋ ฌ | prompt + winning/losing response |
| `tellang/yeji-preference-ko-v1` | 171MB | ๋ฒ์ฉ ์ ํธ๋ | prompt + chosen + rejected |
| `jojo0217/korean_rlhf_dataset` | 137MB | RLHF ์ | prompt + chosen + rejected |
| `lemon-mint/korean-realqa-reasoning-v01-preference` | 58MB | QA ์ถ๋ก | prompt + chosen + rejected |
**ํํฐ๋ง ๊ธฐ์ค**: ์ต์ ๊ธธ์ด 20์, EOS ์ ๊ฑฐ, ํฌ๋งท ์ ๊ทํ ํ ํตํฉ
> ORPO๋ Phase 3์์ ๋ฐ๋ณต๋ฅ ์ด 5% ์ด๊ณผํ ๊ฒฝ์ฐ์๋ง ์คํํ๋ค. 3B ๋ชจ๋ธ์ด 1B์ ๊ตฌ์กฐ์ ๋ฐ๋ณต ๋ฌธ์ ๋ฅผ ์ค์ค๋ก ํด๊ฒฐํ๋ค๋ฉด ORPO ์์ด ๋ฐฐํฌํ ์ ์๋ค.
### 7.5 ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์์ฝ
```
[HuggingFace / ์น ์์ง]
โ
โผ
โโโโ ์์ ์์ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ korean_extra/ (39๊ฐ ๋๋ ํ ๋ฆฌ, 640GB+) โ
โ sft_extra/ (27๊ฐ ๋๋ ํ ๋ฆฌ, 1.08M ์ํ) โ
โ preference/ (7๊ฐ JSONL, 795K ์) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโ ํ ํฐํ (SentencePiece 64K) โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ tokenize_extra.py โ ์๋ ํฌ๋งท ๊ฐ์ง (Arrow/Parquet/JSONL) โ
โ 8 workers ๋ณ๋ ฌ ์ฒ๋ฆฌ, uint16 memmap (.bin) ์ถ๋ ฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโ ์ต์ข
๋ณํฉ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Pretrain: 3b_train.bin (77GB, ~38.5B tokens) โ
โ SFT: sft_combined/train_filtered.jsonl (7.48GB, 2.44M ์ํ) โ
โ ORPO: preference/combined_preference.jsonl (7.9GB) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
---
## 8. ํ์ต ์ค์ ๋ฐ ์ต์ ํ
### ํ์ฌ ํ์ต ์ค์ (`configs/korean_3b_fp8.yaml`)
```yaml
model:
vocab_size: 64000
d_model: 3072
n_layers: 28
n_heads: 24
n_kv_heads: 8
d_ffn: 8192
max_seq_len: 2048
rope_theta: 500000.0
training:
batch_size: 5
gradient_accumulation_steps: 8
learning_rate: 1.5e-4
min_lr: 1.5e-5
warmup_steps: 2000
max_steps: 57000
weight_decay: 0.1
grad_clip: 1.0
optimizer: adamw
scheduler: cosine
fp8:
enabled: true
recipe: "mxfp8"
use_transformer_engine: true
distributed:
strategy: ddp
gradient_as_bucket_view: true
find_unused_parameters: false
nccl:
timeout_seconds: 7200
nvls_enabled: true
```
์ ํจ ๋ฐฐ์น ํฌ๊ธฐ = `batch_size(5) ร grad_accum(8) ร num_gpus(8)` = **320**
LR ์ค์ผ์ค: warmup 2000 ์คํ
โ cosine decay โ min_lr=1.5e-5 (max_lr์ 10%)
### Phase 0์์ ๋ฐฐ์ด ์ต์ ํ ๊ตํ
#### GQA FlashAttention Native
๊ฐ์ฅ ํฐ VRAM ์ ๊ฐ์ ๊ฐ์ ธ์จ ์ต์ ํ. ํต์ฌ์ FlashAttention์ด GQA๋ฅผ native๋ก ์ง์ํ๋ค๋ ์ ์ด๋ค. KV head๋ฅผ expandํ์ฌ MHA์ฒ๋ผ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๊ฐ ๋ฐ์ํ์ง๋ง, native path๋ฅผ ์ฐ๋ฉด ๋ด๋ถ์์ ์ง์ ์ฒ๋ฆฌํ๋ค.
```python
# Before (๋นํจ์จ์ ): KV expand โ MHA์ฒ๋ผ ์ฒ๋ฆฌ
k = k.repeat_interleave(n_heads // n_kv_heads, dim=1)
v = v.repeat_interleave(n_heads // n_kv_heads, dim=1)
out = flash_attn_func(q, k, v)
# After (native GQA): flash_attn์ด ๋ด๋ถ์์ GQA ์ฒ๋ฆฌ
out = flash_attn_func(q, k, v) # q: [B, S, H, D], k/v: [B, S, Hkv, D]
# VRAM 60.4GB โ 48.3GB (-20%)
```
#### DDP ์ต์ ํ
```python
# gradient_as_bucket_view=True: gradient tensor๋ฅผ bucket ๋ฉ๋ชจ๋ฆฌ์ view๋ก ์ง์ ๋งคํ
# โ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์ ๊ฑฐ, GPU-CPU ๋๊ธฐํ ์ค๋ฒํค๋ -87.5%
model = torch.nn.parallel.DistributedDataParallel(
model,
device_ids=[local_rank],
gradient_as_bucket_view=True,
find_unused_parameters=False, # ๋ชจ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ์ฉ๋จ
)
```
**์ฃผ์**: `static_graph=True`๋ ์ฌ์ฉํ์ง ์๋๋ค. TransformerEngine์ `te.Linear`๊ฐ ์ผ๋ถ ์ผ์ด์ค์์ dynamic graph๋ฅผ ์๊ตฌํ๋๋ฐ, static_graph๋ฅผ ์ผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
#### NCCL NVLS
```bash
export NCCL_ALGO=NVLSTree # NVLink SHARP (NVLS) ํ์ฑํ
export NCCL_PROTO=Simple
export NCCL_P2P_DISABLE=0
export NCCL_TIMEOUT=7200 # ๊ธด backward์ ๋๋นํ ํ์์์ ์ฌ์
```
NVSwitch๊ฐ All-to-All single hop์ ์ง์ํ๋ฏ๋ก Ring topology๋ณด๋ค NVLSTree๊ฐ ํจ์จ์ ์ด๋ค.
#### SIGHUP 3์ค ๋ฐฉ์ด
์ฅ์๊ฐ ํ์ต์์ ์ธ์
์ฐ๊ฒฐ ๋๊น(SIGHUP)์ ์น๋ช
์ ์ด๋ค. 3์ค ๋ณดํธ๋ฅผ ๊ตฌ์ถํ๋ค:
```bash
# 1์ค: nohup + setsid (์ ์ธ์
๊ทธ๋ฃน)
nohup setsid torchrun --nproc_per_node=8 train/pretrain.py ... &
# 2์ค: Python signal handler (Python ๋ ๋ฒจ SIGHUP ๋ฌด์)
import signal
signal.signal(signal.SIGHUP, signal.SIG_IGN)
# 3์ค: emergency checkpoint (SIGTERM์๋ ์ฒดํฌํฌ์ธํธ ์ ์ฅ)
def emergency_save(signum, frame):
save_checkpoint(model, optimizer, step, "emergency")
sys.exit(0)
signal.signal(signal.SIGTERM, emergency_save)
```
#### torch.compile โ ํ
์คํธ ๊ฒฐ๊ณผ: ํจ๊ณผ ์์
`torch.compile`์ ์ ์ฉํด speedup์ ๊ธฐ๋ํ์ง๋ง ์ค์ธก ๊ฒฐ๊ณผ **1.00x (ํจ๊ณผ ์์)**์ด์๋ค. ๋ ๊ฐ์ง ์ด์ :
1. TransformerEngine์ kernel์ด opaqueํ์ฌ graph break๊ฐ ๋ฐ์ํ๋ค. `torch.compile`์ Python ์ฐ์ฐ ๊ทธ๋ํ๋ฅผ ์ต์ ํํ๋๋ฐ, TE kernel์ ๊ทธ ๊ทธ๋ํ ๋ฐ์ ์๋ค.
2. `/tmp` ๋๋ ํ ๋ฆฌ์ `noexec` ๋ง์ดํธ ํ๋๊ทธ๊ฐ ์์ด ์ปดํ์ผ๋ kernel์ ์บ์ํ์ง ๋ชปํ๋ค.
**๊ตํ**: "์ผ๋จ ์จ๋ณด์"๋ณด๋ค "์ ํจ๊ณผ๊ฐ ์๋์ง ๋จผ์ ์ดํดํ์"๊ฐ ์ค์ํ๋ค.
### ๋ชจ๋ํฐ๋ง ์์คํ
```
ํ
๋ ๊ทธ๋จ ์๋ฆผ ์์คํ
โโโ B200Bot (token ์ค์ ๋จ)
โโโ training_watchdog.sh โ 10๋ถ ๊ฐ๊ฒฉ cron
โ โโโ loss ์ด์, ํ๋ก์ธ์ค ์ข
๋ฃ ๊ฐ์ง โ ์ฆ์ ์๋ฆผ
โโโ hourly_status.sh โ 1์๊ฐ ๊ฐ๊ฒฉ cron
โโโ step, loss, ์๋, VRAM, eta โ ์ ๊ธฐ ๋ฆฌํฌํธ
```
```python
# curl์ด ์ฐจ๋จ๋ผ ์์ด urllib ์ฌ์ฉ
import urllib.request, json
def send_telegram(message):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
data = json.dumps({"chat_id": CHAT_ID, "text": message}).encode()
req = urllib.request.Request(url, data=data,
headers={"Content-Type": "application/json"})
urllib.request.urlopen(req)
```
---
## 9. ์คํ ๊ฒฐ๊ณผ โ 1B ๋ฒ ์ด์ค๋ผ์ธ
1B ๋ชจ๋ธ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ์งํ๊ฒ ๊ธฐ๋กํ๋ค. ์ฑ๊ณต๊ณผ ์คํจ ๋ชจ๋.
### ํ๋ฆฌํธ๋ ์ธ ๊ฒฐ๊ณผ
| ์งํ | ๊ฐ |
|------|-----|
| ์ต์ข
Loss | 1.904 |
| PPL (C4 Korean) | 5.67 |
| ํ์ต ์คํ
| 34,000 |
| ํ์ต ์๊ฐ | ~2์ผ |
### SFT v1 ๊ฒฐ๊ณผ โ ์คํจ
| ์งํ | ๊ฐ |
|------|-----|
| val_loss | 0.0 (๋น์ ์) |
| ์์ธ | label off-by-one ๋ฒ๊ทธ (๋ฐ์ดํฐ ๋์) |
| ๊ฒฐ๋ก | ์ ๋ฉด ํ๊ธฐ |
### SFT v2 ๊ฒฐ๊ณผ โ ๋ถ๋ถ ์ฑ๊ณต
| ์งํ | ๊ฐ |
|------|-----|
| val_loss | 2.2062 |
| ๋ฐ๋ณต๋ฅ | 18% (rep_penalty=1.1 ์ ์ฉ) |
| kobest_copa | 0.646 |
| ๊ฒฐ๋ก | ๊ธฐ๋ฅํ์ง๋ง ๊ตฌ์กฐ์ ํ๊ณ ์กด์ฌ |
### 3B ๊ธฐ๋ ๋ชฉํ์น (์ค์ผ์ผ๋ง ๋ฒ์น ๊ธฐ๋ฐ ์์ธก)
| ๋ฒค์น๋งํฌ | 1B ํ์ฌ | 3B ๋ชฉํ |
|----------|---------|---------|
| kobest_copa | 0.646 | >0.72 |
| kobest_hellaswag | ~0.42 | >0.52 |
| ๋ฐ๋ณต๋ฅ | 18% | <5% |
| PPL (C4 Korean) | 5.67 | <4.5 |
1B์์ 3B๋ก์ ์ค์ผ์ผ์
์ ๋จ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ด ์๋๋ค. ๋ชจ๋ธ์ด ๋ ๊ธด ๋งฅ๋ฝ์ ๊ธฐ์ตํ๊ณ , ๋ ๋ค์ํ ํจํด์ ํ์ตํ ์ ์์ด์ผ ๋ฐ๋ณต๋ฅ ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๋ฎ์์ง๋ค. 3B ๋ชฉํ์น๋ Chinchilla ์ค์ผ์ผ๋ง ๊ณก์ ๊ณผ ์ ์ฌ ๊ท๋ชจ ๋ชจ๋ธ๋ค์ ๋ฒค์น๋งํฌ๋ฅผ ์ฐธ๊ณ ํ ์์ธก๊ฐ์ด๋ค.
---
## 10. ์คํ ๊ฒฐ๊ณผ โ 3B Base ์ข
ํฉ ํ๊ฐ (v2)
3B ์ฌ์ ํ์ต ์๋ฃ ํ checkpoint-0057000 ๊ธฐ์ค์ผ๋ก ์ํํ ์ข
ํฉ ํ๊ฐ.
v2 ์ฌํ๊ฐ๋ 8-GPU ๋ณ๋ ฌ ํ์ดํ๋ผ์ธ์ผ๋ก 13+ ๋ฒค์น๋งํฌ, 0/5-shot ๋น๊ต, calibration, ์ฐธ๊ณ ๋ชจ๋ธ ๋น๊ต๋ฅผ ํฌํจํ๋ค.
์ด ์์ ์๊ฐ 256.6์ด.
> **v1 โ v2 ๋ณ๊ฒฝ์ **: v1(์ด๊ธฐ ํ๊ฐ)์์๋ PPL 3๊ฐ ๋ฐ์ดํฐ์
+ belebele/MMLU 2๊ฐ ๋ฒค์น๋งํฌ๋ง ์ธก์ ํ๋ค. v2๋ PPL 19๊ฐ ๋ฐ์ดํฐ์
, KoBEST 5๊ฐ, HAE-RAE ์ ์ฒด, MMLU-KO 6์นดํ
๊ณ ๋ฆฌ, MMLU-EN 61๊ณผ๋ชฉ, ์์ด 5๋ ๋ฒค์น๋งํฌ, Calibration, 0/5-shot ๋น๊ต, 12์กฐํฉ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น๋ฅผ ํฌํจํ๋ค.
### 10.1 ํ์ต ์ปค๋ธ
| Step | Loss | LR | ๋น๊ณ |
|------|------|----|------|
| 10 | 11.657 | 1.50e-06 | ์ด๊ธฐ (warmup ์์) |
| 500 | 5.047 | 7.50e-05 | warmup ์งํ |
| 2,000 | 2.851 | 3.00e-04 | warmup ์๋ฃ, peak LR |
| 10,000 | 2.057 | 2.86e-04 | ์์ ํ๊ฐ |
| 30,000 | 1.789 | 1.61e-04 | ์ค๋ฐ, epoch 1 ์ง์
|
| 57,000 | 1.466 | 3.00e-05 | ์ต์ข
(cosine min) |
> ์ฒ๋ฆฌ ์๋๋ ์ ๊ตฌ๊ฐ 36~38K tok/s๋ก ์์ . ์ด ํ์ต ์๊ฐ ์ฝ 63์๊ฐ.
### Base Model ๋ฐฑ์
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| ์๋ณธ ์ฒดํฌํฌ์ธํธ | `checkpoints/korean_3b_fp8_run1/checkpoint-0057000/` (34GB) |
| ๋ฐฑ์
| `checkpoints/korean_3b_fp8_run1/checkpoint-0057000_BASE_BACKUP/` |
| MD5 ๊ฒ์ฆ | `4f493d7bcc843727d32453bb3a4e6b7d` (์ผ์น ํ์ธ) |
| HF ๋ณํ | `eval/outputs/hf_3b_base/` (11GB safetensors) |
### 10.2 PPL (Perplexity) โ 19๊ฐ ๋ฐ์ดํฐ์
**์ฃผ์ PPL (3b_val ํตํฉ): 5.2263** (์ด๊ธฐ v1 ํ๊ฐ: 5.709)
| ๋ฐ์ดํฐ์
| PPL | Bits/Token | ํ๊ฐ ํ ํฐ | ์์ ์๊ฐ |
|---------|-----|-----------|---------|---------|
| korean_namuwiki | 25.88 | 4.694 | 6.5M | 63.7s |
| cc100_ko | 21.78 | 4.445 | 13.6M | 133.2s |
| namuwiki_2023b | 18.92 | 4.242 | 7.7M | 75.1s |
| val | 18.30 | 4.194 | 9.1M | 89.4s |
| korean_wiki | 11.84 | 3.565 | 1.6M | 15.5s |
| wikipedia_ko | 10.71 | 3.420 | 1.8M | 17.4s |
| korean | 7.02 | 2.811 | 53.5M | 521.6s |
| open_web_math | 6.93 | 2.792 | 15.7M | 153.5s |
| **korean_c4** | **5.72** | **2.515** | **45.4M** | **443.1s** |
| **3b (ํตํฉ)** | **5.23** | **2.386** | **226.9M** | **2227.3s** |
| cosmo_web_v2 | 4.17 | 2.059 | 8.6M | 84.6s |
| cosmo_stories | 3.96 | 1.984 | 18.9M | 185.2s |
| cosmo_openstax | 3.87 | 1.951 | 0.7M | 7.2s |
| cosmo_stanford | 3.36 | 1.750 | 6.6M | 65.3s |
| cosmo_wikihow | 3.31 | 1.727 | 1.2M | 11.8s |
| cosmo_auto_math_text | 3.15 | 1.655 | 7.9M | 77.3s |
| cosmo_khanacademy | 2.93 | 1.552 | 0.1M | 1.5s |
| mathpile | 2.72 | 1.446 | 7.1M | 69.9s |
| hplt_ko | 2.40 | 1.265 | 48.5M | 475.9s |
> **ํด์**: in-distribution(ํ์ต์ ํฌํจ๋) ๋ฐ์ดํฐ(hplt_ko: 2.40, mathpile: 2.72)๊ฐ ๋ฎ๊ณ , OOD(ํ์ต ๋น์ค ๋ฎ์) ๋ฐ์ดํฐ(cc100_ko: 21.78, namuwiki: 25.88)๊ฐ ๋์ ๊ฒ์ ์์๋ ํจํด. korean_c4 5.72๋ v1์ 5.717๊ณผ ์ผ์นํ์ฌ ํ๊ฐ ์ฌํ์ฑ์ ํ์ธ.
### 10.3 ํ๊ตญ์ด ๋ฒค์น๋งํฌ
#### KoBEST (0-shot) โ ํ๊ท 43.69%
| ํ์คํฌ | Accuracy | F1 |
|--------|----------|-----|
| kobest_boolq | 50.28% | 0.3457 |
| kobest_copa | 49.30% | 0.4921 |
| kobest_hellaswag | 21.60% | 0.2153 |
| kobest_sentineg | 48.61% | 0.4737 |
| kobest_wic | 48.65% | 0.3286 |
| **ํ๊ท ** | **43.69%** | |
#### HAE-RAE (0-shot) โ ์ ์ฒด 19.71%
| ์๋ธํ์คํฌ | Accuracy |
|-----------|----------|
| haerae_general_knowledge | 21.59% |
| haerae_history | 23.40% |
| haerae_loan_word | 21.30% |
| haerae_rare_word | 18.77% |
| haerae_standard_nomenclature | 13.73% |
| **์ ์ฒด** | **19.71%** |
#### MMLU-KO (0-shot) โ 6์นดํ
๊ณ ๋ฆฌ ํ๊ท 22.75%
| ์นดํ
๊ณ ๋ฆฌ | Accuracy |
|----------|----------|
| medical | 30.56% |
| humanities | 24.51% |
| business | 24.14% |
| social_sciences | 20.59% |
| other | 19.64% |
| stem | 19.57% |
| **ํ๊ท ** | **22.75%** |
> Base model์ instruction-following ์์ด 4์ง์ ๋ค ํ์ ๋ฒค์น๋งํฌ๋ฅผ ํ๋๋ก ์ต์ ํ๋์ง ์์. KoBEST boolq/copa/sentineg/wic๋ ~50% ์์ค์ผ๋ก 2์ง/4์ง์ ๋ค ๋๋ค ๊ธฐ์ค ๋ถ๊ทผ์ด๋ฉฐ, SFT ํ ํฅ์ ๊ธฐ๋.
### 10.4 ์์ด ๋ฒค์น๋งํฌ
#### ์ฃผ์ ๋ฒค์น๋งํฌ (0-shot)
| ํ์คํฌ | Accuracy | Acc (norm) |
|--------|----------|-----------|
| hellaswag | 26.00% | 26.15% |
| arc_easy | 25.63% | 26.64% |
| arc_challenge | 21.67% | 27.90% |
| winogrande | 50.59% | โ |
| piqa | 52.50% | 48.31% |
> winogrande(50.59%)์ piqa(52.50%)๋ 2์ง์ ๋ค๋ก ๋๋ค ๊ธฐ์ค 50%์ ๊ทผ์ . hellaswag/arc๋ 4์ง์ ๋ค๋ก ๋๋ค ๊ธฐ์ค 25%.
#### MMLU-EN (0-shot) โ 61๊ณผ๋ชฉ ํ๊ท 25.81%
**์์ 10๊ฐ ๊ณผ๋ชฉ**:
| ๊ณผ๋ชฉ | Accuracy |
|------|----------|
| college_physics | 37.25% |
| college_computer_science | 34.00% |
| high_school_statistics | 33.80% |
| us_foreign_policy | 32.00% |
| security_studies | 31.43% |
| world_religions | 30.99% |
| professional_medicine | 30.88% |
| high_school_government_and_politics | 30.57% |
| jurisprudence | 30.56% |
| human_sexuality | 30.53% |
**ํ์ 5๊ฐ ๊ณผ๋ชฉ**:
| ๊ณผ๋ชฉ | Accuracy |
|------|----------|
| human_aging | 19.73% |
| college_biology | 19.44% |
| anatomy | 17.04% |
| global_facts | 17.00% |
| abstract_algebra | 15.00% |
### 10.5 Calibration
| ๋ฉํธ๋ฆญ | ๊ฐ |
|--------|-----|
| Top-1 Accuracy | 68.75% |
| Top-5 Accuracy | 81.64% |
| Top-10 Accuracy | 85.93% |
| Mean Correct Prob | 0.6152 |
| Mean Entropy | 1.5682 |
**Token NLL ๋ถํฌ**:
| ํต๊ณ | ๊ฐ |
|------|-----|
| ํ๊ท NLL | 1.5561 |
| ํ์คํธ์ฐจ | 2.4926 |
| ์ค์๊ฐ | 0.1221 |
| p95 | 7.0312 |
| p99 | 10.3125 |
| NLL > 5 ๋น์จ | 10.86% |
| NLL > 10 ๋น์จ | 1.18% |
> Top-1 68.75%๋ ๋ชจ๋ธ์ด ๊ฐ์ฅ ํ์ ํ๋ ์์ธก์ด ~69% ํ๋ฅ ๋ก ์ ํํ๋ค๋ ์๋ฏธ. ์ค์๊ฐ NLL 0.12 (โ e^0.12 = 1.13 PPL)๋ก ๋๋ถ๋ถ์ ํ ํฐ์ ๋งค์ฐ ๋์ ํ์ ๋๋ก ์์ธกํ๊ณ , ์์์ ๊ณ ๋์ด๋ ํ ํฐ์ด ํ๊ท NLL์ ๋์ด์ฌ๋ฆฌ๋ ์ ํ์ ์ธ ๋ถํฌ.
### 10.6 0-shot vs 5-shot ๋น๊ต
18๊ฐ ํ๊ตญ์ด ํ์คํฌ์์ 0-shot๊ณผ 5-shot ์ฑ๋ฅ์ ๋น๊ตํ๋ค.
| ํ์คํฌ | 0-shot | 5-shot | ๋ณํ |
|--------|--------|--------|------|
| global_mmlu_ko | 22.75% | 26.75% | **+4.00pp** |
| global_mmlu_ko_business | 24.14% | 31.03% | **+6.90pp** |
| global_mmlu_ko_humanities | 24.51% | 28.43% | +3.92pp |
| global_mmlu_ko_medical | 30.56% | 36.11% | **+5.56pp** |
| global_mmlu_ko_other | 19.64% | 23.21% | +3.57pp |
| global_mmlu_ko_social_sciences | 20.59% | 23.53% | +2.94pp |
| global_mmlu_ko_stem | 19.57% | 21.74% | +2.17pp |
| haerae | 19.71% | 20.26% | +0.55pp |
| haerae_general_knowledge | 21.59% | 22.73% | +1.14pp |
| haerae_history | 23.40% | 14.89% | -8.51pp |
| haerae_loan_word | 21.30% | 24.26% | +2.96pp |
| haerae_rare_word | 18.77% | 18.02% | -0.74pp |
| haerae_standard_nomenclature | 13.73% | 25.49% | **+11.76pp** |
| kobest_boolq | 50.28% | 50.21% | -0.07pp |
| kobest_copa | 49.30% | 46.80% | -2.50pp |
| kobest_hellaswag | 21.60% | 20.80% | -0.80pp |
| kobest_sentineg | 48.61% | 47.86% | -0.76pp |
| kobest_wic | 48.65% | 48.97% | +0.32pp |
**ํ๊ท ๋ณํ: +1.80pp** | ๊ฐ์ : 12 | ํ๋ฝ: 6
> MMLU-KO๋ 5-shot์์ ์ผ๊ด๋๊ฒ ๊ฐ์ (+2~7pp)๋์ด in-context learning ๋ฅ๋ ฅ์ด ์๋ํจ์ ํ์ธ. KoBEST๋ ๊ฑฐ์ ๋ณ๋ ์๊ฑฐ๋ ์ํญ ํ๋ฝโ์ด๋ฏธ 0-shot์์ ํจํด ๋งค์นญ์ ์ํ๊ณ ์์ด few-shot ์์๊ฐ ์คํ๋ ค ๋ฐฉํด๊ฐ ๋๋ ํจํด. haerae_standard_nomenclature์ +11.76pp๋ ์ด ํ์คํฌ์ ํน์ํ ํฌ๋งท์ few-shot์์ ํ์ตํ ๊ฒฐ๊ณผ.
### 10.7 ์ฐธ๊ณ ๋ชจ๋ธ ๋น๊ต
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | MMLU-KO | MMLU-EN | KoBEST ํ๊ท | PPL |
|------|---------|---------|---------|------------|-----|
| **FRANKENSTALLM 3B** | **3B** | **22.75%** | **25.81%** | **43.69%** | **5.2263** |
| Llama-3.2-3B | 3B | ~42% | ~58% | ~55% | โ |
| Qwen2.5-3B | 3B | ~48% | ~65% | ~60% | โ |
| EXAONE-3.5-2.4B | 2.4B | ~35% | ~50% | ~50% | โ |
> ์ฐธ๊ณ ๋ชจ๋ธ๋ค์ ์์กฐ ํ ํฐ ๊ท๋ชจ์ ํ์ต ๋ฐ์ดํฐ์ ์์ฒ GPU-hour๋ฅผ ํฌ์
ํ ๊ฒฐ๊ณผ. FRANKENSTALLM 3B๋ 41.12B ํ ํฐ(Chinchilla ์ต์ ์ ~68%), 63์๊ฐ, 8 GPU๋ก ํ์ตํ ์ ์ ๊ฐ์ํด์ผ ํ๋ค. SFT + ํ์ฅ ํ๋ฆฌํธ๋ ์ธ(80-100B ํ ํฐ) ์ดํ ๊ฒฉ์ฐจ ์ถ์ ์์.
### 10.8 ์์ฑ ํ์ง ๋ฐ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น
#### ๋ฐ๋ณต๋ฅ ์์ฝ
| ์ค์ | 3-gram ๋ฐ๋ณต๋ฅ | 4-gram ๋ฐ๋ณต๋ฅ |
|------|--------------|--------------|
| greedy (temp=0.0) | 60.99% | 57.02% |
| temp=0.5 | 60.12% | 58.68% |
| temp=0.7 | 47.69% | 43.40% |
| temp=1.0 | 3.58% | 2.81% |
> ์ด๊ธฐ v1 ํ๊ฐ์ greedy 71.1% ๋ฐ๋ณต๋ฅ ์ `no_repeat_ngram_size=3` ์ ์ฉ ๊ธฐ์ค์ด์๋ค. v2์์๋ ๋ฏธ์ ์ฉ ๊ธฐ์ค(raw)์ผ๋ก ํต์ผํ์ฌ 60.99%๋ฅผ ๊ธฐ๋ก.
#### 12์กฐํฉ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น ๊ฒฐ๊ณผ
| ์ค์ | Temp | Rep Pen | 3-gram | 4-gram | ๋น๊ณ |
|------|------|---------|--------|--------|------|
| **t0.7_rep1.3** | **0.70** | **1.30** | **0.00%** | **0.00%** | **์ต์ ** |
| t0.9_rep1.2 | 0.90 | 1.20 | 0.00% | 0.00% | ์ฐจ์ |
| t0.7_rep1.2 | 0.70 | 1.20 | 0.88% | 0.00% | |
| t0.9_rep1.1 | 0.90 | 1.10 | 0.94% | 0.13% | |
| t1.0_rep1.1 | 1.00 | 1.10 | 1.21% | 0.48% | |
| t0.5_rep1.1 | 0.50 | 1.10 | 1.92% | 1.19% | |
| t1.0 | 1.00 | 1.00 | 3.58% | 2.81% | |
| t0.9 | 0.90 | 1.00 | 8.39% | 4.64% | |
| t0.7_rep1.1 | 0.70 | 1.10 | 8.51% | 5.51% | |
| t0.7 | 0.70 | 1.00 | 47.69% | 43.40% | |
| t0.5 | 0.50 | 1.00 | 60.12% | 58.68% | |
| greedy | 0.00 | 1.00 | 60.99% | 57.02% | |
#### ๊ถ์ฅ ์ถ๋ก ํ๋ผ๋ฏธํฐ (base ์คํ์ฉ)
```python
# v2 ๊ทธ๋ฆฌ๋ ์์น ์ต์ ๊ฐ
temp=0.7, repetition_penalty=1.3
# ๋๋ (๋ ๋ค์ํ ์์ฑ)
temp=0.9, repetition_penalty=1.2
```
> ์ด๊ธฐ v1 ๊ถ์ฅ๊ฐ(`temp=0.9, top_p=0.9, no_repeat_ngram=3, repetition_penalty=1.1`)์์ `repetition_penalty=1.3`์ผ๋ก ์ํฅ ์กฐ์ . `no_repeat_ngram_size`๋ ๊ทธ๋ฆฌ๋ ์์น์์ `repetition_penalty`๋ง์ผ๋ก ์ถฉ๋ถํ ๋ฐ๋ณต ์ ๊ฑฐ๊ฐ ๊ฐ๋ฅํจ์ ํ์ธํ์ฌ ๋ถํ์.
### 10.9 ํ๊ฐ ํ์ดํ๋ผ์ธ
v2 ์ฌํ๊ฐ๋ ๋ชจ๋ํ๋ 8-GPU ๋ณ๋ ฌ ํ์ดํ๋ผ์ธ(`eval/reeval_pipeline.py`)์ผ๋ก ์ํ๋์๋ค.
#### ์ํคํ
์ฒ
```
reeval_pipeline.py
โโโ ๋ชจ๋ธ 1ํ ๋ก๋ (GPU 0์ HF ๋ชจ๋ธ)
โโโ Phase 1: PPL ํ๊ฐ (19๊ฐ ๋ฐ์ดํฐ์
, ์์ฐจ)
โโโ Phase 2: Calibration + Token NLL
โโโ Phase 3: ์์ฑ ํ์ง + ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น (12์กฐํฉ)
โโโ Phase 4: lm-evaluation-harness (0-shot, 8-GPU ๋ณ๋ ฌ)
โโโ Phase 5: lm-evaluation-harness (5-shot, 8-GPU ๋ณ๋ ฌ)
โโโ Phase 6: ๋ฆฌํฌํธ ์๋ ์์ฑ (5๊ฐ ๊ฐ๋ณ + 1๊ฐ ์ข
ํฉ)
```
#### Pipeline Mode
๋ชจ๋ธ์ 1ํ ๋ก๋ํ์ฌ 0-shot๊ณผ 5-shot์ ์ฐ์ ์คํํ๋ค. ๊ธฐ์กด ๋ฐฉ์(๋ณ๋ ํ๋ก์ธ์ค 2ํ)์ ๋นํด ๋ชจ๋ธ ๋ก๋ฉ ์๊ฐ์ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค.
#### GPU๋ณ ํ์คํฌ ๋ถ๋ฐฐ
| GPU | 0-shot ํ์คํฌ | 5-shot ํ์คํฌ |
|-----|--------------|--------------|
| 0 | kobest_boolq, kobest_copa, kobest_hellaswag | ๋์ผ |
| 1 | kobest_sentineg, kobest_wic | ๋์ผ |
| 2 | haerae (์ ์ฒด + 5๊ฐ ์๋ธ) | ๋์ผ |
| 3 | global_mmlu_ko (6์นดํ
๊ณ ๋ฆฌ) | ๋์ผ |
| 4 | hellaswag, arc_easy | ๋์ผ |
| 5 | arc_challenge, winogrande | ๋์ผ |
| 6 | piqa, global_mmlu_en (61๊ณผ๋ชฉ) | ๋์ผ |
| 7 | (์๋น โ PPL/calibration ์ ๋ด) | โ |
NUMA affinity ์ ์ฉ: GPU 0-3์ NUMA node 0 (cores 0-35), GPU 4-7์ NUMA node 1 (cores 36-71).
**์ด ์์ ์๊ฐ: 256.6์ด** (๋ชจ๋ธ ๋ก๋ ํฌํจ)
### SFT ์งํ ํ๋จ
**๊ฒฐ๋ก : SFT ์งํ** โ loss 1.466 ๊ฑด๊ฐํ ์๋ฃ ์๊ทธ๋, ๊ตฌ์กฐ ๋ฌธ์ ์์. โ **Phase 2 SFT ์์ (2026-03-05)**
์์ธ ๋ณด๊ณ ์:
- v2 ์ข
ํฉ: `eval/outputs/3b_reeval_20260305_1451/reports/` (5๊ฐ ๊ฐ๋ณ ๋ฆฌํฌํธ + ์ข
ํฉ)
- v1 ๋ ๊ฑฐ์: `reports/2026-03-05_3B_BASE_EVALUATION_REPORT.md`
---
## 11. ์คํ ๊ฒฐ๊ณผ โ 3B SFT ์ข
ํฉ ํ๊ฐ
Phase 2 SFT๊ฐ early stopping์ผ๋ก ์๋ฃ๋ ํ ์ํํ 6์ฐจ์ ์ข
ํฉ ํ๊ฐ.
### 11.1 SFT ํ์ต ๊ฒฐ๊ณผ
| ํญ๋ชฉ | ๊ฐ |
|------|-----|
| ์ต์ข
Step | 25,500 / 33,000 (77.3%, early stopping) |
| Best val_loss | **1.8851** (step 23,000) |
| ํ์ต ์๊ฐ | ~15์๊ฐ 41๋ถ |
| ๋ฐ์ดํฐ | 24๊ฐ ์์ค โ 2,439,397 samples (7.48 GB) |
| ์ค์ | LR=1e-5, eff_batch=64, NEFTune alpha=5.0 |
**Val Loss ์ถ์ด**:
```
Step 500: 2.0732 (warmup ์๋ฃ)
Step 2,000: 1.9558 (๊ธ์ ํ๊ฐ)
Step 5,000: 1.9107 (์์ ์๋ ด)
Step 10,000: 1.8917 (๋ฏธ์ธ ๊ฐ์)
Step 15,000: 1.8864 (plateau ์ง์
)
Step 20,000: 1.8853 (๋ณ๋ < 0.001)
Step 23,000: 1.8851 โ BEST (early stopping ๊ธฐ์ค์ )
Step 25,500: Early Stop (patience 5/5 ์์ง)
```
### 11.2 6์ฐจ์ ํ๊ฐ ์์ฝ
| # | ์ฐจ์ | ๊ฒฐ๊ณผ | ํต์ฌ ์์น |
|---|------|------|-----------|
| 1 | Perplexity (์ง์ ๋ณด์กด) | **PASS** | ์ต๋ forgetting 0.9%, 19๊ฐ ๋ฐ์ดํฐ์
์ ์ฒด PASS |
| 2 | ์์ฑ ํ์ง | **FAIL** | Greedy ๋ฐ๋ณต๋ฅ 72.97% (๋ชฉํ <5%), EOS 60% (๋ชฉํ >90%) |
| 3 | ํ๊ตญ์ด ๋ฒค์น๋งํฌ | **FAIL** | KoBEST ํ๊ท 43.26% (๋ชฉํ >55%) |
| 4 | ์์ด ๋ฒค์น๋งํฌ | **PASS** | hellaswag 26.1%, winogrande 50.8%, piqa 52.6% (์ ํญ๋ชฉ ํํ ์ด๊ณผ) |
| 5 | Calibration | **PASS** | Top-1 68.59%, Top-5 81.55%, Entropy 1.54 |
| 6 | SFT Chat ๋ฅ๋ ฅ | **PASS** | EOS ์ข
๋ฃ์จ 0%โ60%, Chat template ์๋ต |
### 11.3 Base vs SFT ๋น๊ต
| ์งํ | Base | SFT | ๋ณํ | ํ์ |
|------|------|-----|------|------|
| PPL (ํตํฉ) | 5.2263 | 5.2529 | +0.5% forgetting | PASS |
| Greedy 3-gram ๋ฐ๋ณต๋ฅ | 60.99% | 72.97% | +12pp (์
ํ) | FAIL |
| EOS ์ข
๋ฃ์จ | 0% | 60% | +60pp (๋ํญ ๊ฐ์ ) | ๋ถ๋ถ PASS |
| KoBEST ํ๊ท | 43.69% | 43.26% | -0.4pp | FAIL |
| MMLU-KO | 22.75% | 26.00% | +3.2pp | ๋ถ๋ถ ๊ฐ์ |
| ์์ด ๋ฒค์น๋งํฌ | โ | โ | ยฑ0.3pp ์ด๋ด | PASS (์ ์ง) |
| Calibration Top-1 | 68.75% | 68.59% | -0.2pp | PASS (์ ์ง) |
**Repetition ํ๋ผ๋ฏธํฐ ๊ฒ์** (ํฌ๋ง์ ):
| ์ค์ | ๋ฐ๋ณต๋ฅ | EOS Rate |
|------|--------|----------|
| t0.7_rep1.2 | **0.00%** | **100%** |
| t1.0_rep1.1 | **0.00%** | **100%** |
| greedy (raw) | 72.97% | 60% |
> rep_penalty 1.1~1.3 ์ ์ฉ ์ ๋ฐ๋ณต๋ฅ 0% ๋ฌ์ฑ โ ๋ชจ๋ธ์ด ๋ฐ๋ณตํ์ง ์๋ ๋ฅ๋ ฅ ์์ฒด๋ ๋ณด์ . ORPO๋ก ๋ด์ฌํ ๊ฐ๋ฅ.
### 11.4 ์ฝ๋ ๊ฐ์ ์ฌํญ
์ด๋ฒ Phase์์ ์ํํ ์ฃผ์ ์ฝ๋ ๋ณ๊ฒฝ:
| ํ์ผ | ๋ณ๊ฒฝ | ์ค ์ | ๋ชฉ์ |
|------|------|-------|------|
| `train/sft.py` | MixingDataLoader, DDP rank 0 ํ ํฌ๋์ด์ง | +238 | SFT+pretrain ์ธํฐ๋ฆฌ๋น, ๋ฉ๋ชจ๋ฆฌ 8๋ฐฐ ์ ๊ฐ |
| `train/trainer.py` | DDP early stop broadcast | +17 | DDP hang ๋ฐฉ์ง, patience 5โ10 |
| `train/orpo.py` | YAML config, 3B ๊ธฐ๋ณธ๊ฐ | +30 | ORPO ์คํ ์ค๋น |
| `eval/report_generator.py` | SFT ๋น๊ต ๋ณด๊ณ ์ ์๋ ์์ฑ | +831 | ํ๊ฐ ์๋ํ |
| `eval/sft_eval_pipeline.py` | 6์ฐจ์ ํ๊ฐ ํ์ดํ๋ผ์ธ | ์ ๊ท | SFT ์ข
ํฉ ํ๊ฐ |
| `eval/tasks/generation_task.py` | Chat template, diversity metrics | +75 | SFT ํ๊ฐ ์ง์ |
### 11.5 ORPO ์งํ ํ์
**ํ์ : Phase 3 ORPO ์งํ**
| ๊ทผ๊ฑฐ | ์์ธ |
|------|------|
| ์ง์ ๋ณด์กด ์ํธ | forgetting 0.9% โ SFT๊ฐ base ์ง์์ ํ๊ดดํ์ง ์์ |
| ๋ฐ๋ณต ๋ฏธํด๊ฒฐ | greedy 72.97% โ ์ ํธ๋ ์ ๋ ฌ์ด ์ง์ ์ ํด๊ฒฐ ๊ฒฝ๋ก |
| ํฌ๋ง์ ์ ํธ | rep_penalty ์ ์ฉ ์ 0% โ ORPO๊ฐ ๋ด์ฌํ ๊ฐ๋ฅ |
| ๋ฐ์ดํฐ ์ค๋น ์๋ฃ | 795,468 preference pairs (7.9 GB) |
| ์ฝ๋/์ค์ ์๋น | `train/orpo.py` + `configs/korean_3b_orpo.yaml` |
**ORPO ํ ํ์ ๊ธฐ์ค**:
- ๋ฐ๋ณต๋ฅ < 5% AND KoBEST > 50% โ GGUF + Ollama ๋ฐฐํฌ
- ๋ฐ๋ณต๋ฅ 5~15% โ ํ์ดํผํ๋ผ๋ฏธํฐ ์กฐ์ ํ ์ฌ์๋
- ๋ฐ๋ณต๋ฅ > 15% โ SFT v2 (lr=5e-5, data mixing) ํ ์ฌ๋์
์์ธ: `reports/2026-03-06_3B_SFT_COMPLETION_AND_EVAL_SUMMARY.md`
---
## 12. Phase 3 โ ORPO (์ ํธ๋ ์ ๋ ฌ)
### 12.1 ORPO ์ ํ ๋ฐฐ๊ฒฝ
SFT 6์ฐจ์ ํ๊ฐ์์ greedy ๋ฐ๋ณต๋ฅ 72.97%, EOS ์ข
๋ฃ์จ 0%๋ผ๋ ์น๋ช
์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ค. SFT๋ "์ข์ ์๋ต๋ง ๋ชจ๋ฐฉ"ํ๋ ํ์ต์ด๋ฏ๋ก, "๋์ ์๋ต์ ์ต์ "ํ๋ ์ ํธ๊ฐ ์๋ค. ๋ฐ๋ณต ๋ฌธ์ ํด๊ฒฐ์๋ preference optimization์ด ํ์์ ์ด๋ค.
**ORPO vs DPO**:
| ํญ๋ชฉ | ORPO | DPO |
|------|------|-----|
| Reference model | ๋ถํ์ | ํ์ (VRAM 2๋ฐฐ) |
| ๊ตฌํ ๋ณต์ก๋ | ๋ฎ์ | ์ค๊ฐ |
| ๋ฉ๋ชจ๋ฆฌ ํจ์จ | ๋์ (3B 1๊ฐ๋ง ๋ก๋) | ๋ฎ์ (3B 2๊ฐ ๋ก๋) |
| ํ์ต ์์ ์ฑ | ์ค๊ฐ | ๋์ |
ORPO๋ฅผ 1์ฐจ ์ ํ, DPO๋ฅผ Plan B๋ก ์ค์ ํ๋ค.
### 12.2 ๋ฐ์ดํฐ
- **์๋ณธ**: 683,181 preference pairs (7๊ฐ ์์ค ํตํฉ)
- **ํํฐ ํ**: ~630,000 pairs (NaN ๋ฐฉ์ง ํํฐ ์ ์ฉ)
- **Eval split**: 5% (~31,500 pairs, seed=42)
- **Effective batch**: 4 ร 8 GPU ร 4 accum = 128
### 12.3 HP Sweep ์ค๊ณ (6-Config)
3๊ฐ ์ถ(beta, LR, max_length)์ ์ค์ฌ์ถ ๊ณ ์ ๋ฐฉ์์ผ๋ก 6๊ฐ ์กฐํฉ ์ ์ :
| Run | Name | Beta | LR | Max Length | ๋ชฉ์ |
|-----|------|------|----|-----------|------|
| 1 | baseline_b015 | 0.15 | 8e-6 | 1536 | ์ฝํ beta ๋ฒ ์ด์ค๋ผ์ธ |
| 2 | baseline_b025 | 0.25 | 8e-6 | 1536 | ์ค๊ฐ beta ๋ฒ ์ด์ค๋ผ์ธ |
| 3 | strong_b035 | 0.35 | 8e-6 | 1536 | ๊ฐํ beta โ ์ ๊ทน์ ๋ฐ๋ณต ์ต์ |
| 4 | fast_lr12e6 | 0.25 | 1.2e-5 | 1536 | ๋์ LR โ ๋น ๋ฅธ ์๋ ด |
| 5 | conserv_lr5e6 | 0.25 | 5e-6 | 1536 | ๋ณด์์ LR โ ์์ ์ฑ |
| 6 | short_1024 | 0.25 | 8e-6 | 1024 | ์งง์ max_length โ VRAM ์ ์ฝ |
๊ฐ 200 steps, eval_steps=100, 8รB200 DDP.
### 12.4 ์๋ ์ด๋ ฅ โ 5๋ฒ์ ์คํจ
| # | ๋ฌธ์ | ์์ธ | ์์ |
|---|------|------|------|
| 1 | NCCL Timeout | ํ ํฌ๋์ด์ง 30๋ถ > timeout 1800s | ddp_timeout=7200, num_proc=64 |
| 2 | Config ์ถฉ๋ | save_steps โ eval_steps ๋ฐฐ์ | --no_load_best --save_steps 200 |
| 3 | ํฌํธ ์ถฉ๋ + QKV ๋๋ฝ | ์ข๋น ํ๋ก์ธ์ค + fused QKV ๋ฏธ๋ถ๋ฆฌ | pkill + QKV split ๋ก์ง |
| 4 | TRL NaN ๋ฒ๊ทธ | tokenize_row ์์ชฝ response ๋์ ์๋ฆผ | 3์ค ํจ์น (clamp, truncation) |
| 5 | Tokenizer ํธํ | zip(strict=True) + ํ๊ตญ์ด merge ops | TRL ์์ค 8๊ฑด ํจ์น |
๊ฐ์ฅ ์ฌ๊ฐํ๋ ๊ฒ์ TRL NaN ๋ฒ๊ทธ๋ก, 0 response tokens โ log(0) = -inf โ NaN ์ ํ ์ฒด์ธ์ ์ผ์ผ์ผฐ๋ค. ์์ธ: `reports/2026-03-08_ORPO_TRAINING_JOURNEY.md`
### 12.5 ์ค์ ์ต์ข
๊ฒฐ๊ณผ
| Run | Name | Beta | LR | MaxLen | Train Loss | Eval Loss | Margin | Status |
|-----|------|------|----|--------|-----------|-----------|--------|--------|
| 1 | baseline_b015 | 0.15 | 8e-6 | 1536 | 1.811 | 1.827 | 0.004 | โ
|
| 2 | baseline_b025 | 0.25 | 8e-6 | 1536 | 1.890 | 1.906 | 0.009 | โ
|
| 3 | strong_b035 | 0.35 | 8e-6 | 1536 | 2.055 | 1.985 | 0.007 | โ
|
| **4** | **fast_lr12e6** | **0.25** | **1.2e-5** | **1536** | **1.917** | **1.862** | **0.009** | **๐ Best** |
| 5 | conserv_lr5e6 | 0.25 | 5e-6 | 1536 | 1.833 | 1.910 | 0.004 | โ
|
| 6 | short_1024 | 0.25 | 8e-6 | 1024 | 1.664 | 1.695 | 0.007 | โ
|
**Best config: Run 4** (eval_loss 1.862 ์ต์ , margin 0.009 ์ต๊ณ , ๋น ๋ฅธ ์๋ ด).
### 12.6 Throughput ๋ฒค์น๋งํฌ โ ๋ณธ ํ์ต ์ค์
๋ณธ ํ์ต ์ batch/grad_accum ์กฐํฉ์ throughput์ ์ธก์ ํ์ฌ ์ต์ ์ค์ ์ ๊ฒฐ์ :
| batch_size | grad_accum | eff_batch | Throughput | ๋น๊ณ |
|-----------|-----------|----------|-----------|------|
| **4** | **4** | **128** | **80.63 samples/s** | **์ ์ ** |
| 2 | 8 | 128 | 73.14 samples/s | ๊ธฐ์กด ์ค์ |
| 8 | 2 | 128 | OOM | |
### 12.7 ORPO ๋ณธ ํ์ต (์๋ฃ)
| ํ๋ผ๋ฏธํฐ | ๊ฐ |
|---------|-----|
| Beta / LR | 0.25 / 1.2e-5 (Sweep Run 4) |
| Batch / Accum / Eff | 4 / 4 / 128 (๋ฒค์น๋งํฌ ์ต์ ) |
| Max length | 1536 |
| Epochs | 2 (~9,840 steps) |
| GPU VRAM | ~52GB / 183GB (28%) |
| ์๋ | ~1.75 s/step |
| ์์ ์๊ฐ | ~4.8์๊ฐ |
**ํ์ต ์งํ ์ถ์ด (step ~1,660 ๊ธฐ์ค)**:
| Step | Eval Loss | Pref Accuracy | Reward Margin | NLL Loss |
|-----:|----------:|--------------:|--------------:|---------:|
| ~1,000 | 1.791 | 66.8% | 0.107 | 1.647 |
| ~2,000 | 1.713 | 70.1% | 0.293 | 1.591 |
| ~3,000 | 1.681 | 71.9% | 0.372 | 1.567 |
- Train loss: 2.34 โ **1.68** (-0.66)
- rewards/accuracies: 0.43 โ **0.74** (chosen/rejected ๊ตฌ๋ถ ๋ฅ๋ ฅ ๊ธ์์น)
- rewards/margins: -0.005 โ **0.387** (preference signal ํ์ต ํ์ธ)
- ์๋ ~1.76 s/step, GPU 92~100% utilization, ์์ ์ ์งํ ์ค
**ํ์ต ์๋ฃ ํ ์๋ ํ๊ฐ**: `scripts/orpo_eval_watchdog.sh` ๊ฐ ํ์ต ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํ๋ฉฐ, ์๋ฃ ์ ์๋์ผ๋ก 10์ฐจ์ ์ข
ํฉ ํ๊ฐ ํ์ดํ๋ผ์ธ ์คํ
### 12.8 ORPO ์ข
ํฉ ํ๊ฐ ํ์ดํ๋ผ์ธ
SFT v2 ํ๊ฐ์ 6์ฐจ์์ ORPO ๊ณ ์ 4์ฐจ์์ ์ถ๊ฐํ **10์ฐจ์ ์ข
ํฉ ํ๊ฐ**.
ํ์ต ์๋ฃ ์ `eval/orpo_eval_pipeline.py`๊ฐ ์๋ ์คํ๋์ด Base vs SFT vs ORPO 3-way ๋น๊ต ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ค.
**ํ๊ฐ ๊ตฌ์กฐ**:
| Phase | ๋ด์ฉ | GPU | ์์ ์๊ฐ |
|-------|------|-----|----------|
| Pre-phase | train.log์์ ํ์ต ๊ณก์ ์ถ์ถ | - | ~1์ด |
| Phase 1 | ๋ด๋ถ ํ๊ฐ (PPL 19์
, Calibration, Generation, Repetition Grid) | 8 GPU ๋ณ๋ ฌ | ~30๋ถ |
| Phase 2 | ๋ฒค์น๋งํฌ (KoBEST, HAE-RAE, MMLU-KO/EN, hellaswag, arc, piqa) | 8 GPU ๋ณ๋ ฌ | ~1์๊ฐ |
| Phase 3 | 3-way ๋น๊ต ๋ณด๊ณ ์ ์๋ ์์ฑ | - | ~10์ด |
**10์ฐจ์ ํ๊ฐ ํญ๋ชฉ**:
| # | ์ฐจ์ | ๊ธฐ์ค | SFT v2 ๊ฒฐ๊ณผ | ORPO ๋ชฉํ |
|---|------|------|------------|----------|
| 1 | ์ง์ ๋ณด์กด (PPL) | forgetting < 15% | 0.9% | < 5% |
| 2 | ์์ฑ ํ์ง | greedy ๋ฐ๋ณต๋ฅ < 5%, EOS > 90% | **72.97% / 60%** | **< 5% / > 90%** |
| 3 | ํ๊ตญ์ด ๋ฒค์น๋งํฌ | KoBEST ํ๊ท > 55% | 43.26% | โฅ 43% |
| 4 | ์์ด ๋ฒค์น๋งํฌ | ํํ ์ด๊ณผ | PASS | ์ ์ง |
| 5 | Calibration | Top-1 โฅ 65% | 68.59% | โฅ 65% |
| 6 | Chat ๋ฅ๋ ฅ | EOS ์ข
๋ฃ์จ | 60% | > 90% |
| 7 | Preference Accuracy | > 65% | โ | > 65% |
| 8 | Reward Margins | > 0.1 | โ | > 0.1 |
| 9 | ๋ฐ๋ณต ํ๋ผ๋ฏธํฐ ๋ฏผ๊ฐ๋ | rep_penalty=1.0์์๋ < 5% | โ | PASS |
| 10 | SFTโORPO ๊ฐ์ | ๋ฐ๋ณต๋ฅ โ + EOSโ | โ | PASS |
**ํต์ฌ ํ์ผ**:
- `eval/orpo_eval_pipeline.py` โ ORPO ํ๊ฐ ์ค์ผ์คํธ๋ ์ดํฐ
- `eval/report_generator.py` โ 3-way ๋น๊ต ๋ณด๊ณ ์ ์์ฑ๊ธฐ (`generate_three_way_report()`)
- `scripts/orpo_eval_watchdog.sh` โ ํ์ต ์๋ฃ ๊ฐ์ง + ์๋ ํ๊ฐ ์คํ
**๋ฐฐํฌ ๊ธฐ์ค**: greedy ๋ฐ๋ณต๋ฅ < 5% AND EOS > 90% AND forgetting < 5% AND KoBEST โฅ 43% โ **DEPLOY**
---
## 13. ์คํ ๋ฐฉ๋ฒ
### ์ฌ์ ์๊ตฌ์ฌํญ
```bash
# PyTorch๋ ์ฌ์ค์น ๊ธ์ง (NVIDIA ์ปค์คํ
๋น๋)
# ์๋ ํจํค์ง๋ง ์ถ๊ฐ ์ค์น
pip install transformers accelerate peft trl deepspeed \
bitsandbytes sentencepiece wandb
```
### 3B ํ๋ฆฌํธ๋ ์ธ
```bash
# NCCL ํ๊ฒฝ๋ณ์์ ํจ๊ป 8-GPU ํ์ต ์คํ
bash scripts/launch_3b_pretrain.sh
# ์๋ ์คํ (์ง์ ์ ์ด)
torchrun --nproc_per_node=8 \
--master_port=29500 \
train/pretrain.py \
--config configs/korean_3b_fp8.yaml
```
### SFT
```bash
bash scripts/launch_3b_sft.sh
# ๋๋ ์ง์ ์คํ
torchrun --nproc_per_node=8 \
train/sft.py \
--config configs/korean_3b_sft.yaml \
--pretrain_ckpt checkpoints/3b_pretrain_best.pt
```
### ORPO (์ ํธ๋ ์ ๋ ฌ)
```bash
# ORPO ํ์ต
bash scripts/launch_3b_orpo.sh
# ํ์ต ์๋ฃ ํ ์๋ ํ๊ฐ (watchdog)
nohup bash scripts/orpo_eval_watchdog.sh \
> checkpoints/korean_3b_orpo_v1/watchdog.log 2>&1 &
```
### ํ๊ฐ
```bash
# Base ๋ชจ๋ธ ์ ์ฒด ํ๊ฐ (8 GPU ๋ณ๋ ฌ)
python eval/full_eval_pipeline.py
# SFT ๋ชจ๋ธ ํ๊ฐ (Base vs SFT 2-way ๋น๊ต)
python eval/sft_eval_pipeline.py --skip-phase0 \
--hf-model-path eval/outputs/hf_3b_sft_best
# ORPO ๋ชจ๋ธ ํ๊ฐ (Base vs SFT vs ORPO 3-way ๋น๊ต)
python eval/orpo_eval_pipeline.py # ์๋์ผ๋ก ์ต์ checkpoint ๊ฐ์ง
python eval/orpo_eval_pipeline.py --dry-run # ์คํ ๊ณํ๋ง ํ์ธ
# ๋น ๋ฅธ ํ๊ฐ (kobest_copa + PPL)
bash scripts/run_eval_quick.sh
# ์์ฑ ํ๋ผ๋ฏธํฐ ํ์
python eval/test_generation_params.py \
--checkpoint checkpoints/3b_best.pt
```
### ๋ฐฐํฌ
```bash
# Step 1: GGUF ๋ณํ (llama.cpp ํฌ๋งท)
bash scripts/convert_3b_gguf.sh
# Step 2: Ollama ๋ชจ๋ธ ๋ฑ๋ก ๋ฐ ์๋น
bash scripts/deploy_3b_ollama.sh
# Ollama๋ก ํ
์คํธ
ollama run frankenstallm-3b "ํ๊ตญ์ ์ฒ ๊ฐ ์ฐ์
์ ๋ํด ์ค๋ช
ํด์ค."
```
### ํ์ต ๋ชจ๋ํฐ๋ง
```bash
# ์ค์๊ฐ ๋ชจ๋ํฐ (tail -f ๋ฐฉ์)
bash scripts/monitor_3b.sh
# ํ๋ก์ธ์ค ์ํ ํ์ธ
ps aux | grep pretrain
# GPU ์ํ
nvidia-smi --query-gpu=index,name,memory.used,memory.total,utilization.gpu \
--format=csv -l 5
```
### ๋จ์ผ GPU ํ
์คํธ (๊ฐ๋ฐ/๋๋ฒ๊ทธ)
```bash
python train/pretrain.py \
--config configs/korean_3b_fp8.yaml \
--device cuda:0 \
--max_steps 100 \
--debug
```
---
## 14. ๋ก๋๋งต
### ๋จ๊ธฐ (2026๋
3์)
| ํญ๋ชฉ | ์ํ | ๋น๊ณ |
|------|------|------|
| Phase 1 (3B Pretrain) ์๋ฃ | โ
์๋ฃ | 57K steps, loss 1.466, 2026-03-05 |
| Phase 2 (SFT) ์๋ฃ | โ
์๋ฃ | 25.5K steps, val_loss 1.8851, 2026-03-06 |
| SFT 6์ฐจ์ ํ๊ฐ | โ
์๋ฃ | 4/6 PASS, ORPO ํ์ |
| Phase 3 (ORPO Sweep) | โ
์๋ฃ | 6-config sweep ์๋ฃ, best config ์ ์ |
| **Phase 3 (ORPO ๋ณธ ํ์ต)** | **โ
์๋ฃ** | **9,997 steps, eval_loss 1.625, pref_acc 76.02%** |
| Phase 3.5 (ORPO ์ข
ํฉ ํ๊ฐ) | โ
์๋ฃ | 7/10 PASS, 3-way ๋น๊ต ์๋ฃ |
| GGUF ๋ณํ + Ollama ๋ฐฐํฌ | โ
์๋ฃ | byte-fallback ์์ , Q4_K_M/Q8_0/f16, HF + Ollama ๋ฐฐํฌ |
### ์ค๊ธฐ (2026๋
2๋ถ๊ธฐ)
| ํญ๋ชฉ | ๋น๊ณ |
|------|------|
| ํ์ฅ ํ๋ฆฌํธ๋ ์ธ (80~100B ํ ํฐ) | Chinchilla ์ต์ ์ ๋ฌ์ฑ |
| QKV Fusion | +8~12% MFU ๊ธฐ๋ |
| NUMA Affinity ์ค์ | +4~9% ์์ |
| FA2 native RoPE | +3~5% ์์ |
| Context length ํ์ฅ (4096) | RoPE ฮธ=500K ๊ธฐ๋ฐ |
### ์ฅ๊ธฐ (2026๋
ํ๋ฐ๊ธฐ)
| ํญ๋ชฉ | ๋น๊ณ |
|------|------|
| 7B ์คํ | FSDP ์ ๋ต ํ์ |
| vLLM serving | PagedAttention ๊ธฐ๋ฐ ์ถ๋ก ์๋ฒ |
| ๋๋ฉ์ธ ํนํ ํ์ธํ๋ | ์ฒ ๊ฐ/์ ์กฐ์
๋๋ฉ์ธ |
| ๊ณต๊ฐ ๋ฐฐํฌ | HuggingFace Hub ์
๋ก๋ |
### ์๋ ค์ง ๋ฏธ์ ์ฉ ์ต์ ํ
Phase 0 ๋ถ์์์ ๋ฐ๊ฒฌํ์ง๋ง ์์ง ์ ์ฉํ์ง ์์ ์ต์ ํ๋ค:
| ์ต์ ํ | ์์ ํจ๊ณผ | ๊ตฌํ ๋ณต์ก๋ |
|--------|-----------|-------------|
| QKV Fusion | +8~12% MFU | ์ค๊ฐ |
| NUMA Affinity | +4~9% | ๋ฎ์ |
| FA2 Native RoPE | +3~5% | ๋ฎ์ |
| HugePages | +1~3% (TLB ์ต์ ํ) | ๋ฎ์ (sysctl) |
์ด ์ต์ ํ๋ค์ ๋ชจ๋ ์ ์ฉํ๋ฉด ํ์ฌ 33.5% MFU์์ 45~50%๊น์ง ๋๋ฌํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
---
## 15. ์ฐธ๊ณ ๋ฌธ์
| ๋ฌธ์ | ์์น | ๋ด์ฉ |
|------|------|------|
| ํ๋ก์ ํธ ์ ์ฒด ์ฌ์ | `docs/PROJECT_HISTORY.md` | ์ผ๋ณ ์์ธ ์งํ ๊ธฐ๋ก |
| 3B ์์
๊ณํ | `docs/3B_WORKPLAN.md` | 3B ๋จ๊ณ๋ณ ์์
๊ณํ ์์ธ |
| ์ ์คํฐ์ค๋ฆฌ๊ทธ ๋
ผ์ฆ | `eval/debate/justice_league_3b_case.md` | 1Bโ3B ์ ํ ๋ฉํฐ์์ด์ ํธ ํ ๋ก ์ ๋ฌธ |
| SFT ์ฌ์์ ํ๊ฒฐ | `eval/decision/FINAL_DECISION_REPORT.md` | SFT v1 ์คํจ โ v2 ์ค๊ณ ํ๊ฒฐ๋ฌธ |
| 3B ๋ง์คํฐ ํ๋ | `eval/plan/3B_MASTER_PLAN.md` | ์ ์ฒด ํ์ต ํ์ดํ๋ผ์ธ ๋ง์คํฐ ํ๋ |
| Phase 0 ์ต์ ํ ๋ณด๊ณ ์ | `reports/2026-03-02_0200_FRANKENSTALLM_phase0_optimization_report.md` | VRAM/MFU ์ต์ ํ ์ ์ฒด ๋ณด๊ณ |
| 3B Base ํ๊ฐ ๋ณด๊ณ ์ (v1) | `reports/2026-03-05_3B_BASE_EVALUATION_REPORT.md` | ์ด๊ธฐ PPL/๋ฒค์น๋งํฌ/๋ฐ๋ณต๋ฅ ํ๊ฐ |
| PPL ํ๊ฐ ๋ณด๊ณ ์ (v1) | `reports/2026-03-05_PPL_EVALUATION.md` | 4๊ฐ ๊ฒ์ฆ์
PPL ์์ธ |
| ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ (v1) | `reports/2026-03-05_BENCHMARK_RESULTS.md` | belebele, MMLU ์์ธ |
| ์์ฑ ํ์ง ๋ถ์ (v1) | `reports/2026-03-05_GENERATION_QUALITY.md` | ๋ฐ๋ณต๋ฅ , ๋์ฝ๋ฉ ํ๋ผ๋ฏธํฐ |
| SFT ํ์ต ๋ณด๊ณ ์ | `reports/2026-03-05_3B_SFT_PROGRESS_REPORT.md` | Phase 2 SFT ํ์ต ๊ณผ์ ๊ธฐ๋ก |
| **SFT ์๋ฃ ์ข
ํฉ ๋ณด๊ณ ์** | `reports/2026-03-06_3B_SFT_COMPLETION_AND_EVAL_SUMMARY.md` | **SFT ์๋ฃ + ํ๊ฐ + ์ฝ๋ ๊ฐ์ + ORPO ๊ฒฐ์ (์ต์ )** |
| SFT ํ๊ฐ ๊ณํ์ | `reports/2026-03-06_3B_SFT_EVAL_PLAN.md` | 6์ฐจ์ ํ๊ฐ ์ค๊ณ |
| SFT ํ๊ฐ ๊ฒฐ๊ณผ | `reports/2026-03-06_3B_SFT_EVALUATION_REPORT.md` | 6์ฐจ์ ํ๊ฐ ์์ธ ๊ฒฐ๊ณผ |
| 3B ํ์ ๋จ๊ณ ์ฐธ์กฐ | `reports/2026-03-05_3B_NEXT_STEPS_REFERENCE.md` | SFT ํ ๋ฐฉํฅ์ฑ |
| Nemotron Nano ํ๋น์ฑ | `reports/2026-03-05_NEMOTRON_NANO_FEASIBILITY_STUDY.md` | Hybrid ์ํคํ
์ฒ ๊ฒํ |
| **v2 ์ข
ํฉ ํ๊ฐ ๋ฆฌํฌํธ** | `eval/outputs/3b_reeval_20260305_1451/full_eval_report.md` | **13+ ๋ฒค์น๋งํฌ ์ข
ํฉ** |
| v2 PPL ๋ฆฌํฌํธ | `eval/outputs/3b_reeval_20260305_1451/reports/01_perplexity_report.md` | 19๊ฐ ๋ฐ์ดํฐ์
PPL ์์ธ |
| v2 Calibration ๋ฆฌํฌํธ | `eval/outputs/3b_reeval_20260305_1451/reports/02_calibration_report.md` | Top-K ์ ํ๋, NLL ๋ถํฌ |
| v2 ์์ฑ ํ์ง ๋ฆฌํฌํธ | `eval/outputs/3b_reeval_20260305_1451/reports/03_generation_quality.md` | 12์กฐํฉ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๋ ์์น |
| v2 ๋ฒค์น๋งํฌ ๋ฆฌํฌํธ | `eval/outputs/3b_reeval_20260305_1451/reports/04_benchmark_report.md` | KoBEST, HAE-RAE, MMLU, 0/5-shot |
| ์งํ ๊ธฐ๋ก | `PROGRESS.md` | ๋ ์ง๋ณ ์ฒดํฌํฌ์ธํธ, ์งํ, ๊ฒฐ์ ๋ก๊ทธ |
| **ORPO ๋ถ์ ๋ฐ ๊ณํ** | `reports/2026-03-07_ORPO_ANALYSIS_AND_PLAN.md` | **ORPO ์งํ ๊ทผ๊ฑฐ, HP ์ค๊ณ, ์คํ ์ ์ฐจ** |
| **ORPO Sweep ๋๋ฒ๊ทธ** | `reports/2026-03-08_ORPO_SWEEP_DEBUG_REPORT.md` | **QKV ๋ฒ๊ทธ, NCCL timeout, TRL ํจ์น ์์ธ** |
| **ORPO ํ์ต ์ฌ์ ** | `reports/2026-03-08_ORPO_TRAINING_JOURNEY.md` | **ORPO ์ ์ฒด ๊ณผ์ : 5๋ฒ์ ์คํจ์ HP sweep (์ต์ )** |
---
## 16. ๊ธฐ์ ์คํ ์์ฝ
| ์์ญ | ๊ธฐ์ | ๋ฒ์ |
|------|------|------|
| ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ | PyTorch (NVIDIA ์ปค์คํ
๋น๋) | nv25.12 |
| ์ดํ
์
| FlashAttention-2 | 2.7.4.post1+25.12 |
| FP8 / ํผํฉ ์ ๋ฐ๋ | TransformerEngine (MXFP8) | 2.10.0 |
| ๋ถ์ฐ ํ์ต | DDP + NCCL (NVLS) | NCCL 2.28.9 |
| ์ปค๋ ์ปดํ์ผ | Triton | 3.5.1 |
| ํ ํฌ๋์ด์ | SentencePiece Unigram 64K | - |
| ๋ชจ๋ํฐ๋ง | Telegram Bot (B200Bot) + cron watchdog | - |
| ์ถ๋ก ์๋น | GGUF + Ollama | - |
| GPU | 8ร NVIDIA B200 (NVLink 5.0, NVSwitch) | CUDA 13.1 |
| CPU | 2ร AMD EPYC 9365 (Zen 5) | - |
---
## ๊ด๋ จ ํ๋ก์ ํธ
### [EVAFRILL-Mo](https://github.com/pathcosmos/EVAFRILL-Mo) | [๐ค HuggingFace](https://huggingface.co/pathcosmos/EVAFRILL-Mo-3B)
**ํ์ด๋ธ๋ฆฌ๋ Mamba-2 + Transformer ์ธ์ด ๋ชจ๋ธ** โ FRANKENSTALLM์ ์๋งค ํ๋ก์ ํธ.
NVIDIA [Nemotron-H](https://arxiv.org/abs/2504.03624) ์ํคํ
์ฒ์์ ์๊ฐ์ ๋ฐ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์ง์ ๊ตฌํํ 3B ํ์ด๋ธ๋ฆฌ๋ ๋ชจ๋ธ์ด๋ค. FRANKENSTALLM์ด ์์ Transformer ๊ธฐ๋ฐ์ด๋ผ๋ฉด, EVAFRILL-Mo๋ **Mamba-2 SSM + ํฌ์ Transformer ์ดํ
์
** ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ฑํํ๋ค.
| ํญ๋ชฉ | FRANKENSTALLM | EVAFRILL-Mo |
|------|:---:|:---:|
| ์ํคํ
์ฒ | ์์ Transformer (28L) | Mamba-2 24L + Attention 2L |
| ํ๋ผ๋ฏธํฐ | 3.17B | 2.94B |
| ํต์ฌ ๊ธฐ์ | GQA, FP8, FlashAttention-2 | Selective Scan, SwiGLU FFN in Mamba, GQA |
| ์ค๊ณ ์์น | ๊ฒ์ฆ๋ Transformer ์ํคํ
์ฒ | Nemotron-H ๋จํธํ ๋์
|
| GPU | 8ร B200 | 7ร B200 |
| ํ์ต ์ ๋ต | Chinchilla-optimal | Chinchilla 93% ๋ฌ์ฑ ๋ชฉํ |
๋ ํ๋ก์ ํธ๋ ๋์ผํ ํ ํฌ๋์ด์ (64K SentencePiece), ํ์ต ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ, DDP/FP8 ์ธํ๋ผ๋ฅผ ๊ณต์ ํ๋ค. "๊ฐ์ ์ฌ๋ฃ, ๋ค๋ฅธ ๋ ์ํผ"๋ก ์ํคํ
์ฒ ์ฐจ์ด๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๋น๊ต ์คํํ ์ ์๋ค.
> *์ด๋ฆ์ ์ ๋: Bride **Eva** (ํ๋์ผ์ํ์ธ์ ์ ๋ถ) + **FRI**DAY (์์ด์ธ๋งจ AI ๋น์) + **LL**M + Nemotron์ **Mo***
---
## 18. ๋ค์ ์ต์ ํ ๊ณํ โ MFU 33.5% โ 47% ๋ชฉํ
> ์์ธ ๋ฌธ์: [`docs/NEXT_OPTIMIZATION_PLAN.md`](docs/NEXT_OPTIMIZATION_PLAN.md)
### ํ์ฌ ์ฑ๋ฅ ์ง๋จ
Phase 1 ํ๋ฆฌํธ๋ ์ธ ์ค์ธก:
- **57,000 steps**, ~38.5B tokens, **์ฝ 63์๊ฐ**
- ์ฒ๋ฆฌ ์๋: 36~38K tok/s per rank โ ์ ์ฒด **~292K tok/s** (8GPU)
- **MFU: ~33.5%**
### ํต์ฌ ๋ณ๋ชฉ: NUMA Misalignment
```
AMD EPYC 9365 ร 2์์ผ:
GPU 0~3 โ NUMA node 0 (core 0-35)
GPU 4~7 โ NUMA node 1 (core 36-71)
์ด๊ธฐ DDP ๋ฐ์นญ ์ 5/8 rank๊ฐ ์๋ชป๋ NUMA ๋
ธ๋์์ ์คํ.
69%์ DataLoader worker๊ฐ ํฌ๋ก์ค-NUMA โ ~2๋ฐฐ ์ง์ฐ ๋ฐ์.
```
### ์ต์ ํ ํญ๋ชฉ๋ณ ์์ ํจ๊ณผ
| ์ต์ ํ | ์์ MFU ๊ฐ์ | ๋์ด๋ |
|--------|-------------|--------|
| NUMA affinity ๊ณ ์ | +4~9% | ๋ฎ์ (launch script ์์ ) |
| QKV fusion (TransformerEngine) | +8~12% | ์ค๊ฐ (๋ชจ๋ธ ์ฝ๋ ์์ ) |
| FA2 native RoPE | +3~5% | ์ค๊ฐ (FA2 ๋ฒ์ ์์กด) |
| NCCL ํ๊ฒฝ๋ณ์ ํ๋ | +1~2% | ๋ฎ์ (ํ ์ค ์ถ๊ฐ) |
### ์ต์ ํ ์ ํ ์์ ๋น๊ต
| ํญ๋ชฉ | ํ์ฌ | ์ต์ ํ ํ |
|------|------|----------|
| MFU | 33.5% | ~45~47% |
| ์ฒ๋ฆฌ์๋ | 292K tok/s | ~390~410K tok/s |
| 50B ํ ํฐ ํ์ต | ~47์๊ฐ | ~34~36์๊ฐ |
### ์ฆ์ ์ ์ฉ ๊ฐ๋ฅํ ์ฝ๋
**NUMA affinity (launch script):**
```bash
numactl --cpunodebind=0 --membind=0 torchrun \
--nproc_per_node=4 --node_rank=0 train/pretrain.py ... &
numactl --cpunodebind=1 --membind=1 torchrun \
--nproc_per_node=4 --node_rank=1 train/pretrain.py ... &
```
**NCCL ํ๊ฒฝ๋ณ์:**
```bash
export NCCL_MIN_NCHANNELS=4
export NCCL_SOCKET_NTHREADS=4
export CUDA_DEVICE_MAX_CONNECTIONS=1
```
> Phase 3 ORPO ์๋ฃ ํ, ๋ค์ ํ๋ฆฌํธ๋ ์ธ ๋ฐ ์ ์ NUMA affinity๋ฅผ ๋จผ์ ์ ์ฉํ๋ฉด ํ์ต ์๊ฐ์ ~30% ๋จ์ถํ ์ ์๋ค.
---
## 19. GPU ํ๋์จ์ด & ๋น์ฉ ๋ถ์ โ 3B ร 60B ํ๋ฆฌํธ๋ ์ธ
> ์์ธ ๋ฌธ์: [`docs/GPU_COST_ANALYSIS.md`](docs/GPU_COST_ANALYSIS.md)
### ์ค์ธก ๊ธฐ์ค ๋ฒ ์ด์ค๋ผ์ธ
```
FRANKENSTALLM Phase 1 ์ค์ธก:
B200 ร 8, MFU 33.5%, 292K tok/s
38.5B ํ ํฐ โ 63์๊ฐ
60B ํ ํฐ ํ์ฐ โ ์ฝ 98์๊ฐ
```
### ํด๋ผ์ฐ๋ ๊ฐ์ฑ๋น Top 3 (60B ํ ํฐ, ์ต์ ํ ํ)
| ์์ | ๊ตฌ์ฑ | ์์์๊ฐ | ์ด ๋น์ฉ |
|------|------|---------|--------|
| 1 | H100ร8 Cudo | 44.8hr | **$645** (~93๋ง์) |
| 2 | H100ร8 Vast.ai | 44.8hr | $670 (~97๋ง์) |
| 3 | H100ร8 RunPod | 44.8hr | $713 (~103๋ง์) |
> B200 Blackwell์ด ๋น ๋ฅด์ง๋ง, ํด๋ผ์ฐ๋ ๋จ๊ฐ๊ฐ H100์ 3๋ฐฐ โ **H100์ด ์ด๋น์ฉ 4.3๋ฐฐ ์ ๋ ด**
### ๊ฐ์ธ GPU ๊ตฌ์ฑ ์ถ์ฒ
| ๊ตฌ์ฑ | VRAM | NVLink | ๊ฐ๊ฒฉ | ์ถ์ฒ๋ |
|------|------|--------|------|--------|
| A6000 Ada ร 2 ์ค๊ณ | 96GB (ํตํฉ) | โ
| ~1,000๋ง์ | โญโญโญโญโญ |
| L40S ร 2 | 96GB (ํตํฉ) | โ
| ~1,400๋ง์ | โญโญโญโญ |
| RTX Pro 6000 Blackwell | 96GB (๋จ์ผ) | โ | ~1,200๋ง์ | โญโญโญ |
> ์๋น์์ฉ GPU(RTX 5090/4090)๋ NVLink ๋ฏธ์ง์. 80GB+ ํตํฉ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ ๋ฌธ๊ฐ์ฉ ํ์.
### ์ถ์ฒ ์ ๋ต: ๋ก์ปฌ + ํด๋ผ์ฐ๋ ํ์ด๋ธ๋ฆฌ๋
```
[๋ก์ปฌ] RTX 4090 ร 4 (880๋ง์) โ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ, ์คํ, SFT/ORPO
[ํด๋ผ์ฐ๋] H100ร8 (๋ฐ๋น ~103๋ง์) โ ๋ณธ ํ๋ฆฌํธ๋ ์ธ๋ง
```
---
## 20. HuggingFace ๋ฐฐํฌ ํํฉ
> **๋ฐฐํฌ URL**: https://huggingface.co/pathcosmos/frankenstallm
### ๋ชจ๋ธ ํ์ผ ๋ชฉ๋ก
| ํ์ผ | ํฌ๊ธฐ | ์ค๋ช
|
|------|------|------|
| `model.safetensors` | 4.76GB | v2 ORPO ๋ฒ ์คํธ (byte-fallback ์์ ) โ Transformers ์ง์ ๋ก๋์ฉ |
| `gguf/frankenstallm-3b-v2-Q4_K_M.gguf` | 757MB | **Ollama ๊ถ์ฅ** |
| `gguf/frankenstallm-3b-v2-Q8_0.gguf` | 1.2GB | ๊ณ ํ์ง |
| `gguf/frankenstallm-3b-v2-f16.gguf` | 2.3GB | ์ต๊ณ ํ์ง |
| `gguf/frankenstallm-3b-Q4_K_M.gguf` | 1.9GB | v1 Q4_K_M |
| `gguf/frankenstallm-3b-Q8_0.gguf` | 3.2GB | v1 Q8_0 |
| `gguf/frankenstallm-3b-f16.gguf` | 6.0GB | v1 f16 |
๊ฐ GGUF ํ์ผ์ ๋์ํ๋ `Modelfile.*` (sampling config ํฌํจ)์ด ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
---
## 21. Ollama ์ฌ์ฉ๋ฒ โ ์์ธ ์ค๋ช
๋ฐ ์ฃผ์์ฌํญ
### ๋น ๋ฅธ ์์ (๊ถ์ฅ ๋ฐฉ๋ฒ)
```bash
# 1. GGUF + Modelfile ๋ค์ด๋ก๋
huggingface-cli download pathcosmos/frankenstallm gguf/frankenstallm-3b-v2-Q4_K_M.gguf gguf/Modelfile.3b-v2-Q4_K_M --local-dir ./frankenstallm
# 2. Modelfile์ FROM ๊ฒฝ๋ก ์์
# FROM ./outputs/gguf/frankenstallm-3b-v2-Q4_K_M.gguf
# โ FROM ./frankenstallm/gguf/frankenstallm-3b-v2-Q4_K_M.gguf
# 3. Ollama ๋ชจ๋ธ ๋ฑ๋ก
ollama create frankenstallm-3b-v2 -f ./frankenstallm/gguf/Modelfile.3b-v2-Q4_K_M
# 4. ์คํ
ollama run frankenstallm-3b-v2
```
### ๊ฒ์ฆ๋ ์ํ๋ง ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ๊ถ์ฅ๊ฐ | ์ค๋ช
|
|---------|--------|------|
| `temperature` | **0.7** | ๋ฎ์์๋ก ๋ฐ๋ณต, ๋์์๋ก ๋ฌด์์. 0.7์ด ํ๊ตญ์ด ํ์ง ์ต์ |
| `repeat_penalty` | **1.2** | **ํ์** โ ์ด ๊ฐ ์์ด๋ greedy ์ 30.89% ๋ฐ๋ณต ๋ฐ์ |
| `top_p` | **0.9** | nucleus sampling, 0.9 ์ด์ ๊ถ์ฅ |
| `top_k` | **50** | ์์ 50๊ฐ ํ ํฐ ํ๋ณด |
| `num_predict` | **512** | ์ต๋ ์์ฑ ํ ํฐ ์ |
| `num_ctx` | **4096** | ์ปจํ
์คํธ ์๋์ฐ (์ต๋ 4096) |
### โ ๏ธ ์ฃผ์์ฌํญ
**1. repeat_penalty๋ ๋ฐ๋์ ์ค์ ํ์ธ์**
```
ORPO ํ์ต ํ์๋ greedy(temp=0) ์ 30.89% 3-gram ๋ฐ๋ณต๋ฅ ์ด ๋จ์ ์์ต๋๋ค.
repeat_penalty=1.2 ์ค์ ์ ๋ฐ๋ณต๋ฅ 0%๋ก ์์ ์ต์ ๋ฉ๋๋ค.
Modelfile์ ์ด๋ฏธ ์ค์ ๋์ด ์์ผ๋ฏ๋ก, Modelfile์ ์ฌ์ฉํ๋ฉด ์๋ ์ ์ฉ๋ฉ๋๋ค.
```
**2. temperature=0 (greedy) ์ฌ์ฉ ์ฃผ์**
```
greedy ๋์ฝ๋ฉ์ ๋ฐ๋ณต ์ต์ ์์ด 30.89% 3-gram ๋ฐ๋ณต์ด ๋ฐ์ํฉ๋๋ค.
๋ฐ๋์ temperature >= 0.5 ์ด์ + repeat_penalty >= 1.1 ์ด์์ ํจ๊ป ์ฌ์ฉํ์ธ์.
```
**3. num_ctx ์ด๊ณผ ์ ์ฑ๋ฅ ์ ํ**
```
ํ์ต ์ max_position_embeddings=4096์ด์์ต๋๋ค.
4096 ํ ํฐ์ ์ด๊ณผํ๋ ์ปจํ
์คํธ๋ฅผ ๋ฃ์ผ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ฉ๋๋ค.
```
**4. ํ๊ตญ์ด ์ค์ฌ ๋ชจ๋ธ์
๋๋ค**
```
์์ด ๋ฅ๋ ฅ: MMLU 42.0%, HellaSwag 27.9% โ ์์ด ํ์คํฌ์์ ๊ธฐ๋์น๋ฅผ ๋ฎ์ถ์ธ์.
ํ๊ตญ์ด: KoBEST 0-shot 52.75%, korean_nlu 100.0% (Ollama ๋ฒค์น๋งํฌ)
```
**5. v2 vs v1 ์ ํ**
```
v2 ๊ถ์ฅ: byte-fallback ์์ ์ผ๋ก
๋ฑ ํน์๋ฌธ์ ํฌํจ ์
๋ ฅ์ด ์์ ํฉ๋๋ค.
v1์
ํฌํจ ์
๋ ฅ ์ llama.cpp๊ฐ ํฌ๋์ํ ์ ์์ต๋๋ค.
```
### Transformers๋ก ์ง์ ์คํ
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "pathcosmos/frankenstallm"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
# โ ๏ธ do_sample=True + repetition_penalty ๋ฐ๋์ ์ค์
inputs = tokenizer(
"ํ๊ตญ์ ์ ํต ์์ ์ค ๊น์น์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์.",
return_tensors="pt"
).to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
do_sample=True, # โ greedy ์ฌ์ฉ ์ ๋ฐ๋ณต ๋ฐ์
temperature=0.7, # โ ํต์ฌ ํ๋ผ๋ฏธํฐ
repetition_penalty=1.2, # โ ๋ฐ๋์ ์ค์
top_p=0.9,
top_k=50,
max_new_tokens=512,
pad_token_id=tokenizer.eos_token_id,
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```
### API ์๋น (Ollama)
```bash
# ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋ฒ ์คํ (๊ธฐ๋ณธ ํฌํธ 11434)
ollama serve &
# REST API ํธ์ถ
curl http://localhost:11434/api/generate -d '{
"model": "frankenstallm-3b-v2",
"prompt": "ํ๊ตญ์ด๋ก ์๊ธฐ์๊ฐ๋ฅผ ํด์ค.",
"stream": false,
"options": {
"temperature": 0.7,
"repeat_penalty": 1.2,
"top_p": 0.9,
"num_predict": 512
}
}'
```
---
## 22. ๋ชจ๋ธ ์ฑ๋ฅ ๋น๊ต โ Base / SFT / ORPO / Ollama
### ํต์ฌ ์งํ 3-Way ๋น๊ต
| ์งํ | Base | SFT v2 | ORPO (v2) |
|------|------|--------|-----------|
| **greedy 3-gram ๋ฐ๋ณต๋ฅ ** | 60.99% | 72.97% | **30.89%** |
| **EOS ์ข
๋ฃ์จ (greedy)** | 0% | 60% | 67% |
| **sampling ๋ฐ๋ณต๋ฅ ** (temp=0.7, rep=1.2) | โ | โ | **0%** |
| **KoBEST 0-shot ํ๊ท ** | ~44% | 43.26%ยน | **52.75%** |
| **MMLU-KO 0-shot** | 38.8% | 42.0% | โ |
| **Hellaswag EN** | 33.3% | โ | 27.9% |
| **Calibration Top-1** | ~65% | 68.59% | 67.99% |
| **PPL forgetting** | 0% (๊ธฐ์ค) | 0.9% | 4.1% |
| **Preference Accuracy** | โ | โ | **76.02%** |
| **Reward Margin** | โ | โ | **0.6100** |
> ยน SFT ์ด๊ธฐ ํ๊ฐ ์ 43.26%, ์ดํ ์ฌํ๊ฐ์์ 52.75% (ํ๊ฐ ํ๊ฒฝ ์ฐจ์ด).
### KoBEST ์ธ๋ถ ๋น๊ต (0-shot)
| ํ์คํฌ | Base | ORPO |
|--------|------|------|
| BoolQ | ~48% | 54.3% |
| COPA | ~52% | 56.2% |
| WiC | ~49% | 51.8% |
| SentiNeg | ~44% | 51.4% |
| HellaSwag-KO | ~38% | 49.9% |
| **ํ๊ท ** | ~46% | **52.75%** |
### Ollama ๋ฒค์น๋งํฌ (frankenstallm-3b-v2:Q4_K_M, 35 tests)
| ์นดํ
๊ณ ๋ฆฌ | ์ ์ |
|----------|------|
| korean_nlu | **100.0** |
| knowledge | 75.0 |
| instruction_following | 66.7 |
| reasoning | 50.0 |
| safety | 10.0 |
| repetition_resistance | 2.2 |
| **์๋ ์ฑ์ ํ๊ท ** | **46.7** |
| ํ๊ท TPS | 142.5 tok/s |
| ํ๊ท TTFT | 16.7 ms |
> repetition_resistance 2.2%๋ Ollama ๊ธฐ๋ณธ ํ๋ผ๋ฏธํฐ(sampling ์์ด ์คํ)๋ก ์ธก์ ๋ ๊ฐ.
> `repeat_penalty=1.2` + `temperature=0.7` ์ ์ฉ ์ **๋ฐ๋ณต๋ฅ 0%** ๋ฌ์ฑ.
### 3B๊ธ ๋ชจ๋ธ ์ฑ๋ฅ ๋น๊ต โ Ollama ๋ฒค์น๋งํฌ
๋์ผ ํ๊ฒฝ(Ollama, 35๊ฐ ํ
์คํธ)์์ 3B๊ธ ์คํ์์ค ๋ชจ๋ธ๋ค๊ณผ ์ง์ ๋น๊ตํ ๊ฒฐ๊ณผ์
๋๋ค.
#### ์ข
ํฉ ์ ์
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | ์๋ ์ฑ์ ํ๊ท | ๋น๊ณ |
|------|---------|---------------|------|
| **Qwen 2.5 3B** | 3B | **63.4** | ์ข
ํฉ 1์ |
| **Phi-4 Mini** | 3.8B | **60.6** | ์ถ๋ก ํนํ |
| **FRANKENSTALLM 3B v2** | 3B | **46.7** | ๋ณธ ๋ชจ๋ธ (ORPO) |
| FRANKENSTALLM 3B v1 | 3B | 37.9 | SFT only |
#### ์นดํ
๊ณ ๋ฆฌ๋ณ ์์ธ ๋น๊ต
| ์นดํ
๊ณ ๋ฆฌ | FRANKENSTALLM v2 | Qwen 2.5 3B | Phi-4 Mini 3.8B | ๋น๊ณ |
|----------|:---:|:---:|:---:|------|
| **Korean NLU** | **100.0** | **100.0** | 66.7 | ํ๊ตญ์ด ์ดํด๋ ฅ ๋๊ธ |
| **Knowledge** | **75.0** | 20.8 | 29.2 | ํ๊ตญ์ด ์ง์์์ ์๋์ ์ฐ์ |
| **Instruction Following** | **66.7** | 55.6 | 33.3 | ์ง์ ๋ฐ๋ฅด๊ธฐ ์ฐ์ |
| **Reasoning** | 50.0 | 62.5 | **87.5** | Phi-4 ์ถ๋ก ํนํ |
| **Code** | 0.0 | **100.0** | 83.3 | ์ฝ๋ ๋ฅ๋ ฅ ๋ถ์กฑ |
| **Safety** | 10.0 | 35.0 | **70.0** | ์์ ์ฑ ์ฝ์ |
| **Repetition Resistance** | 2.2 | **75.0** | 58.9 | ๊ธฐ๋ณธ ํ๋ผ๋ฏธํฐ ๊ธฐ์คยน |
> ยน FRANKENSTALLM์ ๋ฐ๋ณต ์ ํญ 2.2%๋ Ollama ๊ธฐ๋ณธ ์ค์ ๊ธฐ์ค. `repeat_penalty=1.2` ์ ์ฉ ์ 0% ๋ฌ์ฑ.
#### ์ถ๋ก ์๋ ๋น๊ต
| ๋ชจ๋ธ | Avg TTFT (ms) | P95 TTFT (ms) | Avg TPS | ๋น๊ณ |
|------|:---:|:---:|:---:|------|
| **FRANKENSTALLM 3B v2** | **16.7** | **26.2** | **142.5** | ์ต๊ณ ์๋ |
| Phi-4 Mini 3.8B | 25.6 | 44.9 | 100.4 | |
| Qwen 2.5 3B | 28.2 | 46.5 | 93.8 | |
> FRANKENSTALLM์ ๋์ผ ์ํคํ
์ฒ(LlamaForCausalLM)์ 64K vocab์ผ๋ก Ollama ์ถ๋ก ์ ์ต์ ํ๋จ.
#### lm-eval ๋ฒค์น๋งํฌ ๋น๊ต (Base โ SFT โ ORPO)
| ๋ฒค์น๋งํฌ | Base | SFT | ORPO | ๋ณํ (BaseโORPO) |
|----------|:---:|:---:|:---:|:---:|
| **KoBEST COPA** | 49.3% | 48.6% | **63.9%** | **+14.6pp** |
| **KoBEST HellaSwag** | 21.6% | 19.8% | **38.0%** | **+16.4pp** |
| **KoBEST SentiNeg** | 48.6% | 49.1% | **62.5%** | **+13.9pp** |
| **KoBEST BoolQ** | 50.3% | 50.1% | 50.6% | +0.3pp |
| **KoBEST WiC** | 48.7% | 48.7% | 48.8% | +0.2pp |
| **KoBEST ํ๊ท ** | 43.7% | 43.3% | **52.8%** | **+9.1pp** |
| **HAE-RAE** | 19.7% | 19.9% | 21.8% | +2.1pp |
| **PIQA** | 52.5% | 52.6% | **59.9%** | **+7.3pp** |
| **ARC-Easy** | 25.6% | 25.9% | **36.0%** | **+10.4pp** |
| **HellaSwag EN** | 26.2% | 26.1% | 29.2% | +3.0pp |
| **Winogrande** | 50.6% | 50.8% | 51.0% | +0.4pp |
| **PPL forgetting** | ๊ธฐ์ค | 0.9% | 4.1% | ์๊ณ 15% ์ด๋ด โ
|
#### ํด์ ๋ฐ ์์น
**๊ฐ์ **:
- **ํ๊ตญ์ด NLU 100%** โ Qwen 2.5 3B์ ๋๊ธ, Phi-4๋ฅผ ์๋
- **ํ๊ตญ์ด ์ง์ 75.0** โ ๋น๊ต ๋ชจ๋ธ ์ค ์ต๊ณ (Qwen 20.8, Phi-4 29.2)
- **์ถ๋ก ์๋ ์ต๊ณ ** โ TTFT 16.7ms, TPS 142.5๋ก ์ค์๊ฐ ์๋น์ ์ ๋ฆฌ
- **ORPO ํจ๊ณผ ๊ทน๋** โ KoBEST +9.1pp, COPA/HellaSwag/SentiNeg์์ ๊ฐ 13~16pp ํฅ์
**์ฝ์ ๋ฐ ๊ฐ์ ๋ฐฉํฅ**:
- **์ฝ๋ ์์ฑ 0%** โ ์ฝ๋ SFT ๋ฐ์ดํฐ ๋ถ์กฑ. ์ฝ๋ ํนํ ๋ฐ์ดํฐ ์ถ๊ฐ ํ์
- **์์ ์ฑ 10%** โ safety alignment ๋ฐ์ดํฐ ๋ฏธ๋ฐ์. RLHF/DPO ์ถ๊ฐ ํ์ต ๊ณ ๋ ค
- **๋ฐ๋ณต ๋ฌธ์ ** โ ๊ธฐ๋ณธ ์ค์ ์์ ๋ฐ๋ณต ๋ฐ์ํ๋, `repeat_penalty=1.2`๋ก ์์ ํด๊ฒฐ
- **์ข
ํฉ ์ ์ gap** โ Qwen ๋๋น -16.7pp. ํ์ต ๋ฐ์ดํฐ ํ์ง ๋ฐ ๊ท๋ชจ ์ฐจ์ด๊ฐ ์ฃผ ์์ธ
---
## 23. ์ฌํ ๊ฐ์ด๋ โ ์ ๋จ๊ณ ์ค์ ์์ธ
> ์ด ์น์
์ ๋์ผ ํ๊ฒฝ์์ ์ฌํ ์ ์ฐธ๊ณ ์ฉ์
๋๋ค.
### ํ๊ฒฝ ์ค์
```bash
# NVIDIA ์ปค์คํ
PyTorch๋ ์ฌ์ค์น ๊ธ์ง (B200 ์ต์ ํ ๊นจ์ง)
# ์๋ ํจํค์ง๋ง ์ถ๊ฐ ์ค์น
pip install transformers==4.40.0 accelerate peft trl deepspeed \
bitsandbytes sentencepiece wandb
# ์ ์ฒด ํ๊ฒฝ ์ฌํ
pip install -r requirements.txt
```
**์ํํธ์จ์ด ๋ฒ์ (์ค์ธก)**:
```
torch 2.10.0a0+b4e4ee81d3.nv25.12
flash_attn 2.7.4.post1+25.12
transformers 4.40.x
datasets 4.4.1
tokenizers 0.22.1
huggingface_hub 1.2.3
trl (ORPO NaN ๋ฒ๊ทธ ํจ์น ์ ์ฉ๋ณธ โ scripts/trl_patch.py ์ฐธ๊ณ )
CUDA 13.1 / Driver 580.95.05
```
### Phase 1 โ Pretrain ํต์ฌ ํ์ดํผํ๋ผ๋ฏธํฐ
```yaml
# configs/korean_3b_fp8.yaml ๊ธฐ์ค
model:
hidden_size: 2048
num_hidden_layers: 24
num_attention_heads: 16
num_key_value_heads: 4
intermediate_size: 5632
max_position_embeddings: 4096
vocab_size: 64000
train:
batch_size: 5
gradient_accumulation_steps: 8
# effective batch = 5 ร 8 ร 8GPU = 320
learning_rate: 1.5e-4
min_lr: 1.5e-5 # cosine decay ํํ (max_lr์ 10%)
warmup_steps: 2000
weight_decay: 0.1
max_grad_norm: 1.0
scheduler: cosine
precision: bf16 # FP8 Tensor Core ํ์ฉ (B200)
total_tokens: ~38.5B
```
### Phase 2 โ SFT v2 ํต์ฌ ํ์ดํผํ๋ผ๋ฏธํฐ
```yaml
# configs/korean_3b_sft_v2.yaml ๊ธฐ์ค
train:
learning_rate: 5.0e-5
batch_size: 4
gradient_accumulation_steps: 8
# effective batch = 4 ร 8 ร 8GPU = 256
warmup_ratio: 0.03
weight_decay: 0.01
lr_scheduler_type: cosine
max_steps: 33000 # early stop at 25,500 (patience=5)
early_stopping_patience: 5
fp16: false
bf16: true
data:
total_samples: 2439397 # train
val_samples: 49801
num_sources: 24
total_size_gb: 7.48
mixing: "70% instruction / 30% general"
```
### Phase 3 โ ORPO ํต์ฌ ํ์ดํผํ๋ผ๋ฏธํฐ
```yaml
# configs/korean_3b_orpo.yaml ๊ธฐ์ค (๋ณธ ํ์ต)
train:
beta: 0.25 # ORPO preference weight
learning_rate: 1.2e-5 # HP sweep ์ต์ ๊ฐ
batch_size: 4
gradient_accumulation_steps: 4
# effective batch = 4 ร 4 ร 8GPU = 128
warmup_ratio: 0.1
weight_decay: 0.01
lr_scheduler_type: cosine
max_length: 1536 # prompt + response ํฉ์ฐ ์ต๋ ๊ธธ์ด
max_prompt_length: 512
num_train_epochs: 2 # ์ค์ ~9,997 steps์์ ์กฐ๊ธฐ ์๋ ด
bf16: true
optim: adamw_torch_fused
data:
raw_pairs: 683181
filtered_pairs: ~630000 # NaN ๋ฐฉ์ง ํํฐ ํ
eval_split: 0.05 # seed=42
eval_pairs: ~31500
```
### Phase 4 โ GGUF ๋ณํ ํ์ดํ๋ผ์ธ
```bash
# Step 1: byte-fallback ํ ํฌ๋์ด์ ์์
python scripts/fix_tokenizer_byte_fallback.py \
--input outputs/hf_checkpoint-best \
--output outputs/hf_checkpoint-best-fixed
# Step 2: f16 GGUF ๋ณํ (llama.cpp)
python outputs/llama.cpp/convert_hf_to_gguf.py \
outputs/hf_checkpoint-best-fixed \
--outfile outputs/gguf/frankenstallm-3b-v2-f16.gguf \
--outtype f16
# Step 3: ์์ํ
QUANTIZE=outputs/llama.cpp/build/bin/llama-quantize
$QUANTIZE outputs/gguf/frankenstallm-3b-v2-f16.gguf \
outputs/gguf/frankenstallm-3b-v2-Q4_K_M.gguf Q4_K_M
$QUANTIZE outputs/gguf/frankenstallm-3b-v2-f16.gguf \
outputs/gguf/frankenstallm-3b-v2-Q8_0.gguf Q8_0
# Step 4: Ollama ๋ฑ๋ก
ollama create frankenstallm-3b-v2:Q4_K_M -f Modelfile.3b-v2-Q4
ollama create frankenstallm-3b-v2:Q8_0 -f Modelfile.3b-v2-Q8
ollama create frankenstallm-3b-v2:f16 -f Modelfile.3b-v2-f16
```
### ํ ํฌ๋์ด์ ์ฌํ
```
ํ์ต ๋ฐฉ์: SentencePiece Unigram
vocab_size: 64,000 (์๋ณธ) โ 64,256 (byte-fallback ์์ ํ)
ํ์ต ์คํฌ๋ฆฝํธ: tokenizer/train_sp_tokenizer.py
ํ์ต ๋ฐ์ดํฐ: C4 Korean + ๋๋ฌด์ํค + Wikipedia Korean ํผํฉ
byte_fallback: True (v2์์ ์ถ๊ฐ)
์ถ๊ฐ ํ ํฐ: <0x00> ~ <0xFF> 256๊ฐ
```
---
## ๋ง์น๋ฉฐ
์ด ํ๋ก์ ํธ์ ๋ชจํ ๋ ํ๋๋ค:
> **"๋งํ๋ ๊ฒ๋ ๊ธฐ๋กํ๋ค."**
SFT v1์ loss=0.0 ์คํจ, torch.compile์ด ํจ๊ณผ ์์๋ ๊ฒ, 18% ๋ฐ๋ณต๋ฅ ์ ์ข์ โ ์ด ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ก์ ๋จ์ ์๋ค. Phase 3 ORPO์์๋ **5๋ฒ์ ์คํจ** โ NCCL timeout, config ์ถฉ๋, QKV ๋ณํ ๋ฒ๊ทธ, ํฌํธ ์ถฉ๋, TRL NaN ๋ฒ๊ทธ โ ๋ฅผ ๊ฑฐ์ณ ๋ง์นจ๋ด ์์ฃผํ๋ค.
Phase 1 ํ๋ฆฌํธ๋ ์ธ์ 57,000 steps, loss 1.466์ผ๋ก ์๋ฃ๋๋ค. Phase 2 SFT๋ 25,500 steps์์ early stopping (val_loss 1.8851). Phase 3 ORPO๋ 9,997 steps์์ ์กฐ๊ธฐ ์๋ ด โ eval_loss 1.625, Preference Accuracy 76.02%. Phase 4๋ก GGUF ๋ณํ ํ HuggingFace์ Ollama์ ๋ฐฐํฌ ์๋ฃ.
**๊ฒฐ๊ตญ ํด๋๋ค**: greedy ๋ฐ๋ณต๋ฅ 72.97% โ 30.89% (ORPO), sampling+rep_penalty ์ ์ฉ ์ 0%. TPS 142.5, TTFT 16.7ms. ํ๊ตญ์ด๋ฅผ ์ดํดํ๊ณ ๋งํ๋ 3B ๋ชจ๋ธ, ์ฒ์๋ถํฐ ๋ง๋ ๊ฒ.
Frankenstein์ด ์กฐ๊ฐ๋ค์ ์ด์ด ๋ถ์ฌ ์๋ช
์ ๋ง๋ค์๋ฏ, FRANKENSTALLM๋ ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ก๋ค.
**๐ค ๋ชจ๋ธ ๋ค์ด๋ก๋**: https://huggingface.co/pathcosmos/frankenstallm
---
## Acknowledgment
์ด ํ๋ก์ ํธ๋ **๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ**์ **ใ์ฒจ๋จ GPU ํ์ฉ ์ง์ ์ฌ์
ใ** (๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ ๊ณต๊ณ ์ 2025-1068ํธ)์ ํตํด ์ ๊ณต๋ GPU ์ปดํจํ
์์์ ํ์ฉํ์ฌ ์ํ๋์์ต๋๋ค.
> **๊ตญ๊ฐ AI์ปดํจํ
์์ ์ง์ํฌํธ**: https://aiinfrahub.kr
>
> - ์ฃผ๊ด: ๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ (MSIT), ์ ๋ณดํต์ ์ฐ์
์งํฅ์ (NIPA)
> - ์ด์: ํ๊ตญ์ ๋ณดํต์ ์งํฅํํ (KAIT)
๋ํ๋ฏผ๊ตญ ์ ๋ถ์ AI ์ธํ๋ผ ์ง์ ์ฌ์
๋๋ถ์ 8ร NVIDIA B200 GPU ํ๊ฒฝ์์ ํ๊ตญ์ด 3B LLM์ ์ฒ์๋ถํฐ ํ์ตํ ์ ์์์ต๋๋ค. ๊ตญ๊ฐ ์ฐจ์์ AI ์ปดํจํ
์์ ์ง์์ ๊น์ด ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
---
*์ต์ข
์
๋ฐ์ดํธ: 2026-03-26*
*ํ์ฌ ์ํ: **์ ๋จ๊ณ ์๋ฃ** โ Phase 1 Pretrain โ
| Phase 2 SFT โ
| Phase 3 ORPO โ
| Phase 4 ๋ฐฐํฌ โ
*