KoHRM-Text Methodology and Architecture Notes
์์ฑ์ผ: 2026-05-24
์ด ๋ฌธ์๋ KoHRM-Text-1.4B๊ฐ HRM-Text ๋
ผ๋ฌธ ๋ฐฉ์๊ณผ ์ด๋ค ์ ์์ ๊ฐ๊ณ , ์ด๋ค ์ ์์ ์ด์์ ๋ค๋ฅธ์ง ์ ๋ฆฌํฉ๋๋ค.
์ฐธ๊ณ ๋ฌธ์:
- HRM-Text paper: https://arxiv.org/html/2605.20613
- Upstream code: https://github.com/sapientinc/HRM-Text
- KoHRM-Text code: https://github.com/LLM-OS-Models/KoHRM-text
๊ฒฐ๋ก
์ฐ๋ฆฌ์ ํ์ฌ ํ์ต์ ๋ฐฉ๋ฒ๋ก ๊ด์ ์์๋ HRM-Text ๋ ผ๋ฌธ์ single-stage instruction pretraining์ ๋ง์ถฐ์ ธ ์์ต๋๋ค.
๋ค๋ง ์คํ ์ด์ ๊ด์ ์์๋ ๋ ผ๋ฌธ๊ณผ ์์ ํ ๊ฐ์ง ์์ต๋๋ค. ๋ ผ๋ฌธ์ 40B unique tokens๋ฅผ ๋จ์ผ ์ฐ์ run์ผ๋ก ํ์ตํ๊ณ , ์ค๊ฐ checkpointing/crash recovery๋ฅผ ์ฐ์ง ์์๋ค๊ณ ์ค๋ช ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์ค๋น์ HF ์ ๋ก๋, OOM ํํผ, ์ฒดํฌํฌ์ธํธ ๋ณด์กด ๋๋ฌธ์ stage-0, stage0b, stage-1์ฒ๋ผ ๋๋์ด ์คํํ๊ณ ์์ต๋๋ค.
ํต์ฌ ์ฐจ์ด๋ ๋ค์์ ๋๋ค.
| ํญ๋ชฉ | HRM-Text ๋ ผ๋ฌธ | KoHRM-Text ํ์ฌ ๋ฐฉ์ |
|---|---|---|
| ํ์ต ๋ชฉ์ | instruction-response task-completion objective | ๋์ผ |
| loss | response-only NLL | ๋์ผ |
| attention | PrefixLM, instruction bidirectional + response causal | ๋์ผ ์ฝ๋ ๊ฒฝ๋ก ์ฌ์ฉ |
| raw LM pretraining ํ SFT | ํ์ง ์์ | ํ์ง ์์ |
| SFT ํ๋ณด ๋ฐ์ดํฐ | instruction pretraining์ ํฌํจ | ํฌํจ |
| ์คํ ํํ | ๋จ์ผ ์ฐ์ run | staged resume run |
| checkpoint | ๋ ผ๋ฌธ์ ์ค๊ฐ checkpointing ์์ | ์ด์์ 5,000 step๋ง๋ค ์ ์ฅ |
| tokenizer | 65,536 BPE | 131,072 Korean/terminal BPE |
| hardware | 16 x H100 | 8 x H200 |
๋ฐ๋ผ์ โ๋ ผ๋ฌธ์ฒ๋ผ single-stage ์ง์๋ฌธ ์ฌ์ ํ์ต์ธ๊ฐ?โ์ ๋ํ ๋ต์ ๋ค์์ฒ๋ผ ์ ๋ฆฌํ๋ ๊ฒ์ด ์ ํํฉ๋๋ค.
ํ์ต objective์ ๋ฐ์ดํฐ ํฌ๋งท์ single-stage instruction pretraining์ ๋๋ค.
๊ทธ๋ฌ๋ ์คํ์ ํ ํ๋ก์ธ์ค์ ๋จ์ผ ์ฐ์ run์ด ์๋๋ผ, ๊ฐ์ objective๋ฅผ ์ ์งํ๋ฉด์ checkpoint resume์ผ๋ก ์ด์ด๊ฐ๋ staged pretraining์ ๋๋ค.
๋ ผ๋ฌธ ๋ฐฉ๋ฒ๋ก ์์ฝ
HRM-Text ๋ ผ๋ฌธ์ ๊ธฐ์กด LLM์ ๋๊ท๋ชจ raw-text causal LM ์ฌ์ ํ์ต ํ mid-training/SFT๋ก ๊ฐ๋ ๋ค๋จ๊ณ recipe๋ฅผ ๋นํจ์จ์ ์ด๋ผ๊ณ ๋ณด๊ณ , ์ฒ์๋ถํฐ instruction-response pair๋ง์ผ๋ก ํ์ตํฉ๋๋ค.
๋ ผ๋ฌธ ํต์ฌ:
- raw text ์ ์ฒด ํ ํฐ์ ์์ธกํ์ง ์์ต๋๋ค.
- instruction tokens์๋ loss๋ฅผ ์ฃผ์ง ์์ต๋๋ค.
- response tokens์๋ง negative log-likelihood loss๋ฅผ ์ค๋๋ค.
- instruction segment๋ PrefixLM mask๋ก bidirectional attention์ ํ์ฉํฉ๋๋ค.
- response segment๋ autoregressive causal attention์ ์ ์งํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ direct, cot, synth, noisy ๊ฐ์ condition tag๋ฅผ instruction ์์ ๋ถ์ฌ ์๋ต ์คํ์ผ์ ์ ์ดํฉ๋๋ค.
<think>...</think>๊ฐ์ explicit long-CoT trace๋ ์ ๊ฑฐํด ๋ด๋ถ recurrent computation์ด ๋ฌธ์ ํด๊ฒฐ์ ๋งก๊ฒ ํฉ๋๋ค.
๋ ผ๋ฌธ์ 1B HRM-Text๋ฅผ scratch๋ก ํ์ตํ๊ณ , ์ฝ 40B unique tokens ๋ฐ 16 x H100์์ ์ฝ 46์๊ฐ์ ์ฌ์ฉํ๋ค๊ณ ์ค๋ช ํฉ๋๋ค. ๊ณต๊ฐ ํ๊ฐ์๋ EMA checkpoint๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ์ฌ KoHRM-Text ํ์ต ๋ฐฉ์
ํ์ฌ KoHRM-Text-1.4B๋ raw causal LM์ด ์๋๋ผ HRM-Text V1Dataset ํฌ๋งท์ผ๋ก ํ์ตํฉ๋๋ค.
๊ฐ ์ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
instruction span -> response span
ํ ํฐ ๋ ๋ฒจ์์๋ ๋ค์์ฒ๋ผ ๊ตฌ์ฑ๋ฉ๋๋ค.
<|im_start|> condition_tokens instruction <|im_end|> response <|box_end|>
condition token์ ๋ค์ mapping์ ์ฌ์ฉํฉ๋๋ค.
| condition | token |
|---|---|
| direct | `< |
| cot | `< |
| noisy | `< |
| synth | `< |
dataset_new.py ๊ธฐ์ค์ผ๋ก instruction span์ inputs์๋ ๋ค์ด๊ฐ์ง๋ง target_only=True์ผ ๋ label์ IGNORE_LABEL_ID๊ฐ ๋ฉ๋๋ค. response span๋ง ์ค์ cross entropy loss๋ฅผ ๋ฐ์ต๋๋ค.
์ฆ ํ์ฌ ํ์ต์ โ๋ฌธ์๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๋ค ๋งํ๋ raw LMโ์ด ์๋๋ผ โ์ฃผ์ด์ง ์ง์/๋ฌธ๋งฅ์ ๋ณด๊ณ ์๋ต์ ์์ฑํ๋ task-completion pretrainingโ์ ๋๋ค.
PrefixLM ๊ตฌํ ํ์ธ
ํ์ฌ ์ฝ๋์์ PrefixLM ๊ฒฝ๋ก๋ ๋ค์ ํ์ผ๋ค๋ก ํ์ธ๋ฉ๋๋ค.
| ํ์ผ | ์ญํ |
|---|---|
dataset_new.py |
instruction/response span ๋ถ๋ฆฌ, response-only label ๊ตฌ์ฑ |
models/flash_attention_prefixlm_v2.py |
prefix bidirectional attention + response causal attention ๊ตฌํ |
models/layers.py |
attention type prefixlm ์ฌ์ฉ |
models/lm_head.py |
IGNORE_LABEL_ID๋ฅผ ์ ์ธํ๊ณ response label์๋ง CE loss ๊ณ์ฐ |
dataset_new.py์์๋ ๊ฐ ์ํ์ ๋ํด instruction ๊ธธ์ด๋ฅผ prefix_lens, response ๊ธธ์ด๋ฅผ causal_lens๋ก ๋๊น๋๋ค.
flash_attention_prefixlm_v2.py๋ attention์ ๋ ๋ถ๋ถ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- prefix ๊ตฌ๊ฐ: instruction tokens๋ผ๋ฆฌ bidirectional attention
- causal ๊ตฌ๊ฐ: response tokens๊ฐ prefix ์ ์ฒด์ ์ด์ response tokens๋ฅผ ๋ณด๋ causal attention
์ด ๊ตฌ์กฐ๊ฐ ๋ ผ๋ฌธ์ PrefixLM๊ณผ ๋ง๋ ํต์ฌ์ ๋๋ค.
๋ชจ๋ธ ์ํคํ ์ฒ
ํ์ฌ ํ์ค ๋ชจ๋ธ๋ช
์ KoHRM-Text-1.4B์ด๊ณ , arch/size@arch=XL์ ํด๋นํ๋ ์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| params | 1,384,120,320 |
| hidden size | 1,536 |
| total configured layers | 32 |
| half layers | true |
| H module layers | 16 |
| L module layers | 16 |
| heads | 12 |
| head dim | 128 |
| expansion | 4 |
| intermediate size | 4,096 |
| context | 4,096 |
| RoPE theta | 10,000 |
| norm | RMSNorm-style parameterless norm |
| init | LeCun normal |
| dtype | bfloat16 |
| tokenizer vocab | 131,072 |
HRM recurrent schedule:
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| H cycles | 2 |
| L cycles per H cycle | 3 |
| effective H/L recurrence | H2L3 |
| bp min steps | 2 |
| bp max steps | 5 |
| bp warmup ratio | 0.2 |
์ฝ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- token embedding์์ ์์ํ hidden state๋ฅผ
z_H๋ก ๋ก๋๋ค. - learned/fixed low-level initial state
z_L_init์์z_L์ ์์ํฉ๋๋ค. - ๊ฐ H cycle๋ง๋ค L module์ 3๋ฒ ๋ฐ๋ณต ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๊ทธ ๋ค H module์ 1๋ฒ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ด 2๋ฒ์ H cycle์ ์ํํฉ๋๋ค.
- ์ต์ข
z_H์ LM head๋ฅผ ๋ถ์ฌ vocabulary logits๋ฅผ ๋ ๋๋ค.
๋ ผ๋ฌธ ํํ์ผ๋ก๋ slow-evolving strategic layer์ธ H module๊ณผ fast-evolving execution layer์ธ L module์ dual-timescale recurrent design์ ๋๋ค.
MagicNorm / ์์ ํ
๋ ผ๋ฌธ์ recurrent depth๊ฐ ๊น์ด์ง๋ฉด activation variance์ gradient instability๊ฐ ์ปค์ง๋ฏ๋ก MagicNorm๊ณผ warmup deep credit assignment๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ์ฌ ์ฝ๋์์๋ norm_type: pre๋ฅผ ์ฐ๋, Transformer module ๋์ final RMSNorm์ ์ ์ฉํฉ๋๋ค. ์ฆ ๋ด๋ถ block์ PreNorm ์คํ์ผ์ด๊ณ module output์ norm์ผ๋ก capped๋ฉ๋๋ค. ์ด๊ฒ์ด ๋
ผ๋ฌธ์์ ๋งํ๋ MagicNorm ๊ณ์ด ์์ ํ์ ๋์๋ฉ๋๋ค.
Backward๋ ์ฒ์๋ถํฐ ๋ชจ๋ recurrent step์ ๋ค ํต๊ณผํ์ง ์๊ณ , bp_steps๋ฅผ warmupํฉ๋๋ค.
ํ์ฌ ์ค์ :
bp_warmup_ratio: 0.2
bp_min_steps: 2
bp_max_steps: 5
์ด๊ธฐ์๋ ๋ง์ง๋ง 2 recurrent steps ์์ฃผ๋ก gradient๋ฅผ ํ๋ฆฌ๊ณ , ํ์ต์ด ์งํ๋๋ฉฐ ์ต๋ 5 steps๊น์ง ๋๋ฆฝ๋๋ค. ์ด ์ ๋ ๋ ผ๋ฌธ ๋ฐฉ์๊ณผ ๋ง์ต๋๋ค.
Optimizer / ์ค์ผ์ค
ํ์ฌ pretraining config:
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| optimizer | Adam-atan2 |
| beta1 | 0.9 |
| beta2 | 0.95 |
| weight decay | 0.1 |
| lr | 2.2e-4 |
| lr warmup | 2,000 steps |
| lr min ratio | 1.0 |
| EMA | 0.9999 |
| gradient clipping | ์์ |
๋ ผ๋ฌธ๋ Adam-atan2, warmup 2,000 steps, weight decay 0.1, EMA 0.9999, bf16์ ์ฌ์ฉํฉ๋๋ค. ๊ณต๊ฐ/ํ๊ฐ๋ EMA checkpoint๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.
ํ์ฌ staged run์ด ๋ ผ๋ฌธ๊ณผ ๋ค๋ฅธ ์ด์
๋ ผ๋ฌธ์ โsingle continuous runโ์ด๋ผ๊ณ ์ค๋ช ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์ ํ์ค์ ์ด์ ๋๋ฌธ์ staged run์ผ๋ก ์ด์ํฉ๋๋ค.
- ํ๊ตญ์ด/ํฐ๋ฏธ๋/tokenizer ์ ์ฒ๋ฆฌ๊ฐ ์์ฐจ์ ์ผ๋ก ๋๋๊ณ ์์ต๋๋ค.
- GPU๋ฅผ ๋๋ฆฌ์ง ์๊ธฐ ์ํด ์ค๋น๋ ๋ฐ์ดํฐ๋ถํฐ ํ์ต์ ์์ํ์ต๋๋ค.
- H200 8์ฅ ํ๊ฒฝ์์ 131K vocab ๋๋ฌธ์ batch OOM ์์ ๋ง์ง์ ์ค์ธกํด์ผ ํ์ต๋๋ค.
- HF ์ ๋ก๋์ raw checkpoint ๋ณด์กด์ด ํ์ํฉ๋๋ค.
- full HRM 328G no-cap retokenization์ด ์์ง ์งํ ์ค์ ๋๋ค.
ํ์ง๋ง ๊ฐ stage๊ฐ ๋ค๋ฅธ ๋ชฉ์ ํจ์๋ก ๋ฐ๋๋ ๊ฒ์ ์๋๋๋ค.
| Stage | Objective | ์ฑ๊ฒฉ |
|---|---|---|
| stage-0 | PrefixLM response-only | ์ค๋น ์๋ฃ๋ 711.3M mix |
| stage0b | PrefixLM response-only | ๊ฐ์ mix ์ถ๊ฐ pass |
| stage-1 | PrefixLM response-only | HRM fast-cap 14.55B |
| later stage | PrefixLM response-only | full HRM 328G retokenized + ํ๊ตญ์ด/ํฐ๋ฏธ๋/ํด์ฝ mix |
| final SFT | PrefixLM response-only ๋๋ SFT์ฉ response-only | ํ์ง ๋์ subset์ผ๋ก ํ์ฒ๋ฆฌ |
์ค์ํ ์ ์ stage-0์์ stage-1๋ก ๋์ด๊ฐ ๋ model/optimizer/EMA/carry๋ฅผ ์ด์ด๋ฐ๊ณ , resume_step_offset๊ณผ total_steps_override๋ก global step/LR schedule์ ์ด์ด๊ฐ๋๋ก ์์ ํ๋ค๋ ๊ฒ์
๋๋ค.
์ฆ โํ์ต ๋ฐฉ๋ฒ๋ก โ์ single-stage instruction pretraining์ด๊ณ , โ์ด์ ๋ฐฉ์โ์ staged continuation์ ๋๋ค.
ํ์ฌ ๋ฐ์ดํฐ๊ฐ single-stage ์์น์ ๋ง๋์ง
ํ์ฌ prepared dataset๋ค์ ์ ๋ถ ๊ฐ๋ฅํ ํ instruction-response ํํ๋ก ๋ณํํ์ต๋๋ค.
| ๋ฐ์ดํฐ | single-stage ์์น ์ ํฉ์ฑ |
|---|---|
| HRM cleaned data | ์๋ HRM instruction/response/condition ๊ตฌ์กฐ๋ผ ์ ํฉ |
| ToolBench | tool instruction -> tool-call/answer response ๊ตฌ์กฐ๋ผ ์ ํฉ |
| SWE-ZERO/local terminal | terminal context -> next action/answer ๊ตฌ์กฐ๋ผ ์ ํฉ |
| GLM/Claude reasoning | final answer ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ฉด ์ ํฉ |
| ํ๊ตญ์ด ๋ฒ๋ฅ /์ํค ์๋ฌธ | chunked instruction/response task๋ก ๋ฐ๊ฟ ํฌ์ ํ๋ฏ๋ก ์ ํฉ |
์ฃผ์ํ ์ :
- ํ๊ตญ์ด ์ํค/๋ฒ๋ฅ raw chunk๋ โ๊ทธ๋ฅ ๋ค์ ํ ์คํธ ์์ธกโ์ฒ๋ผ ๋ฃ์ผ๋ฉด ๋ ผ๋ฌธ์ task-completion์์ ๋ฉ์ด์ง๋๋ค.
- ๋ฐ๋ผ์ title/context๋ฅผ instruction์ผ๋ก ๋๊ณ chunk/summary/extraction์ response๋ก ๋๋ ์์ด ๋ ๋ง์ต๋๋ค.
- local terminal dataset์ objective์ ์ ๋ง์ง๋ง ์ ์ฒด ๋น์ค์ด ๋๋ฌด ์ปค์ง๋ฉด ์ผ๋ฐ ์ง์/ํ๊ตญ์ด ๊ท ํ์ด ๋ฌด๋์ง ์ ์์ต๋๋ค.
ํ์ฌ ๋ฐฉ์ ํ๊ฐ
ํ์ฌ ๋ฐฉ์์ ๋ ผ๋ฌธ ํต์ฌ๊ณผ ์ ๋ง์ต๋๋ค.
๋ง๋ ๋ถ๋ถ:
- scratch training
- HRM H2L3 recurrent architecture
- PrefixLM attention
- response-only loss
- condition token ์ฌ์ฉ
- Adam-atan2
- bf16
- EMA 0.9999
- 4,096 context
- LeCun normal init
๋ค๋ฅธ ๋ถ๋ถ:
- vocab 65,536์ด ์๋๋ผ 131,072์ ๋๋ค.
- 16 x H100์ด ์๋๋ผ 8 x H200์ ๋๋ค.
- ๋ ผ๋ฌธ์ ๋จ์ผ ์ฐ์ run, ์ฐ๋ฆฌ๋ staged resume run์ ๋๋ค.
- ๋ ผ๋ฌธ์ 40B unique tokens๋ฅผ ๋ณด๊ณ ํ๊ณ , ํ์ฌ public checkpoint๋ stage-1 fast-cap ์ค๊ฐ ์ฐ์ถ๋ฌผ์ ๋๋ค.
- ํ๊ตญ์ด/ํฐ๋ฏธ๋/ํด์ฝ ๋น์ค์ด ๋ ผ๋ฌธ๋ณด๋ค ํจ์ฌ ํฝ๋๋ค.
์ ์ฐจ์ด๋ ์๋๋ ๋ณ๊ฒฝ์ ๋๋ค. ํนํ ํ๊ตญ์ด/ํฐ๋ฏธ๋/ํด์ฝ์ ๋ชฉํ๋ก ํ๋ฏ๋ก tokenizer์ ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๋ฐ๊พผ ๊ฒ์ ๋ง์ต๋๋ค. ๋ค๋ง ๋ ผ๋ฌธ์ ํจ์จ์ฑ์ ์ฌํํ๋ ค๋ฉด ์ต์ข ์ ์ผ๋ก full HRM cleaned data์ balanced Korean/terminal/tool mix๋ฅผ ํฉ์ณ 40B+ token ์์ค์ผ๋ก ์ด์ด ํ์ตํด์ผ ํฉ๋๋ค.
์ด์ ๊ฒฐ๋ก
ํ์ฌ๋ ๋ค์ ๊ธฐ์ค์ผ๋ก ๊ณ์ ๊ฐ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
- ํ์ฌ stage-1์ ๊ณ์ ์ ์งํฉ๋๋ค.
- ์ ์ฒ๋ฆฌ ์๋ฃ ๋ฐ์ดํฐ๋ HF dataset repo์ ์ฌ๋ ค ๋ค๋ฅธ ๋จธ์ ์์๋ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ก๋๋ค.
- full HRM 328G no-cap retokenization์ด ๋๋๋ฉด next stage๋ก ์ด์ด ํ์ตํฉ๋๋ค.
- SFT ํ๋ณด ๋ฐ์ดํฐ๋ pretraining์ ๋จผ์ ํฌํจํฉ๋๋ค.
- ๋ณ๋ final SFT๋ ๋ง์ง๋ง์ ํ์ง ๋์ subset์ผ๋ก ๋ค์ ์ํํฉ๋๋ค.
- model repo๋ ์ต์ safetensors ์ค์ฌ, raw checkpoint repo๋ resume์ฉ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.