Global Batch, Micro-Batch, Gradient Accumulation
학습 병렬화에서 batch size는 하나의 숫자가 아니라 세 숫자의 곱으로 보는 편이 좋다.
mbs 2 samples per GPU pass
x grad_acc 4 passes before update
x dp 8 model replicas
= gbs 64 samples per update
grad_acc
같은 GPU가 여러 micro-batch를 순서대로 처리한다.
dp
여러 GPU가 서로 다른 micro-batch를 동시에 처리한다.
gbs = mbs x grad_acc x dp
각 항의 의미는 다음과 같다.
mbs = GPU 하나가 한 번의 forward/backward에서 처리하는 micro-batch size
grad_acc = optimizer step 전까지 micro-batch gradient를 몇 번 누적하는지
dp = 같은 모델 복사본을 몇 개 병렬로 돌리는지
gbs = optimizer step 하나가 본 전체 batch size
예를 들어 다음 설정을 보자.
mbs = 2
grad_acc = 4
dp = 8
그러면 한 optimizer step은 총 64개 sample을 본다.
2 x 4 x 8 = 64
grad_acc와 dp의 차이
grad_acc는 순차적이다.
micro-batch 1 -> micro-batch 2 -> micro-batch 3 -> micro-batch 4 -> update
dp는 병렬적이다.
GPU 1, GPU 2, GPU 3, GPU 4가 동시에 서로 다른 micro-batch 처리
그래서 같은 global batch size를 만들 수 있다면, 보통은 가능한 범위에서 grad_acc보다 dp를 늘리는 쪽이 빠르다. 다만 DP를 늘리면 gradient synchronization 통신도 늘어난다.
확인
mbs=4,grad_acc=2,dp=8이면gbs는 얼마인가?grad_acc는 병렬인가, 순차인가?- DP를 늘리면 어떤 통신 비용이 생기는가?