말 그대로 Data를 병렬적으로 처리하기 위한 module level에서의 multi gpu 사용 방법이다.
진짜 간단한데 다음과 같은 코드 한줄로 병렬화를 할 수 있다.
devices = list(range(torch.cuda.device_count()))
model = nn.DataParallel(model, device_ids=devices)
DDP에 비하면 정말 간단하다 !
근데 귀찮게 Data를 나누는 이유가 뭘까 ?
크게 이렇게 두 이유로 DP 혹은 DDP를 사용한다.
모델을 저장할 때, nn.DataParallel()로 저장하면 모델의 파라미터가 module.{parameter name}으로 저장이 된다. 그래서 그냥 일반적인 모델 부르는것 처럼 Inference 하지 말고, 꼭 Inference시에도 감싸주자.
DataParallel
과 DistributedDataParallel
의 차이가 무엇인가 ?DataParallel
은 단일 작업, 멀티쓰레드이며 단일 기기에서만 작동한다.DistributedDaraParallel
은 다중 작업, 단일 및 다중 기기 학습을 전부 지원하기 때문에 일반적으로 DataParallel
보다 빠르게 작동한다.모델이 너무 커서 GPU에 올리지 못하는 경우에 model parallel을 사용해야 하는데, DataParallel
은 model parallel에서 실행되지 않음.