ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
How ๐Ÿค— Accelerate runs very large models thanks to PyTorch
Hugging Face BlogHugging Face Blog
Backend

Hugging Face๊ฐ€ PyTorch์˜ meta device์™€ ๋™์  ๊ฐ€์ค‘์น˜ ๋กœ๋”ฉ์œผ๋กœ 176์–ต ๊ฐœ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋ธ์„ Colab ๋ฌด๋ฃŒ ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„

How ๐Ÿค— Accelerate runs very large models thanks to PyTorch

2022๋…„ 9์›” 27์ผ9๋ถ„intermediate

Context

๊ธฐ์กด PyTorch ๋ชจ๋ธ ๋กœ๋”ฉ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ชจ๋ธ ์ƒ์„ฑ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋กœ๋“œ โ†’ ๊ฐ€์ค‘์น˜ ์ฃผ์ž… โ†’ ๋””๋ฐ”์ด์Šค ์ด๋™์˜ ์ˆœ์ฐจ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. 6.7B ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋ธ(OPT-6.7B)์€ float32 ๊ธฐ๋ณธ ์ •๋ฐ€๋„์—์„œ 26.8GB RAM์ด ํ•„์š”ํ•˜๊ณ , 176B ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋ธ(BLOOM, OPT-176B)์€ 1.4TB CPU RAM์ด ํ•„์š”ํ•ด ์ผ๋ฐ˜ ์†Œ๋น„์ž ํ•˜๋“œ์›จ์–ด์—์„œ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.

Technical Solution

  • PyTorch 1.9์˜ meta device๋ฅผ ํ™œ์šฉํ•œ ๋นˆ ๋ชจ๋ธ ์ƒ์„ฑ: ์‹ค์ œ ๋ฐ์ดํ„ฐ ์—†์ด ํ…์„œ์˜ ํ˜•ํƒœ(shape)๋งŒ ๊ฐ€์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—†์ด ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • init_empty_weights() ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ € ๊ฐœ๋ฐœ: ๊ธฐ์กด Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 150๊ฐœ ๋ชจ๋ธ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋นˆ ๋ชจ๋ธ ์ž๋™ ์ƒ์„ฑ
  • ๋ฉ”ํƒ€ ๋””๋ฐ”์ด์Šค์˜ ํ˜•ํƒœ ์ •๋ณด๋กœ device_map ์ž๋™ ๊ณ„์‚ฐ: ๊ฐ ๊ฐ€์ค‘์น˜์˜ ํ˜•ํƒœ์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋Ÿ‰ ์‚ฌ์ „ ๊ณ„์‚ฐ ํ›„ CPU/GPU/๋””์Šคํฌ ๋ฐฐ์น˜ ๊ฒฐ์ •
  • offload_folder์™€ offload_state_dict ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ๋””์Šคํฌ ์˜คํ”„๋กœ๋”ฉ: ๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ณ  ํ•„์š”์‹œ์—๋งŒ ๋กœ๋“œ
  • dispatch_model ํ•จ์ˆ˜์˜ forward ์ „/ํ›„ ํ›…(hook) ์ถ”๊ฐ€: ๊ฐ ๋ชจ๋“ˆ ์‹คํ–‰ ์ „์— ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ™์€ ๋””๋ฐ”์ด์Šค๋กœ ์ด๋™, ์‹คํ–‰ ํ›„ CPU/๋””์Šคํฌ๋กœ ๋ณต์›

Impact

์•„ํ‹ฐํด์—์„œ ์ •๋Ÿ‰์  ์„ฑ๋Šฅ ์ง€ํ‘œ(์†๋„ ๊ฐœ์„ , ๋ฉ”๋ชจ๋ฆฌ ์ ˆ๊ฐ %)๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์Œ.

Key Takeaway

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


๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์„ ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค ํ™˜๊ฒฝ(Colab, ๊ฐœ์ธ GPU)์—์„œ ์ถ”๋ก ํ•ด์•ผ ํ•  ๋•Œ, PyTorch์˜ meta device๋กœ ๋ชจ๋ธ ํ˜•ํƒœ๋งŒ ๋จผ์ € ํŒŒ์•…ํ•˜๊ณ  device_map์œผ๋กœ ๊ฐ ๋ ˆ์ด์–ด์˜ ๋ฐฐ์น˜๋ฅผ ์‚ฌ์ „ ๊ฒฐ์ •ํ•œ ํ›„, ๋™์  ํ›…์„ ํ†ตํ•ด ํฌ์›Œ๋“œ ํŒจ์Šค ์ง์ „์—๋งŒ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์—๋Ÿฌ ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ฌธ ์ฝ๊ธฐ