File size: 11,816 Bytes
77ff990 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | # 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๋ง์ผ๋ก ํ์ตํฉ๋๋ค.
๋
ผ๋ฌธ ํต์ฌ:
1. raw text ์ ์ฒด ํ ํฐ์ ์์ธกํ์ง ์์ต๋๋ค.
2. instruction tokens์๋ loss๋ฅผ ์ฃผ์ง ์์ต๋๋ค.
3. response tokens์๋ง negative log-likelihood loss๋ฅผ ์ค๋๋ค.
4. instruction segment๋ PrefixLM mask๋ก bidirectional attention์ ํ์ฉํฉ๋๋ค.
5. response segment๋ autoregressive causal attention์ ์ ์งํฉ๋๋ค.
6. ๋ฐ์ดํฐ๋ direct, cot, synth, noisy ๊ฐ์ condition tag๋ฅผ instruction ์์ ๋ถ์ฌ ์๋ต ์คํ์ผ์ ์ ์ดํฉ๋๋ค.
7. `<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 ํฌ๋งท์ผ๋ก ํ์ตํฉ๋๋ค.
๊ฐ ์ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
```text
instruction span -> response span
```
ํ ํฐ ๋ ๋ฒจ์์๋ ๋ค์์ฒ๋ผ ๊ตฌ์ฑ๋ฉ๋๋ค.
```text
<|im_start|> condition_tokens instruction <|im_end|> response <|box_end|>
```
condition token์ ๋ค์ mapping์ ์ฌ์ฉํฉ๋๋ค.
| condition | token |
|---|---|
| direct | `<|object_ref_start|>` |
| cot | `<|object_ref_end|>` |
| noisy | `<|quad_start|>` |
| synth | `<|quad_end|>` |
`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์ ๋ ๋ถ๋ถ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
1. prefix ๊ตฌ๊ฐ: instruction tokens๋ผ๋ฆฌ bidirectional attention
2. 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 |
์ฝ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. token embedding์์ ์์ํ hidden state๋ฅผ `z_H`๋ก ๋ก๋๋ค.
2. learned/fixed low-level initial state `z_L_init`์์ `z_L`์ ์์ํฉ๋๋ค.
3. ๊ฐ H cycle๋ง๋ค L module์ 3๋ฒ ๋ฐ๋ณต ์
๋ฐ์ดํธํฉ๋๋ค.
4. ๊ทธ ๋ค H module์ 1๋ฒ ์
๋ฐ์ดํธํฉ๋๋ค.
5. ์ด 2๋ฒ์ H cycle์ ์ํํฉ๋๋ค.
6. ์ต์ข
`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ํฉ๋๋ค.
ํ์ฌ ์ค์ :
```yaml
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์ผ๋ก ์ด์ํฉ๋๋ค.
1. ํ๊ตญ์ด/ํฐ๋ฏธ๋/tokenizer ์ ์ฒ๋ฆฌ๊ฐ ์์ฐจ์ ์ผ๋ก ๋๋๊ณ ์์ต๋๋ค.
2. GPU๋ฅผ ๋๋ฆฌ์ง ์๊ธฐ ์ํด ์ค๋น๋ ๋ฐ์ดํฐ๋ถํฐ ํ์ต์ ์์ํ์ต๋๋ค.
3. H200 8์ฅ ํ๊ฒฝ์์ 131K vocab ๋๋ฌธ์ batch OOM ์์ ๋ง์ง์ ์ค์ธกํด์ผ ํ์ต๋๋ค.
4. HF ์
๋ก๋์ raw checkpoint ๋ณด์กด์ด ํ์ํฉ๋๋ค.
5. 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 ์์ค์ผ๋ก ์ด์ด ํ์ตํด์ผ ํฉ๋๋ค.
## ์ด์ ๊ฒฐ๋ก
ํ์ฌ๋ ๋ค์ ๊ธฐ์ค์ผ๋ก ๊ณ์ ๊ฐ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
1. ํ์ฌ stage-1์ ๊ณ์ ์ ์งํฉ๋๋ค.
2. ์ ์ฒ๋ฆฌ ์๋ฃ ๋ฐ์ดํฐ๋ HF dataset repo์ ์ฌ๋ ค ๋ค๋ฅธ ๋จธ์ ์์๋ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ก๋๋ค.
3. full HRM 328G no-cap retokenization์ด ๋๋๋ฉด next stage๋ก ์ด์ด ํ์ตํฉ๋๋ค.
4. SFT ํ๋ณด ๋ฐ์ดํฐ๋ pretraining์ ๋จผ์ ํฌํจํฉ๋๋ค.
5. ๋ณ๋ final SFT๋ ๋ง์ง๋ง์ ํ์ง ๋์ subset์ผ๋ก ๋ค์ ์ํํฉ๋๋ค.
6. model repo๋ ์ต์ safetensors ์ค์ฌ, raw checkpoint repo๋ resume์ฉ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
|