- 인쇄
- PDF
멀티 노드 사용하기
- 인쇄
- PDF
VPC 환경에서 이용 가능합니다.
CLOVA NSML은 현재 Closed Beta로 일부 파트너사에게만 제공되어 있으며, 일반 사용자 대상 오픈 시기는 미정입니다.
CLOVA NSML에서 Run(실험)을 생성할 때 둘 이상의 노드를 설정하여 분산 학습을 수행할 수 있습니다. 이런 형태를 멀티 노드라고 하며, 실험 단위로 구성할 수 있습니다. 실험을 생성할 때 다음과 같이 실험에 사용할 노드의 수만큼 노드 개수(VM)를 설정하면 됩니다.
멀티 노드로 구성된 실험의 각 노드에는 순서대로 번호가 부여되며 이를 랭크라고 부릅니다. 번호는 0부터 1씩 증가하며 노드 환경 변수 NSML_RANK
를 통해 각 노드의 랭크를 확인할 수 있습니다. 또한, 각 노드에서 현재 소속된 멀티 노드 실험이 몇 개의 노드로 구성되어 있는지 NSML_WORLD_SIZE
변수를 통해 파악할 수 있습니다.
예를 들어, 4개의 멀티 노드를 사용하는 실험에서 NSML_WORLD_SIZE
변수의 값은 4이며, 두 번째 노드의 랭크 번호는 1입니다. 아래의 명령으로 각 노드의 랭크 번호와 멀티 노드 구성 크기를 확인할 수 있습니다.
$ echo $NSML_RANK / $NSML_WORLD_SIZE
멀티 노드로 구성된 실험의 노드는 서로 자유롭게 통신할 수 있으며, 각 노드의 호스트 이름은 노드 환경 변수 NSML_HOST_RANK{n}
을 통해 파악할 수 있습니다. 만약, 위 예에서 두 번째 노드의 호스트 이름을 확인하고 싶다면 아래와 같은 명령을 실행하면 됩니다.
$ echo $NSML_HOST_RANK1
PyTorch를 사용하여 분산 학습을 할 때 torch.distributed API를 사용할 수 있습니다. 이때, 환경 변수를 사용하여 다음과 같이 초기화할 수 있습니다.
import os
import torch.distributed as dist
dist.init_process_group(
backend='nccl',
init_method=f'tcp://{os.environ['NSML_HOST_RANK0']}:23456',
world_size=int(os.environ['NSML_WORLD_SIZE']),
rank=int(os.environ['NSML_RANK']),
)
뿐만 아니라 다음과 같이 PyTorch가 자동으로 수용하는 환경 변수를 지정할 수도 있습니다.
export MASTER_PORT=23456
export MASTER_ADDR="$NSML_HOST_RANK0"
export WORLD_SIZE="$NSML_WORLD_SIZE"
export RANK="$NSML_RANK"
...
dist.init_process_group(backend='nccl')
멀티 노드로 구성된 실험에서는 모든 노드가 동시에 시작되는 것이 보장되지 않습니다. 따라서 모든 노드가 준비될 때까지 작업이나 코드 실행을 기다릴 수 있도록 다음과 같은 스크립트 사용을 권장합니다.
#!/bin/bash
# 모든 노드가 통신 가능한 상태인지 확인하는 fping 패키지를 설치합니다.
# 매번 패키지를 설치할 필요없이 개인 이미지로 저장하여 사용하면 편리합니다.
sudo apt-get update
sudo apt-get install fping -y
# 모든 노드가 통신 가능한 상태인지 확인합니다.
while ! fping $(seq $NSML_WORLD_SIZE | awk '{ print "node" $1-1 }'); do sleep 1; done
# 모두 통신 가능하다면, 아래 MAIN_COMMAND를 실행하게 됩니다.
{MAIN_COMMAND}