PyTorch Multi-GPU ์ œ๋Œ€๋กœ ํ•™์Šตํ•˜๊ธฐ

matthew l
matthew l
Mar 28 ยท 24 min read

PyTorch๋ฅผ ์‚ฌ๋ž‘ํ•˜๋Š” ๋‹น๊ทผ๋งˆ์ผ“ ๋จธ์‹ ๋Ÿฌ๋‹ ์—”์ง€๋‹ˆ์–ด Matthew ์ž…๋‹ˆ๋‹ค. PyTorch๋ฅผ ์‚ฌ์šฉํ•ด์„œ Multi-GPU ํ•™์Šต์„ ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํฌ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ๋๊นŒ์ง€ ๋‹ค ์ฝ๊ณ  ๋‚˜๋ฉด ๋‹ค์Œ nvidia-smi ์‚ฌ์ง„๊ณผ ๊ฐ™์ด 4๊ฐœ์˜ GPU๋ฅผ full๋กœ ๋ฉ‹์ง€๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜€

๋”ฅ๋Ÿฌ๋‹๊ณผ Multi-GPU ๐Ÿฅ•

๋”ฅ๋Ÿฌ๋‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ GPU ์—์„œ ํ•™์Šต์„ ํ•ฉ๋‹ˆ๋‹ค. Deep Neural Network๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งคํŠธ๋ฆญ์Šค ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— GPU๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ์ƒ๋‹นํžˆ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ ์  ๋„คํŠธ์›Œํฌ์˜ ํฌ๊ธฐ๋„ ์ปค์กŒ์Šต๋‹ˆ๋‹ค. ๋น„์ „ ๋ถ„์•ผ์—์„œ Neural Network๋ฅผ ๊นŠ๊ฒŒ ์Œ“๋Š” ๋ฐฉ์‹์ด ์„ฑ๊ณตํ•˜๋ฉด์„œ๋ถ€ํ„ฐ ๊ทธ ์ดํ›„์˜ ๋”ฅ๋Ÿฌ๋‹ ์—ฐ๊ตฌ์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ํฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์—์„œ๋ณด๋ฉด ResNet์ด 152๊ฐœ์˜ ์ธต์„ ์Œ“์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์ „ ๋ถ„์•ผ์—์„œ๋Š” ResNet ์ดํ›„๋กœ ๊พธ์ค€ํžˆ ํฐ ๋ฐ์ดํ„ฐ์…‹๊ณผ ํฐ ๋ชจ๋ธ๋กœ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ์—ฐ๊ตฌ๋ฅผ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€๋ฒผ์šด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋˜ NLP ๋ถ„์•ผ์—์„œ๋„ 2018๋…„ BERT๋ฅผ ๊ธฐ์ ์œผ๋กœ ํฐ ๋ฐ์ดํ„ฐ์…‹์— ํฐ ๋ชจ๋ธ๋กœ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌ๊ฐ€ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://icml.cc/2016/tutorials/icml2016_tutorial_deep_residual_networks_kaiminghe.pdf

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Nvidia์˜ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ GPU ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ฐœ์ธ์ด ์ง‘์ด๋‚˜ ์—ฐ๊ตฌ์‹ค์—์„œ ๋”ฅ๋Ÿฌ๋‹์œผ๋กœ ํ•™์Šต์„ ํ•  ๊ฒฝ์šฐ์— GTX 1080 TI ๊ฐ™์€ ๊ฒŒ์ž„์šฉ GPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ GPU์˜ ๊ฒฝ์šฐ ๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์šฉ์ด๋‚˜ ๋”ฅ๋Ÿฌ๋‹ ์—ฐ์‚ฐ์šฉ GPU์— ๋น„ํ•ด ๊ฐ€์„ฑ๋น„๊ฐ€ ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— GTX 1080 TI, TITAN XP์™€ ๊ฐ™์€ GPU ํ•˜๋‚˜๋กœ๋„ ๋”ฅ๋Ÿฌ๋‹์„ ํ•˜๋Š” ๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์—…์ด๋‚˜ ์—ฐ๊ตฌ์‹ค์—์„œ ํฐ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•ด ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ฌ ๊ฒฝ์šฐ์— ํ•˜๋‚˜์˜ GPU๋กœ๋Š” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ•œ์ •์ ์ž…๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์—์„œ batch size๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ GPU ํŠนํžˆ ๊ฒŒ์ž„์šฉ GPU๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 12G์ธ TITAN XP์—์„œ๋Š” BERT base model์„ batch size 30 ์ดํ•˜๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BERT ๋…ผ๋ฌธ์—์„œ batch size 256์œผ๋กœ ํ•™์Šต์‹œํ‚จ ๊ฒƒ๊ณผ๋Š” ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ multi-GPU ํ•™์Šต์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ GPU ์—์„œ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์ด ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์ง„ ์ถœ์ฒ˜: http://www.macvidcards.com/store/p97/Nvidia_GTX_1080_Ti_11_GB.html

๋ฉ€ํ‹ฐ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์›Œํฌ์Šคํ…Œ์ด์…˜์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹น๊ทผ๋งˆ์ผ“์—์„œ๋Š” 4 ๊ฐœ์˜ TITAN XP ๋กœ ์›Œํฌ์Šคํ…Œ์ด์…˜์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌ ์Šคํ…Œ์ด์…˜์—์„œ multi-GPU ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ–ˆ๋”๋ผ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ GPU๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ฐ GPU ๋งˆ๋‹ค memory ์‚ฌ์šฉ๋Ÿ‰์ด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•˜๋‚˜์˜ GPU๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šตํ•˜๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค ๊ทธ๋‹ฅ ํ•™์Šต์ด ๋นจ๋ผ์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด multi-GPU๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š”๋ฐ๊นŒ์ง€ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹ ์žฅ๋น„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šต์„ ํ•˜๋Š” ๊ฒƒ์€ ๊ณต์งœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ž์ฒด์ ์œผ๋กœ ์›Œํฌ ์Šคํ…Œ์ด์…˜์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ๋ฌด์‹ค์ด๋‚˜ ์—ฐ๊ตฌ์‹ค์—์„œ ํ•™์Šตํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ถ€๋‹ด์ด ๋œํ•˜๊ฒ ์ง€๋งŒ ํด๋ผ์šฐ๋“œ์—์„œ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ถ€๋‹ด์ด ํฝ๋‹ˆ๋‹ค. Multi-GPU๋กœ ํ•™์Šตํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ๋น„์šฉ์ด ๊ณ„์† ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ธ€์—์„œ๋Š” PyTorch์œผ๋กœ multi-GPU ํ•™์Šตํ•˜๋Š” ๋™์•ˆ ๊ฒช์€ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ง„ ์ถœ์ฒ˜: https://gathering.tweakers.net/forum/list_messages/1870709

PyTorch Data Parallel ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿฅ•

PyTorch์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ multi-gpu ํ•™์Šต์„ ์œ„ํ•œ Data Parallel์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Data Parallel์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ๋‹ค์Œ ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255

๋”ฅ๋Ÿฌ๋‹์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ GPU์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋‹จ ๋ชจ๋ธ์„ ๊ฐ GPU์— ๋ณต์‚ฌํ•ด์„œ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  iteration์„ ํ•  ๋•Œ๋งˆ๋‹ค batch๋ฅผ GPU์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์„ โ€˜scatterโ€™ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉฐ ์‹ค์ œ๋กœ Data Parallel์—์„œ scatter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์„ ๋‚˜๋ˆ„๊ณ  ๋‚˜๋ฉด ๊ฐ GPU์—์„œ forward ๊ณผ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋ชจ๋ธ์ด ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด๋ฉด ์ด์ œ ์ด ์ถœ๋ ฅ๋“ค์„ ํ•˜๋‚˜์˜ GPU๋กœ ๋ชจ์๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ tensor๋ฅผ ํ•˜๋‚˜์˜ device๋กœ ๋ชจ์œผ๋Š” ๊ฒƒ์€ โ€˜gatherโ€™ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต ๋”ฅ๋Ÿฌ๋‹์—์„œ๋Š” ๋ชจ๋ธ์˜ ์ถœ๋ ฅ๊ณผ ์ •๋‹ต์„ ๋น„๊ตํ•˜๋Š” loss function์ด ์žˆ์Šต๋‹ˆ๋‹ค. Loss function์„ ํ†ตํ•ด loss๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด back-propagation์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Back-propagation์€ ๊ฐ GPU์—์„œ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋กœ ๊ฐ GPU์— ์žˆ๋˜ ๋ชจ๋ธ์˜ gradient๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ 4๊ฐœ์˜ GPU๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 4๊ฐœ์˜ GPU์— ๊ฐ๊ฐ ๋ชจ๋ธ์ด ์žˆ๊ณ  ๊ฐ ๋ชจ๋ธ์€ ๊ณ„์‚ฐ๋œ gradient๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ GPU์— ์žˆ๋Š” gradient๋ฅผ ๋˜ ํ•˜๋‚˜์˜ GPU๋กœ ๋ชจ์•„์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Adam๊ณผ ๊ฐ™์€ optimizer๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด gradient๋กœ ๋ฐ”๋กœ ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ ์—ฐ์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Data Parallel ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ ํ•œ ์ค„๋กœ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

nn.DataParallel๋กœ model์„ ๊ฐ์‹ธ๋ฉด ํ•™์Šต์„ ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ replicate โ†’ scatter โ†’ parallel_apply โ†’ gather ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Gather๊ฐ€ ํ•˜๋‚˜์˜ gpu๋กœ ๊ฐ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ๋ชจ์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ gpu์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์„ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ DataParallel์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•™์Šต ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

PyTorch์˜ DataParallel ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๊น€์ค€์„ฑ๋‹˜์˜ BERT ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(๋งํฌ: https://github.com/codertimo/BERT-pytorch). BERT ๋…ผ๋ฌธ์˜ ๋ชจ๋ธ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ž‘์€ ์‚ฌ์ด์ฆˆ๋กœ multi GPU ํ•™์Šต์„ ํ…Œ์ŠคํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์— ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” sequence์˜ ๊ธธ์ด๋Š” 163, layer ์ˆ˜๋Š” 8์ธต, attention head์˜ ์ˆ˜ 8๊ฐœ ๊ทธ๋ฆฌ๊ณ  hidden unit์˜ ์ˆ˜๋Š” 256์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 0๋ฒˆ, 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ GPU๋ฅผ ์‚ฌ์šฉํ•ด์„œ multi-gpu ํ•™์Šต์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ์— nvidia-smi๋กœ GPU ์‚ฌ์šฉ ํ˜„ํ™ฉ์„ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด 0๋ฒˆ GPU๊ฐ€ 1, 2, 3๋ฒˆ GPU์— ๋น„ํ•ด 6G ์ •๋„ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ GPU๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด batch size๋ฅผ ๋งŽ์ด ํ‚ค์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์‹คํ—˜์„ ํ•  ๋•Œ๋Š” 200๊นŒ์ง€ batch size๋ฅผ ํ‚ค์šธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์—์„œ batch size๋Š” ํ•™์Šต ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ถˆ๊ท ํ˜•์€ ๊ผญ ํ•ด๊ฒฐํ•ด์•ผํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•™์Šต์„ ๋” ๋นจ๋ฆฌํ•˜๊ณ  ์‹ถ์–ด์„œ multi-GPU๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•™์Šต์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ batch size ์ฐจ์ด๋กœ 1์ฃผ์ผ์„ ๋” ํ•™์Šต์‹œ์ผœ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ์ œ์ผ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํžˆ ์ถœ๋ ฅ์„ ๋‹ค๋ฅธ GPU๋กœ ๋ชจ์œผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋””ํดํŠธ๋กœ ์„ค์ •๋˜์–ด์žˆ๋Š” GPU์˜ ๊ฒฝ์šฐ gradient ๋˜ํ•œ ํ•ด๋‹น GPU๋กœ ๋ชจ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ GPU์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ƒ๋‹นํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ์„ ๋‹ค๋ฅธ GPU๋กœ ๋ชจ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ์ฐจ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถœ๋ ฅ์„ ๋ชจ์œผ๊ณ  ์‹ถ์€ GPU ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

output_device๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‹ค์‹œ ํ•™์Šต์„ ์‹œ์ž‘ํ•˜๋ฉด GPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0๋ฒˆ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ค„๊ณ  1๋ฒˆ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋Š˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ท ํ˜•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ํฌ๊ธฐ๋Š” batch size์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด๋Œ€๋กœ batch size๋ฅผ ๋Š˜๋ฆฌ๋ฉด 1๋ฒˆ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ ์  ๋Š˜์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ๋ฒ•์€ ์ผ์‹œ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ณด์—ฌ๋„ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ GPU-Util์„ ๋ณด๋ฉด GPU๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Custom์œผ๋กœ DataParallel ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿฅ•

DataParallel์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํžŒํŠธ๋Š” PyTorch-Encoding์ด๋ผ๋Š” ํŒจํ‚ค์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€ ๋งํฌ: https://github.com/zhanghang1989/PyTorch-Encoding). ํ•˜๋‚˜์˜ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์€ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ํ•˜๋‚˜์˜ GPU๋กœ ๋ชจ์€ ๊ฒƒ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์™œ ํ•˜๋‚˜์˜ GPU๋กœ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ๋ชจ์„๊นŒ์š”? ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•ด์„œ loss function์„ ๊ณ„์‚ฐํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ DataParallel์„ ํ†ตํ•ด ๋ณ‘๋ ฌ๋กœ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์ง€๋งŒ loss function์ด ๊ทธ๋Œ€๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ GPU์—์„œ loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ loss function ๋˜ํ•œ ๋ณ‘๋ ฌ๋กœ ์—ฐ์‚ฐํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PyTorch-Encoding ์ค‘์—์„œ๋„ ๋‹ค์Œ ํŒŒ์ด์ฌ ์ฝ”๋“œ์— loss function์„ parallelํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

Loss function์„ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋ธ์„ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. PyTorch์—์„œ๋Š” loss function ๋˜ํ•œ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์„ ๊ฐ GPU์— replicate ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ •๋‹ต์— ํ•ด๋‹นํ•˜๋Š” tensor๋ฅผ ๊ฐ GPU๋กœ scatter ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด loss๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ, ์ •๋‹ต, loss function ๋ชจ๋‘ ๊ฐ GPU์—์„œ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๋€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ GPU์—์„œ loss ๊ฐ’์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ GPU์—์„œ๋Š” ๊ณ„์‚ฐํ•œ loss๋กœ ๋ฐ”๋กœ backward ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ ์ถœ์ฒ˜: https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255

Loss function์„ parallel ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์—ฐ์‚ฐํ•˜๋Š” ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ •๋‹ต์— ํ•ด๋‹นํ•˜๋Š” target์„ scatter ํ•œ ๋‹ค์Œ์— replicateํ•œ module์—์„œ ๊ฐ๊ฐ ๊ณ„์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์‚ฐํ•œ output์™€ Reduce.apply๋ฅผ ํ†ตํ•ด ๊ฐ GPU์—์„œ backward ์—ฐ์‚ฐ์„ ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.

DataParallelCriterion์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์— ์ผ๋ฐ˜์ ์ธ DataParallel๋กœ ๋ชจ๋ธ์„ ๊ฐ์‹ธ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. DataParallel์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ GPU๋กœ ์ถœ๋ ฅ์„ ๋ชจ์œผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Custom DataParallel ํด๋ž˜์Šค์ธ DataParallelModel์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. DataParallelModel๊ณผ DataParallelCriterion์„ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์€ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Pytorch-Encoding ํŒจํ‚ค์ง€์—์„œ parallel.py ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์™€์„œ ํ•™์Šต ์ฝ”๋“œ์—์„œ import ํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•™์Šต์„ ํ•  ๊ฒฝ์šฐ์— Nvidia-smi ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. batch size ๋Š” 200์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. DataParallel ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ์— ๋น„ํ•ด 1๋ฒˆ GPU์™€ 2๋ฒˆ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ์ฐจ์ด๊ฐ€ ์ƒ๋‹นํžˆ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. batch size๋ฅผ ๊ธฐ์กด์— ๋น„ํ•ด ๋Š˜๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•™์Šต ์‹œ๊ฐ„๋„ ์ „์ฒด์ ์œผ๋กœ 1/3 ์ •๋„๊ฐ€ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ GPU-Util์˜ ์ˆ˜์น˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด GPU ์„ฑ๋Šฅ์„ ์—ฌ์ „ํžˆ ์ œ๋Œ€๋กœ ํ™œ์šฉ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GPU ์„ฑ๋Šฅ์„ 100 %๋กœ ๋Œ์–ด ์˜ฌ๋ฆฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

PyTorch์—์„œ Distributed ํŒจํ‚ค์ง€ ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿฅ•

๋”ฅ๋Ÿฌ๋‹์„ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ๋ถ„์‚ฐ ํ•™์Šต์— ๋Œ€ํ•ด ๋“ค์–ด๋ณด์‹  ์ ์ด ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. DeepMind์—์„œ ์•ŒํŒŒ๊ณ ๋‚˜ ์•ŒํŒŒ์Šคํƒ€๋ฅผ ๋ฐœํ‘œํ•  ๋•Œ ์–ด๋–ค ์‹์œผ๋กœ ํ•™์Šต ํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ทœ๋ชจ๊ฐ€ ํฐ ๋ชจ๋ธ์„ ํ•™์Šตํ•  ๋•Œ๋Š” ๋ณดํ†ต ๋ถ„์‚ฐ ํ•™์Šต์„ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ง„ ์ถœ์ฒ˜: https://www.quantamagazine.org/is-alphago-really-such-a-big-deal-20160329/

๋ถ„์‚ฐ ํ•™์Šต ์ž์ฒด๋Š” ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ๋กœ ํ•™์Šตํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šตํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ multi-GPU ํ•™์Šต์„ ํ•  ๋•Œ๋„ ๋ถ„์‚ฐ ํ•™์Šต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ํ•™์Šต์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ PyTorch์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

PyTorch์—์„œ๋Š” DataParallel๊ณผ ํ•จ๊ป˜ ๋ถ„์‚ฐ ํ•™์Šต๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. PyTorch์—์„œ ๋ถ„์‚ฐ ํ•™์Šต์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์Œ PyTorch Tutorial์„ ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๋ถ„์‚ฐ ํ•™์Šต์„ ์‚ฌ์šฉํ•ด์„œ multi-GPU ํ•™์Šต์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด PyTorch์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” example์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋น„์ „ ๋ถ„์•ผ์—์„œ ํฐ ๋ฐ์ดํ„ฐ์…‹ ์ค‘์— ์œ ๋ช…ํ•œ ๊ฒƒ์ด ImageNet ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋งํฌ๊ฐ€ ImageNet์— ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ์ฝ”๋“œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ์—ฌ๋Ÿฌ ๋จธ์‹ ์—์„œ ๋ถ„์‚ฐ ํ•™์Šต์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋Š”๋ฐ ํ•˜๋‚˜์˜ ๋จธ์‹ ์—์„œ ์—ฌ๋Ÿฌ GPU ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

ImageNet ์˜ˆ์ œ์˜ main.py ์—์„œ multi-GPU์™€ ๊ด€๋ จ๋œ ์ฃผ์š” ๋ถ€๋ถ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. main.py๋ฅผ ์‹คํ–‰ํ•˜๋ฉด main์ด ์‹คํ–‰๋˜๋Š”๋ฐ main์€ ๋‹ค์‹œ main_worker ๋“ค์„ multi-processing์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. GPU 4๊ฐœ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณด๊ณ  world_size๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด mp.spawn ํ•จ์ˆ˜๊ฐ€ 4๊ฐœ์˜ GPU์—์„œ ๋”ฐ๋กœ ๋”ฐ๋กœ main_worker๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

main_worker์—์„œ dist.init_process_group์„ ํ†ตํ•ด ๊ฐ GPU ๋งˆ๋‹ค ๋ถ„์‚ฐ ํ•™์Šต์„ ์œ„ํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. PyTorch์˜ docs๋ฅผ ๋ณด๋ฉด multi-GPU ํ•™์Šต์„ ํ•  ๊ฒฝ์šฐ backend๋กœ nccl์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. init_method์—์„œ FREEPORT์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ port๋ฅผ ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„์‚ฐ ํ•™์Šต์„ ์œ„ํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ๋‚˜๋ฉด ๋ถ„์‚ฐ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 28๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด model์—๋Š” DataParallel ๋Œ€์‹ ์— DistributedDataParallel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DataParallel์—์„œ ์–ธ๊ธ‰ํ•œ ์ž…๋ ฅ์„ ๋ถ„์‚ฐํ•˜๊ณ  forward ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค์‹œ backward ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

DataLoader๊ฐ€ ์ž…๋ ฅ์„ ๊ฐ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ DistributedSampler๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. DistributedSampler๋Š” DistributedDataParallel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•ด๋†“์€ dataset๋ฅผ DistributedSampler๋กœ ๊ฐ์‹ธ์ฃผ๊ณ  DataLoader์—์„œ sampler์— ์ธ์ž๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์—” ํ‰์†Œ์— DataLoader๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ์ด ๋˜‘๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

DistributedSampler์˜ ๋‚ด๋ถ€๋ฅผ ์‚ด์ง ๋ณด์ž๋ฉด ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋งŽ์€ ๋ถ€๋ถ„์„ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ฐ Sampler๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ GPU์˜ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ์—์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹ ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ž์€ ๋‹ค์Œ์— ๊ทธ ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ๋ฅผ ์ชผ๊ฐœ์„œ ๊ฐ GPU Sampler์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. epoch ๋งˆ๋‹ค ๊ฐ GPU sampler์— ํ• ๋‹น๋˜๋Š” ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์‹œ ๋ฌด์ž‘์œ„๋กœ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” train_sampler.set_epoch(epoch) ๋ช…๋ น์–ด๋ฅผ ๋งค epoch ๋งˆ๋‹ค ํ•™์Šต ์ „์— ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PyTorch Distributed ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ BERT ์ž‘์€ ๋ชจ๋ธ์„ ํ•™์Šตํ•ด๋ดค์Šต๋‹ˆ๋‹ค. Nvidia-smi ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํ˜„ํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์™„์ „ ๋™์ผํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ GPU-Util์˜ ์ˆ˜์น˜๋„ 99%๋กœ ์ƒ๋‹นํžˆ ๋†’์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ์™”๋‹ค๋ฉด multi-GPU ํ•™์Šต์„ ์ œ๋Œ€๋กœ ํ•  ์ค€๋น„๊ฐ€ ๋์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Distibuted DataParallel์˜ ๊ฒฝ์šฐ ํ•™์Šต์„ ์‹œ์ž‘ํ•˜๋ ค ํ•  ๋•Œ ๊ฐ„๊ฐ„ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ github issue ๊ธ€์ด ์—ฌ๋Ÿฌ ๋ฌธ์ œ ์ค‘์— ํ•˜๋‚˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. BERT ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆด ๋•Œ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๋ชจ๋ธ์—์„œ ํ•™์Šต์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” parameter๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์— Distributed DataParallel์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ํ•™์Šต์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ Nvidia์—์„œ ๋งŒ๋“  Apex๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Nvidia Apex๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•™์Šตํ•˜๊ธฐ ๐Ÿฅ•

Nvidia์—์„œ Apex๋ผ๋Š” Mixed Precision ์—ฐ์‚ฐ์„ ์œ„ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ๋”ฅ๋Ÿฌ๋‹์€ 32 ๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ•˜๋Š”๋ฐ 16 ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ํ•™์Šต ์†๋„๋ฅผ ๋†’์ด๊ฒ ๋‹ค๋Š” ์˜๋„๋กœ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Apex์—๋Š” Mixed Precision ์—ฐ์‚ฐ ๊ธฐ๋Šฅ ๋ง๊ณ ๋„ Distributed ๊ด€๋ จ ๊ธฐ๋Šฅ์ด ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŠธ์—์„œ๋Š” Mixed Precision์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Apex์˜ Distributed DataParallel ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์ด DDP ์ž…๋‹ˆ๋‹ค. Apex์—์„œ ImageNet ํ•™์Šต์„ ์œ„ํ•ด ๋งŒ๋“  ์˜ˆ์ œ์— ๊ด€๋ จ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Apex ์‚ฌ์šฉ๋ฒ•์€ Docs์— ์ž˜ ๋‚˜์™€์žˆ์œผ๋‹ˆ ์‚ดํŽด๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ 2๋ฒˆ ์ค„์—์„œ ๋ณด๋“ฏ์ด apex์—์„œ DistributedDataParallel์„ import ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ„ PyTorch ๊ณต์‹ ์˜ˆ์ œ์—์„œ์™€๋Š” ๋‹ฌ๋ฆฌ ์ฝ”๋“œ ๋‚ด์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 19 ์ค„์—์„œ ๋ณด๋“ฏ์ด DDP๋กœ model์„ ๊ฐ์‹ธ์ค๋‹ˆ๋‹ค. ๊ทธ ์ด์™ธ์—๋Š” PyTorch DistributedDataParallel๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Torch.distributed.launch๋ฅผ ํ†ตํ•ด main.py๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๋…ธ๋“œ์—์„œ 4๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ์•„๊ฐ€๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” GPU ํ•˜๋‚˜์—์„œ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ GPU๊ฐ€ 2๊ฐœ๋ผ๋ฉด nproc_per_node๋ฅผ 2๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. main.py์— batch_size์™€ num_worker๋ฅผ ์„ค์ •ํ•˜๋Š”๋ฐ ๊ฐ GPU ๋งˆ๋‹ค์˜ batch_size์™€ worker ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. batch size๊ฐ€ 60์ด๊ณ  worker์˜ ์ˆ˜๊ฐ€ 2๋ผ๋ฉด ์ „์ฒด์ ์œผ๋กœ๋Š” batch size๊ฐ€ 240์ด๋ฉฐ worker์˜ ์ˆ˜๋Š” 8์ž…๋‹ˆ๋‹ค.

Nvidia Apex๋ฅผ ์‚ฌ์šฉํ•ด์„œ multi-GPU ํ•™์Šต์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. GPU ์‚ฌ์šฉ ํ˜„ํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ชจ๋“  GPU์—์„œ ์ผ์ •ํ•ฉ๋‹ˆ๋‹ค.(3๋ฒˆ GPU๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ด ํ• ๋‹น๋ฐ›๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žกํ˜€์žˆ์Šต๋‹ˆ๋‹ค). GPU-Util์„ ๋ณด๋ฉด 99% ์•„๋‹ˆ๋ฉด 100 %์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Multi-GPU ํ•™์Šต ๋ฐฉ๋ฒ• ์„ ํƒํ•˜๊ธฐ ๐Ÿฅ•

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ PyTorch๋กœ multi-GPU ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

DataParallel์€ PyTorch์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. Custom DataParallel์˜ ๊ฒฝ์šฐ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ•ด์ฃผ์ง€๋งŒ GPU๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Distributed DataParallel์€ ์›๋ž˜ ๋ถ„์‚ฐํ•™์Šต์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ PyTorch์˜ ๊ธฐ๋Šฅ์ด์ง€๋งŒ multi-GPU ํ•™์Šต์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ์™€ GPU๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„๊ฐ„ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Nvidia์—์„œ ๋งŒ๋“  Apex๋ฅผ ์ด์šฉํ•ด์„œ multi-GPU ํ•™์Šตํ•˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Apex๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์ข‹์„๊นŒ์š”? ์ œ๊ฐ€ ์‚ดํŽด๋ณธ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์ด ๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต์„ ํ•  ๋•Œ ํ•ญ์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜๋ฅผ ํ•™์Šตํ•œ๋‹ค๋ฉด DataParallel ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BERT์—์„œ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ด์œ ๋Š” ๋ชจ๋ธ ์ถœ๋ ฅ์ด ์ƒ๋‹นํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ step๋งˆ๋‹ค word์˜ ๊ฐœ์ˆ˜๋งŒํผ์ด ์ถœ๋ ฅ์œผ๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜์˜ ๊ฒฝ์šฐ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ํด ์ˆ˜๋Š” ์žˆ์–ด๋„ ๋ชจ๋ธ ์ถœ๋ ฅ์€ ๊ทธ๋ ‡๊ฒŒ ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜•์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด CIFAR-10์— PyramidNet์„ ํ•™์Šตํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ํ•™์Šต์— ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ๋งํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. CIFAR-10์€ 10๊ฐœ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ฐ€์ง„ 32x32์˜ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ์…‹ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ PyramidNet์€ CIFAR-10 ์—์„œ ์ตœ๊ทผ๊นŒ์ง€ ๊ฐ€์žฅ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ƒˆ๋˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. PyramidNet์€ ๋ชจ๋ธ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Multi-GPU์—์„œ ํ•™์Šต ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋ ค๋ฉด ์‚ฌ์ด์ฆˆ๊ฐ€ ํฐ ๋ชจ๋ธ์„ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฉ”ํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 24,253,410์ธ ๋ชจ๋ธ์„ ์‹คํ—˜์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ์—์„œ PyramidNet(alpha=270)์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ํ•™์Šต์—๋Š” K80 4๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://github.com/dyhan0920/PyramidNet-PyTorch

PyramidNet Single GPU (batch size: 240)

์šฐ์„  Single GPU๋กœ PyramidNet์„ ํ•™์Šต์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ GPU๋งŒ ์‚ฌ์šฉํ•˜๋ฉด batch size๊ฐ€ 240 ์ •๋„๊ฐ€ ๊ฐ€์žฅ ํฌ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค.

Batch size 240์œผ๋กœ ํ•™์Šต์„ ํ•  ๊ฒฝ์šฐ์— ํ•˜๋‚˜์˜ batch๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ 6~7์ดˆ ์ •๋„๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด ํ•™์Šต์‹œ๊ฐ„(1 epoch์„ train ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„)์€ 22๋ถ„ ์ •๋„๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

PyramidNet DataParallel (batch size: 768)

PyTorch์˜ ๊ธฐ๋ณธ์ ์€ DataParallel ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์„œ PyramidNet์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. Batch size๋Š” 768 ์ •๋„๊นŒ์ง€ ํ‚ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ํ•˜๋‚˜์˜ GPU๋งŒ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ์ƒ๋‹นํžˆ ํฐ batch size๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด DataParallel ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•ด๋„ ๋ชจ๋“  GPU์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ BERT์˜ ๊ฒฝ์šฐ Adam์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ PyramidNet์—์„œ๋Š” ์ผ๋ฐ˜ SGD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”๋”์šฑ ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ์‹œ๊ฐ„์€ ์›๋ž˜ 22๋ถ„์—์„œ 5๋ถ„ ์ •๋„๋กœ ํ™• ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ batch size๊ฐ€ 768์ด ๋์Œ์—๋„ batch time์ด ์˜คํžˆ๋ ค 6์ดˆ์—์„œ 5์ดˆ๋กœ ๋นจ๋ผ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Image Classification ์„ ํ•™์Šตํ•  ๋•Œ๋Š” DataParallel ๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋” ํฐ batch size๋กœ ํ•™์Šตํ•˜๊ฑฐ๋‚˜ ๋” ๋น ๋ฅด๊ฒŒ ํ•™์Šตํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ(ImageNet ๊ฐ™์€ ๋ฐ์ดํ„ฐ์…‹์˜ ๊ฒฝ์šฐ ํ•™์Šต์ด ํ›จ์”ฌ ์˜ค๋ž˜๊ฑธ๋ฆฝ๋‹ˆ๋‹ค) Distributed ํ•™์Šต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ด ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์—์„œ multi-GPU ํ•™์Šต์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ์—์„œ ํ•™์Šต์„ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•™์Šต์‹œํ‚ค๋Š” ๋ชจ๋ธ์— ๋”ฐ๋ผ ๋˜ํ•œ optimizer์— ๋”ฐ๋ผ multi-GPU ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ „ ๋ถ„์•ผ๋ณด๋‹ค๋Š” ์ž์—ฐ์–ด์ฒ˜๋ฆฌ ๋ถ„์•ผ์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ๋งˆ์น˜๋ฉฐ

๋”ฅ๋Ÿฌ๋‹์€ ๋…ผ๋ฌธ์„ ์ฝ๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ํž˜๋“  ์ผ์ธ๋ฐ ์ด๋ ‡๊ฒŒ ์ž์›์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด๊ฐ€๋Š” ๋…ธ๋ ฅ๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹ ๊ด€๋ จ ๋…ผ๋ฌธ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋‚˜ ๋…ผ๋ฌธ์˜ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž๋ฃŒ๋Š” ๋งŽ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์ œ๋Œ€๋กœ ์ž์›์„ ํ™œ์šฉํ•ด์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ž๋ฃŒ๋Š” ๋ณ„๋กœ ์—†์–ด์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PyTorch๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋”ฅ๋Ÿฌ๋‹์„ ํ•˜์‹œ๋Š” ๋ถ„๋“ค๊ป˜ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

๋‹น๊ทผ๋งˆ์ผ“ ํŒ€๋ธ”๋กœ๊ทธ

๋‹น๊ทผ๋งˆ์ผ“์€ ๋™๋„ค ์ด์›ƒ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋„์™€ ๋”ฐ๋œปํ•˜๊ณ  ํ™œ๋ฐœํ•œ ๊ต๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ง€์—ญ ์‚ฌํšŒ๋ฅผ ๊ฟˆ๊พธ๊ณ  ์žˆ์–ด์š”.

matthew l

Written by

matthew l

๋‹น๊ทผ๋งˆ์ผ“ ํŒ€๋ธ”๋กœ๊ทธ

๋‹น๊ทผ๋งˆ์ผ“์€ ๋™๋„ค ์ด์›ƒ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋„์™€ ๋”ฐ๋œปํ•˜๊ณ  ํ™œ๋ฐœํ•œ ๊ต๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ง€์—ญ ์‚ฌํšŒ๋ฅผ ๊ฟˆ๊พธ๊ณ  ์žˆ์–ด์š”.