Ternary QAT KO - teamswyg/laya-tools GitHub Wiki

3์ง„ ์˜์‚ฌ๊ฒฐ์ • ํ—ค๋“œ์˜ ์‹ค์ œ ํ•™์Šต๊ณผ PDCA

English ยท ์ด์Šˆ #17 ยท ์ด์ „ ์••์ถ• ์‹คํ—˜ ยท ๊ณต๊ฐœ HF ์ปฌ๋ ‰์…˜

์ด๋ฒˆ์—๋Š” ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜๋ฅผ ๋งˆ์ง€๋ง‰์— ์ค„์ด๊ธฐ๋งŒ ํ•˜๋Š” ๋ฐฉ์‹์—์„œ ๋‚˜์•„๊ฐ€, ์‹ค์ œ๋กœ 3์ง„ ๊ฐ€์ค‘์น˜๋กœ ์˜ˆ์ธกํ•˜๋ฉด์„œ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์˜ PDCA์™€ ์ด 32๊ฐœ ํ•™์Šต ํ›„๋ณด๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ๋œ ํ—ค๋“œ๋Š” 572B์ด๋ฉฐ 3,072๊ฐœ ์„ ํ˜• ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ—ค๋”ยท๋ฐฐ์œจยทํŽธํ–ฅ์„ ํฌํ•จํ•ด 1.490bit/weight์ž…๋‹ˆ๋‹ค. ์ „์ฒด Laya๊ฐ€ ์ด ํฌ๊ธฐ๊ฐ€ ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์™œ ์ƒ์„ฑ ๋Šฅ๋ ฅ๋ณด๋‹ค ํŒ๋‹จ ๋Šฅ๋ ฅ์— ์ง‘์ค‘ํ•˜๋Š”๊ฐ€

์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ์ถœ๋ ฅ์€ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋ผ fast / standard / strong ํ™•๋ฅ  ์„ธ ๊ฐœ์ž…๋‹ˆ๋‹ค. Laya๋„ ์ด๋ฏธ ์ธ์ฝ”๋” ๊ธฐ๋ฐ˜ ๊ฒฐ์ • ๋ชจ๋ธ์ด๋ผ, ์ƒ์„ฑ ๋””์ฝ”๋”๋ฅผ ์ƒˆ๋กœ ์ œ๊ฑฐํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ด๋Š” ๋‹จ๊ณ„๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฌธ์žฅ์„ ์ดํ•ดํ•˜๋Š” ์ธ์ฝ”๋”๋Š” ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๊ทธ ๋’ค์˜ ์ž‘์€ ํŒ๋‹จ ํ—ค๋“œ์— 3์ง„ ํ•™์Šต์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฝ”๋” ์ „์ฒด๋‚˜ ํ™œ์„ฑ๊ฐ’์€ 3์ง„ํ™”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋‹ฌ๋ผ์ง„ ํ•™์Šต ๋ฐฉ๋ฒ•

  1. ๋ถ€๋ชจ v0.2์˜ LayerNorm affine์„ ์„ ํ˜• ์ธต์— ํ•ฉ์นœ ๊ฐ€์ค‘์น˜์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ›„๋ณด์˜ ์ดˆ๊ธฐ ๋ถ€๋ชจ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.
  2. ํ•™์Šต ์ค‘ ๋ณด๊ด€ํ•˜๋Š” ์‹ค์ˆ˜ ๊ฐ€์ค‘์น˜(shadow weights)๋Š” Go์˜ FP64 ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์˜ˆ์ธกํ•  ๋•Œ๋งˆ๋‹ค ํ–‰๋ณ„ ํ‰๊ท  ์ ˆ๋Œ“๊ฐ’์— ์ž„๊ณ„๊ฐ’์„ ๊ณฑํ•ด ์ž‘์€ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋‚˜๋จธ์ง€๋ฅผ -1/+1๊ณผ ๋ฐฐ์œจ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  3. ์‹ค์ œ ์••์ถ• ๋ชจ๋ธ์˜ ์˜ˆ์ธก ์˜ค์ฐจ๋ฅผ ์ด์šฉํ•ด ์‹ค์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜์˜ฌ๋ฆผ์€ ๋ฏธ๋ถ„ํ•˜๊ธฐ ์–ด๋ ค์›Œ identity STE๋ผ๋Š” ๊ทผ์‚ฌ ๊ธฐ์šธ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์œจยท์ž„๊ณ„๊ฐ’์˜ ๋ฏธ๋ถ„์€ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •ํ™•ํ•œ ๋ฐ˜์˜ฌ๋ฆผ ๋ฏธ๋ถ„์ด๋‚˜ BitNet ์›๋…ผ๋ฌธ์˜ ์žฌํ˜„์ด ์•„๋‹™๋‹ˆ๋‹ค.
  4. ๊ฐ epoch์—์„œ ๊ฒ€์ฆ NLL๋งŒ์œผ๋กœ 600B ์ดํ•˜ ํ›„๋ณด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. final์€ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ seed์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์„ ํƒํ•œ ํ›„ calibration 24๊ฑด๋งŒ์œผ๋กœ ์˜จ๋„๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ์กด confidence ๊ธฐ์ค€ 0.9๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  5. ์„ ํƒ ๋ชจ๋ธ๊ณผ ๊ณ„ํšยท๋ฐ์ดํ„ฐ์˜ SHA๋ฅผ ๊ธฐ๋กํ•œ ๋’ค ๋ณ„๋„ check ๋ช…๋ น์—์„œ ์ฒ˜์Œ final์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šตยทํ‰๊ฐ€ยท๊ฒŒ์‹œ ๊ฒ€์ฆ์€ Go CPU๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์บ์‹œํ•œ ํ•™์Šต ํŠน์ง•์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด final ๋ฌธ์žฅ์˜ ํŠน์ง•์„ ์ถ”์ถœํ•  ๋•Œ๋งŒ ๊ธฐ์กด Python/PyTorch MPS๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ seed๋Š” ๋‹ค๋ฅธ minibatch ์ˆœ์„œ๋ฅผ ๋œปํ•˜๋ฉฐ ๋…๋ฆฝ์ ์ธ ๋ฌด์ž‘์œ„ ์ดˆ๊ธฐ ๋ชจ๋ธ ๋‘ ๊ฐœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

PDCA ๊ธฐ๋ก

๋ฐ˜๋ณต ๊ณ„ํšยท์‹คํ–‰ ํ™•์ธ ํ›„์† ์กฐ์น˜
01: ์ •๋‹ต๋งŒ ํ•™์Šต 2 seeds ร— 4 ์ž„๊ณ„๊ฐ’ ร— 2 ํ•™์Šต๋ฅ , ๊ฐ 80 epochs 507B๊ฐ€ ์„ ํƒ๋์ง€๋งŒ ์ด๋ฏธ ์‰ฌ์šด train์„ ๊ฑฐ์˜ ํ™•์‹คํžˆ ๋งžํ˜€ gradient๊ฐ€ ์ž‘์•˜์Œ. ๊ฒ€์ฆ 35/36, ๊ฐ™์€ ์••์ถ•์˜ ํ•™์Šต ์ „ํ›„ ์ฐจ์ด๊ฐ€ ๋งค์šฐ ์ž‘์Œ ์„ฑ๊ณต์ ์ธ ํ•™์Šต ๊ฐœ์„ ์œผ๋กœ ์ฃผ์žฅํ•˜์ง€ ์•Š์Œ. final ๋ฏธ๊ฐœ๋ด‰ ์ƒํƒœ์—์„œ ๋‹ค์Œ ๊ณ„ํš ๊ณ ์ •
02: ์ ์ˆ˜ ์ฐจ์ด๋„ ํ•™์Šต ๊ฐ™์€ 16๊ฐœ ์กฐํ•ฉ, ๊ฐ 120 epochs. ์ •๋‹ต CE + ๋ถ€๋ชจ์˜ ์ค‘์‹ฌํ™” logit MSE ร— 0.1 572B, ๊ฒ€์ฆ 36/36. ๊ฐ™์€ ์ž„๊ณ„๊ฐ’์˜ ํ•™์Šต ์ „ PTQ๋Š” 35/36. 3์ง„ ๊ธฐํ˜ธ 46๊ฐœ ๋ณ€๊ฒฝ ๋‘ seed์™€ ์˜จ๋„๋ฅผ ๊ณ ์ •ํ•˜๊ณ  final ์ฒ˜์Œ ํ™•์ธ

๋‘ ๋ฒˆ์งธ ํ•™์Šต์€ ๋ถ€๋ชจ๊ฐ€ ์„ธ ํด๋ž˜์Šค์— ๋ถ€์—ฌํ•œ ์ ์ˆ˜ ์‚ฌ์ด์˜ ์ฐจ์ด๋„ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ •๋‹ต์„ ๋งžํžŒ ์‚ฌ๋ก€์—์„œ๋„ ์••์ถ•์œผ๋กœ ์†์‹ค๋œ ์ •๋ณด๋ฅผ ํ•™์Šต ์‹ ํ˜ธ๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ต์‚ฌ๋Š” ๊ณ ์ •๋œ ์šฐ๋ฆฌ ๊ณต๊ฐœ ํ—ค๋“œ์ด๋ฉฐ ์™ธ๋ถ€ API๋‚˜ ์œ ๋ฃŒ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ต์‚ฌ ์‹ ํ˜ธ๋Š” train 180๊ฑด์—๋งŒ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๋ณด์กฐ ์†์‹ค์€ 0.1 / (2ร—3) ร— ฮฃ(ํ•™์ƒ ์ค‘์‹ฌํ™” logit โˆ’ ๊ต์‚ฌ ์ค‘์‹ฌํ™” logit)ยฒ์ž…๋‹ˆ๋‹ค.

์ฒซ ๊ณ„ํš, ๋‘ ๋ฒˆ์งธ ๊ณ„ํš, 32๊ฐœ ํ›„๋ณด ์š”์•ฝ, ์ตœ์ข… ๊ฒฐ๊ณผ, ๋ฐ˜๋ณต ์‹œ๊ฐ„ ์ธก์ •, ์ž์›ยท์žฌํ˜„ ๊ธฐ๋ก. ๋ชจ๋“  epoch์˜ ์›๋ณธ ๊ธฐ๋ก์€ HF์˜ development-cycle-01.json๊ณผ selection.json์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์‹คํ—˜์—์„œ ์žฌํ•™์Šตํ•œ ๋ชจ๋ธ์ด ๋ถ€๋ชจ๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ: ์žฅ์ ๊ณผ ์†ํ•ด๋ฅผ ํ•จ๊ป˜ ๋ณด๊ธฐ

ํ•™์Šต ์ „์— ์ƒˆ๋กœ ์ž‘์„ฑํ•ด ๊ณ ์ •ํ•œ ์˜์–ด ํ•ฉ์„ฑ final 36๊ฑด, ํด๋ž˜์Šค๋‹น 12๊ฑด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Œ€ ๋‚œ์ด๋„๋Š” ๋ช…์‹œ๋œ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฐ€์„ค์ด๋ฉฐ ์‹ค์ œ ์ฝ”๋“œ ์ž‘์—… ์„ฑ๊ณต/์‹คํŒจ์—์„œ ์–ป์€ ์ •๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์กด train 180 / validation 36 / calibration 24๋Š” ์žฌ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด test 24๋Š” ํ•™์Šตยท์„ ํƒยท๋ณด์ •์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. final์€ ์ด๋ฒˆ ํ™•์ธ ์ดํ›„๋ถ€ํ„ฐ ์ด๋ฏธ ๋ณธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๋ถ€๋ชจ FP32 ์ด์ „ 660B PTQ ์ƒˆ 572B QAT, ๋‘ seed
์ •๋‹ต 33/36 33/36 34/36
confidence โ‰ฅ0.9 ํŒ๋‹จ ์ค‘ ์ •๋‹ต 32/33 31/31 32/33
ํŒ๋‹จ ์ˆ˜๋ฝ๋ฅ  91.7% 86.1% 91.7%
strong ์žฌํ˜„์œจ 12/12 12/12 12/12
strongโ†’fast ์˜ค๋ฅ˜ 0 0 0
NLL, ๋‚ฎ์„์ˆ˜๋ก ์ข‹์Œ 0.171 0.128 0.179
Brier, ๋‚ฎ์„์ˆ˜๋ก ์ข‹์Œ 0.111 0.088 0.109

์ •๋‹ต ์ˆ˜์™€ ํฌ๊ธฐ๋Š” ๊ฐœ์„ ๋์ง€๋งŒ ์ƒˆ ๋ชจ๋ธ์ด ๋ชจ๋“  ํ’ˆ์งˆ ์ง€ํ‘œ์—์„œ ๋” ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ „ PTQ๋ณด๋‹ค ํ™•๋ฅ  ํ’ˆ์งˆ๊ณผ accepted precision์ด ๋‚˜๋น ์กŒ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ๊ธฐ์ค€์€ ๋‘ seed ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ์ง€๋งŒ 36๊ฑด์—์„œ 1๊ฑด์˜ ์ฐจ์ด๋Š” ํ†ต๊ณ„์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ์šฐ์›”์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 34/36์˜ Wilson 95% ๊ตฌ๊ฐ„์€ ์•ฝ 81.9~98.5%์ž…๋‹ˆ๋‹ค. ์ž๋™ ๋ผ์šฐํ„ฐ๋กœ ์Šน๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚จ์€ ์˜ค๋‹ต์€ ์‰ฌ์šด ๋ฌธ์„œ ๋ณ€๊ฒฝ์„ standard๋กœ ๋ณด๋Š” ๊ณผ๋Œ€ ๋ถ„๋ฅ˜ 2๊ฑด์ž…๋‹ˆ๋‹ค. rate-limit ๋‹จ์œ„ ์˜คํƒ€๋Š” ํ™•์‹ ์ด ์•ฝ 0.852์—ฌ์„œ ๋ณด๋ฅ˜๋˜์ง€๋งŒ, watcher ๋ฌธ์„œ glob ์ˆ˜์ •์€ ์•ฝ 0.953์œผ๋กœ ํ‹€๋ฆฌ๊ฒŒ ์ˆ˜๋ฝ๋์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ํ•˜ํ–ฅ ๋ผ์šฐํŒ…๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆํ•„์š”ํ•œ ์ƒํ–ฅ ๋ผ์šฐํŒ… ๋น„์šฉ๋„ ๋‹ค์Œ ์‹ค์ œ ์ž‘์—… ํ‰๊ฐ€์—์„œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ด final์„ ๋ณด๊ณ  ์˜จ๋„๋‚˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋‹ค์‹œ ๋ฐ”๊พธ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

1.58๋น„ํŠธ๋ณด๋‹ค ์ž‘์€ ์ด์œ ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ”์œ„

์„ ํƒ๋œ ํ—ค๋“œ์˜ 0 ๋น„์œจ์€ ์•ฝ 62.63%์ž…๋‹ˆ๋‹ค. ์„ธ ๊ธฐํ˜ธ๊ฐ€ ๊ฐ™์€ ๋นˆ๋„๋กœ ๋‚˜์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •์ ์ธ 1.58๋น„ํŠธ ํ‘œํ˜„๋งŒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์„ฑ์€ presence bitmap 384B + nonzero sign 144B + ํ—ค๋”ยท๋ฐฐ์œจยทํŽธํ–ฅ 44B = 572B์ž…๋‹ˆ๋‹ค.

  • ๊ธฐํ˜ธ ๋ถ€๋ถ„: 528ร—8รท3,072 = 1.375bit/weight.
  • ์ „์ฒด ํŒŒ์ผ: 572ร—8รท3,072 = 1.4896bit/weight.
  • ๋ถ„๋ชจ๋Š” ์„ ํ˜• ์ธต์˜ 3,072๊ฐœ ๊ณ„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ „์ฒด encoder, float ํ™œ์„ฑ๊ฐ’, tokenizer๋‚˜ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ์˜ ๋น„ํŠธ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • float32 ๋ฐฐ์œจยทํŽธํ–ฅ๊ณผ float64 ๋ˆ„์‚ฐยทnormalization์€ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. ํ•™์Šต์€ ์‹ค์ˆ˜ shadow weights์™€ gradient๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ”๋ก  ํŒŒ์ผ ํฌ๊ธฐ์™€ ํ•™์Šต ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

M4 Pro, Go 1.27.1์—์„œ ๋™์ผ 36๊ฐœ ํŠน์ง•์„ ์‚ฌ์šฉํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ์ˆœํ™˜ํ•˜๋ฉฐ 30,000ํšŒ์”ฉ 5๋ฒˆ ์ธก์ •ํ•œ ์ค‘์•™๊ฐ’:

ํ—ค๋“œ ํฌ๊ธฐ ํ—ค๋“œ๋งŒ ์‹คํ–‰
ํ•ฉ์นœ FP32 12,332B 4.23ยตs
์ด์ „ 3์ง„ PTQ 660B 5.73ยตs
QAT seed 1729 572B 5.01ยตs
QAT seed 2718 572B 5.03ยตs

์ด์ „ 3์ง„๋ณด๋‹ค ์•ฝ 12% ์งง์€ ์‹œ๊ฐ„๊ณผ 13.3% ์ž‘์€ ํŒŒ์ผ์ด์ง€๋งŒ FP32๋ณด๋‹ค ๋А๋ฆฝ๋‹ˆ๋‹ค. 5ํšŒ ํ‘œ๋ณธ์€ ์‹œ์Šคํ…œ ์ „์ฒด ์„ฑ๋Šฅ ๋ณด์ฆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋‘ ํ˜ธ์ถœ๋‹น ํ• ๋‹น 0ํšŒ์ž…๋‹ˆ๋‹ค. SIMD/GPU ์ปค๋„์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ธ์ฝ”๋”๋ฅผ ํฌํ•จํ•œ ์ง€์—ฐ ๊ฐœ์„ ์œผ๋กœ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ํ›„๋ณด 16๊ฐœ ํ•™์Šต ์ „์ฒด๋Š” ์•ฝ 3.25์ดˆ, ํ”„๋กœ์„ธ์Šค ์ตœ๋Œ€ RSS ์•ฝ 24.1MiB์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“  ํŠน์ง•์„ ์“ฐ๋Š” ์ž‘์€ Go ํ—ค๋“œ ํ•™์Šต์ž…๋‹ˆ๋‹ค. ์ƒˆ ํŠน์ง•์„ ๋งŒ๋“  MPS ํ”„๋กœ์„ธ์Šค๋Š” ์•ฝ 2.51GiB RSS๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋๊ณ  RSS์™€ MPS ๋“œ๋ผ์ด๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ฉ์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฌํ˜„

HF์—์„œ ํŒŒ์ผ์„ ๋ฐ›์„ ๋•Œ๋Š” ์ด์Šˆ์— ๊ธฐ๋ก๋œ immutable commit์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GitHub์—๋Š” ๋ชจ๋ธ/ํŠน์ง•์„ ์˜ฌ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ™˜๊ฒฝ์—์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์ƒˆ๋กœ์šด ๋ฌธ์žฅ์˜ ํŠน์ง• ์ถ”์ถœ์—๋งŒ PyTorch/MPS ํ•„์š”
.cache/mps-training-venv/bin/python scripts/training/export_qat_features.py \
  --base .cache/training/base \
  --package .cache/training/pdca-06-package-v0.2 \
  --out .cache/ternary-qat/final-features.json

# train ๋ช…๋ น์€ final ์ธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
go run ./cmd/riido-qat --stage train \
  --development .cache/tinyhead/features.json \
  --out .cache/ternary-qat/new-training

# ์œ„ ๋‹จ๊ณ„๊ฐ€ ๋‘ seed๋ฅผ ์„ ํƒยท๊ณ ์ •ํ•œ ๋’ค ๋ณ„๋„๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
go run ./cmd/riido-qat --stage check \
  --development .cache/tinyhead/features.json \
  --final .cache/ternary-qat/final-features.json \
  --selection .cache/ternary-qat/new-training/selection.json \
  --out .cache/ternary-qat/new-check

# ํ’ˆ์งˆ ์ˆ˜์น˜๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๊ณ , ๊ณต๊ฐœ ์ง์ „ ์ •ํ™•ํ•œ ์†Œ์Šค CI๊นŒ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
go run ./cmd/riido-hubcheck --package .cache/ternary-qat/package --require-ci

์ถœ๋ ฅ ๊ฒฝ๋กœ๋Š” ์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. HF ํŒจํ‚ค์ง€์—์„œ ๋ฐ›์€ development-features.json์„ --development๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด Python ์—†์ด ํ•™์Šต๋ถ€ํ„ฐ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 01 ๋ฐ˜๋ณต์€ --plan experiments/ternary-qat/plan-01.json์œผ๋กœ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. --stage bench๋Š” ๋™์ผํ•œ ์ž…๋ ฅยท์„ ํƒ ํŒŒ์ผ ์ธ์ž๋กœ ์‹œ๊ฐ„๋งŒ ๋ฐ˜๋ณต ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. HF ์—…๋กœ๋“œ๋Š” ๋ณ„๋„ ๋‹จ๊ณ„์ด๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๊ฐ€ ํ•™์Šต์„ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐœ ํŒจํ‚ค์ง€ ๊ฒ€์‚ฌ๋Š” ํ•ด์‹œ๋งŒ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œํ•œ ํ—ค๋“œ์™€ final ํŠน์ง•์œผ๋กœ 36๊ฐœ ํ™•๋ฅ ยท์ •๋‹ต ์ˆ˜ยท์ˆ˜๋ฝ ์ˆ˜ยทํ’ˆ์งˆ ๊ธฐ์ค€์„ Go์—์„œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์›์‹œ ํ”„๋กœํŒŒ์ผยท์‚ฌ๋‚ด ์ด๋ฆ„ยท์‹ค์ œ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธยท์ธ์ฆ์ •๋ณดยท์ ˆ๋Œ€ ๋กœ์ปฌ ๊ฒฝ๋กœ๋Š” ๊ฒŒ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LICENSE์™€ ๋ถ€๋ชจ NOTICE๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ PDCA

  • ์ด 36๊ฑด์„ ๋” ์ด์ƒ ์ƒˆ๋กœ์šด final๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์‹คํ—˜ ์ „์— ์ƒˆ ์ž‘์—… ๊ณ„์—ดยท์ถœ์ฒ˜์˜ final์„ ๋จผ์ € ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์งง์€ ๋ฌธ์„œ ์ˆ˜์ •์— ๋ณต์žกํ•œ ์šฉ์–ด๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ, ํ‘œ๋ฉด ์–ดํœ˜์™€ ์‹ค์ œ ์ž‘์—… ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅธ train/validation/calibration ์‚ฌ๋ก€๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. ํ•œ ์‚ฌ๋žŒ์ด ์“ด ๋ฐ˜๋ณต ํ…œํ”Œ๋ฆฟ์„ ๋ฒ—์–ด๋‚˜ ์‹ค์ œ ๊ณต๊ฐœ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ๋ผ๋ฒจ๋„ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์‰ฌ์›Œ ์ตœ์†Œ ์˜จ๋„ 0.5๊ฐ€ ์„ ํƒ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค. confidence ๊ธฐ์ค€์„ ๋‚ด๋ ค์„œ ์ˆ˜๋ฝ๋ฅ ์„ ๋งž์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•œ ๋ฒˆ์— ๋ฐ”๊ฟ€ ์š”์ธ์„ ์ œํ•œํ•ด 3์ง„ ์ž„๊ณ„๊ฐ’, ํ•™์Šต๋ฅ , teacher ๋น„์ค‘, ๋ณด์ •์˜ ๊ธฐ์—ฌ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์‹คํ—˜์€ NLLยทaccepted precision์˜ ์•…ํ™”๋„ ๋ช…์‹œ์ ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๋” ์—„๊ฒฉํ•œ ์‚ฌ์ „ ๊ธฐ์ค€์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์ ˆ๊ฐ์€ encoder-free ํ•™์ƒ ๋˜๋Š” ์ธ์ฝ”๋” ์ž์ฒด์˜ ์ €๋น„ํŠธ ํ•™์Šต/์‹คํ–‰์œผ๋กœ ๋ณ„๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ—ค๋“œ ์„ฑ๊ณต์„ ๊ทผ๊ฑฐ๋กœ ์ „์ฒด Laya๊ฐ€ 3์ง„์—์„œ๋„ ๊ฐ™์€ ์„ฑ๋Šฅ์ผ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ ๋ชจ๋ธ์€ ๋ฒ„์ „๋ณ„ HF ์ €์žฅ์†Œ๋กœ ๊ฒŒ์‹œํ•˜๊ณ  ๋ถ€๋ชจยท๋ฐ์ดํ„ฐยท์ฝ”๋“œยทCIยทํ•ด์‹œ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ชจ๋ธ๊ณผ ์‹คํŒจ ๊ธฐ๋ก์€ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ง€์† ๊ฒŒ์‹œ๊ฐ€ ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ๋ชจ๋ธ์˜ ์ž๋™ ์Šน๊ฒฉ์„ ๋œปํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ทผ๊ฑฐ์™€ ๋ผ์ด์„ ์Šค

์ˆ˜ํ•™์  ์•„์ด๋””์–ด๋ฅผ ์ฐธ๊ณ ํ•ด Go๋กœ ๋…๋ฆฝ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ•™์Šต ๋ฐ์ดํ„ฐ๋‚˜ ์ œ3์ž ๊ตฌํ˜„์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ธฐ์กด Apache-2.0 ๋ถ€๋ชจ ์ž์‚ฐ์˜ LICENSE/NOTICE๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • Ternary Weight Networks: ์ž„๊ณ„๊ฐ’๊ณผ ๋ฐฐ์œจ์„ ์ด์šฉํ•œ 3์ง„ ๊ฐ€์ค‘์น˜์˜ ์„ ํ–‰ ์—ฐ๊ตฌ.
  • STE ์—ฐ๊ตฌ: ๋ฏธ๋ถ„ํ•˜๊ธฐ ์–ด๋ ค์šด ์—ฐ์‚ฐ์— ๊ทผ์‚ฌ ๊ธฐ์šธ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ๊ฒฝ. ์šฐ๋ฆฌ์˜ identity/stop-gradient ์„ ํƒ ์ž์ฒด๋Š” ์‹คํ—˜ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.
  • Knowledge distillation: ๊ต์‚ฌ์˜ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํ•™์ƒ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฐ๊ฒฝ. ์ด๋ฒˆ centered-logit MSE ํ˜ผํ•ฉ์€ ์šฐ๋ฆฌ ์„ค์ •์ด๋ฉฐ ์›๋…ผ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ํ–ˆ๋‹ค๋Š” ์ฃผ์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • BitNet b1.58: ์ €๋น„ํŠธ ํ•™์Šต์˜ ๋ฐฉํ–ฅ์„ ์ฐธ๊ณ ํ•˜์ง€๋งŒ ์ „์ฒด Transformer์˜ BitNet ๊ตฌํ˜„์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • BITCOS: ๋น„๋Œ€์นญ ๊ธฐํ˜ธ ๋นˆ๋„๋ฅผ ํ™œ์šฉํ•œ bitmap/sign ํ‘œํ˜„. ํ•ด๋‹น ๋…ผ๋ฌธ์˜ Intel ์„ฑ๋Šฅ์„ ์šฐ๋ฆฌ Mac์— ์ „์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.