Global Batch, Micro-Batch, Gradient Accumulation

trainingbatchinggradient-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를 늘리면 어떤 통신 비용이 생기는가?