Ver4.0 ๐ฒ ๊ฐ์ ๋ฐ์ดํฐ, ๊ฐ์ ์ฝ๋์ธ๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค๊ณ ? ๋ฅ๋ฌ๋ ๋น๊ฒฐ์ ์ฑ(Non-determinism)์ ๋ชจ๋ ๊ฒ ๐ง

๐ฒ ๊ฐ์ ๋ฐ์ดํฐ, ๊ฐ์ ์ฝ๋์ธ๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค๊ณ ? ๋ฅ๋ฌ๋ ๋น๊ฒฐ์ ์ฑ(Non-determinism)์ ๋ชจ๋ ๊ฒ ๐ง
"๋ด ์ปดํจํฐ์์ 92%์๋๋ฐ ์ ๋ค ์ปดํจํฐ์์ 89%์ผ?"
์ด ํ ๋ฌธ์ฅ์์ ์์๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ฐค์ ๋๋ฒ๊น
์ด์ผ๊ธฐ
โ ๋ค์ด๊ฐ๋ฉฐ : "๋ถ๋ช ํ ๋๊ฐ์ด ๋๋ ธ๋๋ฐ์?"
์, ์ปคํผ ํ ์ ๋ค๊ณ ํธํ๊ฒ ์์๋ด. ์ค๋ ์ฐ๋ฆฌ๊ฐ ํ ๋ฏธ์คํฐ๋ฆฌ๋ ์ด๊ฑฐ์ผ.
"๋์ผํ ๋ฐ์ดํฐ์ , ๋์ผํ ์ฝ๋, ๋์ผํ ํ์ดํผํ๋ผ๋ฏธํฐ๋ก ํ์ต์์ผฐ๋๋ฐ ์ ๋งค๋ฒ ๋ค๋ฅธ ๋ชจ๋ธ์ด ๋์ฌ๊น?"
์ด๊ฑฐ ์ง์ง ํํ ์ผ์ด์ผ. ๋ ผ๋ฌธ ์ฌํํ๋ ค๊ณ GitHub ์ฝ๋ ๊ทธ๋๋ก ํด๋ก ํด์ ๋๋ ธ๋๋ฐ, ๋ ผ๋ฌธ์ ์ ํ 94.3%๊ฐ ์ ๋์ค๊ณ 92.1%๊ฐ ๋์. ๊ทธ๋์ "์ ๋ด๊ฐ ๋ญ ์๋ชปํ๋?" ํ๊ณ ๋ฐค์ ์ฝ๋๋ฅผ ๋ฏ์ด๋ด. ๊ทผ๋ฐ ์ฌ์ค์... ๋๋ ์๋ฌด๊ฒ๋ ์๋ชปํ์ง ์์์ ์๋ ์์ด.
๋ฅ๋ฌ๋ ํ์ต์ ๋ณธ์ง์ ์ผ๋ก ํ๋ฅ ์ (stochastic) ํ๋ก์ธ์ค์ผ. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ํ๋์จ์ด์ ๋ณ๋ ฌ ์ฐ์ฐ์ ๋ฌผ๋ฆฌ์ ์ ์ฝ์ด ์นํ ์์ง. ์ด ๋์ด ํฉ์ณ์ง๋ฉด, "๋์ผํ ์ ๋ ฅ โ ๋์ผํ ์ถ๋ ฅ"์ด๋ผ๋ ์ฐ๋ฆฌ๊ฐ ์ปดํจํฐ์ ๋ํด ๊ฐ๊ณ ์๋ ์์์ด ์ฌ์ฉ ๋ฌด๋์ ธ.
๐ก ๋ฏธ๋ฆฌ ์คํฌ์ผ๋ฌ: ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ์ด์ ๋ ํฌ๊ฒ ๋ ๊ฐ๋์ผ.
โ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด์์์ฑ โ ์ด๊ธฐํ, ์
ํ, ๋๋กญ์์ ๊ฐ์ "์ผ๋ถ๋ฌ ๋ฃ์ ๋๋ค"
โก ๊ตฌํ์ ๋น๊ฒฐ์ ์ฑ โ ๋ถ๋์์์ ๋ง์
์์, GPU ๋ณ๋ ฌ ์ค๋ ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๊ฐ์ "์จ์ด์๋ ๋๋ค"
โ ์ ์๋๋ก ์กํ์ง๋ง, โก๋ ์๋๋ก๋ ์ ์กํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์. ์ด๊ฒ ํต์ฌ์ด์ผ.
์ด ๊ธ์์๋ ์ ๋ณด์ง๋ฅ๊ณตํ ๊ด์ ์์ ์ด ํ์์ ํ๋ํ๋ ํด๋ถํด๋ณผ ๊ฑฐ์ผ. ์์์ ์ต์ํ์ผ๋ก, ๋์ "์ ๊ทธ๋์ ๊ทธ๋ฐ ๊ฑฐ์๊ตฌ๋!" ํ๋ ์๊ฐ์ ์ต๋ํ ๋ง์ด ๋ง๋ค์ด๋ณผ๊ฒ.
๐บ๏ธ ์ ์ฒด ์ง๋ ๋จผ์ ๋ณด๊ธฐ
๋ณต์กํ ์๊ธฐ ํ๊ธฐ ์ ์ ํฐ ๊ทธ๋ฆผ๋ถํฐ. ๋ชจ๋ธ ํ๋๊ฐ ๋ง๋ค์ด์ง๊ธฐ๊น์ง ๋ฌด์์์ฑ์ด ๋ผ์ด๋๋ ์ง์ ์ด ์ด๋ ๊ฒ ๋ง์.
๋ดค์ง? ๋ฌด๋ ค 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)์ด๋ผ๊ณ ํด. ๊ทธ๋ฌ๋ ์ด๋ค ์์๋ก ๋ํ๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฑฐ์ง.
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๋นํธ๋ก ๊น์์ ๊ณ์ฐํด. ํ ์ ์ฝ์ด๋ฅผ ํ์ฉํด ํจ์ฌ ๋น ๋ฅด์ง๋ง, ์ ๋ฐ๋๋ ๋ฎ์์ง์ง.
| ํฌ๋งท | ์ง์ ๋นํธ | ๊ฐ์ ๋นํธ | ํน์ง |
|---|---|---|---|
| FP32 | 8 | 23 | ํ์ค ๋จ์ ๋ฐ๋, ์ ํจ์ซ์ ~7์๋ฆฌ |
| TF32 | 8 | 10 | FP32 ๋ฒ์ + FP16 ์ ๋ฐ๋. Ampere ๊ธฐ๋ณธ |
| FP16 | 5 | 10 | ๋ฒ์ ์ข์ overflow ์ํ, ์ค์ผ์ผ๋ง ํ์ |
| BF16 | 8 | 7 | FP32์ ๊ฐ์ ๋ฒ์, ์์ ์ . LLM ํ์ต ํ์ค |
| FP8 (E4M3/E5M2) | 4/5 | 3/2 | Hopper ์ดํ, ์ด๊ฑฐ๋ ๋ชจ๋ธ ๊ฐ์์ฉ |
ํผํฉ ์ ๋ฐ๋(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)๊ณ , ์ด๋ฐ ์์คํ ์ ์ข ์ข ์ด๊ธฐ ์กฐ๊ฑด์ ๋ฏผ๊ฐํด.
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%p | atomicAdd ์ํฅ ํผ |
ํนํ 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 / cuDNN | Docker ์ด๋ฏธ์ง ํ๊ทธ ๊ณ ์ (latest ๊ธ์ง!) |
| GPU ๋๋ผ์ด๋ฒ | ๋ฒ์ ๊ธฐ๋ก (nvidia-smi ์ถ๋ ฅ ์ ์ฅ) |
| GPU ์ํคํ ์ฒ | V100 vs A100 vs H100 ๊ฒฐ๊ณผ ๋ค๋ฆ โ ๋ช ์ |
| GPU ๊ฐ์ / ๋ถ์ฐ ์ค์ | world_size, ๋ฐฐ์น ํฌ๊ธฐ, gradient accumulation |
| ๋ฐ์ดํฐ ๋ฒ์ | DVC, ํด์๊ฐ ๊ธฐ๋ก, ์ ์ฒ๋ฆฌ ์คํฌ๋ฆฝํธ ์ปค๋ฐ |
| ์คํ ๋ฉํ๋ฐ์ดํฐ | MLflow, Weights&Biases, Neptune ๋ฑ |
โ
๊ณจ๋ ๋ฃฐ : "์ฌํ ๊ฐ๋ฅํ ์คํ = ์ฝ๋ + ๋ฐ์ดํฐ + ํ๊ฒฝ + ์๋ + ํ๋์จ์ด"
์ด ๋ค์ฏ ๊ฐ ์ค ํ๋๋ผ๋ ๋น ์ง๋ฉด ์์ ์ฌํ์ ๋ถ๊ฐ๋ฅํด.
5-4. ๊ฒฐ์ ๋ก ์ ๋๊ฐ โ ์ผ๋ง๋ ๋๋ ค์ง๋?
๊ณต์ง๋ ์์ด. ๊ฒฐ์ ๋ก ๋ชจ๋๋ฅผ ์ผ๋ฉด ๋๋ต ์ด๋ฐ ๋น์ฉ์ ์น๋ฌ.
| ์ค์ | ์๋ ์ํฅ | ์ธ์ ์ธ๊น |
|---|---|---|
cudnn.benchmark=False | 5~20% ๋๋ ค์ง | ์ฌํ ํ์ํ ๋ชจ๋ ์คํ |
cudnn.deterministic=True | 10~30% ๋๋ ค์ง | ๋ ผ๋ฌธ ๊ฒฐ๊ณผ ์ ์ถ์ฉ |
| TF32 ๋นํ์ฑํ | Ampere+ ์์ ์ต๋ 2~3๋ฐฐ ๋๋ ค์ง | ์์น ๋ฏผ๊ฐํ ์ฐ๊ตฌ |
use_deterministic_algorithms | ์ฐ์ฐ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๋ฆ | ๋๋ฒ๊น , ์ต์ข ๊ฒ์ฆ |
| AMP ๋นํ์ฑํ | 1.5~2๋ฐฐ ๋๋ ค์ง + ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ | ์ ๋ฐ๋ ์ผ๊ด์ฑ ํ์ ์ |
๊ทธ๋์ ํ์ค์ ์ธ ์ ๋ต์ ์ด๊ฑฐ์ผ:
๐ฏ ๋จ๊ณ๋ณ ์ ๋ต
ํ์ ๋จ๊ณ โ ๊ฒฐ์ ๋ก ๋ค ๋๊ณ ์ต๋ ์๋๋ก. ์ด์ฐจํผ ์์ด๋์ด ๊ฒ์ฆ ์ค์ด๋๊น.
๋น๊ต ๋จ๊ณ โ ์๋๋ง ๊ณ ์ ํ๊ณ ์ฌ๋ฌ ์๋๋ก ๋ฐ๋ณต. ํ๊ท ยฑํ์คํธ์ฐจ๋ก ๋น๊ต.
์ต์ข
๊ฒ์ฆ โ ์์ ๊ฒฐ์ ๋ก ๋ชจ๋๋ก ์ฌํ ํ์ธ. ์ฒดํฌํฌ์ธํธ์ ํ๊ฒฝ ์ ์ฒด ์์นด์ด๋น.
๋ฐฐํฌ โ ์ถ๋ก ์์๋ ๋๋ถ๋ถ ๊ฒฐ์ ์ ์ด์ง๋ง, ์ํ๋ง ๊ธฐ๋ฐ ์์ฑ ๋ชจ๋ธ์ ๋ณ๋ ๊ด๋ฆฌ.
๐งฉ 6์ฅ. ๋น๊ฒฐ์ ์ฑ์ '๋ฌธ์ '๊ฐ ์๋๋ผ '์์'์ผ๋ก ์ฐ๊ธฐ
์ฌ๊ธฐ๊น์ง ์ฝ์ผ๋ฉด "๋น๊ฒฐ์ ์ฑ = ๋์ ๊ฒ"์ฒ๋ผ ๋๊ปด์ง์ง? ๊ทผ๋ฐ ๋ฐ์ ์ด ์์ด. ์ด ๋ฌด์์์ฑ ๋๋ถ์ ๋ฅ๋ฌ๋์ด ์ ๋๋ ์ธก๋ฉด๋ ์๊ณ , ์ฌ์ง์ด ์ด๊ฑธ ์ ๊ทน ํ์ฉํ๋ ๊ธฐ๋ฒ๋ค๋ ๋ง์.
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. ์์ํํ๋ฉด ๋น๊ฒฐ์ ์ฑ์ด ์ค์ด๋ค๊น?
ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ด๋ค. ์ ์ ์ฐ์ฐ์ ๊ฒฐํฉ๋ฒ์น์ด ์ฑ๋ฆฝํ๋๊น ์ฐ์ฐ ์์ฒด๋ ๋ ๊ฒฐ์ ์ ์ผ ์ ์์ด. ํ์ง๋ง ์์ํ ๊ณผ์ ์์ ์ค์ผ์ผ ๊ณ์ฐ, ๋ฐ์ฌ๋ฆผ ์ ์ฑ
, ์บ๋ฆฌ๋ธ๋ ์ด์
๋ฐ์ดํฐ ์ ํ ๋ฑ ์๋ก์ด ๋ณ์๋ค์ด ์๊ฒจ.
๊ทธ๋ฆฌ๊ณ ์์ํ๋ ์ ๋ฐ๋๋ฅผ ํฌ๊ฒ ๊น๊ธฐ ๋๋ฌธ์, ์๋ ๋ฏธ์ธํ๋ ์ฐจ์ด๊ฐ ์์ํ ๊ฒฝ๊ณ์์ ๋ค๋ฅธ ์ ์๋ก ๋ฐ์ฌ๋ฆผ๋๋ฉด์ ์คํ๋ ค ์ฐจ์ด๊ฐ ์ปค์ง ์๋ ์์ด.
๐ ๋ง๋ฌด๋ฆฌ โ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๊ฒ๋ค
ํต์ฌ ์์ฝ
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
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.