다중 GPU 학습의 표준
DistributedDataParallel(DDP)은 PyTorch의 표준 다중 GPU 학습 방식이야. GPU마다 프로세스 하나를 띄우고, 각 프로세스가 모델 복사본을 하나씩 들고 서로 다른 데이터 조각에서 순전파와 역전파를 실행해. 역전파 중에는 프로세스 사이에서 기울기를 all-reduce로 동기화해. 각 옵티마이저가 같은 평균 기울기를 자신의 가중치에 적용하므로 모든 모델 복사본은 같은 상태를 유지해.
단일 GPU 스크립트에 추가할 것
dist.init_process_group("nccl")로 프로세스 그룹을 초기화해.torch.cuda.set_device(rank)로 프로세스마다 사용할 장치를 정해.model = DDP(model, device_ids=[rank])로 모델을 DDP로 감싸.- DistributedSampler를 사용해 프로세스마다 서로 다른 데이터 조각을 보게 해.
- 기존
torch.distributed.launch대신 현대적인 실행기인torchrun으로 실행해.
DistributedSampler의 함정
DistributedSampler가 없으면 모든 프로세스가 전체 데이터셋을 순회해 같은 작업을 중복하므로 계산을 낭비해. 또 에포크가 시작될 때마다 샘플러의 set_epoch(epoch)를 반드시 호출해야 해. 빼먹으면 매 에포크의 섞기 순서가 같아져 학습이 이유 없이 정체될 수 있어.
torchrun: 현대적인 실행기
torchrun --nproc_per_node=4 train.py는 프로세스 네 개를 띄우고 LOCAL_RANK, WORLD_SIZE, RANK 환경 변수를 설정해 각 프로세스가 자신의 순위를 알게 해. 기존 torch.distributed.launch도 작동하지만 새 코드에는 torchrun을 사용해.