Data Parallelism

trainingdistributeddata-parallelism

Data Parallelism은 같은 모델을 여러 GPU에 복제하고, 각 GPU가 서로 다른 micro-batch를 처리하게 하는 방식이다.

GPU 0
same model copy
micro-batch A
grad A
GPU 1
same model copy
micro-batch B
grad B
GPU 2
same model copy
micro-batch C
grad C
GPU 3
same model copy
micro-batch D
grad D
all-reduce gradients same averaged gradient on every GPU
DP는 데이터를 나눠 forward/backward를 병렬로 수행하고, optimizer step 전에는 gradient를 동기화한다.

GPU가 4개라면 구조는 이렇게 볼 수 있다.

GPU 0: model copy + micro-batch A
GPU 1: model copy + micro-batch B
GPU 2: model copy + micro-batch C
GPU 3: model copy + micro-batch D

각 GPU는 자기 micro-batch로 forward와 backward를 수행한다. 문제는 각 GPU가 본 데이터가 다르기 때문에 gradient도 다르다는 점이다.

GPU 0: grad A
GPU 1: grad B
GPU 2: grad C
GPU 3: grad D

하지만 optimizer step 뒤에도 모든 model copy는 같은 parameter를 가져야 한다. 그래서 optimizer step 전에 gradient를 맞춰야 한다.

grad A, B, C, D -> all-reduce -> same averaged gradient on every GPU

이 때문에 DP는 gradient accumulation을 병렬로 한 버전처럼 이해할 수 있다.

gradient accumulation:
한 GPU가 여러 micro-batch를 순서대로 처리해 gradient 누적

data parallelism:
여러 GPU가 여러 micro-batch를 동시에 처리한 뒤 gradient 동기화

DP가 잘 맞는 상황

DP는 모델 하나가 GPU 하나에 들어갈 때 가장 단순하게 작동한다.

model copy 하나가 GPU memory에 들어간다
원하는 global batch size가 크다
여러 GPU가 있다

반대로 모델 하나가 GPU 하나에 들어가지 않으면 DP만으로는 부족하다. 이때 ZeRO, tensor parallelism, pipeline parallelism 같은 다음 전략이 필요해진다.

확인

  • DP에서 GPU마다 모델은 같은가, 다른가?
  • DP에서 GPU마다 데이터는 같은가, 다른가?
  • optimizer step 전에 gradient를 맞추는 이유는 무엇인가?