์ด ํ์ด์ง์์๋ Vertex AI์์ ๋ถ์ฐ ํ์ต ์์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ฝ๋ ์๊ตฌ์ฌํญ
๋ถ์ฐ ํ์ต์ ์ง์ํ๋ ML ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ต ์ฝ๋์์ CLUSTER_SPEC
๋๋ TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต ํด๋ฌ์คํฐ์ ํน์ ๋ถ๋ถ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
ํ์ต ํด๋ฌ์คํฐ ๊ตฌ์กฐ
Vertex AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐํ ํ์ต ์์ ์ ์คํํ๋ ๊ฒฝ์ฐ, ํ์ต ํด๋ฌ์คํฐ์ ์ฌ๋ฌ ๋จธ์ (๋ ธ๋)์ ์ง์ ํฉ๋๋ค. ํ์ต ์๋น์ค๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ๋จธ์ ์ ํ์ ๋ฆฌ์์ค๋ฅผ ํ ๋นํฉ๋๋ค. ์ ๊ณต๋ ๋ ธ๋์์ ์คํ ์ค์ธ ์์ ์ ๋ณต์ ๋ณธ์ด๋ผ ํฉ๋๋ค. ๊ตฌ์ฑ์ด ๋์ผํ ๋ณต์ ๋ณธ ๊ทธ๋ฃน์ ์์ ์ ํ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
ํ์ต ํด๋ฌ์คํฐ์์ ๊ฐ ๋ณต์ ๋ณธ์๋ ๋ถ์ฐ ํ์ต ์ ๋จ์ผ ์ญํ ๋๋ ํ์คํฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ ๋ณต์ ๋ณธ: ์ ํํ ํ๋์ ๋ณต์ ๋ณธ์ด ๊ธฐ๋ณธ ๋ณต์ ๋ณธ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ด ํ์คํฌ๋ ๋ค๋ฅธ ์์ ์ ๊ด๋ฆฌํ๊ณ ์์ ์ํ๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ณด๊ณ ํฉ๋๋ค.
์์ ์: ๋ณต์ ๋ณธ ํ ๊ฐ ์ด์์ ์์ ์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณต์ ๋ณธ์ ์์ ๊ตฌ์ฑ์์ ์ง์ ํ ๋๋ก ์์ ์ ์ผ๋ถ๋ถ์ ์ํํฉ๋๋ค.
๋งค๊ฐ๋ณ์ ์๋ฒ: ML ํ๋ ์์ํฌ์์ ์ง์๋๋ ๊ฒฝ์ฐ ํ๋ ์ด์์ ๋ณต์ ๋ณธ์ด ๋งค๊ฐ๋ณ์ ์๋ฒ๋ก ์ง์ ๋ ์ ์์ต๋๋ค. ์ด ๋ณต์ ๋ณธ์ ๋ชจ๋ธ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ฅํ๊ณ ๊ฐ ์์ ์ ๊ฐ์ ๊ณต์ ๋ชจ๋ธ ์ํ๋ฅผ ์กฐ์ ํฉ๋๋ค.
ํ๊ฐ์: ML ํ๋ ์์ํฌ์์ ์ง์๋๋ ๊ฒฝ์ฐ ํ๋ ์ด์์ ๋ณต์ ๋ณธ์ด ํ๊ฐ์๋ก ์ง์ ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณต์ ๋ณธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํ ์ ์์ต๋๋ค. TensorFlow๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก TensorFlow๋ ํ๊ฐ์๋ฅผ ๋ ๊ฐ ์ด์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋ถ์ฐ ํ์ต ์์ ๊ตฌ์ฑ
์ฌ๋ฌ ์์ ์ ํ์ ์ ์ํ์ฌ ์ปค์คํ ํ์ต ์์ ์ ๋ถ์ฐ ํ์ต ์์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋ํ ํ์ต ํ์ดํ๋ผ์ธ ๋๋ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์์ ๋ด์์ ๋ถ์ฐ ํ์ต์ ์คํํ ์๋ ์์ต๋๋ค.
๋ถ์ฐ ํ์ต ์์
์ ๊ตฌ์ฑํ๋ ค๋ฉด ๊ฐ ํ์คํฌ ์ ํ์ ๋ํด ํ๋์ WorkerPoolSpec
์ ์ง์ ํ์ฌ ์์
์ ํ ๋ชฉ๋ก(workerPoolSpecs[]
)์ ์ ์ํฉ๋๋ค.
workerPoolSpecs[] ์ ์์น |
ํด๋ฌ์คํฐ์์ ์ํ๋๋ ํ์คํฌ |
---|---|
์ฒซ ๋ฒ์งธ(workerPoolSpecs[0] ) |
๊ธฐ๋ณธ, ์ฃผ, ์ค์ผ์ค๋ฌ, '๋ง์คํฐ' |
๋ ๋ฒ์งธ(workerPoolSpecs[1] ) |
๋ณด์กฐ, ๋ณต์ ๋ณธ, ์์ ์ |
์ธ ๋ฒ์งธ(workerPoolSpecs[2] ) |
๋งค๊ฐ๋ณ์ ์๋ฒ, Reduction Server |
๋ค ๋ฒ์งธ(workerPoolSpecs[3] ) |
ํ๊ฐ์ |
๋ค๋ฅธ ๋ชจ๋ ๋ณต์ ๋ณธ์์ ์ํ๋๋ ์์
์ ์กฐ์ ํ๋ ๊ธฐ๋ณธ ๋ณต์ ๋ณธ์ ์ง์ ํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ ๋ณต์ ๋ณธ์ ๋ํด์๋ง ์ฒซ ๋ฒ์งธ ์์
์ ํ ์ฌ์์ ์ฌ์ฉํ๊ณ ํด๋น replicaCount
๋ฅผ 1
๋ก ์ค์ ํฉ๋๋ค.
{
"workerPoolSpecs": [
// `WorkerPoolSpec` for worker pool 0, primary replica, required
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 1, optional
{},
// `WorkerPoolSpec` for worker pool 2, optional
{},
// `WorkerPoolSpec` for worker pool 3, optional
{}
]
...
}
์ถ๊ฐ ์์ ์ ํ ์ง์
ML ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชฉ์ ์ ์ถ๊ฐ ์์ ์ ํ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด TensorFlow๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ ์ ํ์ ์ง์ ํ์ฌ ์์ ์ ๋ณต์ ๋ณธ, ๋งค๊ฐ๋ณ์ ์๋ฒ ๋ณต์ ๋ณธ, ํ๊ฐ์ ๋ณต์ ๋ณธ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
workerPoolSpecs[]
๋ชฉ๋ก์ ์ง์ ํ๋ ์์
์ ํ์ ์์์ ๋ฐ๋ผ ์์
์ ํ ์ ํ์ด ๊ฒฐ์ ๋ฉ๋๋ค. ์ฌ์ฉํ์ง ์์ ์์
์ ํ์ ๊ฐ์ ๋น์๋ก๋๋ค. ๊ทธ๋ฌ๋ฉด workerPoolSpecs[]
๋ชฉ๋ก์์ ์ด๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ฌ์ฉํ๋ ค๋ ์์
์ ํ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ ๋ณต์ ๋ณธ ๋ฐ ๋งค๊ฐ๋ณ์ ์๋ฒ ์์ ์ ํ๋ง ํฌํจ๋ ์์ ์ ์ง์ ํ๋ ค๋ฉด ์์ ์ ํ์ ๋น ๊ฐ์ 1๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
{
"workerPoolSpecs": [
// `WorkerPoolSpec` for worker pool 0, required
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 1, optional
{},
// `WorkerPoolSpec` for worker pool 2, optional
{
"machineSpec": {...},
"replicaCount": 1,
"diskSpec": {...},
...
},
// `WorkerPoolSpec` for worker pool 3, optional
{}
]
...
}
Reduction Server๋ก ํ์ต ์๊ฐ ๋จ์ถ
์ฌ๋ฌ ๋ ธ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ML ๋ชจ๋ธ์ ํ์ต์ํฌ ๋ ๋ ธ๋ ๊ฐ ๊ทธ๋๋์ธํธ๋ฅผ ํต์ ํ๋ฉด ์๋นํ ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. Reduction Server๋ ๋ถ์ฐ ํ์ต์ ์ฒ๋ฆฌ๋์ ๋๋ฆฌ๊ณ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์๋ all-reduce ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. Vertex AI๋ ๋ถ์ฐ ํ์ต ์ค์ ์์ ์ ํ ์ค ํ๋์ ์ฌ์ฉํ ์ ์๋ Docker ์ปจํ ์ด๋ ์ด๋ฏธ์ง์์ Reduction Server๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Reduction Server์ ์๋ ๋ฐฉ์์ ์์๋ณด๋ ค๋ฉด Vertex AI์ Reduction Server๋ฅผ ์ฌ์ฉํ๋ ๋ณด๋ค ๋น ๋ฅธ ๋ถ์ฐ GPU ํ์ต์ ์ฐธ์กฐํ์ธ์.
๊ธฐ๋ณธ ์๊ฑด
๋ค์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ Reduction Server๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
GPU ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ํ์ต์ ์ํํฉ๋๋ค.
ํ์ต ์ฝ๋์ TensorFlow ๋๋ PyTorch๊ฐ ์ฌ์ฉ๋๋ฉฐ, NCCL all-reduce๋ฅผ ์ฌ์ฉํด์ GPU๋ก ๋ฉํฐ ํธ์คํธ ๋ฐ์ดํฐ ๋ณ๋ ฌ ํ์ต์ ์ํํ๋๋ก ๊ตฌ์ฑ๋์์ต๋๋ค. (NCCL์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ML ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.)
๊ธฐ๋ณธ ๋ ธ๋(
workerPoolSpecs[0]
) ๋ฐ ์์ ์(workerPoolSpecs[1]
)์์ ์คํ ์ค์ธ ์ปจํ ์ด๋์ Reduction Server๊ฐ ์ง์๋ฉ๋๋ค. ํนํ ๊ฐ ์ปจํ ์ด๋๊ฐ ๋ค์ ์ค ํ๋์ ๋๋ค.์ฌ์ ๋น๋๋ TensorFlow ํ์ต ์ปจํ ์ด๋ ๋ฒ์ 2.3 ์ด์์ ๋๋ค.
์ฌ์ ๋น๋๋ Pytorch ํ์ต ์ปจํ ์ด๋, ๋ฒ์ 1.4 ์ด์์ ๋๋ค.
NCCL 2.7 ์ด์ ๋ฐ
google-reduction-server
ํจํค์ง๊ฐ ์ค์น๋ ์ปค์คํ ์ปจํ ์ด๋์ ๋๋ค. ๋ค์ ์ค์ Dockerfile์ ์ถ๊ฐํ์ฌ ์ด ํจํค์ง๋ฅผ ์ปค์คํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ์ค์นํ ์ ์์ต๋๋ค.RUN echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | tee /etc/apt/sources.list.d/google-fast-socket.list && \ curl -s -L https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ apt update && apt install -y google-reduction-server
Reduction Server๋ฅผ ์ฌ์ฉํ ํ์ต
Reduction Server๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปค์คํ ํ์ต ๋ฆฌ์์ค๋ฅผ ๋ง๋ค ๋ ๋ค์์ ์ํํฉ๋๋ค.
์ธ ๋ฒ์งธ ์์ ์ ํ(
workerPoolSpecs[2]
)์containerSpec.imageUri
ํ๋์ ๋ค์ URI ์ค ํ๋๋ฅผ ์ง์ ํฉ๋๋ค.us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
europe-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
asia-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
์ปค์คํ ํ์ต์ ์ํํ๋ ์์น์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฉํฐ ๋ฆฌ์ ์ ์ ํํ๋ฉด ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์์ ์ ํ์ ๋จธ์ ์ ํ ๋ฐ ๋ ธ๋ ์๋ฅผ ์ ํํ ๋ ์ธ ๋ฒ์งธ ์์ ์ ํ์ ์ด ๋คํธ์ํฌ ๋์ญํญ์ด ์ฒซ ๋ฒ์งธ ๋ฐ ๋ ๋ฒ์งธ ์์ ์ ํ์ ์ด ๋คํธ์ํฌ ๋์ญํญ๊ณผ ์ผ์นํ๊ฑฐ๋ ์ด๊ณผํ๋์ง ํ์ธํฉ๋๋ค.
๋ ๋ฒ์งธ ์์ ์ ํ์์ ๊ฐ ๋ ธ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต๋ ๋์ญํญ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋คํธ์ํฌ ๋์ญํญ ๋ฐ GPU๋ฅผ ์ฐธ์กฐํ์ธ์.
Reduction Server ๋ ธ๋์๋ GPU๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ธ ๋ฒ์งธ ์์ ์ ํ์์ ๊ฐ ๋ ธ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต๋ ๋์ญํญ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฒ์ฉ ๋จธ์ ๊ณ์ด์ '์ต๋ ์ด๊ทธ๋ ์ค ๋์ญํญ(Gbps)' ์ด์ ์ฐธ์กฐํ์ธ์.
์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ๋ฐ ๋ ๋ฒ์งธ ์์ ์ ํ์์ ๊ฐ๊ฐ 8๊ฐ์
NVIDIA_TESLA_V100
GPU๊ฐ ์๋ 5๊ฐ์n1-highmem-96
๋ ธ๋๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ ๊ฐ ๋ ธ๋์ ์ต๋ ๋์ญํญ์ 100Gbps์ด๊ณ ์ด ๋์ญํญ์ 500Gbps์ ๋๋ค. ์ธ ๋ฒ์งธ ์์ ์ ํ์์ ์ด ๋์ญํญ์ ์ผ์น์ํค๊ธฐ ์ํด์๋ ๊ฐ ์ต๋ ๋์ญํญ์ด 32Gbps์ด๊ณ ์ด ๋์ญํญ์ 512Gbps์ธn1-highcpu-16
๋ ธ๋ 16๊ฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.Reduction Server ๋ ธ๋์๋
n1-highcpu-16
๋จธ์ ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋จธ์ ์ ํ์ ๋ฆฌ์์ค์ ๋น๊ต์ ๋์ ๋์ญํญ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ๋ช
๋ น์ด๋ Reduction Server๋ฅผ ์ฌ์ฉํ๋ CustomJob
๋ฆฌ์์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=n1-highmem-96,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=n1-highmem-96,replica-count=4,accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=n1-highcpu-16,replica-count=16,container-image-uri=us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
์์ธํ ๋ด์ฉ์ CustomJob
๋ง๋ค๊ธฐ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
Reduction Server๋ฅผ ์ฌ์ฉํ ํ์ต ๊ถ์ฅ์ฌํญ
๋จธ์ ์ ํ ๋ฐ ๊ฐ์
Reduction Server ํ์ต์์ ๊ฐ ์์ ์๋ ๋ชจ๋ ๊ฐ์๊ธฐ ํธ์คํธ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. ์์ ์ ํธ์คํธ์์ ์ฐ๊ฒฐ ์๋ฅผ ์ต์ํํ๋ ค๋ฉด ๊ฐ์๊ธฐ ํธ์คํธ์ ๋ํด ๋คํธ์ํฌ ๋์ญํญ์ด ๊ฐ์ฅ ๋์ ๋จธ์ ์ ํ์ ์ฌ์ฉํ์ธ์.
๊ฐ์๊ธฐ ํธ์คํธ์๋ 32Gbps ์ด๊ทธ๋ ์ค ๋์ญํญ์ ์ ๊ณตํ๋ vCPU๊ฐ 16๊ฐ ์ด์์ธ ๋ฒ์ฉ N1/N2 VM์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์: n1-highcpu-16
๋ฐ n2-highcpu-16
). N1/N2 VM์ ๋ฑ๊ธ 1 VM ๋์ญํญ์ ์ต๋ ์ด๊ทธ๋ ์ค ๋์ญํญ์ 50Gbps~100Gbps ๋ฒ์๋ก ์ฆ๊ฐ์ํค๋ฏ๋ก ๊ฐ์๊ธฐ VM ๋
ธ๋์ ์ ํฉํฉ๋๋ค.
์์
์์ ๊ฐ์๊ธฐ์ ์ด ์ด๊ทธ๋ ์ค ๋์ญํญ์ ๋์ผํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด 8๊ฐ์ a2-megagpu-16g
VM์ ์์
์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 25๊ฐ ์ด์์ n1-highcpu-16
VM์ ๊ฐ์๊ธฐ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
`(8 worker VMs * 100 Gbps) / 32 Gbps egress = 25 reducer VMs`.
์์ ๋ฉ์์ง ์ผ๊ด ์ฒ๋ฆฌ
Reduction Server๋ ์ง๊ณํ ๋ฉ์์ง๊ฐ ์ถฉ๋ถํ ํฐ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค. ๋๋ถ๋ถ์ ML ํ๋ ์์ํฌ๋ ์ ์ฒด ์ถ์๋ฅผ ์ํํ๊ธฐ ์ ์ ์์ ๊ฒฝ์ฌ ํ ์๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๋ค๋ฅธ ์ฉ์ด์ ๊ธฐ์ ์ ์ด๋ฏธ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
Horovod
Horovod๋ Tensor Fusion์ ์ง์ํ์ฌ ์ ์ฒด ์ถ์๋ฅผ ์ํด ์๊ท๋ชจ ํ
์๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค. ํ
์๋ ๋ฒํผ๊ฐ ์์ ํ ์ฑ์์ง๊ณ ๋ฒํผ์ ๋ํ ์ ์ฒด ์ถ์ ์์
์ด ์คํ๋ ๋๊น์ง ํจ์ ๋ฒํผ์ ์ฑ์์ง๋๋ค. HOROVOD_FUSION_THRESHOLD
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ตํฉ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
HOROVOD_FUSION_THRESHOLD
ํ๊ฒฝ ๋ณ์์ ๊ถ์ฅ ๊ฐ์ ์ต์ 128MB์
๋๋ค. ์ด ๊ฒฝ์ฐ HOROVOD_FUSION_THRESHOLD
ํ๊ฒฝ ๋ณ์๋ฅผ 134217728(128 * 1024 * 1024)๋ก ์ค์ ํ์ธ์.
PyTorch
PyTorch DistributedDataParallel์ ์ผ๊ด ๋ฉ์์ง๋ฅผ '๊ฒฝ์ฌ ๋ฒ์ผํ
'์ผ๋ก ์ง์ํฉ๋๋ค. DistributedDataParallel
์์ฑ์์์ bucket_cap_mb
๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ผ๊ด ๋ฒํท์ ํฌ๊ธฐ๋ฅผ ์ ์ดํฉ๋๋ค.
๊ธฐ๋ณธ ํฌ๊ธฐ๋ 25MB์
๋๋ค.
๊ถ์ฅ์ฌํญ: bucket_cap_mb์ ๊ถ์ฅ ๊ฐ์ 64(64MB)์ ๋๋ค.
ํด๋ฌ์คํฐ์ ํ๊ฒฝ ๋ณ์
Vertex AI๋ ๋ชจ๋ ๋ณต์ ๋ณธ์ ํ๊ฒฝ ๋ณ์, CLUSTER_SPEC
์ ์ฑ์ ์ ์ฒด ํด๋ฌ์คํฐ๊ฐ ์ค์ ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค. TensorFlow์ TF_CONFIG
์ ๋ง์ฐฌ๊ฐ์ง๋ก CLUSTER_SPEC
์ ์์ธ๊ณผ ์ญํ (๊ธฐ๋ณธ ๋ณต์ ๋ณธ, ์์
์, ๋งค๊ฐ๋ณ์ ์๋ฒ, ํ๊ฐ์)์ ํฌํจํ์ฌ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ณต์ ๋ณธ์ ์ค๋ช
ํฉ๋๋ค.
TensorFlow๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐํ ํ์ต์ ์คํํ๋ฉด TF_CONFIG
๊ฐ ํ์ฑ๋์ด tf.train.ClusterSpec
์ด ๋น๋๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์์ ๋ถ์ฐํ ํ์ต์ ์คํํ๋ ๊ฒฝ์ฐ CLUSTER_SPEC
์ ํ์ฑํ์ฌ ํ๋ ์์ํฌ์์ ์๊ตฌํ๋ ํ๊ฒฝ ๋ณ์ ๋๋ ์ค์ ์ ์ฑ์์ผ ํฉ๋๋ค.
CLUSTER_SPEC
ํ์
CLUSTER_SPEC
ํ๊ฒฝ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ JSON ๋ฌธ์์ด์
๋๋ค.
ํค | ์ค๋ช | |
---|---|---|
"cluster"
|
์ปค์คํ
์ปจํ
์ด๋์ ๋ํ ํด๋ฌ์คํฐ ์ค๋ช
์
๋๋ค. ํด๋ฌ์คํฐ ์ค๋ช ์๋ ์ง์ ๋ ๊ฐ ์์ ์ ํ์ ๋ณต์ ๋ณธ ์ด๋ฆ ๋ชฉ๋ก์ด ํฌํจ๋ฉ๋๋ค. |
|
"workerpool0"
|
๋ชจ๋ ๋ถ์ฐ ํ์ต ์์ ์๋ ์ฒซ ๋ฒ์งธ ์์ ์ ํ์ ๊ธฐ๋ณธ ๋ณต์ ๋ณธ ํ๋๊ฐ ํฌํจ๋ฉ๋๋ค. | |
"workerpool1"
|
์ด ์์ ์ ํ์๋ ์์ ์ ๋ง๋ค ๋ ์ง์ ํ ์์ ์ ๋ณต์ ๋ณธ์ด ํฌํจ๋ฉ๋๋ค. | |
"workerpool2"
|
์ด ์์ ์ ํ์๋ ์์ ์ ๋ง๋ค ๋ ์ง์ ํ ๋งค๊ฐ๋ณ์ ์๋ฒ๊ฐ ํฌํจ๋ฉ๋๋ค. | |
"workerpool3"
|
์ด ์์ ์ ํ์๋ ์์ ์ ๋ง๋ค ๋ ์ง์ ํ ํ๊ฐ์๊ฐ ํฌํจ๋ฉ๋๋ค. | |
"environment"
|
cloud ๋ฌธ์์ด์
๋๋ค.
|
|
"task"
|
์ฝ๋๋ฅผ ์คํ ์ค์ธ ํน์ ๋ ธ๋์ ํ์คํฌ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ์์ ์ ํน์ ์์ ์์ ๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ํญ๋ชฉ์ ๋ค์๊ณผ ๊ฐ์ ํค๊ฐ ํฌํจ๋ ์ฌ์ ์ ๋๋ค. | |
"type"
|
์ด ํ์คํฌ๊ฐ ์คํ๋๋ ์์
์ ํ์ ์ ํ์
๋๋ค. ์๋ฅผ ๋ค์ด "workerpool0" ๋ ๊ธฐ๋ณธ ๋ณต์ ๋ณธ์ ๋ํ๋
๋๋ค.
|
|
"index"
|
0๋ถํฐ ์์ํ๋ ํ์คํฌ ์์ธ์
๋๋ค. ์๋ฅผ ๋ค์ด ํ์ต ์์
์ ๋ ์์
์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์ ํ ์์
์์์๋ |
|
"trial"
|
ํ์ฌ ์คํ ์ค์ธ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์๋์ ์๋ณ์์ ๋๋ค. ์์ ์ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ํ์ต ์๋ ํ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด ๊ฐ์ ํตํด ์คํ ์ค์ธ ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์๋ณ์๋ ์๋ ํ์๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด ๊ฐ์ด๋ฉฐ 1๋ถํฐ ์์ํฉ๋๋ค. | |
job |
์ฌ์ ์ผ๋ก ํ์๋ ํ์ฌ ํ์ต ์์
์ ์์ฑํ๊ธฐ ์ํด ์ ๊ณตํ๋ |
CLUSTER_SPEC
์์
๋ค์์ ๊ฐ ์์์ ๋๋ค.
{ "cluster":{ "workerpool0":[ "cmle-training-workerpool0-ab-0:2222" ], "workerpool1":[ "cmle-training-workerpool1-ab-0:2222", "cmle-training-workerpool1-ab-1:2222" ], "workerpool2":[ "cmle-training-workerpool2-ab-0:2222", "cmle-training-workerpool2-ab-1:2222" ], "workerpool3":[ "cmle-training-workerpool3-ab-0:2222", "cmle-training-workerpool3-ab-1:2222", "cmle-training-workerpool3-ab-2:2222" ] }, "environment":"cloud", "task":{ "type":"workerpool0", "index":0, "trial":"TRIAL_ID" }, "job": { ... } }
TF_CONFIG
ํ์
CLUSTER_SPEC
์ธ์๋ Vertex AI๋ ๋ชจ๋ ๋ถ์ฐ ํ์ต ์์
์ ๊ฐ ๋ณต์ ๋ณธ์ ํ๊ฒฝ ๋ณ์TF_CONFIG
๋ฅผ ์ค์ ํฉ๋๋ค. Vertex AI๋ ๋จ์ผ ๋ณต์ ๋ณธ ํ์ต ์์
์ TF_CONFIG
๋ฅผ ์ค์ ํ์ง ์์ต๋๋ค.
CLUSTER_SPEC
๋ฐ TF_CONFIG
๋ ์ผ๋ถ ๊ฐ์ ๊ณต์ ํ์ง๋ง ํ์์ด ๋ค๋ฆ
๋๋ค. ๋ ํ๊ฒฝ ๋ณ์ ๋ชจ๋ TensorFlow์ ํ์ํ ๋ฒ์๋ฅผ ์ด๊ณผํ๋ ์ถ๊ฐ ํ๋๊ฐ ํฌํจ๋ฉ๋๋ค.
TensorFlow๋ฅผ ์ฌ์ฉํ ๋ถ์ฐ ํ์ต์ ์ฌ์ ๋น๋๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ด ์ปค์คํ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ๋์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์๋ํฉ๋๋ค.
TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ JSON ๋ฌธ์์ด์
๋๋ค.
TF_CONFIG ํ๋ |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
cluster |
TensorFlow ํด๋ฌ์คํฐ ์ค๋ช
์
๋๋ค. ํ๋ ์ด์์ ํ์คํฌ ์ด๋ฆ(
|
||||||||||
task |
์ด ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋ VM์ ํ์คํฌ ์ค๋ช ์ ๋๋ค. ์ด ์ฌ์ ์ ๊ฐ์ ํ์ต ์์ ์์๋ VM๋ง๋ค ์๋ก ๋ค๋ฆ ๋๋ค. ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ํ์ต ์์ ์ ๊ฐ VM์์ ์คํ๋๋ ์ฝ๋๋ฅผ ๋ง์ถค์ค์ ํ ์ ์์ต๋๋ค. ๋ํ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์์ ์ ์๋๋ง๋ค ํ์ต ์ฝ๋์ ๋์์ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค. ์ด ์ฌ์ ์๋ ๋ค์ ํค-๊ฐ ์์ด ํฌํจ๋ฉ๋๋ค.
|
||||||||||
job |
์ฌ์ ์ผ๋ก ํ์๋ ํ์ฌ ํ์ต ์์
์ ์์ฑํ๊ธฐ ์ํด ์ ๊ณตํ๋ |
||||||||||
environment |
|
TF_CONFIG
์์
๋ค์ ์ฝ๋ ์์๋ ํ์ต ๋ก๊ทธ์ TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
import json
import os
tf_config_str = os.environ.get('TF_CONFIG')
tf_config_dict = json.loads(tf_config_str)
# Convert back to string just for pretty printing
print(json.dumps(tf_config_dict, indent=2))
๋ฐํ์ ๋ฒ์ 2.1 ์ด์์์ ์คํ๋๊ณ ๋งค๊ฐ๋ณ์ ์๋ฒ, ๋ง์คํฐ ์์
์, ์์
์ ๋์ ์ฌ์ฉํ๋ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์์
์์ ์ด ์ฝ๋๋ ์ฒซ ๋ฒ์งธ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์๋ ์ค์ ์์
์ ์ค ํ ๊ฐ์ ๋ํด ๋ค์ ๋ก๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ถ๋ ฅ ์์์์๋ ๊ฐ๊ฒฐ์ฑ์ ์ํด job
ํ๋๋ฅผ ์จ๊ธฐ๊ณ ์ผ๋ถ ID๋ฅผ ์ผ๋ฐ์ ์ธ ๊ฐ์ผ๋ก ๋์ฒดํฉ๋๋ค.
{
"cluster": {
"chief": [
"training-workerpool0-[ID_STRING_1]-0:2222"
],
"ps": [
"training-workerpool2-[ID_STRING_1]-0:2222"
],
"worker": [
"training-workerpool1-[ID_STRING_1]-0:2222",
"training-workerpool1-[ID_STRING_1]-1:2222"
]
},
"environment": "cloud",
"job": {
...
},
"task": {
"cloud": "[ID_STRING_2]",
"index": 0,
"trial": "1",
"type": "worker"
}
}
TF_CONFIG
์ฌ์ฉ ์์
TF_CONFIG
๋ ๋ถ์ฐ ํ์ต ์์
์๋ง ์ค์ ๋ฉ๋๋ค.
ํ์ต ์ฝ๋์์ TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ๋ค์ ์น์
์ ์ค๋ช
๋ TensorFlow์ ๋ถ์ฐ ์ ๋ต ๋ฐ Vertex AI์ ํ์ค ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์ํฌํ๋ก๊ฐ ํด๋น ์์
์ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ์๋ง TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์.
๋ถ์ฐํ ํ์ต
Vertex AI์์๋ TensorFlow์ ๋ถ์ฐ ํ์ต์ ํ์ํ ์ฌ์์ ํ์ฅํ๋๋ก TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
TensorFlow๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ํ์ต์ ์ํํ๋ ค๋ฉด tf.distribute.Strategy
API๋ฅผ ์ฌ์ฉํ์ธ์.
ํนํ Keras API๋ฅผ MultiWorkerMirroredStrategy
๋๋ ParameterServerStrategy
(์์
์ ๋งค๊ฐ๋ณ์ ์๋ฒ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ)์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ TensorFlow๋ ์ด ๊ฐ์ ์ ๋ต์ ๋ํด ์คํ์ ์ง์๋ง ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋ฐฐํฌ ์ ๋ต์์๋ TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต ์์
์ ๊ฐ VM์ ์ญํ ์ ํ ๋นํ๊ณ VM ๊ฐ์ ํต์ ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. TensorFlow๊ฐ ์ด ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ํ์ต ์ฝ๋์์ TF_CONFIG
ํ๊ฒฝ ๋ณ์์ ์ง์ ์ก์ธ์คํ ํ์๊ฐ ์์ต๋๋ค.
ํ์ต ์์
์ ์คํํ๋ ์ฌ๋ฌ VM์ ๋์์ ๋ง์ถค์ค์ ํ๋ ค๋ ๊ฒฝ์ฐ์๋ง TF_CONFIG
ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ ํ์ฑํ์ธ์.
์ด๋งค๊ฐ๋ณ์ ์กฐ์
์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์์ ์ ์คํํ๋ฉด Vertex AI์์ ๊ฐ ์๋์ ํ์ต ์ฝ๋์ ์๋ก ๋ค๋ฅธ ์ธ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ต ์ฝ๋๊ฐ ํ์ฌ ์คํ ์ค์ธ ์๋์ ๋ํด ์ธ์งํด์ผ ํ ํ์๋ ์์ต๋๋ค. ๋ํ Google Cloud ์ฝ์์์ ์ด๋งค๊ฐ๋ณ์ ์กฐ์ ์์ ์ ์งํ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ์ฝ๋๊ฐ TF_CONFIG
ํ๊ฒฝ ๋ณ์์ task
ํ๋ ๋ด trial
ํ๋์์ ํ์ฌ ์๋ ํ์์ ๋ฒํธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ
- ํ์ต ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ