์๊ฐ || ๋ถ์ฐ ๋ฐ์ดํฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ (DDP) ๋ ๋ฌด์์ธ๊ฐ? || ๋จ์ผ ๋ ธ๋ ๋ค์ค-GPU ํ์ต || ๊ฒฐํจ ๋ด์ฑ || ๋ค์ค ๋ ธ๋ (Multinode) ํ์ต || minGPT ํ์ต
์ ์: Suraj Subramanian ๋ฒ์ญ: ๋ฐ์ง์
.. grid:: 2 .. grid-item-card:: :octicon:`mortar-board;1em;` ์ด ์ฅ์์ ๋ฐฐ์ฐ๋ ๊ฒ - ``torchrun`` ์ผ๋ก ๋ฉํฐ๋ ธ๋ ํ์ต ์์ํ๊ธฐ - ์ฑ๊ธ๋ ธ๋์์ ๋ฉํฐ๋ ธ๋ ํ์ต์ผ๋ก ์ฎ๊ธฐ๊ธฐ ์ํ ์ฝ๋ ๋ณ๊ฒฝ (๋ฐ ์ผ๋์ ๋์ด์ผ ํ๋ ๊ฒ๋ค) .. grid:: 1 .. grid-item:: :octicon:`code-square;1.0em;` ์ด ํํ ๋ฆฌ์ผ์ ์ฌ์ฉ๋ ์ฝ๋ ์ฐธ๊ณ - `GitHub <https://github.com/pytorch/examples/blob/main/distributed/ddp-tutorial-series/multinode.py>`__ .. grid-item-card:: :octicon:`list-unordered;1em;` ํ์ ์ฌํญ - `๋ค์ค GPU ํ์ต <../beginner/ddp_series_multigpu.html>`__ ๊ณผ `torchrun <../beginner/ddp_series_fault_tolerance.html>`__ ์ ์ต์ํ ๊ฒ - 2๊ฐ ์ด์์ TCP ์ ๊ทผ์ด ๊ฐ๋ฅํ GPU ๋จธ์ (๋ณธ ํํ ๋ฆฌ์ผ์์๋ AWS p3.2xlarge๋ฅผ ์ฌ์ฉํจ) - ๋ชจ๋ ๋จธ์ ์ CUDA๊ฐ ์ค์น๋ `ํ์ดํ ์น <https://pytorch.org/get-started/locally/>`__
์๋์ ์์์ด๋ ์ ํ๋ธ ์์ ์ ๋ฐ๋ผ ์งํํ์ธ์.
๋ฉํฐ๋ ธ๋ ํ์ต์ ์ฌ๋ฌ ๋์ ๋จธ์ ์ ํ์ต ์์ ์ ์คํํ๋ ๊ฒ์ ๋๋ค. ์คํ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
- ๊ฐ ๋จธ์ ์์ ๋์ผํ rendezvous ์ธ์๋ก
torchrun
๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ - SLURM ๊ณผ ๊ฐ์ ์ํฌ๋ก๋ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํจํฐ ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ๊ธฐ
์ด ์์์์๋ ์ฑ๊ธ๋ ธ๋ ๋ค์ค GPU ๋ก๋ถํฐ ๋ฉํฐ๋ ธ๋ ํ์ต์ผ๋ก ์ฎ๊ธฐ๊ธฐ ์ํ (์ต์ํ์) ์ฝ๋ ๋ณ๊ฒฝ์ ๋ค๋ฃจ๊ณ , ์์์ ์ธ๊ธํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ต ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๊ฒ์ ๋๋ค.
๋ฉํฐ๋ ธ๋ ํ์ต์ ๋ ธ๋ ๊ฐ ํต์ ์ง์ฐ์ผ๋ก ์ธํด ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ์ฑ๊ธ๋ ธ๋์์ 4๊ฐ์ GPU๋ฅผ ์ฌ์ฉํ ํ์ต ์์ ์ด 4๊ฐ์ ๋ ธ๋์์ 1๊ฐ์ GPU๋ฅผ ์ฌ์ฉํ ๊ฒ๋ณด๋ค ๋น ๋ฅผ ๊ฒ์ ๋๋ค.
- ์ฑ๊ธ๋ ธ๋๋ฅผ ์ค์ ํ ๋, ํ์ต ํ๋ก์ธ์ค์ ๊ฐ ์ฅ์น์
gpu_id
๊ฐ ๊ธฐ๋ก๋๊ณ ์์์ต๋๋ค.torchrun
์ ์ด ๊ฐ์ ํ๊ฒฝ ๋ณ์LOCAL_RANK
๋ก ๊ธฐ๋กํ๊ณ ,
์ด๋ ๋
ธ๋์์ ๊ฐ๊ฐ์ ๊ณ ์ ํ GPU ํ๋ก์ธ์ค๋ฅผ ์๋ณํ๊ธฐ ์ํ ๊ฐ์
๋๋ค. For a unique identifier across all the nodes, torchrun
provides another variable
RANK
which refers to the global rank of a process.
.. ์ฃผ์์ฌํญ:: ํ์ต ์ ์ค์ํ ๋ก์ง์ ``์์`` ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ``torchrun``์ ์คํจ ํน์ ๋ฉค๋ฒ์ญ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฌ์์๋๋ฉด ํด๋น ํ๋ก์ธ์ค์์ ๊ฐ์ ``๋ก์ปฌ ์์`` ์ ``์์`` ๊ฐ ์ ์ง๋๋ค๋ ๋ณด์ฅ์ด ์์ต๋๋ค.
Torchrun ์ ์ด์ง์ ์ค์ผ์ผ๋ง ์ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๊ฐ์ ๋ฉํฐ๋ ธ๋ ๋จธ์ ์ด ํ์ต์ ์ฐธ์ฌํ๋ GPU์ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ด ๋น๋์ค์์๋ 2 ๋์ ๋จธ์ ์ ์ฝ๋๋ฅผ ๋ฐฐํฌํ์ฌ ํ ๊ฐ์ ๋จธ์ ์๋ 4๊ฐ, ๋ค๋ฅธ ํ ๊ฐ์ ๋จธ์ ์๋ 2๊ฐ์ GPU๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ ธ๋๋ค์ด TCP๋ฅผ ํตํด ์๋ก ํต์ ์ด ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์.
- ํ๊ฒฝ ๋ณ์
NCCL_DEBUG
๋ฅผINFO
๋ก ์ค์ ํ์ฌ (๋ช ๋ น์ด:export NCCL_DEBUG=INFO
) ์ด์๋ฅผ ํ์ธํ ์ ์๋ ์์ธ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ์ธ์. - ๋ถ์ฐ ๋ฐฑ์๋๋ฅผ ์ํด ๋ช
์์ ์ธ ๋คํธ์ํฌ ์ธํฐํ์ด์ค ์ค์ ์ด ํ์ํ ์๋ ์์ต๋๋ค. (
export NCCL_SOCKET_IFNAME=eth0
). ์ด ๋งํฌ. ๋ฅผ ์ฐธ์กฐํ์ธ์.
- DDP ๋ก GPT ๋ชจ๋ธ ํ์ต์ํค๊ธฐ (์ด ์๋ฆฌ์ฆ์ ๋ค์ ํํ ๋ฆฌ์ผ)
- ๊ฒฐํจ ๋ด์ฑ ๋ถ์ฐ ํ์ต (์ด ์๋ฆฌ์ฆ์ ์ด์ ํํ ๋ฆฌ์ผ)
- torchrun
- ๋๋ฐ๋ถ ์ธ์
- AWS ์์ ํด๋ฌ์คํฐ ์ ํ ํ๊ธฐ
- Slurm ๋ฌธ์