์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ์ฝ”๋“œ์ธ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ ? ๋”ฅ๋Ÿฌ๋‹ ๋น„๊ฒฐ์ •์„ฑ(Non-determinism)์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿง 

๐ŸŽฒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ์ฝ”๋“œ์ธ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ ? ๋”ฅ๋Ÿฌ๋‹ ๋น„๊ฒฐ์ •์„ฑ(Non-determinism)์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿง 

"๋‚ด ์ปดํ“จํ„ฐ์—์„  92%์˜€๋Š”๋ฐ ์™œ ๋„ค ์ปดํ“จํ„ฐ์—์„  89%์•ผ?"
์ด ํ•œ ๋ฌธ์žฅ์—์„œ ์‹œ์ž‘๋œ ์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ฐค์ƒ˜ ๋””๋ฒ„๊น… ์ด์•ผ๊ธฐ

๊ณตํ•™ ยท ์ •๋ณด์ง€๋Šฅ๊ณตํ•™ ์žฌํ˜„์„ฑ(Reproducibility) ๋ถ€๋™์†Œ์ˆ˜์  ๋žœ๋ค ์‹œ๋“œ

โ˜• ๋“ค์–ด๊ฐ€๋ฉฐ : "๋ถ„๋ช…ํžˆ ๋˜‘๊ฐ™์ด ๋Œ๋ ธ๋Š”๋ฐ์š”?"

์ž, ์ปคํ”ผ ํ•œ ์ž” ๋“ค๊ณ  ํŽธํ•˜๊ฒŒ ์•‰์•„๋ด. ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ํ’€ ๋ฏธ์Šคํ„ฐ๋ฆฌ๋Š” ์ด๊ฑฐ์•ผ.

"๋™์ผํ•œ ๋ฐ์ดํ„ฐ์…‹, ๋™์ผํ•œ ์ฝ”๋“œ, ๋™์ผํ•œ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•™์Šต์‹œ์ผฐ๋Š”๋ฐ ์™œ ๋งค๋ฒˆ ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ๋‚˜์˜ฌ๊นŒ?"

์ด๊ฑฐ ์ง„์งœ ํ”ํ•œ ์ผ์ด์•ผ. ๋…ผ๋ฌธ ์žฌํ˜„ํ•˜๋ ค๊ณ  GitHub ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ํด๋ก ํ•ด์„œ ๋Œ๋ ธ๋Š”๋ฐ, ๋…ผ๋ฌธ์— ์ ํžŒ 94.3%๊ฐ€ ์•ˆ ๋‚˜์˜ค๊ณ  92.1%๊ฐ€ ๋‚˜์™€. ๊ทธ๋ž˜์„œ "์•„ ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ–ˆ๋‚˜?" ํ•˜๊ณ  ๋ฐค์ƒˆ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ด. ๊ทผ๋ฐ ์‚ฌ์‹ค์€... ๋„ˆ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ž˜๋ชปํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์–ด.

๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต์€ ๋ณธ์งˆ์ ์œผ๋กœ ํ™•๋ฅ ์ (stochastic) ํ”„๋กœ์„ธ์Šค์•ผ. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์œ„์— ํ•˜๋“œ์›จ์–ด์™€ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์˜ ๋ฌผ๋ฆฌ์  ์ œ์•ฝ์ด ์–นํ˜€ ์žˆ์ง€. ์ด ๋‘˜์ด ํ•ฉ์ณ์ง€๋ฉด, "๋™์ผํ•œ ์ž…๋ ฅ โ†’ ๋™์ผํ•œ ์ถœ๋ ฅ"์ด๋ผ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ปดํ“จํ„ฐ์— ๋Œ€ํ•ด ๊ฐ–๊ณ  ์žˆ๋˜ ์ƒ์‹์ด ์Šฌ์ฉ ๋ฌด๋„ˆ์ ธ.

๐Ÿ’ก ๋ฏธ๋ฆฌ ์Šคํฌ์ผ๋Ÿฌ: ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ์ด์œ ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐˆ๋ž˜์•ผ.
โ‘  ์•Œ๊ณ ๋ฆฌ์ฆ˜์  ๋ฌด์ž‘์œ„์„ฑ โ€” ์ดˆ๊ธฐํ™”, ์…”ํ”Œ, ๋“œ๋กญ์•„์›ƒ ๊ฐ™์€ "์ผ๋ถ€๋Ÿฌ ๋„ฃ์€ ๋žœ๋ค"
โ‘ก ๊ตฌํ˜„์  ๋น„๊ฒฐ์ •์„ฑ โ€” ๋ถ€๋™์†Œ์ˆ˜์  ๋ง์…ˆ ์ˆœ์„œ, GPU ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ๊ฐ™์€ "์ˆจ์–ด์žˆ๋Š” ๋žœ๋ค"
โ‘ ์€ ์‹œ๋“œ๋กœ ์žกํžˆ์ง€๋งŒ, โ‘ก๋Š” ์‹œ๋“œ๋กœ๋„ ์•ˆ ์žกํžˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ์ด๊ฒŒ ํ•ต์‹ฌ์ด์•ผ.

์ด ๊ธ€์—์„œ๋Š” ์ •๋ณด์ง€๋Šฅ๊ณตํ•™ ๊ด€์ ์—์„œ ์ด ํ˜„์ƒ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ํ•ด๋ถ€ํ•ด๋ณผ ๊ฑฐ์•ผ. ์ˆ˜์‹์€ ์ตœ์†Œํ•œ์œผ๋กœ, ๋Œ€์‹  "์•„ ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ ๊ฑฐ์˜€๊ตฌ๋‚˜!" ํ•˜๋Š” ์ˆœ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ.

๐Ÿ—บ๏ธ ์ „์ฒด ์ง€๋„ ๋จผ์ € ๋ณด๊ธฐ

๋ณต์žกํ•œ ์–˜๊ธฐ ํ•˜๊ธฐ ์ „์— ํฐ ๊ทธ๋ฆผ๋ถ€ํ„ฐ. ๋ชจ๋ธ ํ•˜๋‚˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ๊นŒ์ง€ ๋ฌด์ž‘์œ„์„ฑ์ด ๋ผ์–ด๋“œ๋Š” ์ง€์ ์ด ์ด๋ ‡๊ฒŒ ๋งŽ์•„.

๋ฌด์ž‘์œ„์„ฑ์ด ๋ผ์–ด๋“œ๋Š” 7๊ฐœ์˜ ๋ฌธ 1. ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™” ๋‚œ์ˆ˜๋กœ ์‹œ์ž‘์  ๊ฒฐ์ • 2. ๋ฐ์ดํ„ฐ ์…”ํ”Œ ๋ฐฐ์น˜ ๊ตฌ์„ฑ ์ˆœ์„œ 3. ์ฆ๊ฐ• / ๋…ธ์ด์ฆˆ crop, flip, mixup 4. ๋“œ๋กญ์•„์›ƒ ๋‰ด๋Ÿฐ ๋งˆ์Šคํ‚น 5. ๋ถ€๋™์†Œ์ˆ˜์  ์ˆœ์„œ (a+b)+c โ‰  a+(b+c) 6. GPU ๋ณ‘๋ ฌ ์Šค์ผ€์ค„ atomicAdd, ์ปค๋„ ์„ ํƒ 7. ํ™˜๊ฒฝ / ๋ฒ„์ „ cuDNN, ๋“œ๋ผ์ด๋ฒ„, HW ํŒŒ๋ž€ ๋ฐ•์Šค = ์‹œ๋“œ๋กœ ํ†ต์ œ ๊ฐ€๋Šฅ ยท ๋ถ„ํ™ ๋ฐ•์Šค = ์‹œ๋“œ๋กœ๋„ ์•ˆ ์žกํžˆ๋Š” ์˜์—ญ ๋ฏธ์„ธํ•œ ์ฐจ์ด๊ฐ€ ํ•™์Šต ๊ณผ์ •์—์„œ ์ฆํญ 1e-7 ์˜ค์ฐจ โ†’ ๋‹ค๋ฅธ ๊ทธ๋ž˜๋””์–ธํŠธ โ†’ ๋‹ค๋ฅธ ๊ฒฝ๋กœ โ†’ ๋‹ค๋ฅธ ๊ทน์†Œ์  92.1% 93.4% 92.8% ๊ฐ™์€ ์ฝ”๋“œ ยท ๊ฐ™์€ ๋ฐ์ดํ„ฐ ยท ๋‹ค๋ฅธ ๊ฒฐ๊ณผ

๋ดค์ง€? ๋ฌด๋ ค 7๊ฐœ์˜ ๋ฌธ. ์ด ์ค‘์— ํ•˜๋‚˜๋งŒ ์‚๋—ํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋‹ฌ๋ผ์ ธ. ์ด์ œ ํ•˜๋‚˜์”ฉ ์—ด์–ด๋ณด์ž.

๐ŸŽฐ 1์žฅ. ์ผ๋ถ€๋Ÿฌ ๋„ฃ์€ ๋žœ๋ค โ€” "ํ™•๋ฅ ์ "์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์„ค๊ณ„

1-1. ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™” : ์ถœ๋ฐœ์ ์ด ๋‹ค๋ฅด๋ฉด ๋„์ฐฉ์ ๋„ ๋‹ค๋ฅด๋‹ค

์‹ ๊ฒฝ๋ง์„ ๋งŒ๋“ค๋ฉด ์ œ์ผ ๋จผ์ € ํ•˜๋Š” ๊ฒŒ ๊ฐ€์ค‘์น˜๋ฅผ ์ฑ„์šฐ๋Š” ๊ฑฐ์•ผ. ๊ทธ๋Ÿฐ๋ฐ ์ „๋ถ€ 0์œผ๋กœ ์ฑ„์šฐ๋ฉด? ๋งํ•ด. ๊ฐ™์€ ์ธต์˜ ๋ชจ๋“  ๋‰ด๋Ÿฐ์ด ์™„์ „ํžˆ ๋™์ผํ•œ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๋ฐ›์•„์„œ ์˜์›ํžˆ ๋˜‘๊ฐ™์€ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ฑฐ๋“ . ์ด๊ฑธ ๋Œ€์นญ์„ฑ ๋ฌธ์ œ(symmetry breaking failure)๋ผ๊ณ  ํ•ด.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ผ๋ถ€๋Ÿฌ ๋‚œ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•ด. Xavier(Glorot) ์ดˆ๊ธฐํ™”, He ์ดˆ๊ธฐํ™” ๊ฐ™์€ ๊ฒŒ ๋‹ค ๊ทธ๊ฑฐ์•ผ. ๋ถ„์‚ฐ์„ ์ ์ ˆํžˆ ๋งž์ถ˜ ๋‚œ์ˆ˜๋ฅผ ๋ฟŒ๋ ค์„œ ๊ฐ ๋‰ด๋Ÿฐ์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์ง•์„ ํ•™์Šตํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์ง€.

๐Ÿ“Œ ๋Œ€ํ‘œ์  ์ดˆ๊ธฐํ™” ๋ฐฉ์‹

โ€ข Xavier/Glorot : ๋ถ„์‚ฐ์„ 2/(fan_in + fan_out)๋กœ. tanh, sigmoid ๊ณ„์—ด์— ์ ํ•ฉ
โ€ข He(Kaiming) : ๋ถ„์‚ฐ์„ 2/fan_in๋กœ. ReLU ๊ณ„์—ด์—์„œ ํ™œ์„ฑ๊ฐ’์ด ์ฃฝ์ง€ ์•Š๊ฒŒ
โ€ข Orthogonal : ์ง๊ต ํ–‰๋ ฌ๋กœ ์ดˆ๊ธฐํ™”. RNN์—์„œ ๊ทธ๋ž˜๋””์–ธํŠธ ๋ณด์กด์— ์œ ๋ฆฌ
โ€ข Truncated Normal : ๊ทน๋‹จ๊ฐ’ ์ž˜๋ผ๋‚ธ ์ •๊ทœ๋ถ„ํฌ. Transformer ๊ณ„์—ด์—์„œ ์ž์ฃผ ์‚ฌ์šฉ

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฑด, ์ดˆ๊ธฐํ™”๋Š” ์†์‹ค ์ง€ํ˜•(loss landscape)์—์„œ์˜ ์ถœ๋ฐœ ์ง€์ ์„ ์ •ํ•œ๋‹ค๋Š” ๊ฑฐ์•ผ. ๊นŠ์€ ์‹ ๊ฒฝ๋ง์˜ ์†์‹ค ์ง€ํ˜•์€ ๋ง๋„ ์•ˆ ๋˜๊ฒŒ ์šธํ‰๋ถˆํ‰ํ•œ ๊ณ ์ฐจ์› ๊ณต๊ฐ„์ด๊ฑฐ๋“ . ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 1์–ต ๊ฐœ๋ฉด 1์–ต ์ฐจ์› ๊ณต๊ฐ„์ด์•ผ. ์ƒ์ƒ๋„ ์•ˆ ๋˜์ง€?

๊ทธ ๊ณต๊ฐ„์—์„œ ์ถœ๋ฐœ์ ์ด ๋‹ค๋ฅด๋ฉด, ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์ด ๊ตด๋Ÿฌ๋–จ์–ด์ง€๋Š” ๊ณ„๊ณก๋„ ๋‹ฌ๋ผ์ ธ. ๊ทธ๋ฆฌ๊ณ  ๋”ฅ๋Ÿฌ๋‹์˜ ์‹ ๊ธฐํ•œ ์ ์€, ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„๊ณก๋“ค์ด ๋Œ€๋ถ€๋ถ„ ๋น„์Šทํ•œ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์„ ๋‚ธ๋‹ค๋Š” ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ "๋น„์Šทํ•œ"์ด์ง€ "๊ฐ™์€"์€ ์•„๋‹ˆ์ง€. ๊ทธ๋ž˜์„œ 92.1%์™€ 93.4% ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์ƒ๊ฒจ.

1-2. ๋ฐ์ดํ„ฐ ์…”ํ”Œ๋ง : ์ˆœ์„œ๊ฐ€ ๋งŒ๋“œ๋Š” ๋‚˜๋น„ํšจ๊ณผ

SGD(Stochastic Gradient Descent)์˜ S, ์ฆ‰ "Stochastic(ํ™•๋ฅ ์ )"์ด ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ๋‚˜์™€. ์ „์ฒด ๋ฐ์ดํ„ฐ๋กœ ํ•œ ๋ฒˆ์— ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘์€ ๋ฏธ๋‹ˆ๋ฐฐ์น˜๋กœ ๊ทผ์‚ฌํ•˜๋Š” ๊ฑฐ์•ผ.

๋งค epoch๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์„ž์œผ๋ฉด ๋ฐฐ์น˜ ๊ตฌ์„ฑ์ด ๋‹ฌ๋ผ์ง€๊ณ , ๋ฐฐ์น˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๊ทธ๋ž˜๋””์–ธํŠธ์˜ ๋ฐฉํ–ฅ๋„ ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ ธ. ์ด "๋…ธ์ด์ฆˆ"๋Š” ์‚ฌ์‹ค ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ด์•ผ. ์ ๋‹นํ•œ ๋…ธ์ด์ฆˆ๋Š” ์–•์€ ๊ทน์†Œ์ (sharp minima)์„ ํƒˆ์ถœํ•˜๊ฒŒ ๋„์™€์ฃผ๊ณ , ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ฃผ๊ฑฐ๋“ .

๐Ÿ” ์•Œ์•„๋‘๋ฉด ๋ฉ‹์žˆ๋Š” ์–˜๊ธฐ : Keskar ๋“ฑ์˜ ์—ฐ๊ตฌ(2017)์— ๋”ฐ๋ฅด๋ฉด, ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ชจ๋ธ์€ "๋‚ ์นด๋กœ์šด ๊ทน์†Œ์ "์— ๋น ์ง€๊ธฐ ์‰ฝ๊ณ , ์ด๋Š” ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์—ฐ๊ด€๋œ๋‹ค๋Š” ๊ด€์ฐฐ์ด ์žˆ์–ด. ์ž‘์€ ๋ฐฐ์น˜์˜ ๋…ธ์ด์ฆˆ๊ฐ€ ์ผ์ข…์˜ ์•”๋ฌต์  ์ •๊ทœํ™”(implicit regularization) ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ํ•ด์„์ด์ง€. (๋ฌผ๋ก  ํ•™์Šต๋ฅ  ์Šค์ผ€์ผ๋งยท์›Œ๋ฐ์—…์œผ๋กœ ์ƒ๋‹น ๋ถ€๋ถ„ ๋ณด์™„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํ›„์† ์—ฐ๊ตฌ๋“ค๋„ ์žˆ์–ด.)

1-3. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ• : ๋งค๋ฒˆ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋Š” ๋ชจ๋ธ

RandomCrop, RandomHorizontalFlip, ColorJitter, Mixup, CutMix, RandAugment... ์š”์ฆ˜ ๋น„์ „ ๋ชจ๋ธ ํ•™์Šต์— ์ฆ๊ฐ•์€ ํ•„์ˆ˜์•ผ. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ๋ง ๊ทธ๋Œ€๋กœ ๋งค ์Šคํ… ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด๊ฑฐ๋“ .

"๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋กœ ํ›ˆ๋ จํ–ˆ๋‹ค"๊ณ  ๋งํ•˜์ง€๋งŒ, ์ฆ๊ฐ•์ด ๋“ค์–ด๊ฐ„ ์ˆœ๊ฐ„ ๋ชจ๋ธ์ด ์‹ค์ œ๋กœ ๋ณธ ํ”ฝ์…€์€ ๋งค๋ฒˆ ๋‹ฌ๋ผ. ์›๋ณธ 5๋งŒ ์žฅ์ด ์‚ฌ์‹ค์ƒ ๋ฌดํ•œ๋Œ€์˜ ๋ณ€ํ˜•์œผ๋กœ ํ™•์žฅ๋˜๋Š” ๊ฑฐ๊ณ , ๊ทธ ๋ณ€ํ˜•์˜ ์‹œํ€€์Šค๊ฐ€ ์‹œ๋“œ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง€์ง€.

NLP์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์•ผ. ํ† ํฐ ๋งˆ์Šคํ‚น(BERT์˜ MLM), ๋“œ๋กญ ํ† ํฐ, ๋ฐฑํŠธ๋žœ์Šฌ๋ ˆ์ด์…˜, ๊ทธ๋ฆฌ๊ณ  ์š”์ฆ˜์€ ๋ฐ์ดํ„ฐ ํŒจํ‚น ์ˆœ์„œ๊นŒ์ง€ ๋ฌด์ž‘์œ„ ์š”์†Œ๊ฐ€ ๊ฐ€๋“ํ•ด.

1-4. ๋“œ๋กญ์•„์›ƒ๊ณผ ํ™•๋ฅ ์  ๋ ˆ์ด์–ด

๋“œ๋กญ์•„์›ƒ์€ ํ•™์Šต ์ค‘ ๋‰ด๋Ÿฐ์„ ํ™•๋ฅ  p๋กœ ๊บผ๋ฒ„๋ ค. ์ฆ‰ ๋งค forward pass๋งˆ๋‹ค ๋‹ค๋ฅธ ์„œ๋ธŒ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•™์Šต๋˜๋Š” ๊ฑฐ์•ผ. Stochastic Depth, DropPath, DropBlock ๊ฐ™์€ ๊ฒƒ๋„ ๊ฐ™์€ ์ฒ ํ•™์ด๊ณ .

์ด๊ฑด ์•™์ƒ๋ธ” ํšจ๊ณผ๋ฅผ ๋‚ด์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์ •๊ทœํ™” ๊ธฐ๋ฒ•์ด์ง€๋งŒ, ๋‹น์—ฐํžˆ ์žฌํ˜„์„ฑ ์ธก๋ฉด์—์„  ๋˜ ํ•˜๋‚˜์˜ ๋‚œ์ˆ˜ ์†Œ์Šค์•ผ.

1-5. ๊ทธ ์™ธ ์ˆจ์€ ๋žœ๋ค๋“ค

์š”์†Œ๋ฌด์ž‘์œ„์„ฑ์˜ ์ •์ฒด
Negative Sampling๋Œ€์กฐํ•™์Šตยท์ถ”์ฒœ๋ชจ๋ธ์—์„œ ์Œ์„ฑ ์ƒ˜ํ”Œ ์ถ”์ถœ
๊ฐ€์ค‘ ์ƒ˜ํ”Œ๋Ÿฌํด๋ž˜์Šค ๋ถˆ๊ท ํ˜• ๋ณด์ • ์‹œ ํ™•๋ฅ ์  ์žฌ์ƒ˜ํ”Œ๋ง
Label Smoothing + ๋…ธ์ด์ฆˆ์ผ๋ถ€ ๊ตฌํ˜„์—์„œ ํ™•๋ฅ ์  ๋ผ๋ฒจ ๊ต๋ž€
๋ณ€๋ถ„ ์ถ”๋ก (VAE)์žฌํŒŒ๋ผ๋ฏธํ„ฐํ™” ํŠธ๋ฆญ์˜ ฮต ~ N(0,1)
๊ฐ•ํ™”ํ•™์Šต ํƒํ—˜ฮต-greedy, ์ •์ฑ… ์ƒ˜ํ”Œ๋ง
NAS / ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰ํƒ์ƒ‰ ๊ณต๊ฐ„ ์ƒ˜ํ”Œ๋ง ์ž์ฒด๊ฐ€ ํ™•๋ฅ ์ 

์—ฌ๊ธฐ๊นŒ์ง€๋Š” "์‹œ๋“œ๋ฅผ ๊ณ ์ •ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š”" ์˜์—ญ์ด์•ผ. torch.manual_seed(42), np.random.seed(42), random.seed(42) 3์ข… ์„ธํŠธ ๋”ฑ ๋ฐ•์œผ๋ฉด ์ƒ๋‹น ๋ถ€๋ถ„ ์žกํ˜€.

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ... ์‹œ๋“œ๋ฅผ ๋‹ค ๊ณ ์ •ํ–ˆ๋Š”๋ฐ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋ฉด? ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์ง„์งœ ์žฌ๋ฐŒ์–ด์ ธ. ๐Ÿฟ

๐Ÿ”ฌ 2์žฅ. ์‹œ๋“œ๋กœ๋„ ์•ˆ ์žกํžˆ๋Š” ๋žœ๋ค โ€” ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ๋ฐฐ์‹ 

2-1. ์ปดํ“จํ„ฐ์˜ ๋ง์…ˆ์€ ๊ฒฐํ•ฉ๋ฒ•์น™์„ ์ง€ํ‚ค์ง€ ์•Š๋Š”๋‹ค

์ดˆ๋“ฑํ•™๊ต์—์„œ ๋ฐฐ์› ์ง€. (a + b) + c = a + (b + c). ๊ฒฐํ•ฉ๋ฒ•์น™. ์ˆ˜ํ•™์—์„  ๋‹น์—ฐํ•ด.

๊ทธ๋Ÿฐ๋ฐ ์ปดํ“จํ„ฐ์˜ ๋ถ€๋™์†Œ์ˆ˜์  ์—ฐ์‚ฐ์—์„œ๋Š” ์ด๊ฒŒ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์•„.

>>> (0.1 + 0.2) + 0.3
0.6000000000000001
>>> 0.1 + (0.2 + 0.3)
0.6

>>> (1e16 + 1.0) - 1e16
0.0          # 1.0์ด ์ฆ๋ฐœํ–ˆ๋‹ค
>>> 1e16 + (1.0 - 1e16)
1.0          # ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟจ๋Š”๋ฐ ์‚ด์•„๋‚จ์•˜๋‹ค

์™œ ์ด๋Ÿด๊นŒ? IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์ ์€ ์œ ํ•œํ•œ ๋น„ํŠธ๋กœ ์‹ค์ˆ˜๋ฅผ ๊ทผ์‚ฌํ•˜๊ฑฐ๋“ . float32๋Š” ๋ถ€ํ˜ธ 1๋น„ํŠธ, ์ง€์ˆ˜ 8๋น„ํŠธ, ๊ฐ€์ˆ˜ 23๋น„ํŠธ. ์ฆ‰ ์œ ํšจ ์ˆซ์ž๊ฐ€ ๋Œ€๋žต 7์ž๋ฆฌ ์ •๋„์•ผ.

ํฐ ์ˆ˜์™€ ์•„์ฃผ ์ž‘์€ ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด, ์ž‘์€ ์ˆ˜๊ฐ€ ๊ฐ€์ˆ˜ ๋น„ํŠธ ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค๋‚˜์„œ ๊ทธ๋ƒฅ ์‚ฌ๋ผ์ ธ. ์ด๊ฑธ ํก์ˆ˜ ์˜ค์ฐจ(absorption) ๋˜๋Š” ์†Œ์‹ค(swamping)์ด๋ผ๊ณ  ํ•ด. ๊ทธ๋Ÿฌ๋‹ˆ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋”ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฑฐ์ง€.

๋ณ‘๋ ฌ ํ•ฉ์‚ฐ : ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค GPU ์Šค๋ ˆ๋“œ A ์ˆœ์„œ GPU ์Šค๋ ˆ๋“œ B ์ˆœ์„œ 1e8 1.0 1.0 -1e8 1e8 + 1.0 โ†’ 1e8 (1.0 ํก์ˆ˜๋จ) 1e8 + 1.0 โ†’ 1e8 (๋˜ ํก์ˆ˜) 1e8 - 1e8 โ†’ 0 ๊ฒฐ๊ณผ = 0.0 1.0 1.0 1e8 -1e8 1.0 + 1.0 โ†’ 2.0 2.0 + 1e8 โ†’ 1e8 (๊ทผ์‚ฌ) 1e8 - 1e8 โ†’ 0 ๋˜๋Š” 2.0 ๊ฒฐ๊ณผ = 2.0 ์™„์ „ํžˆ ๊ฐ™์€ ์ˆซ์ž 4๊ฐœ, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‹ต GPU๋Š” ์ˆ˜์ฒœ ๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ '๋จผ์ € ๋๋‚˜๋Š” ์ˆœ์„œ๋Œ€๋กœ' ๋ˆ„์ ํ•œ๋‹ค

2-2. GPU๋Š” ์™œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์„๊นŒ?

CPU์—์„œ for๋ฌธ์œผ๋กœ ๋ฐฐ์—ด์„ ๋”ํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ๋”ฑ ์ •ํ•ด์ ธ ์žˆ์–ด. 0๋ฒˆ, 1๋ฒˆ, 2๋ฒˆ... ํ•ญ์ƒ ๊ฐ™์•„. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๋„ ํ•ญ์ƒ ๊ฐ™์ง€.

๊ทธ๋Ÿฐ๋ฐ GPU๋Š” ์ˆ˜์ฒœ~์ˆ˜๋งŒ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ผํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด 100๋งŒ ๊ฐœ ์›์†Œ๋ฅผ ๋”ํ•  ๋•Œ, GPU๋Š” ์ด๊ฑธ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ๋ณ‘๋ ฌ๋กœ ๋ถ€๋ถ„ํ•ฉ์„ ๊ตฌํ•˜๊ณ , ๊ทธ ๋ถ€๋ถ„ํ•ฉ๋“ค์„ ๋‹ค์‹œ ํ•ฉ์ณ(reduction). ์ด๋•Œ ์–ด๋–ค ๋ธ”๋ก์ด ๋จผ์ € ๋๋‚˜๋А๋ƒ๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ฌ๋ผ.

ํŠนํžˆ atomicAdd ๊ฐ™์€ ์—ฐ์‚ฐ์€ "์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์•ˆ์ „ํ•˜๊ฒŒ ๋”ํ•˜๊ธฐ"๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ, ๋”ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋ณด์žฅํ•˜์ง€ ์•Š์•„. ์ด๊ฒŒ ๋น„๊ฒฐ์ •์„ฑ์˜ ๋Œ€ํ‘œ์  ์›ํ‰์ด์•ผ.

โš™๏ธ atomicAdd๊ฐ€ ์“ฐ์ด๋Š” ๋Œ€ํ‘œ ์—ฐ์‚ฐ๋“ค

โ€ข scatter_add / index_add โ€” ๊ทธ๋ž˜ํ”„ ์‹ ๊ฒฝ๋ง(GNN)์˜ ๋ฉ”์‹œ์ง€ ์ง‘๊ณ„
โ€ข Embedding ๋ ˆ์ด์–ด์˜ backward โ€” ๊ฐ™์€ ํ† ํฐ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋“ฑ์žฅํ•˜๋ฉด ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ ํ•œ ์ฃผ์†Œ์— ๋ˆ„์ 
โ€ข nll_loss / CrossEntropyLoss์˜ ์ผ๋ถ€ CUDA ์ปค๋„
โ€ข max_pool2d, adaptive_avg_pool2d์˜ backward
โ€ข bincount, histc ๋“ฑ ์ง‘๊ณ„ ์—ฐ์‚ฐ
โ€ข ์ผ๋ถ€ interpolate (bilinear/nearest) backward

2-3. cuDNN์˜ "์•Œ์•„์„œ ๋น ๋ฅธ ๊ฑฐ ๊ณจ๋ผ์ค„๊ฒŒ"

ํ•ฉ์„ฑ๊ณฑ(Convolution) ์—ฐ์‚ฐ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์•ผ. ์ง์ ‘ ๊ณ„์‚ฐ(direct), im2col+GEMM, FFT ๊ธฐ๋ฐ˜, Winograd ์•Œ๊ณ ๋ฆฌ์ฆ˜... ๊ฐ๊ฐ ์†๋„์™€ ์ˆ˜์น˜ ํŠน์„ฑ์ด ๋‹ฌ๋ผ.

NVIDIA cuDNN์€ benchmark=True๋กœ ์„ค์ •ํ•˜๋ฉด ์‹คํ–‰ ์‹œ์ ์— ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹ค์ œ๋กœ ๋Œ๋ ค๋ณด๊ณ  ์ œ์ผ ๋น ๋ฅธ ๊ฑธ ์„ ํƒํ•ด. ์ด๊ฒŒ autotuning์ด์•ผ. ์†๋„๋Š” ํ™•์‹คํžˆ ๋นจ๋ผ์ง€๋Š”๋ฐ... ๋ฌธ์ œ๋Š” ๊ทธ ์ˆœ๊ฐ„ GPU ์ƒํƒœ(์˜จ๋„, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค, ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”)์— ๋”ฐ๋ผ ์„ ํƒ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ.

Winograd ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ณฑ์…ˆ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋Œ€์‹  ์ˆ˜์น˜ ์˜ค์ฐจ๊ฐ€ ์กฐ๊ธˆ ๋” ์ปค. FFT ๊ธฐ๋ฐ˜์€ ๋˜ ๋‹ค๋ฅธ ์˜ค์ฐจ ํŠน์„ฑ์ด ์žˆ๊ณ . ๊ทธ๋Ÿฌ๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋€Œ๋ฉด ์†Œ์ˆ˜์  6~7์ž๋ฆฌ์—์„œ ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์˜ค๊ณ , ๊ทธ๊ฒŒ ํ•™์Šต ์ „์ฒด๋กœ ์ฆํญ๋ผ.

# ์žฌํ˜„์„ฑ vs ์†๋„์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
torch.backends.cudnn.benchmark = False      # ์ž๋™ ํŠœ๋‹ ๋„๊ธฐ (์žฌํ˜„์„ฑ โ†‘, ์†๋„ โ†“)
torch.backends.cudnn.deterministic = True   # ๊ฒฐ์ •์  ์ปค๋„๋งŒ ์‚ฌ์šฉ

2-4. TF32, FP16, BF16 โ€” ์ •๋ฐ€๋„๋ฅผ ๊นŽ์œผ๋ฉด ์ƒ๊ธฐ๋Š” ์ผ

์š”์ฆ˜ GPU(Ampere ์ดํ›„)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ TF32๋ผ๋Š” ํฌ๋งท์„ ์จ. ์ด๊ฑด float32์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ ํ–‰๋ ฌ๊ณฑ ๋‚ด๋ถ€์—์„œ๋Š” ๊ฐ€์ˆ˜๋ฅผ 10๋น„ํŠธ๋กœ ๊นŽ์•„์„œ ๊ณ„์‚ฐํ•ด. ํ…์„œ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด ํ›จ์”ฌ ๋น ๋ฅด์ง€๋งŒ, ์ •๋ฐ€๋„๋Š” ๋‚ฎ์•„์ง€์ง€.

ํฌ๋งท์ง€์ˆ˜ ๋น„ํŠธ๊ฐ€์ˆ˜ ๋น„ํŠธํŠน์ง•
FP32823ํ‘œ์ค€ ๋‹จ์ •๋ฐ€๋„, ์œ ํšจ์ˆซ์ž ~7์ž๋ฆฌ
TF32810FP32 ๋ฒ”์œ„ + FP16 ์ •๋ฐ€๋„. Ampere ๊ธฐ๋ณธ
FP16510๋ฒ”์œ„ ์ข์•„ overflow ์œ„ํ—˜, ์Šค์ผ€์ผ๋ง ํ•„์š”
BF1687FP32์™€ ๊ฐ™์€ ๋ฒ”์œ„, ์•ˆ์ •์ . LLM ํ•™์Šต ํ‘œ์ค€
FP8 (E4M3/E5M2)4/53/2Hopper ์ดํ›„, ์ดˆ๊ฑฐ๋Œ€ ๋ชจ๋ธ ๊ฐ€์†์šฉ

ํ˜ผํ•ฉ ์ •๋ฐ€๋„(AMP, Automatic Mixed Precision)๋ฅผ ์“ฐ๋ฉด ์—ฌ๊ธฐ์— ๋™์  ์†์‹ค ์Šค์ผ€์ผ๋ง(dynamic loss scaling)์ด ๋ถ™์–ด. ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ FP16 ๋ฒ”์œ„์—์„œ ์–ธ๋”ํ”Œ๋กœ ๋‚˜์ง€ ์•Š๊ฒŒ ์†์‹ค์— ํฐ ์ˆ˜๋ฅผ ๊ณฑํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋‚˜๋ˆ„๋Š” ๊ธฐ๋ฒ•์ธ๋ฐ, ์Šค์ผ€์ผ ๊ฐ’์ด overflow ๋ฐœ์ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์‹คํ–‰ ์ค‘์— ์ž๋™์œผ๋กœ ์กฐ์ •๋ผ.

์ฆ‰, ์•„์ฃผ ๋ฏธ์„ธํ•œ ์ˆ˜์น˜ ์ฐจ์ด ํ•˜๋‚˜๊ฐ€ "์ด๋ฒˆ์—” overflow ๋ฐœ์ƒ / ์•ˆ ๋ฐœ์ƒ"์„ ๊ฐ€๋ฅด๊ณ , ๊ทธ๊ฒŒ ์Šค์ผ€์ผ ๊ฐ’์„ ๋ฐ”๊พธ๊ณ , ๊ทธ๊ฒŒ ๋˜ ํ•™์Šต ๊ถค์ ์„ ๋ฐ”๊ฟ”. ์™„๋ฒฝํ•œ ๋‚˜๋น„ํšจ๊ณผ์ง€.

โš ๏ธ ์‹ค๋ฌด ํŒ : AMP๋ฅผ ์“ฐ๋Š” ํ•™์Šต์€ FP32 ํ•™์Šต๋ณด๋‹ค run-to-run ํŽธ์ฐจ๊ฐ€ ๋” ํฐ ๊ฒฝํ–ฅ์ด ์žˆ์–ด. ๋…ผ๋ฌธ ์žฌํ˜„์ด ์•ˆ ๋  ๋•Œ AMP ์—ฌ๋ถ€๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ด. ๋…ผ๋ฌธ์€ FP32๋กœ ๋Œ๋ ธ๋Š”๋ฐ ๋„ˆ๋Š” AMP๋กœ ๋Œ๋ฆฌ๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ฑฐ๋“ .

2-5. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ DataLoader์˜ ํ•จ์ •

PyTorch์˜ DataLoader(num_workers=4)๋Š” 4๊ฐœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ด. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ ์›Œ์ปค๋Š” ์ž๊ธฐ๋งŒ์˜ ๋‚œ์ˆ˜ ์ƒํƒœ๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด. ์›Œ์ปค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์„œ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์›Œ์ปค์—์„œ ์‹คํ–‰๋˜๋Š” ์ฆ๊ฐ•์˜ ๋‚œ์ˆ˜ ์†Œ๋น„ ์ˆœ์„œ๊ฐ€ ์‹คํ–‰๋งˆ๋‹ค ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์ง€.

def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    np.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(42)

loader = DataLoader(dataset, batch_size=32, shuffle=True,
                    num_workers=4, worker_init_fn=seed_worker,
                    generator=g, persistent_workers=True)

์ด๋ ‡๊ฒŒ worker_init_fn๊ณผ generator๋ฅผ ๋ช…์‹œํ•ด์•ผ ์›Œ์ปค๋ณ„ ์‹œ๋“œ๊ฐ€ ๊ฒฐ์ •์ ์œผ๋กœ ๊ด€๋ฆฌ๋ผ. ์ด๊ฑฐ ์•ˆ ํ•˜๋ฉด num_workers๋ฅผ 4์—์„œ 8๋กœ๋งŒ ๋ฐ”๊ฟ”๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด. ์ง„์งœ์•ผ.

2-6. ๋ถ„์‚ฐ ํ•™์Šต : ๋…ธ๋“œ๊ฐ€ ๋Š˜๋ฉด ๋žœ๋ค๋„ ๋Š˜์–ด๋‚œ๋‹ค

DDP(DistributedDataParallel)๋กœ GPU 8์žฅ์—์„œ ํ•™์Šตํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ฐ GPU๊ฐ€ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , all-reduce๋กœ ํ•ฉ์ณ. ์ด all-reduce๋„ ring ๋ฐฉ์‹์ด๋ƒ tree ๋ฐฉ์‹์ด๋ƒ์— ๋”ฐ๋ผ ๋ง์…ˆ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ ธ. NCCL์€ ๋„คํŠธ์›Œํฌ ํ† ํด๋กœ์ง€์™€ ํ…์„œ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž๋™ ์„ ํƒํ•˜๊ณ .

๊ฑฐ๊ธฐ์— gradient bucketing(๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๋ฌถ์–ด์„œ ํ†ต์‹ ํ•˜๋Š” ์ตœ์ ํ™”)์˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋˜ ํ•ฉ์‚ฐ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ณ ... ๋น„๋™๊ธฐ ํ†ต์‹  ์™„๋ฃŒ ์ˆœ์„œ๋„ ๋งค๋ฒˆ ๋‹ค๋ฅด๊ณ ... ๋ญ, ์นด์˜ค์Šค์ง€.

๊ทธ๋ž˜์„œ "GPU 4์žฅ์—์„œ ํ•™์Šตํ•œ ๊ฒฐ๊ณผ์™€ 8์žฅ์—์„œ ํ•™์Šตํ•œ ๊ฒฐ๊ณผ๋Š” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ™์•„๋„ ๋‹ค๋ฅด๋‹ค"๋Š” ๊ฒŒ ๊ฑฐ์˜ ์ƒ์‹์ด์•ผ. ์œ ํšจ ๋ฐฐ์น˜ ํฌ๊ธฐ๊นŒ์ง€ ๋‹ฌ๋ผ์ง€๋ฉด ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ .

๐Ÿฆ‹ 3์žฅ. ์™œ ์ž‘์€ ์ฐจ์ด๊ฐ€ ํฐ ์ฐจ์ด๋กœ ์ฆํญ๋ ๊นŒ?

3-1. ์นด์˜ค์Šค ์‹œ์Šคํ…œ์œผ๋กœ์„œ์˜ ์‹ ๊ฒฝ๋ง ํ•™์Šต

1e-7. ์†Œ์ˆ˜์  ์•„๋ž˜ 7๋ฒˆ์งธ ์ž๋ฆฌ์˜ ์ฐจ์ด. "์—์ด ๊ทธ๊ฒŒ ๋ญ ๋Œ€์ˆ˜์•ผ?" ์‹ถ์ง€?

๊ทธ๋Ÿฐ๋ฐ ๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต์€ ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ ๋ฒˆ์˜ ๋ฐ˜๋ณต ์—…๋ฐ์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ ธ. ๊ฐ ์Šคํ…์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ด์ „ ์Šคํ…์˜ ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๊ณ , ๊ทธ๋ž˜๋””์–ธํŠธ๋Š” ํ˜„์žฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋น„์„ ํ˜•์ ์œผ๋กœ ์˜์กดํ•ด. ์ด๊ฑด ์ „ํ˜•์ ์ธ ๋ฐ˜๋ณต ๋™์—ญํ•™๊ณ„(iterated dynamical system)๊ณ , ์ด๋Ÿฐ ์‹œ์Šคํ…œ์€ ์ข…์ข… ์ดˆ๊ธฐ ์กฐ๊ฑด์— ๋ฏผ๊ฐํ•ด.

1e-7์˜ ๋‚˜๋น„ํšจ๊ณผ : ์˜ค์ฐจ ์ฆํญ ๊ณก์„  ํ•™์Šต ์Šคํ… (iteration) ๋‘ ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ฐจ์ด 1e-7 (๋ถ€๋™์†Œ์ˆ˜์  ์˜ค์ฐจ) 1e-4 1e-1 ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ชจ๋ธ ์ดˆ๋ฐ˜: ๊ฑฐ์˜ ๋™์ผ ์ค‘๋ฐ˜: ๊ธ‰๊ฒฉํ•œ ๋ถ„๊ธฐ ํ›„๋ฐ˜: ๋‹ค๋ฅธ ๊ทน์†Œ์  ์ˆ˜๋ ด ๋น„์„ ํ˜• + ๋ฐ˜๋ณต = ๋ฏธ์„ธ ์˜ค์ฐจ๊ฐ€ ์ง€์ˆ˜์ ์œผ๋กœ ์ฆํญ๋˜๋Š” ๊ตฌ์กฐ

3-2. ๊ฒฐ์ •์  ๋ถ„๊ธฐ์  : ReLU, argmax, ๊ทธ๋ฆฌ๊ณ  if๋ฌธ

์ฆํญ์„ ๊ฐ€์†ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฒ”์ธ๋“ค์ด ์žˆ์–ด. ๋ถˆ์—ฐ์†์ ์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ์—ฐ์‚ฐ๋“ค์ด์•ผ.

๐Ÿšช ๋ฏธ์„ธ ์˜ค์ฐจ๋ฅผ ๊ฑฐ๋Œ€ ์˜ค์ฐจ๋กœ ๋ฐ”๊พธ๋Š” "์Šค์œ„์น˜" ์—ฐ์‚ฐ๋“ค

ReLU : ์ž…๋ ฅ์ด +0.0000001์ด๋ƒ -0.0000001์ด๋ƒ์— ๋”ฐ๋ผ ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ 1์ด๋ƒ 0์ด๋ƒ๋กœ ๊ฐˆ๋ ค. ๋‰ด๋Ÿฐ ํ•˜๋‚˜๊ฐ€ ์™„์ „ํžˆ ์ผœ์ง€๊ฑฐ๋‚˜ ๊บผ์ง€๋Š” ๊ฑฐ์•ผ.

MaxPooling : ๋‘ ๊ฐ’์ด ๊ฑฐ์˜ ๊ฐ™์„ ๋•Œ ์–ด๋А ์ชฝ์ด ์ตœ๋Œ€์ธ์ง€๊ฐ€ ๋’ค๋ฐ”๋€Œ๋ฉด, ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ ํ๋ฅด๋Š” ๊ฒฝ๋กœ ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ์–ด.

argmax / top-k : ๋ถ„๋ฅ˜ ๊ฒฐ๊ณผ, ๋น” ์„œ์น˜ ๊ฒฝ๋กœ, MoE์˜ ๋ผ์šฐํŒ… ๊ฒฐ์ •์ด ํ†ต์งธ๋กœ ๋ฐ”๋€Œ์–ด.

Early Stopping : "๊ฒ€์ฆ ์†์‹ค์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉˆ์ถค" โ€” ์•„์Šฌ์•„์Šฌํ•œ ๊ฒฝ๊ณ„์—์„œ 1e-6 ์ฐจ์ด๋กœ 3 epoch ๋” ๋Œ๊ฑฐ๋‚˜ ๋œ ๋Œ์•„.

Gradient Clipping : norm์ด ์ž„๊ณ„๊ฐ’์„ ๋„˜๋А๋ƒ ๋งˆ๋А๋ƒ๋กœ ์Šค์ผ€์ผ๋ง ์ ์šฉ ์—ฌ๋ถ€๊ฐ€ ๊ฐˆ๋ ค.

ํŠนํžˆ Mixture-of-Experts(MoE) ๊ตฌ์กฐ๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•ด. ํ† ํฐ๋งˆ๋‹ค ์–ด๋–ค ์ „๋ฌธ๊ฐ€(expert)๋กœ ๋ณด๋‚ผ์ง€ ๋ผ์šฐํŒ…ํ•˜๋Š”๋ฐ, ๋ผ์šฐํŒ… ํ™•๋ฅ ์ด ๋น„์Šทํ•œ ๋‘ ์ „๋ฌธ๊ฐ€ ์‚ฌ์ด์—์„œ ์„ ํƒ์ด ๋’ค๋ฐ”๋€Œ๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋“ . ๊ฒŒ๋‹ค๊ฐ€ ์šฉ๋Ÿ‰ ์ œํ•œ(capacity factor) ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐฐ์น˜ ์•ˆ์˜ ๋‹ค๋ฅธ ํ† ํฐ๋“ค์—๊ฒŒ๋„ ์—ฐ์‡„์ ์œผ๋กœ ์˜ํ–ฅ์„ ์ค˜.

3-3. ์†์‹ค ์ง€ํ˜•์—๋Š” '์ •๋‹ต'์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค

๊นŠ์€ ์‹ ๊ฒฝ๋ง์˜ ์†์‹ค ํ•จ์ˆ˜๋Š” ๋ณผ๋ก(convex)ํ•˜์ง€ ์•Š์•„. ๊ทน์†Œ์ ์ด ์•„์ฃผ ๋งŽ์ง€. ๊ทธ๋Ÿฐ๋ฐ ์žฌ๋ฐŒ๋Š” ๊ฑด, ๊ณ ์ฐจ์›์—์„œ๋Š” "๋‚˜์œ ๊ทน์†Œ์ "๋ณด๋‹ค ์•ˆ์žฅ์ (saddle point)์ด ํ›จ์”ฌ ํ”ํ•˜๊ณ , ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ทน์†Œ์ ๋“ค์€ ๋Œ€์ฒด๋กœ ๋น„์Šทํ•œ ์†์‹ค ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๋Š” ์‹ค์ฆ์ ยท์ด๋ก ์  ๊ด€์ฐฐ๋“ค์ด ์žˆ์–ด.

๋” ๋†€๋ผ์šด ๊ฑด ๋ชจ๋“œ ์—ฐ๊ฒฐ์„ฑ(mode connectivity) ์—ฐ๊ตฌ์•ผ. Garipov ๋“ฑ(2018)์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๋“œ๋กœ ํ•™์Šตํ•œ ๋‘ ๋ชจ๋ธ ์‚ฌ์ด์—, ์†์‹ค์ด ๊ฑฐ์˜ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ณก์„  ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฑธ ๋ณด์˜€์–ด. ์ฆ‰ ์ด ํ•ด๋“ค์€ ์™„์ „ํžˆ ๊ณ ๋ฆฝ๋œ ์„ฌ์ด ์•„๋‹ˆ๋ผ, ์ €์ง€๋Œ€ ๋Šฅ์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฑฐ์ง€.

๊ทธ๋ฆฌ๊ณ  ์ˆœ์—ด ๋Œ€์นญ์„ฑ(permutation symmetry). ์€๋‹‰์ธต ๋‰ด๋Ÿฐ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”๋„ ํ•จ์ˆ˜์ ์œผ๋กœ๋Š” ์™„์ „ํžˆ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ์•ผ. n๊ฐœ ๋‰ด๋Ÿฐ์ด๋ฉด n! ๊ฐ€์ง€ ํ‘œํ˜„์ด ์กด์žฌํ•˜๋Š” ๊ฑฐ์ง€. Entezari ๋“ฑ(2022)์˜ "์ˆœ์—ด ๋ถˆ๋ณ€์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด SGD ํ•ด๋“ค์ด ์‚ฌ์‹ค์ƒ ํ•˜๋‚˜์˜ ๋ณผ๋ก ๋ถ„์ง€์— ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค"๋Š” ๊ฐ€์„ค๋„ ์—ฌ๊ธฐ์„œ ๋‚˜์™€.

๐ŸŒฑ ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ : ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๋“œ๋กœ ํ•™์Šตํ•œ ๋ชจ๋ธ๋“ค์€ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์€ ์ „ํ˜€ ๋‹ค๋ฅด์ง€๋งŒ, ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ๋น„์Šทํ•œ ์ˆ˜์ค€์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ์ •ํ™•๋„ ์ฐจ์ด 1~2%๋Š” "๋‹ค๋ฅธ ๊ทน์†Œ์ ์— ๊ฐ”๋‹ค"๋Š” ๋œป์ด์ง€ "ํ•˜๋‚˜๊ฐ€ ์ž˜๋ชป๋๋‹ค"๋Š” ๋œป์ด ์•„๋‹ˆ์•ผ.

๐Ÿ“Š 4์žฅ. ๊ทธ๋Ÿผ ์ฐจ์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜๋Š”๋ฐ? โ€” ์ˆซ์ž๋กœ ๋ณด๋Š” ํŽธ์ฐจ

4-1. ๊ด€์ฐฐ๋˜๋Š” ํŽธ์ฐจ์˜ ๊ทœ๋ชจ

์—ฌ๋Ÿฌ ์‹ค์ฆ ์—ฐ๊ตฌ์™€ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ์ข…ํ•ฉํ•˜๋ฉด ๋Œ€๋žต ์ด๋Ÿฐ ์–‘์ƒ์ด์•ผ. (๋ฐ์ดํ„ฐ์…‹ยท๋ชจ๋ธยท์„ค์ •์— ๋”ฐ๋ผ ํŽธ์ฐจ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง€๋‹ˆ ์ฐธ๊ณ ์šฉ์œผ๋กœ ๋ด์ค˜.)

์ƒํ™ฉ์ผ๋ฐ˜์ ์ธ ํŽธ์ฐจ ๊ทœ๋ชจ๋น„๊ณ 
๋Œ€๊ทœ๋ชจ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ (์ถฉ๋ถ„ํ•œ ๋ฐ์ดํ„ฐ)ยฑ0.1 ~ 0.5%p๋น„๊ต์  ์•ˆ์ •์ 
์ค‘์†Œ๊ทœ๋ชจ ๋ถ„๋ฅ˜ (CIFAR๊ธ‰)ยฑ0.3 ~ 1.0%p์‹œ๋“œ ์˜ํ–ฅ ๋šœ๋ ท
์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ํŒŒ์ธํŠœ๋‹ยฑ1 ~ 5%pํŽธ์ฐจ ๋งค์šฐ ํผ
NLP ์†Œ๊ทœ๋ชจ ํƒœ์Šคํฌ ํŒŒ์ธํŠœ๋‹ยฑ2 ~ 10%p๋ฐœ์‚ฐํ•˜๋Š” ์‹œ๋“œ๋„ ์กด์žฌ
๊ฐ•ํ™”ํ•™์Šตยฑ์ˆ˜์‹ญ %์žฌํ˜„์„ฑ ์ตœ์•…์˜ ์˜์—ญ
GNN / ๊ทธ๋ž˜ํ”„ ํƒœ์Šคํฌยฑ1 ~ 3%patomicAdd ์˜ํ–ฅ ํผ

ํŠนํžˆ BERT ๊ณ„์—ด ์†Œ๊ทœ๋ชจ ํŒŒ์ธํŠœ๋‹์˜ ์‹œ๋“œ ๋ฏผ๊ฐ์„ฑ์€ ์œ ๋ช…ํ•ด. Dodge ๋“ฑ(2020)์˜ ์—ฐ๊ตฌ๋Š” GLUE์˜ ์ž‘์€ ํƒœ์Šคํฌ(RTE, MRPC ๋“ฑ)์—์„œ ์‹œ๋“œ๋งŒ ๋ฐ”๊ฟ”๋„ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์š”๋™์น˜๊ณ , ์‹ฌ์ง€์–ด ์ผ๋ถ€ ์‹œ๋“œ์—์„œ๋Š” ํ•™์Šต์ด ์™„์ „ํžˆ ์‹คํŒจ(degenerate run)ํ•œ๋‹ค๋Š” ๊ฑธ ๋ณด๊ณ ํ–ˆ์–ด.

๐Ÿ˜ฑ ์”์“ธํ•œ ์ง„์‹ค : "์šฐ๋ฆฌ ๋ฐฉ๋ฒ•์ด SOTA๋ณด๋‹ค 0.3%p ๋†’์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋…ผ๋ฌธ์ด ์žˆ๋‹ค๋ฉด... ๊ทธ 0.3%p๊ฐ€ ๋ฐฉ๋ฒ•๋ก ์˜ ์šฐ์›”ํ•จ์ธ์ง€, ์•„๋‹ˆ๋ฉด ์šด ์ข‹์€ ์‹œ๋“œ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๊ทธ๋ž˜์„œ ์š”์ฆ˜ ์ข‹์€ ๋…ผ๋ฌธ๋“ค์€ 3~5๊ฐœ ์‹œ๋“œ์˜ ํ‰๊ท  ยฑ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ํ•„์ˆ˜๋กœ ๋ณด๊ณ ํ•ด.

4-2. ๊ทธ๋Ÿผ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋ธ๋„ ๊ฐ™์€ ๊ฑด๊ฐ€?

์ ˆ๋Œ€ ์•„๋‹ˆ์•ผ. ์ด๊ฒŒ ์ง„์งœ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ธ๋ฐ.

๋‘ ๋ชจ๋ธ์ด ๋˜‘๊ฐ™์ด 92.5%๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค๊ณ  ํ•ด๋„, ํ‹€๋ฆฌ๋Š” ์ƒ˜ํ”Œ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด. ์ด๊ฑธ ์˜ˆ์ธก ๋ถˆ์ผ์น˜(prediction churn / disagreement)๋ผ๊ณ  ํ•ด.

์‹ค์ œ๋กœ ๋™์ผ ์„ค์ •ยท๋‹ค๋ฅธ ์‹œ๋“œ ๋ชจ๋ธ ์Œ์˜ ํ…Œ์ŠคํŠธ ์˜ˆ์ธก์„ ๋น„๊ตํ•˜๋ฉด, ์ •ํ™•๋„๋Š” ๊ฑฐ์˜ ๊ฐ™์€๋ฐ ์˜ˆ์ธก์ด ์—‡๊ฐˆ๋ฆฌ๋Š” ์ƒ˜ํ”Œ์ด ์ˆ˜ %์— ๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•ด. ์ •ํ™•๋„๋ผ๋Š” ๋‹จ์ผ ์Šค์นผ๋ผ ์ง€ํ‘œ๋Š” ๋ชจ๋ธ์˜ ํ–‰๋™์„ ์š”์•ฝํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ฑฐ์น ๋‹ค๋Š” ๋œป์ด์ง€.

๐Ÿค” ์ƒ๊ฐํ•ด๋ณผ ๋ฌธ์ œ
์˜๋ฃŒ ์ง„๋‹จ AI๋ฅผ ๋งŒ๋“ค์—ˆ์–ด. ์‹œ๋“œ A ๋ชจ๋ธ๊ณผ ์‹œ๋“œ B ๋ชจ๋ธ ๋ชจ๋‘ ์ •ํ™•๋„ 95%. ๊ทธ๋Ÿฐ๋ฐ ํ™˜์ž ๊น€์”จ์— ๋Œ€ํ•ด A๋Š” "์ •์ƒ", B๋Š” "์ด์ƒ"์ด๋ผ๊ณ  ํ•ด.

๋‹น์‹ ์€ ์–ด๋А ๋ชจ๋ธ์„ ๋ฐฐํฌํ•  ๊ฒƒ์ธ๊ฐ€? ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์„ ํƒ์„ ์–ด๋–ป๊ฒŒ ์ •๋‹นํ™”ํ•  ๊ฒƒ์ธ๊ฐ€?

โ†’ ์ด๊ฒŒ ๋ฐ”๋กœ AI ์‹ ๋ขฐ์„ฑยท๊ทœ์ œ ๋…ผ์˜์—์„œ ์žฌํ˜„์„ฑ์ด ์œค๋ฆฌ์  ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ์•ผ. ๊ทธ๋ž˜์„œ ์˜๋ฃŒยท๊ธˆ์œต ๊ฐ™์€ ๊ณ ์œ„ํ—˜ ๋„๋ฉ”์ธ์—์„œ๋Š” ์•™์ƒ๋ธ”์ด๋‚˜ ๋ถˆํ™•์‹ค์„ฑ ์ •๋Ÿ‰ํ™”๊ฐ€ ๊ฑฐ์˜ ํ•„์ˆ˜๋กœ ์š”๊ตฌ๋ผ.

4-3. ํŽธ์ฐจ๋ฅผ ์žฌ๋Š” ๋ฐฉ๋ฒ•

์ œ๋Œ€๋กœ ์‹คํ—˜ํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•ด:

1๋‹จ๊ณ„ โ€” ์‹œ๋“œ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋Œ๋ฆฌ๊ธฐ : ์ตœ์†Œ 3๊ฐœ, ๊ฐ€๋Šฅํ•˜๋ฉด 5~10๊ฐœ
2๋‹จ๊ณ„ โ€” ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ ๋ณด๊ณ  : 92.4 ยฑ 0.6 ํ˜•ํƒœ
3๋‹จ๊ณ„ โ€” ํ†ต๊ณ„ ๊ฒ€์ • : ๋‘ ๋ฐฉ๋ฒ• ๋น„๊ต ์‹œ t-test๋‚˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์‹ ๋ขฐ๊ตฌ๊ฐ„
4๋‹จ๊ณ„ โ€” ์ตœ๋Œ“๊ฐ’๋งŒ ๋ณด๊ณ ํ•˜์ง€ ์•Š๊ธฐ : "best of 10"์€ ์‚ฌ์‹ค์ƒ ์ฒด๋ฆฌํ”ผํ‚น
5๋‹จ๊ณ„ โ€” ์˜ˆ์‚ฐ ๊ณต๊ฐœ : ๋ช‡ ๋ฒˆ ๋Œ๋ ค์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ์ธ์ง€ ๋ช…์‹œ

Dodge ๋“ฑ์ด ์ œ์•ˆํ•œ expected max performance ๊ฐœ๋…๋„ ์œ ์šฉํ•ด. "์‹œ๋„ ํšŸ์ˆ˜ n์— ๋”ฐ๋ฅธ ๊ธฐ๋Œ€ ์ตœ๋Œ€ ์„ฑ๋Šฅ"์„ ๊ณก์„ ์œผ๋กœ ๊ทธ๋ ค์„œ, ๊ณ„์‚ฐ ์˜ˆ์‚ฐ ๋Œ€๋น„ ๊ณต์ •ํ•œ ๋น„๊ต๋ฅผ ํ•˜์ž๋Š” ์•„์ด๋””์–ด์•ผ.

๐Ÿ› ๏ธ 5์žฅ. ์‹ค์ „ ์žฌํ˜„์„ฑ ํ™•๋ณด ๊ฐ€์ด๋“œ โ€” ์™„์ „ ๊ฒฐ์ •๋ก ์— ๋„์ „ํ•˜๊ธฐ

5-1. PyTorch ์™„์ „ ๊ฒฐ์ •๋ก  ์„ธํŒ…

import os, random, numpy as np, torch

def make_deterministic(seed: int = 42):
    # 1) CUBLAS ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ณ ์ • (CUDA 10.2+ ํ•„์ˆ˜)
    os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"
    os.environ["PYTHONHASHSEED"] = str(seed)

    # 2) ๋ชจ๋“  ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‹œ๋“œ ๊ณ ์ •
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)

    # 3) cuDNN ๊ฒฐ์ •๋ก  ๋ชจ๋“œ
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

    # 4) ๋น„๊ฒฐ์ •์  ์—ฐ์‚ฐ ๋งŒ๋‚˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
    torch.use_deterministic_algorithms(True, warn_only=False)

    # 5) TF32 ๋„๊ธฐ (์ •๋ฐ€๋„ ์ผ๊ด€์„ฑ)
    torch.backends.cuda.matmul.allow_tf32 = False
    torch.backends.cudnn.allow_tf32 = False

make_deterministic(42)

use_deterministic_algorithms(True)๊ฐ€ ํ•ต์‹ฌ์ด์•ผ. ์ด๊ฑธ ์ผœ๋ฉด ๋น„๊ฒฐ์ •์  CUDA ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋ ค ํ•  ๋•Œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์ค˜. "๋„ˆ ์ง€๊ธˆ ์žฌํ˜„ ์•ˆ ๋˜๋Š” ์—ฐ์‚ฐ ์“ฐ๊ณ  ์žˆ์–ด!"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์ง€.

โš ๏ธ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด ๋‹นํ™ฉํ•˜์ง€ ๋ง๊ณ  ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ์–ด.
โ‘  ํ•ด๋‹น ์—ฐ์‚ฐ์„ ๊ฒฐ์ •์  ๋Œ€์•ˆ์œผ๋กœ ๊ต์ฒด (์˜ˆ: scatter_add โ†’ ์ •๋ ฌ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„)
โ‘ก warn_only=True๋กœ ๋ฐ”๊ฟ”์„œ ๊ฒฝ๊ณ ๋งŒ ๋ฐ›๊ณ  ์ง„ํ–‰ (์žฌํ˜„์„ฑ ์ผ๋ถ€ ํฌ๊ธฐ)

5-2. TensorFlow / JAX์˜ ๊ฒฝ์šฐ

# TensorFlow
import os, tensorflow as tf
os.environ["TF_DETERMINISTIC_OPS"] = "1"
os.environ["TF_CUDNN_DETERMINISTIC"] = "1"
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()   # TF 2.8+

JAX๋Š” ์ ‘๊ทผ๋ฒ• ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ. ์•”๋ฌต์  ์ „์—ญ ๋‚œ์ˆ˜ ์ƒํƒœ๊ฐ€ ์•„์˜ˆ ์—†์–ด. ๋ชจ๋“  ๋‚œ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ key๋ฅผ ๋ฐ›์•„์•ผ ํ•ด.

# JAX - ํ•จ์ˆ˜ํ˜• ๋‚œ์ˆ˜ ๊ด€๋ฆฌ
import jax
key = jax.random.PRNGKey(42)
key, subkey = jax.random.split(key)
noise = jax.random.normal(subkey, (128, 256))
# key๋ฅผ ์•ˆ ์ชผ๊ฐœ๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋ฉด? ๊ฐ™์€ ๋‚œ์ˆ˜๊ฐ€ ๋˜ ๋‚˜์˜ด (์˜๋„์  ์„ค๊ณ„)

์ฒ˜์Œ์—” ๊ท€์ฐฎ์€๋ฐ, ์จ๋ณด๋ฉด "์•„ ์ด๊ฒŒ ๋งž๋Š” ์„ค๊ณ„๊ตฌ๋‚˜" ์‹ถ์–ด์ ธ. ๋‚œ์ˆ˜์˜ ํ๋ฆ„์ด ์ฝ”๋“œ์— ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜๋‹ˆ๊นŒ ๋ณ‘๋ ฌํ™”ํ•ด๋„ ์žฌํ˜„์„ฑ์ด ์œ ์ง€๋˜๊ฑฐ๋“ .

5-3. ํ™˜๊ฒฝ ์ž์ฒด๋ฅผ ๊ณ ์ •ํ•˜๊ธฐ

์ฝ”๋“œ๋งŒ ๊ฐ™๋‹ค๊ณ  ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์ง„์งœ ์žฌํ˜„์„ ์›ํ•˜๋ฉด ํ™˜๊ฒฝ๊นŒ์ง€ ๋ฐ•์ œํ•ด์•ผ ํ•ด.

๊ณ ์ • ๋Œ€์ƒ๋ฐฉ๋ฒ•
Python ํŒจํ‚ค์ง€pip freeze, poetry.lock, uv.lock
CUDA / cuDNNDocker ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๊ณ ์ • (latest ๊ธˆ์ง€!)
GPU ๋“œ๋ผ์ด๋ฒ„๋ฒ„์ „ ๊ธฐ๋ก (nvidia-smi ์ถœ๋ ฅ ์ €์žฅ)
GPU ์•„ํ‚คํ…์ฒ˜V100 vs A100 vs H100 ๊ฒฐ๊ณผ ๋‹ค๋ฆ„ โ†’ ๋ช…์‹œ
GPU ๊ฐœ์ˆ˜ / ๋ถ„์‚ฐ ์„ค์ •world_size, ๋ฐฐ์น˜ ํฌ๊ธฐ, gradient accumulation
๋ฐ์ดํ„ฐ ๋ฒ„์ „DVC, ํ•ด์‹œ๊ฐ’ ๊ธฐ๋ก, ์ „์ฒ˜๋ฆฌ ์Šคํฌ๋ฆฝํŠธ ์ปค๋ฐ‹
์‹คํ—˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐMLflow, Weights&Biases, Neptune ๋“ฑ

โœ… ๊ณจ๋“  ๋ฃฐ : "์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‹คํ—˜ = ์ฝ”๋“œ + ๋ฐ์ดํ„ฐ + ํ™˜๊ฒฝ + ์‹œ๋“œ + ํ•˜๋“œ์›จ์–ด"
์ด ๋‹ค์„ฏ ๊ฐœ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ์™„์ „ ์žฌํ˜„์€ ๋ถˆ๊ฐ€๋Šฅํ•ด.

5-4. ๊ฒฐ์ •๋ก ์˜ ๋Œ€๊ฐ€ โ€” ์–ผ๋งˆ๋‚˜ ๋А๋ ค์ง€๋‚˜?

๊ณต์งœ๋Š” ์—†์–ด. ๊ฒฐ์ •๋ก  ๋ชจ๋“œ๋ฅผ ์ผœ๋ฉด ๋Œ€๋žต ์ด๋Ÿฐ ๋น„์šฉ์„ ์น˜๋Ÿฌ.

์„ค์ •์†๋„ ์˜ํ–ฅ์–ธ์ œ ์“ธ๊นŒ
cudnn.benchmark=False5~20% ๋А๋ ค์ง์žฌํ˜„ ํ•„์š”ํ•œ ๋ชจ๋“  ์‹คํ—˜
cudnn.deterministic=True10~30% ๋А๋ ค์ง๋…ผ๋ฌธ ๊ฒฐ๊ณผ ์ œ์ถœ์šฉ
TF32 ๋น„ํ™œ์„ฑํ™”Ampere+ ์—์„œ ์ตœ๋Œ€ 2~3๋ฐฐ ๋А๋ ค์ง์ˆ˜์น˜ ๋ฏผ๊ฐํ•œ ์—ฐ๊ตฌ
use_deterministic_algorithms์—ฐ์‚ฐ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ค๋ฆ„๋””๋ฒ„๊น…, ์ตœ์ข… ๊ฒ€์ฆ
AMP ๋น„ํ™œ์„ฑํ™”1.5~2๋ฐฐ ๋А๋ ค์ง + ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€์ •๋ฐ€๋„ ์ผ๊ด€์„ฑ ํ•„์š” ์‹œ

๊ทธ๋ž˜์„œ ํ˜„์‹ค์ ์ธ ์ „๋žต์€ ์ด๊ฑฐ์•ผ:

๐ŸŽฏ ๋‹จ๊ณ„๋ณ„ ์ „๋žต

ํƒ์ƒ‰ ๋‹จ๊ณ„ โ€” ๊ฒฐ์ •๋ก  ๋‹ค ๋„๊ณ  ์ตœ๋Œ€ ์†๋„๋กœ. ์–ด์ฐจํ”ผ ์•„์ด๋””์–ด ๊ฒ€์ฆ ์ค‘์ด๋‹ˆ๊นŒ.

๋น„๊ต ๋‹จ๊ณ„ โ€” ์‹œ๋“œ๋งŒ ๊ณ ์ •ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์‹œ๋“œ๋กœ ๋ฐ˜๋ณต. ํ‰๊ท ยฑํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋น„๊ต.

์ตœ์ข… ๊ฒ€์ฆ โ€” ์™„์ „ ๊ฒฐ์ •๋ก  ๋ชจ๋“œ๋กœ ์žฌํ˜„ ํ™•์ธ. ์ฒดํฌํฌ์ธํŠธ์™€ ํ™˜๊ฒฝ ์ „์ฒด ์•„์นด์ด๋น™.

๋ฐฐํฌ โ€” ์ถ”๋ก  ์‹œ์—๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฒฐ์ •์ ์ด์ง€๋งŒ, ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๋ชจ๋ธ์€ ๋ณ„๋„ ๊ด€๋ฆฌ.

๐Ÿงฉ 6์žฅ. ๋น„๊ฒฐ์ •์„ฑ์„ '๋ฌธ์ œ'๊ฐ€ ์•„๋‹ˆ๋ผ '์ž์›'์œผ๋กœ ์“ฐ๊ธฐ

์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์œผ๋ฉด "๋น„๊ฒฐ์ •์„ฑ = ๋‚˜์œ ๊ฒƒ"์ฒ˜๋Ÿผ ๋А๊ปด์ง€์ง€? ๊ทผ๋ฐ ๋ฐ˜์ „์ด ์žˆ์–ด. ์ด ๋ฌด์ž‘์œ„์„ฑ ๋•๋ถ„์— ๋”ฅ๋Ÿฌ๋‹์ด ์ž˜ ๋˜๋Š” ์ธก๋ฉด๋„ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ์ด๊ฑธ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•๋“ค๋„ ๋งŽ์•„.

๋žœ๋ค์„ ๋ฌด๊ธฐ๋กœ ๋ฐ”๊พธ๋Š” 4๊ฐ€์ง€ ๊ธฐ๋ฒ• โ‘  ๋”ฅ ์•™์ƒ๋ธ” M1 M2 M3 ํ‰๊ท  ๋‹ค๋ฅธ ์‹œ๋“œ = ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ํŒจํ„ด = ์ƒ์‡„ โ‘ก ๋ถˆํ™•์‹ค์„ฑ ์ •๋Ÿ‰ํ™” ์˜ˆ์ธก ๋ถ„์‚ฐ = ๋ชจ๋ธ์ด ์–ผ๋งˆ๋‚˜ ํ™•์‹ ํ•˜๋Š”๊ฐ€ โ‘ข SGD ๋…ธ์ด์ฆˆ = ์ •๊ทœํ™” ๋…ธ์ด์ฆˆ๊ฐ€ ๋‚ ์นด๋กœ์šด ๊ทน์†Œ์ ์„ ํƒˆ์ถœ์‹œํ‚ด โ‘ฃ ์‹œ๋“œ ์Šค์œ• = ๊ฒฌ๊ณ ์„ฑ ๊ฒ€์ฆ ํŽธ์ฐจ๊ฐ€ ์ž‘์•„์•ผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

6-1. ๋”ฅ ์•™์ƒ๋ธ” : ๋žœ๋ค์ด ๊ณง ๋‹ค์–‘์„ฑ

Lakshminarayanan ๋“ฑ(2017)์ด ์ œ์•ˆํ•œ Deep Ensembles๋Š” ๋†€๋ž๋„๋ก ๋‹จ์ˆœํ•ด. "์‹œ๋“œ๋งŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ณ  ์˜ˆ์ธก์„ ํ‰๊ท ๋‚ด๋ผ."

์ด๊ฒŒ ์™œ ์ž˜ ๋ ๊นŒ? ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๋“œ์˜ ๋ชจ๋ธ๋“ค์€ ๋‹ค๋ฅธ ๊ทน์†Œ์ ์— ์ˆ˜๋ ดํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์‹ค์ˆ˜๋ฅผ ํ•˜๊ฑฐ๋“ . ํ‰๊ท ์„ ๋‚ด๋ฉด ๊ฐœ๋ณ„ ์˜ค๋ฅ˜๊ฐ€ ์ƒ์‡„๋˜๊ณ , ๋™์‹œ์— ์˜ˆ์ธก์˜ ๋ถ„์‚ฐ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ •์น˜๊ฐ€ ๋ผ.

์‹ค์ œ๋กœ ๋”ฅ ์•™์ƒ๋ธ”์€ ๋ณต์žกํ•œ ๋ฒ ์ด์ง€์•ˆ ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฒ•๋“ค๋ณด๋‹ค๋„ ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ •๊ณผ ๋ถ„ํฌ ์™ธ ๋ฐ์ดํ„ฐ(OOD) ํƒ์ง€์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๋‹จ์ˆœํ•œ๋ฐ ๊ฐ•๋ ฅํ•œ, ๋”ฅ๋Ÿฌ๋‹๋‹ค์šด ํ•ด๋ฒ•์ด์ง€.

6-2. ๋žœ๋ค์„ ์•„์˜ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์“ฐ๋Š” ๊ฒฝ์šฐ

๐ŸŽฒ ๋ฌด์ž‘์œ„์„ฑ์ด ํ•ต์‹ฌ์ธ ๊ธฐ๋ฒ•๋“ค

โ€ข MC Dropout โ€” ์ถ”๋ก  ์‹œ์—๋„ ๋“œ๋กญ์•„์›ƒ์„ ์ผœ์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์˜ˆ์ธก, ๋ถ„์‚ฐ์œผ๋กœ ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ •
โ€ข SWA (Stochastic Weight Averaging) โ€” ํ•™์Šต ํ›„๋ฐ˜ ์—ฌ๋Ÿฌ ์‹œ์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ‰๊ท 
โ€ข Snapshot Ensemble โ€” ์ˆœํ™˜ ํ•™์Šต๋ฅ ๋กœ ์—ฌ๋Ÿฌ ๊ทน์†Œ์ ์„ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ์Šค๋ƒ…์ƒท ์ˆ˜์ง‘
โ€ข Random Search โ€” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰์—์„œ ๊ทธ๋ฆฌ๋“œ ์„œ์น˜๋ณด๋‹ค ํšจ์œจ์  (Bergstra & Bengio, 2012)
โ€ข ํ™•์‚ฐ ๋ชจ๋ธ(Diffusion) โ€” ๊ฐ€์šฐ์‹œ์•ˆ ๋…ธ์ด์ฆˆ์—์„œ ์‹œ์ž‘ํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ƒ„. ๋žœ๋ค์ด ๊ณง ์ฐฝ์ž‘
โ€ข LLM ์ƒ˜ํ”Œ๋ง โ€” temperature, top-p, top-k. ์ฐฝ์˜์  ์ถœ๋ ฅ์˜ ์›์ฒœ
โ€ข ์ฐจ๋“ฑ ํ”„๋ผ์ด๋ฒ„์‹œ(DP-SGD) โ€” ๊ทธ๋ž˜๋””์–ธํŠธ์— ์˜๋„์  ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ

6-3. LLM์˜ ๋น„๊ฒฐ์ •์„ฑ : ์š”์ฆ˜ ๊ฐ€์žฅ ๋œจ๊ฑฐ์šด ์ฃผ์ œ

"ChatGPT์— temperature=0์œผ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์™œ ๋‹ต์ด ๋งค๋ฒˆ ๋‹ค๋ฅด์ง€?" ์ด ์งˆ๋ฌธ ํ•œ ๋ฒˆ์ฏค ํ•ด๋ดค์ง€?

์ด๊ฑด ์œ„์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์˜ ์ข…ํ•ฉํŒ์ด์•ผ. ์›์ธ์ด ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ์Œ“์—ฌ ์žˆ์–ด.

์›์ธ์„ค๋ช…
๋ฐฐ์น˜ ๊ตฌ์„ฑ ๋ณ€๋™์„œ๋น™ ์‹œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์š”์ฒญ๊ณผ ๋ฌถ์—ฌ ๋ฐฐ์น˜๊ฐ€ ๋˜๋Š”๋ฐ, ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด GEMM ์ปค๋„์ด ๋ฐ”๋€Œ๊ณ  ๋ถ€๋™์†Œ์ˆ˜์  ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง
MoE ๋ผ์šฐํŒ…์ „๋ฌธ๊ฐ€ ์„ ํƒ์ด ๋ฏธ์„ธ ์˜ค์ฐจ๋กœ ๋’ค๋ฐ”๋€œ + ์šฉ๋Ÿ‰ ์ œํ•œ์œผ๋กœ ๋‹ค๋ฅธ ํ† ํฐ์— ์—ฐ์‡„ ์˜ํ–ฅ
KV ์บ์‹œ / ์ฒญํ‚น์–ดํ…์…˜์„ ์ฒญํฌ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•  ๋•Œ ์ฒญํฌ ๊ฒฝ๊ณ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๋ˆ„์  ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง
์—ฐ์† ๋ฐฐ์นญvLLM ๋“ฑ์˜ continuous batching์€ ์š”์ฒญ ๋„์ฐฉ ์‹œ์ ์— ๋”ฐ๋ผ ๊ทธ๋ฃนํ•‘์ด ๋‹ฌ๋ผ์ง
argmax ๋™๋ฅ greedy decoding์—์„œ ์ƒ์œ„ ๋‘ ํ† ํฐ ๋กœ์ง“์ด ๊ฑฐ์˜ ๊ฐ™์œผ๋ฉด ์„ ํƒ์ด ๋’ค๋ฐ”๋€œ
์ถ”์ธก ๋””์ฝ”๋”ฉspeculative decoding์˜ ๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ ์ˆ˜์น˜ ์ฐจ์ด๊ฐ€ ์ˆ˜๋ฝ/๊ฑฐ์ ˆ์„ ๊ฐ€๋ฆ„

๊ทธ๋ž˜์„œ "batch-invariant kernel"(๋ฐฐ์น˜ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ผํ•œ ์—ฐ์‚ฐ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์ปค๋„)์„ ๋งŒ๋“œ๋Š” ์—ฐ๊ตฌ๊ฐ€ ์ตœ๊ทผ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์–ด. ์†๋„๋ฅผ ์กฐ๊ธˆ ํฌ์ƒํ•˜๋”๋ผ๋„ ์ถ”๋ก  ๊ฒฐ๊ณผ์˜ ์™„์ „ํ•œ ์žฌํ˜„์„ ๋ณด์žฅํ•˜๋ ค๋Š” ์‹œ๋„์ง€. LLM ํ‰๊ฐ€ยทA/B ํ…Œ์ŠคํŠธยท๊ทœ์ œ ๋Œ€์‘์—์„œ ์ด๊ฑด ์ ์  ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์–ด.

๐Ÿข ์™œ ๊ธฐ์—…๋“ค์ด ์‹ ๊ฒฝ ์“ธ๊นŒ?
โ€ข ๊ธˆ์œต : ๋™์ผ ์ž…๋ ฅ์— ๋™์ผ ํŒ๋‹จ์ด ๋‚˜์™€์•ผ ๊ฐ์‚ฌ(audit)๋ฅผ ํ†ต๊ณผ
โ€ข ์˜๋ฃŒ : ์ง„๋‹จ ๊ฒฐ๊ณผ๊ฐ€ ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅด๋ฉด ์ธ์ฆ์ด ์•ˆ ๋จ
โ€ข ๋ฒ•๋ฅ /๋ณดํ—˜ : ์˜์‚ฌ๊ฒฐ์ • ๊ทผ๊ฑฐ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
โ€ข EU AI Act ๋“ฑ ๊ทœ์ œ : ๊ณ ์œ„ํ—˜ AI ์‹œ์Šคํ…œ์˜ ๋กœ๊น…ยท์ถ”์ ์„ฑ ์š”๊ตฌ

๐Ÿ”ง 7์žฅ. ๋””๋ฒ„๊น… ์‹ค์ „ โ€” "๋‚ด ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ ๋งž์„ ๋•Œ" ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ž, ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ํ„ฐ์กŒ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ• ๊นŒ? ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ณด์ž.

STEP 1 โ€” ๊ฐ™์€ ๋จธ์‹ ์—์„œ ๋‘ ๋ฒˆ ๋Œ๋ ค๋ณธ๋‹ค
๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์œผ๋ฉด? โ†’ ์‹œ๋“œ๋Š” ์ž˜ ์žกํ˜”๊ณ , ํ™˜๊ฒฝ ์ฐจ์ด ๋ฌธ์ œ์•ผ. STEP 4๋กœ.
๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋ฉด? โ†’ ๋‚ด๋ถ€ ๋น„๊ฒฐ์ •์„ฑ ๋ฌธ์ œ. STEP 2๋กœ.

STEP 2 โ€” ์‹œ๋“œ 3์ข… ์„ธํŠธ ํ™•์ธ
random, numpy, torch ๋ชจ๋‘ ๊ณ ์ •ํ–ˆ๋‚˜?
torch.cuda.manual_seed_all() ๋น ์ง€์ง€ ์•Š์•˜๋‚˜?
DataLoader์— worker_init_fn๊ณผ generator ๋„ฃ์—ˆ๋‚˜?
์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(albumentations, imgaug ๋“ฑ)์˜ ์ž์ฒด ์‹œ๋“œ๋Š”?

STEP 3 โ€” ๊ฒฐ์ •๋ก  ๊ฐ•์ œ ๋ชจ๋“œ๋กœ ์›์ธ ํŠน์ •
torch.use_deterministic_algorithms(True) ์ผœ๊ณ  ์‹คํ–‰.
์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ์—ฐ์‚ฐ์ด ๋ฐ”๋กœ ๋ฒ”์ธ์ด์•ผ.
์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋ฒ”์ธ: index_add, scatter_add, embedding_backward, nll_loss2d, upsample_bilinear2d_backward

STEP 4 โ€” CPU์—์„œ ์†Œ๊ทœ๋ชจ๋กœ ๊ฒ€์ฆ
์ž‘์€ ๋ฐ์ดํ„ฐ๋กœ CPU์—์„œ ๋Œ๋ ค๋ด. CPU ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๋ถ€๋ถ„ ์™„์ „ ๊ฒฐ์ •์ ์ด์•ผ.
(torch.set_num_threads(1)๋„ ํ•จ๊ป˜)
CPU์—์„œ ์žฌํ˜„๋˜๋ฉด โ†’ GPU ๊ด€๋ จ ๋ฌธ์ œ ํ™•์ •.

STEP 5 โ€” ์ฒซ N ์Šคํ…์˜ ์†์‹ค๊ฐ’์„ ๋น„๊ต
ํ•™์Šต ์ดˆ๋ฐ˜ 10 ์Šคํ…์˜ loss๋ฅผ ์†Œ์ˆ˜์  8์ž๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅํ•ด์„œ ๋น„๊ตํ•ด๋ด.
โ€ข 1์Šคํ…๋ถ€ํ„ฐ ๋‹ค๋ฅด๋‹ค โ†’ ์ดˆ๊ธฐํ™” or ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฌธ์ œ
โ€ข 3~5์Šคํ…๋ถ€ํ„ฐ ๊ฐˆ๋ผ์ง„๋‹ค โ†’ ์—ฐ์‚ฐ ์ˆ˜์ค€ ๋น„๊ฒฐ์ •์„ฑ
โ€ข ์ˆ˜๋ฐฑ ์Šคํ… ํ›„ ๊ฐˆ๋ผ์ง„๋‹ค โ†’ ์ฆํญ๋œ ๋ฏธ์„ธ ์˜ค์ฐจ

STEP 6 โ€” ํ™˜๊ฒฝ ๋น„๊ต
torch.__version__, torch.version.cuda, torch.backends.cudnn.version()
nvidia-smi๋กœ ๋“œ๋ผ์ด๋ฒ„ยทGPU ๋ชจ๋ธ ํ™•์ธ
Docker ์ด๋ฏธ์ง€ digest ๋น„๊ต (ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ digest!)

7-1. ์œ ์šฉํ•œ ์ง„๋‹จ ์ฝ”๋“œ

import torch, platform, subprocess

def env_fingerprint():
    info = {
        "python": platform.python_version(),
        "torch": torch.__version__,
        "cuda": torch.version.cuda,
        "cudnn": torch.backends.cudnn.version(),
        "gpu": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "cpu",
        "gpu_count": torch.cuda.device_count(),
        "tf32_matmul": torch.backends.cuda.matmul.allow_tf32,
        "cudnn_benchmark": torch.backends.cudnn.benchmark,
        "cudnn_det": torch.backends.cudnn.deterministic,
    }
    for k, v in info.items():
        print(f"{k:16s}: {v}")
    return info

# ํ•™์Šต ๋ฃจํ”„์— ์ฒดํฌ์„ฌ ์‹ฌ๊ธฐ
def param_checksum(model):
    s = 0.0
    for p in model.parameters():
        s += float(p.detach().double().sum())
    return s

# ๋งค ์Šคํ… ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋””์„œ ๊ฐˆ๋ผ์ง€๋Š”์ง€ ๋ฐ”๋กœ ๋ณด์ž„
# print(f"step {i} loss={loss.item():.10f} ck={param_checksum(model):.10f}")

์ด param_checksum ํŠธ๋ฆญ ์€๊ทผํžˆ ๊ฐ•๋ ฅํ•ด. ๋‘ ์‹คํ–‰์˜ ๋กœ๊ทธ๋ฅผ diff๋กœ ๋น„๊ตํ•˜๋ฉด ์ •ํ™•ํžˆ ๋ช‡ ๋ฒˆ์งธ ์Šคํ…์—์„œ ๊ฐˆ๋ผ์กŒ๋Š”์ง€ ๋”ฑ ๋‚˜์™€.

๐Ÿ’ก ์ด๋Ÿฐ ์‹์˜ ์‹ค๋ฌด ๋…ธํ•˜์šฐ๋Š” ํ˜ผ์ž ์ตํžˆ๊ธฐ ์ฐธ ์–ด๋ ค์šด ์˜์—ญ์ด์•ผ. ์žฌ๋Šฅ๋„ท์˜ '์ง€์‹์ธ์˜ ์ˆฒ' ๊ฐ™์€ ๊ณต๊ฐ„์—์„œ ํ˜„์—… ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฝ์งˆ๊ธฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒŒ ๊ทธ๋ž˜์„œ ๊ฐ’์ง„ ๊ฑฐ๊ณ . ๊ณต์‹ ๋ฌธ์„œ์—๋Š” "๋น„๊ฒฐ์ •์ ์ผ ์ˆ˜ ์žˆ์Œ"์ด๋ผ๊ณ  ํ•œ ์ค„ ์ ํ˜€ ์žˆ์„ ๋ฟ์ด๊ฑฐ๋“ .

๐ŸŒ 8์žฅ. ๋” ๋„“์€ ์‹œ์„  โ€” ์žฌํ˜„์„ฑ์€ ๊ณผํ•™์˜ ๋ฌธ์ œ๋‹ค

8-1. ์žฌํ˜„์„ฑ์˜ ์„ธ ๊ฐ€์ง€ ์ธต์œ„

์—ฐ๊ตฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์žฌํ˜„์„ฑ์„ ์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„ํ•ด:

์ˆ˜์ค€์ •์˜๋‚œ์ด๋„
Repeatability
(๋ฐ˜๋ณต์„ฑ)
๊ฐ™์€ ํŒ€, ๊ฐ™์€ ํ™˜๊ฒฝ, ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅ
Replicability
(๋ณต์ œ์„ฑ)
๋‹ค๋ฅธ ํŒ€์ด ์›์ €์ž์˜ ์ฝ”๋“œยท๋ฐ์ดํ„ฐ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์–ด๋ ค์›€
Reproducibility
(์žฌํ˜„์„ฑ)
๋‹ค๋ฅธ ํŒ€์ด ๋…ผ๋ฌธ ์„ค๋ช…๋งŒ ๋ณด๊ณ  ๋…๋ฆฝ ๊ตฌํ˜„ํ•ด ๊ฐ™์€ ๊ฒฐ๋ก ๊ฐ€์žฅ ์–ด๋ ต๊ณ  ๊ฐ€์žฅ ์ค‘์š”

์‚ฌ์‹ค ๊ณผํ•™์ ์œผ๋กœ ์ง„์งœ ์ค‘์š”ํ•œ ๊ฑด ์„ธ ๋ฒˆ์งธ์•ผ. ๋น„ํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ, "๊ฒฐ๋ก ์ด ์žฌํ˜„๋˜๋Š”๊ฐ€"๊ฐ€ ํ•ต์‹ฌ์ด๊ฑฐ๋“ .

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ "์ •ํ™•๋„๊ฐ€ 92.4๊ฐ€ ์•„๋‹ˆ๋ผ 92.1์ด ๋‚˜์™”๋‹ค"๋Š” ๊ฑด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ "๋…ผ๋ฌธ์—์„œ๋Š” ๊ธฐ์กด ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ข‹๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ๋Œ๋ฆฌ๋‹ˆ ๋” ๋‚˜์˜๋‹ค"๋ฉด ๊ทธ๊ฑด ์ง„์งœ ๋ฌธ์ œ์•ผ.

8-2. ์žฌํ˜„์„ฑ ์œ„๊ธฐ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋Œ€์‘

2018๋…„ NeurIPS์—์„œ Joelle Pineau๊ฐ€ ์ œ์•ˆํ•œ Reproducibility Checklist๋Š” ํฐ ์ „ํ™˜์ ์ด์—ˆ์–ด. ์ง€๊ธˆ์€ ์ฃผ์š” ํ•™ํšŒ๋“ค์ด ๋…ผ๋ฌธ ์ œ์ถœ ์‹œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์š”๊ตฌํ•˜์ง€.

๐Ÿ“‹ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— ๋ณดํ†ต ๋“ค์–ด๊ฐ€๋Š” ํ•ญ๋ชฉ๋“ค

โ€ข ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์™€ ๊ณ„์‚ฐ ๋ณต์žก๋„ ๋ช…์‹œ
โ€ข ์‚ฌ์šฉํ•œ ์ปดํ“จํŒ… ์ธํ”„๋ผ (GPU ์ข…๋ฅ˜, ๊ฐœ์ˆ˜, ์ด ํ•™์Šต ์‹œ๊ฐ„)
โ€ข ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰ ๋ฒ”์œ„์™€ ์„ ํƒ ๋ฐฉ๋ฒ•
โ€ข ์‹คํ–‰ ํšŸ์ˆ˜์™€ ๊ฒฐ๊ณผ ํ†ต๊ณ„ (ํ‰๊ท , ๋ถ„์‚ฐ, ์‹ ๋ขฐ๊ตฌ๊ฐ„)
โ€ข ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ๋ฐฉ์‹๊ณผ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •
โ€ข ์ฝ”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ๊ณต๊ฐœ ์—ฌ๋ถ€
โ€ข ์‚ฌ์šฉํ•œ ๋žœ๋ค ์‹œ๋“œ

ML Reproducibility Challenge ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ด๋ฒคํŠธ๋„ ํ™œ๋ฐœํ•ด. ์ฐธ๊ฐ€์ž๋“ค์ด ๋…ผ๋ฌธ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌํ˜„ํ•ด๋ณด๊ณ  ๋ณด๊ณ ์„œ๋ฅผ ๋‚ด๋Š” ๊ฑด๋ฐ, ๊ฒฐ๊ณผ๊ฐ€ ๊ฝค ํฅ๋ฏธ๋กœ์›Œ. "์™„์ „ํžˆ ์žฌํ˜„๋จ"๋ณด๋‹ค "๋ถ€๋ถ„์ ์œผ๋กœ ์žฌํ˜„๋จ"์ด ํ›จ์”ฌ ๋งŽ๋‹ค๋Š” ๊ฒŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ด€์ฐฐ๋˜๊ณ  ์žˆ์–ด.

8-3. ๋ฒค์น˜๋งˆํฌ ๊ณผ์ ํ•ฉ์ด๋ผ๋Š” ํ•จ์ •

์—ฌ๊ธฐ์„œ ์ข€ ๋ถˆํŽธํ•œ ์–˜๊ธฐ๋ฅผ ํ•ด๋ณผ๊ฒŒ.

๊ฐ™์€ ํ…Œ์ŠคํŠธ์…‹์„ ์ˆ˜์ฒœ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์—ฐ๊ตฌ์ž๋“ค์ด "ํ…Œ์ŠคํŠธ์…‹ ์„ฑ๋Šฅ์„ ๋ณด๊ณ  ๋ฐฉ๋ฒ•์„ ์ˆ˜์ •"ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ์…‹์— ๋Œ€ํ•œ ๊ฐ„์ ‘์  ๊ณผ์ ํ•ฉ์ด ์ผ์–ด๋‚˜.

Recht ๋“ฑ(2019)์€ CIFAR-10๊ณผ ImageNet์˜ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ์…‹์„ ์›๋ž˜ ์ˆ˜์ง‘ ์ ˆ์ฐจ๋Œ€๋กœ ๋งŒ๋“ค์–ด์„œ ๊ธฐ์กด ๋ชจ๋ธ๋“ค์„ ํ‰๊ฐ€ํ–ˆ์–ด. ๊ฒฐ๊ณผ? ๋ชจ๋“  ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ํ•˜๋ฝํ–ˆ์–ด. ๋‹ค๋งŒ ๋ชจ๋ธ ๊ฐ„ ์ˆœ์œ„๋Š” ๋Œ€์ฒด๋กœ ์œ ์ง€๋์ง€. ์ฆ‰ "์ ˆ๋Œ€ ์ˆ˜์น˜๋Š” ๋ถ€ํ’€๋ ค์ ธ ์žˆ์ง€๋งŒ ์ƒ๋Œ€ ๋น„๊ต๋Š” ์–ด๋А ์ •๋„ ์œ ํšจํ•˜๋‹ค"๋Š” ๊ฒฐ๋ก .

์ด ์–˜๊ธฐ๋ฅผ ์™œ ํ•˜๋ƒ๋ฉด, "0.2%p ์ฐจ์ด"์— ๋ชฉ๋งค๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ์˜๋ฏธ ์—†๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ์‹œ๋“œ ํŽธ์ฐจ๊ฐ€ ยฑ0.5%p์ธ๋ฐ 0.2%p ๊ฐœ์„ ์„ ์ฃผ์žฅํ•˜๋Š” ๊ฑด... ์Œ, ํ†ต๊ณ„์ ์œผ๋กœ ์ข€ ๊ณค๋ž€ํ•˜์ง€.

8-4. ๊ทธ๋ž˜์„œ ์ข‹์€ ์‹คํ—˜์ด๋ž€?

โœจ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ML ์‹คํ—˜์˜ ์กฐ๊ฑด

1. ์—ฌ๋Ÿฌ ์‹œ๋“œ โ€” ์ตœ์†Œ 3๊ฐœ, ์ด์ƒ์ ์œผ๋กœ 5~10๊ฐœ
2. ํ†ต๊ณ„์  ๋ณด๊ณ  โ€” ํ‰๊ท  ยฑ ํ‘œ์ค€ํŽธ์ฐจ, ๊ฐ€๋Šฅํ•˜๋ฉด ์‹ ๋ขฐ๊ตฌ๊ฐ„
3. ๊ณต์ •ํ•œ ์˜ˆ์‚ฐ โ€” ๋น„๊ต ๋Œ€์ƒ์—๋„ ๋™์ผํ•œ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹ ๊ธฐํšŒ
4. ํšจ๊ณผ ํฌ๊ธฐ โ€” "ํ†ต๊ณ„์ ์œผ๋กœ ์œ ์˜"๋ณด๋‹ค "์‹ค์งˆ์ ์œผ๋กœ ์˜๋ฏธ ์žˆ๋Š”" ์ฐจ์ด์ธ๊ฐ€
5. ํ™˜๊ฒฝ ๊ณต๊ฐœ โ€” ์ฝ”๋“œ, ์„ค์ • ํŒŒ์ผ, ํ™˜๊ฒฝ ๋ช…์„ธ, ์‹œ๋“œ ์ „๋ถ€
6. ์‹คํŒจ ๋ณด๊ณ  โ€” ์ž˜ ์•ˆ ๋œ ์‹œ๋“œ๋‚˜ ์„ค์ •๋„ ์†”์งํ•˜๊ฒŒ
7. ์–ด๋ธ”๋ ˆ์ด์…˜ โ€” ์–ด๋–ค ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‹ค์ œ๋กœ ๊ธฐ์—ฌํ–ˆ๋Š”์ง€

๐Ÿงช 9์žฅ. ์ง์ ‘ ํ•ด๋ณด๋Š” ์‹คํ—˜ โ€” ๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ

๋ง๋กœ๋งŒ ๋“ค์œผ๋ฉด ๊ฐ์ด ์•ˆ ์˜ค์ง€? ์ง์ ‘ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์‹คํ—˜๋“ค์„ ์ค€๋น„ํ–ˆ์–ด.

์‹คํ—˜ 1 : ๋ถ€๋™์†Œ์ˆ˜์  ๊ฒฐํ•ฉ๋ฒ•์น™ ๊นจ๊ธฐ

import numpy as np

# ํฐ ์ˆ˜์™€ ์ž‘์€ ์ˆ˜๊ฐ€ ์„ž์ธ ๋ฐฐ์—ด
arr = np.array([1e8, 1.0, -1e8, 1.0, 1e8, -1e8], dtype=np.float32)

print("์ˆœ์„œ๋Œ€๋กœ :", np.float32(0) + arr[0] + arr[1] + arr[2] + arr[3] + arr[4] + arr[5])
print("์—ญ์ˆœ     :", np.float32(0) + arr[5] + arr[4] + arr[3] + arr[2] + arr[1] + arr[0])
print("numpy sum:", arr.sum())          # pairwise summation ์‚ฌ์šฉ
print("์ •ํ™•ํ•œ ๊ฐ’ :", 2.0)

# ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ 100๋ฒˆ ๋”ํ•ด๋ณด๊ธฐ
results = set()
for _ in range(100):
    perm = np.random.permutation(arr)
    s = np.float32(0)
    for x in perm:
        s = np.float32(s + x)
    results.add(float(s))
print("๋‚˜์˜จ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋“ค:", sorted(results))

์‹คํ–‰ํ•ด๋ณด๋ฉด 0.0, 1.0, 2.0 ๊ฐ™์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’๋“ค์ด ๋‚˜์™€. ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๋”ํ–ˆ๋Š”๋ฐ๋„!

์‹คํ—˜ 2 : GPU ๋ˆ„์  ํ•ฉ์˜ ๋น„๊ฒฐ์ •์„ฑ

import torch

x = torch.randn(10_000_000, device='cuda', dtype=torch.float32)
sums = {float(x.sum()) for _ in range(20)}
print(f"20๋ฒˆ ํ•ฉ์‚ฐ โ†’ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’ {len(sums)}๊ฐœ")
# ํ™˜๊ฒฝ์— ๋”ฐ๋ผ 1๊ฐœ์ผ ์ˆ˜๋„, ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜๋„ ์žˆ์Œ

# scatter_add๋Š” ํ›จ์”ฌ ์ž˜ ๋“œ๋Ÿฌ๋‚จ
idx = torch.randint(0, 100, (5_000_000,), device='cuda')
src = torch.randn(5_000_000, device='cuda')
outs = []
for _ in range(10):
    out = torch.zeros(100, device='cuda')
    out.scatter_add_(0, idx, src)
    outs.append(out.clone())
diff = max(float((outs[0] - o).abs().max()) for o in outs)
print(f"scatter_add ์ตœ๋Œ€ ํŽธ์ฐจ: {diff:.3e}")

์‹คํ—˜ 3 : ์‹œ๋“œ๋งŒ ๋ฐ”๊ฟ”์„œ ์„ฑ๋Šฅ ๋ถ„ํฌ ๋ณด๊ธฐ

import numpy as np

accs = []
for seed in range(10):
    make_deterministic(seed)
    model = build_model()
    acc = train_and_eval(model)
    accs.append(acc)
    print(f"seed {seed}: {acc:.4f}")

accs = np.array(accs)
print(f"\nํ‰๊ท    : {accs.mean():.4f}")
print(f"ํ‘œ์ค€ํŽธ์ฐจ: {accs.std():.4f}")
print(f"๋ฒ”์œ„   : {accs.min():.4f} ~ {accs.max():.4f}")
print(f"์ตœ๋Œ€-์ตœ์†Œ ์ฐจ์ด: {accs.max()-accs.min():.4f}")

์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ•ด๋ณด๋ฉด ๊นœ์ง ๋†€๋ž„ ๊ฑฐ์•ผ. ์ตœ๋Œ€-์ตœ์†Œ ์ฐจ์ด๊ฐ€ ๋…ผ๋ฌธ๋“ค์ด ์ž๋ž‘ํ•˜๋Š” "๊ฐœ์„ ํญ"๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•˜๊ฑฐ๋“ .

์‹คํ—˜ 4 : ๋‘ ๋ชจ๋ธ์˜ ์˜ˆ์ธก ๋ถˆ์ผ์น˜ ์ธก์ •

import numpy as np

pred_a = model_a.predict(X_test).argmax(1)
pred_b = model_b.predict(X_test).argmax(1)
y = y_test

acc_a = (pred_a == y).mean()
acc_b = (pred_b == y).mean()
disagree = (pred_a != pred_b).mean()

both_right = ((pred_a == y) & (pred_b == y)).mean()
only_a     = ((pred_a == y) & (pred_b != y)).mean()
only_b     = ((pred_a != y) & (pred_b == y)).mean()
both_wrong = ((pred_a != y) & (pred_b != y)).mean()

print(f"์ •ํ™•๋„ A/B : {acc_a:.4f} / {acc_b:.4f}")
print(f"์˜ˆ์ธก ๋ถˆ์ผ์น˜ : {disagree:.4f}")
print(f"๋‘˜ ๋‹ค ๋งž์Œ {both_right:.3f} | A๋งŒ {only_a:.3f} | "
      f"B๋งŒ {only_b:.3f} | ๋‘˜ ๋‹ค ํ‹€๋ฆผ {both_wrong:.3f}")

์ •ํ™•๋„๋Š” ๋น„์Šทํ•œ๋ฐ ๋ถˆ์ผ์น˜์œจ์ด 3~8%์”ฉ ๋‚˜์˜ค๋Š” ๊ฑธ ๋ณด๋ฉด, "๋ชจ๋ธ์ด ๊ฐ™๋‹ค"๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ์„ฑ๋ฆฝํ•˜๊ธฐ ์–ด๋ ค์šด ๋ง์ธ์ง€ ์‹ค๊ฐํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ“– 10์žฅ. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ ๋ชจ์Œ

Q1. ์‹œ๋“œ๋ฅผ 42๋กœ ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ์•ผ?

๋”๊ธ€๋Ÿฌ์Šค ์• ๋ค์Šค์˜ ์†Œ์„ค ใ€Ž์€ํ•˜์ˆ˜๋ฅผ ์—ฌํ–‰ํ•˜๋Š” ํžˆ์น˜ํ•˜์ด์ปค๋ฅผ ์œ„ํ•œ ์•ˆ๋‚ด์„œใ€์—์„œ "์‚ถ, ์šฐ์ฃผ, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๊ถ๊ทน์˜ ๋‹ต"์ด 42๊ฑฐ๋“ . ์ˆœ์ „ํžˆ ๊ฐœ๋ฐœ์ž ๋ฌธํ™”์˜ ๋†๋‹ด์ด์•ผ. ์ˆ˜ํ•™์  ์˜๋ฏธ๋Š” ์ „ํ˜€ ์—†์–ด. 0, 1, 1234, 2023 ๋‹ค ๋˜‘๊ฐ™์•„.

๋‹ค๋งŒ ์ฃผ์˜ํ•  ์ ! ํŠน์ • ์‹œ๋“œ๊ฐ€ ์œ ๋‚œํžˆ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ๋‹ค๊ณ  ๊ทธ ์‹œ๋“œ๋งŒ ์“ฐ๋Š” ๊ฑด ํ†ต๊ณ„์  ๋ถ€์ •ํ–‰์œ„์•ผ. ๊ทธ๊ฑด ํ…Œ์ŠคํŠธ์…‹์— ๋งž์ถฐ ํŠœ๋‹ํ•œ ๊ฑฐ๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฑฐ๋“ .

Q2. ์‹œ๋“œ๋ฅผ ๊ณ ์ •ํ•˜๋ฉด ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋‚˜?

์•„๋‹ˆ์•ผ. ์‹œ๋“œ ๊ณ ์ •์€ ๋‚œ์ˆ˜์˜ ์‹œํ€€์Šค๋ฅผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ๋ฟ, ๋ฌด์ž‘์œ„์„ฑ ์ž์ฒด๋ฅผ ์—†์• ๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์…”ํ”Œ๋„ ์—ฌ์ „ํžˆ ์ผ์–ด๋‚˜๊ณ , ๋“œ๋กญ์•„์›ƒ๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ด. ๊ทธ์ € "๊ฐ™์€ ํŒจํ„ด์œผ๋กœ" ์ผ์–ด๋‚  ๋ฟ์ด์ง€.

์„ฑ๋Šฅ์— ์˜ํ–ฅ ์—†๊ณ , ์žฌํ˜„์„ฑ์€ ์–ป๋Š”๋‹ค. ๋ฌด์กฐ๊ฑด ๊ณ ์ •ํ•ด.

Q3. ์ถ”๋ก (inference)๋„ ๋น„๊ฒฐ์ •์ ์ผ ์ˆ˜ ์žˆ์–ด?

๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๋ก ์€ ํ•™์Šต๋ณด๋‹ค ํ›จ์”ฌ ๊ฒฐ์ •์ ์ด์•ผ. ์—ญ์ „ํŒŒ๊ฐ€ ์—†์œผ๋‹ˆ atomicAdd๋„ ๊ฑฐ์˜ ์•ˆ ์“ฐ์ด๊ณ .

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—” ๋‹ฌ๋ผ์ ธ:
โ€ข ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ โ€” ๋‹ค๋ฅธ GEMM ์ปค๋„์ด ์„ ํƒ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋ฏธ์„ธํ•˜๊ฒŒ ๋‹ฌ๋ผ์ง
โ€ข ์ƒ์„ฑ ๋ชจ๋ธ์˜ ์ƒ˜ํ”Œ๋ง โ€” ์• ์ดˆ์— ํ™•๋ฅ ์ 
โ€ข ๋™์  ๋ฐฐ์นญ ์„œ๋ฒ„ โ€” ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ๋ฌถ์ด๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
โ€ข ๋‹ค๋ฅธ GPU์—์„œ ์‹คํ–‰ โ€” ์•„ํ‚คํ…์ฒ˜๋ณ„ ์ปค๋„์ด ๋‹ค๋ฆ„
โ€ข ์–‘์žํ™” ๋ชจ๋ธ โ€” ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ์ƒ์ด

Q4. CPU์—์„œ ๋Œ๋ฆฌ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€?

๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ผ๋ฉด ๋Œ€์ฒด๋กœ ๊ทธ๋ž˜. ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ BLAS(OpenBLAS, MKL)๋ฅผ ์“ฐ๋ฉด ์Šค๋ ˆ๋“œ ์ˆ˜์— ๋”ฐ๋ผ ํ•ฉ์‚ฐ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด.

torch.set_num_threads(1), OMP_NUM_THREADS=1๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฑฐ์˜ ์™„์ „ ๊ฒฐ์ •์ ์ด์•ผ. ๋Œ€์‹  ์—„์ฒญ ๋А๋ ค์ง€๊ฒ ์ง€๋งŒ.

Q5. ํ•™์Šต ์ค‘๊ฐ„์— ๋ฉˆ์ท„๋‹ค๊ฐ€ ์ฒดํฌํฌ์ธํŠธ์—์„œ ์žฌ๊ฐœํ•˜๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

์•ˆ ๋‚˜์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„! ์ฒดํฌํฌ์ธํŠธ์— ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉด, ์žฌ๊ฐœํ•  ๋•Œ ๋‚œ์ˆ˜ ์‹œํ€€์Šค๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋“ .

์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ์ €์žฅํ•ด์•ผ ํ•ด:

torch.save({
    'epoch': epoch, 'step': global_step,
    'model': model.state_dict(),
    'optimizer': optimizer.state_dict(),
    'scheduler': scheduler.state_dict(),
    'scaler': scaler.state_dict(),          # AMP ์‚ฌ์šฉ ์‹œ
    'torch_rng': torch.get_rng_state(),
    'cuda_rng': torch.cuda.get_rng_state_all(),
    'numpy_rng': np.random.get_state(),
    'python_rng': random.getstate(),
    'sampler_epoch': epoch,                  # DistributedSampler
}, path)

Q6. ์™„์ „ํ•œ ์žฌํ˜„์„ฑ์ด ์ •๋ง ํ•„์š”ํ• ๊นŒ?

์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ : ๊ทœ์ œ ๋Œ€์‘, ๋ฒ„๊ทธ ๋””๋ฒ„๊น…, ๋…ผ๋ฌธ ์ตœ์ข… ๊ฒฐ๊ณผ, ์˜๋ฃŒยท๊ธˆ์œต ๋ฐฐํฌ, ๋ณด์•ˆ ๊ฐ์‚ฌ
๋œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ : ์•„์ด๋””์–ด ํƒ์ƒ‰, ๋Œ€๊ทœ๋ชจ ์‚ฌ์ „ํ•™์Šต(์–ด์ฐจํ”ผ ํ•œ ๋ฒˆ๋งŒ ๋Œ๋ฆผ), ํ”„๋กœํ† ํƒ€์ดํ•‘

ํ˜„์‹ค์ ์œผ๋กœ๋Š” "๋น„ํŠธ ๋‹จ์œ„ ์žฌํ˜„"๋ณด๋‹ค "ํ†ต๊ณ„์  ์žฌํ˜„"์ด ๋” ์ค‘์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ์—ฌ๋Ÿฌ ์‹œ๋“œ์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์ข‹์œผ๋ฉด ๊ทธ๊ฒŒ ์ง„์งœ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ˆ๊นŒ.

Q7. ํŒŒ์ธํŠœ๋‹์ด ์œ ๋… ์‹œ๋“œ์— ๋ฏผ๊ฐํ•œ ์ด์œ ๋Š”?

๋ฐ์ดํ„ฐ๊ฐ€ ์ ๊ณ  ํ•™์Šต ์Šคํ…์ด ์งง๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ์‚ฌ์ „ํ•™์Šต์€ ์ˆ˜์‹ญ์–ต ํ† ํฐ์„ ๋ณด๋ฉด์„œ ๋…ธ์ด์ฆˆ๊ฐ€ ํ‰๊ท ํ™”๋˜์ง€๋งŒ, ํŒŒ์ธํŠœ๋‹์€ ์ˆ˜์ฒœ ์ƒ˜ํ”Œ์„ ๋ช‡ epoch๋งŒ ๋ณด๊ฑฐ๋“ . ๋…ธ์ด์ฆˆ๊ฐ€ ํ‰๊ท ํ™”๋  ์‹œ๊ฐ„์ด ์—†์–ด.

๊ฒŒ๋‹ค๊ฐ€ ๋ถ„๋ฅ˜ ํ—ค๋“œ๋Š” ๋žœ๋ค ์ดˆ๊ธฐํ™”๋กœ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ์ „์ฒด ๋ชจ๋ธ์˜ ํ•™์Šต ๊ถค์ ์— ํฐ ์˜ํ–ฅ์„ ์ค˜. ์™„ํ™” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” warmup ๋Š˜๋ฆฌ๊ธฐ, ํ•™์Šต๋ฅ  ๋‚ฎ์ถ”๊ธฐ, layer-wise learning rate decay, ์—ฌ๋Ÿฌ ์‹œ๋“œ ์•™์ƒ๋ธ” ๋“ฑ์ด ์žˆ์–ด.

Q8. ์–‘์žํ™”ํ•˜๋ฉด ๋น„๊ฒฐ์ •์„ฑ์ด ์ค„์–ด๋“ค๊นŒ?

ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ด๋„ค. ์ •์ˆ˜ ์—ฐ์‚ฐ์€ ๊ฒฐํ•ฉ๋ฒ•์น™์ด ์„ฑ๋ฆฝํ•˜๋‹ˆ๊นŒ ์—ฐ์‚ฐ ์ž์ฒด๋Š” ๋” ๊ฒฐ์ •์ ์ผ ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์–‘์žํ™” ๊ณผ์ •์—์„œ ์Šค์ผ€์ผ ๊ณ„์‚ฐ, ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…, ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ ์„ ํƒ ๋“ฑ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋“ค์ด ์ƒ๊ฒจ.

๊ทธ๋ฆฌ๊ณ  ์–‘์žํ™”๋Š” ์ •๋ฐ€๋„๋ฅผ ํฌ๊ฒŒ ๊นŽ๊ธฐ ๋•Œ๋ฌธ์—, ์›๋ž˜ ๋ฏธ์„ธํ–ˆ๋˜ ์ฐจ์ด๊ฐ€ ์–‘์žํ™” ๊ฒฝ๊ณ„์—์„œ ๋‹ค๋ฅธ ์ •์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋˜๋ฉด์„œ ์˜คํžˆ๋ ค ์ฐจ์ด๊ฐ€ ์ปค์งˆ ์ˆ˜๋„ ์žˆ์–ด.

๐ŸŽ ๋งˆ๋ฌด๋ฆฌ โ€” ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ๋“ค

ํ•œ ์žฅ์œผ๋กœ ๋ณด๋Š” ๋Œ€์‘ ์ „๋žต ํ†ต์ œํ•œ๋‹ค ์‹œ๋“œ 3์ข… ๊ณ ์ • cudnn.deterministic worker_init_fn ํ™˜๊ฒฝ ์ปจํ…Œ์ด๋„ˆํ™” RNG ์ƒํƒœ ์ฒดํฌํฌ์ธํŠธ CUBLAS_WORKSPACE โ†’ ๋น„ํŠธ ๋‹จ์œ„ ์žฌํ˜„ ๋ชฉํ‘œ ์ธก์ •ํ•œ๋‹ค ๋‹ค์ค‘ ์‹œ๋“œ ์‹คํ–‰ ํ‰๊ท  ยฑ ํ‘œ์ค€ํŽธ์ฐจ ์‹ ๋ขฐ๊ตฌ๊ฐ„ / ๊ฒ€์ • ์˜ˆ์ธก ๋ถˆ์ผ์น˜์œจ ์‹คํ—˜ ์ถ”์  ๋„๊ตฌ ์‹คํŒจ ์ผ€์ด์Šค ๊ธฐ๋ก โ†’ ํ†ต๊ณ„์  ์‹ ๋ขฐ ํ™•๋ณด ํ™œ์šฉํ•œ๋‹ค ๋”ฅ ์•™์ƒ๋ธ” ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ • SWA / ์Šค๋ƒ…์ƒท MC Dropout ๋žœ๋ค ์„œ์น˜ ์ฐจ๋“ฑ ํ”„๋ผ์ด๋ฒ„์‹œ โ†’ ๋žœ๋ค์„ ์ž์›์œผ๋กœ ํ†ต์ œ ยท ์ธก์ • ยท ํ™œ์šฉ โ€” ์„ธ ๋ฐ•์ž๊ฐ€ ๋งž์•„์•ผ ์ง„์งœ ์—”์ง€๋‹ˆ์–ด๋ง

ํ•ต์‹ฌ ์š”์•ฝ

1. ๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต์€ ์„ค๊ณ„์ƒ ํ™•๋ฅ ์ ์ด๋‹ค. ์ดˆ๊ธฐํ™”, ์…”ํ”Œ, ์ฆ๊ฐ•, ๋“œ๋กญ์•„์›ƒ โ€” ์ „๋ถ€ ์˜๋„๋œ ๋ฌด์ž‘์œ„๋‹ค.

2. ๊ทธ๋ณด๋‹ค ๋” ๊นŠ์€ ๊ณณ์— ๋ถ€๋™์†Œ์ˆ˜์  ๋น„๊ฒฐ์ •์„ฑ์ด ์žˆ๋‹ค. GPU ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์˜ ๋ง์…ˆ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

3. 1e-7์˜ ์ฐจ์ด๊ฐ€ ReLU, argmax ๊ฐ™์€ ์Šค์œ„์น˜ ์—ฐ์‚ฐ์„ ํ†ต๊ณผํ•˜๋ฉฐ ๊ฑฐ๋Œ€ํ•œ ์ฐจ์ด๋กœ ์ฆํญ๋œ๋‹ค.

4. ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ทน์†Œ์ ์— ๋„๋‹ฌํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„ ์„ฑ๋Šฅ์€ ๋น„์Šทํ•˜์ง€๋งŒ ํ–‰๋™์€ ๋‹ค๋ฅด๋‹ค.

5. ์™„์ „ ๊ฒฐ์ •๋ก ์€ ์†๋„๋ฅผ ํฌ์ƒํ•˜๋ฉด ์–ด๋А ์ •๋„ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ํ•˜๋“œ์›จ์–ด๊นŒ์ง€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

6. ์ง„์งœ ์ค‘์š”ํ•œ ๊ฑด ๋น„ํŠธ ๋‹จ์œ„ ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๋ผ "๊ฒฐ๋ก ์˜ ์žฌํ˜„"์ด๋‹ค. ์—ฌ๋Ÿฌ ์‹œ๋“œ๋กœ ๊ฒ€์ฆํ•˜๋ผ.

7. ๋ฌด์ž‘์œ„์„ฑ์€ ์•™์ƒ๋ธ”ยท๋ถˆํ™•์‹ค์„ฑ ์ถ”์ • ๋“ฑ์—์„œ ์˜คํžˆ๋ ค ์œ ์šฉํ•œ ์ž์›์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ

์ฒ˜์Œ ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ขŒ์ ˆํ•ด. "์ปดํ“จํ„ฐ๋Š” ๊ฒฐ์ •์ ์ด์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?" ํ•˜๋ฉด์„œ.

๊ทผ๋ฐ ์กฐ๊ธˆ ์ต์ˆ™ํ•ด์ง€๋ฉด ๊ด€์ ์ด ๋ฐ”๋€Œ์–ด. ์ด๊ฑด ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋”ฅ๋Ÿฌ๋‹์ด๋ผ๋Š” ์‹œ์Šคํ…œ์˜ ๋ณธ์งˆ์  ์„ฑ์งˆ์ด์•ผ. ๊ณ ์ฐจ์› ๋น„๋ณผ๋ก ์ตœ์ ํ™”๋ฅผ ํ™•๋ฅ ์  ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘ธ๋Š” ์ด์ƒ, ๊ทธ๋ฆฌ๊ณ  ์œ ํ•œ ์ •๋ฐ€๋„ ํ•˜๋“œ์›จ์–ด์—์„œ ์ˆ˜์ฒœ ๊ฐœ ์ฝ”์–ด๋ฅผ ๋ณ‘๋ ฌ๋กœ ๋Œ๋ฆฌ๋Š” ์ด์ƒ, ์–ด๋А ์ •๋„์˜ ๋น„๊ฒฐ์ •์„ฑ์€ ํ”ผํ•  ์ˆ˜ ์—†์–ด.

์ค‘์š”ํ•œ ๊ฑด ์ด ์„ฑ์งˆ์„ ์ดํ•ดํ•˜๊ณ , ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ํ†ต์ œํ•˜๊ณ , ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฑด ์ธก์ •ํ•ด์„œ ์ •์งํ•˜๊ฒŒ ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์ด์•ผ. ๊ทธ๊ฒŒ ์ง„์งœ ์—”์ง€๋‹ˆ์–ด๋ง์ด๊ณ  ์ง„์งœ ๊ณผํ•™์ด์ง€.

๋‹ค์Œ์— ๋ˆ„๊ฐ€ "๋‚ด ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ ๋‚˜์™€์š”" ํ•˜๊ณ  ๋ฌผ์–ด๋ณด๋ฉด, ์ด์ œ ๋‹น์‹ ์€ ์ฒด๊ณ„์ ์œผ๋กœ ๋‹ตํ•ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ์‹œ๋“œ๋Š” ๊ณ ์ •ํ–ˆ๋Š”์ง€, cudnn benchmark๋Š” ๊ป๋Š”์ง€, DataLoader worker ์‹œ๋“œ๋Š” ์žก์•˜๋Š”์ง€, GPU ๋ชจ๋ธ์€ ๊ฐ™์€์ง€, ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋Œ๋ ค๋ดค๋Š”์ง€...

๊ทธ ์งˆ๋ฌธ๋“ค ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€, ์‚ฌ์‹ค์€ ์ •๋ณด์ง€๋Šฅ๊ณตํ•™์ด "๊ณตํ•™"์ธ ์ด์œ ์•ผ. ๋ถˆํ™•์‹ค์„ฑ ์†์—์„œ๋„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ. ๊ทธ๊ฒŒ ์šฐ๋ฆฌ ์ผ์ด๋‹ˆ๊นŒ. ๐Ÿš€

๐Ÿ“š ๋” ํŒŒ๊ณ ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด
โ€ข Deep Ensembles (Lakshminarayanan et al., 2017) โ€” ์•™์ƒ๋ธ”์˜ ๊ณ ์ „
โ€ข Loss Surfaces, Mode Connectivity (Garipov et al., 2018) โ€” ์†์‹ค ์ง€ํ˜• ์ดํ•ด
โ€ข Fine-Tuning Pretrained Language Models: Weight Initializations, Data Orders, and Early Stopping (Dodge et al., 2020) โ€” ์‹œ๋“œ ๋ฏผ๊ฐ์„ฑ์˜ ์‹ค์ฆ
โ€ข Do ImageNet Classifiers Generalize to ImageNet? (Recht et al., 2019) โ€” ๋ฒค์น˜๋งˆํฌ ๊ณผ์ ํ•ฉ
โ€ข PyTorch ๊ณต์‹ Reproducibility ๋ฌธ์„œ โ€” ์‹ค๋ฌด ํ•„๋…
โ€ข NVIDIA Determinism in Deep Learning ์ž๋ฃŒ โ€” GPU ์ˆ˜์ค€ ์ƒ์„ธ

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๋‚ด์šฉ์„ ์‹ค๋ฌด ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ๋‚˜๋ˆ„๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋“ค โ€” ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ์ง€์‹ ๊ณต์œ  ํ”Œ๋žซํผ์„ ํฌํ•จํ•ด์„œ โ€” ์„ ๊พธ์ค€ํžˆ ๋‘˜๋Ÿฌ๋ณด๋Š” ๊ฒƒ๋„ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ.

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.