주제: DT-5 Gradient Accumulation (Effective Batch Size 증가)
문제 설정
딥러닝 학습에서는 큰 batch size가 더 안정적인 gradient를 제공하는 경우가 많습니다.
하지만 GPU 메모리 제한 때문에 큰 batch를 한 번에 처리할 수 없는 경우가 많습니다.
이 문제를 해결하기 위해 사용하는 방법이 Gradient Accumulation입니다.
직관 비유
- 큰 batch -> 많은 데이터를 한 번에 학습
- GPU 메모리 제한 -> 작은 batch만 처리 가능
- Gradient accumulation -> 여러 번 계산 후 한 번 업데이트
즉 여러 mini-batch의 gradient를 누적한 뒤 한 번에 업데이트합니다.
1. 일반적인 SGD 업데이트
일반적인 학습 과정:
for batch in data:
loss = model(batch)
loss.backward()
optimizer.step()
수식:
w <- w - eta ∇L_batch
기호 의미
- w : 모델 파라미터
- eta : learning rate
- ∇L_batch : batch gradient
주의점
batch가 작으면 gradient noise가 커질 수 있습니다.
2. Gradient Accumulation
Gradient accumulation은 여러 mini-batch의 gradient를 누적합니다.
for i, batch in enumerate(data):
loss = model(batch)
loss.backward()
if (i+1) % k == 0:
optimizer.step()
optimizer.zero_grad()
즉 k개의 mini-batch gradient를 합칩니다.
수식
업데이트:
w <- w - eta g
기호 의미
- k : accumulation step
- g : 누적 gradient
3. Effective Batch Size
Gradient accumulation을 사용하면 실제 batch size가 증가한 것과 같은 효과를 얻습니다.
기호 의미
- B : 실제 mini-batch size
- k : accumulation steps
- B_eff : effective batch size
예시
| mini-batch | accumulation | effective batch |
|---|---|---|
| 16 | 4 | 64 |
| 32 | 8 | 256 |
4. 왜 필요한가
- GPU 메모리 제한 해결
- 큰 batch 학습 효과
- gradient 안정성 증가
직관 설명
여러 작은 batch를 모아 하나의 큰 batch처럼 학습합니다.
5. Gradient 평균
실제 구현에서는 gradient 평균을 사용하는 경우가 많습니다.
이 경우 learning rate 조정이 필요 없습니다.
주의점
평균을 사용하지 않으면 learning rate scaling이 필요합니다.
6. DDP와 Gradient Accumulation
DDP에서도 gradient accumulation을 사용할 수 있습니다.
방법:
- 여러 step 동안 gradient 누적
- all-reduce는 업데이트 시점에 수행
효과
통신 횟수를 줄일 수 있습니다.
7. 메모리와 계산 비용
| 방법 | GPU 메모리 | batch 효과 |
|---|---|---|
| 큰 batch | 높음 | 높음 |
| gradient accumulation | 낮음 | 높음 |
코드-수식 연결
| 개념 | PyTorch 코드 | 설명 |
|---|---|---|
| gradient 계산 | loss.backward() |
gradient 누적 |
| gradient reset | optimizer.zero_grad() |
gradient 초기화 |
| 파라미터 업데이트 | optimizer.step() |
누적 후 업데이트 |
자주 하는 오해 5개
- gradient accumulation은 계산 속도를 줄인다고 생각한다
- 큰 batch와 완전히 동일한 결과를 항상 만든다고 생각한다
- learning rate 조정이 필요 없다고 생각한다
- DDP에서는 사용할 수 없다고 생각한다
- gradient가 자동으로 평균된다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- gradient accumulation의 기본 아이디어는 무엇인가?
- effective batch size는 어떻게 계산되는가?
- 왜 GPU 메모리 문제를 해결할 수 있는가?
- gradient 평균과 합의 차이는 무엇인가?
- DDP와 함께 사용할 때 어떤 장점이 있는가?