주제: DT-1 Data Parallel (Distributed Data Parallel, DDP)
문제 설정
대규모 딥러닝 모델을 학습할 때 하나의 GPU만으로는 계산 시간이 너무 오래 걸립니다. 그래서 여러 GPU를 동시에 사용하는 분산 학습(distributed training)이 필요합니다.
가장 널리 사용되는 방법이 Data Parallel이며, PyTorch에서는 Distributed Data Parallel (DDP)로 구현됩니다.
핵심 아이디어:
- 각 GPU가 동일한 모델 복사본(replica)을 가짐
- 데이터를 GPU마다 나누어 학습
- gradient를 동기화하여 동일한 파라미터 유지
직관 비유
- 여러 학생이 같은 문제집을 동시에 풂
- 각자 다른 문제를 풀지만
- 정답 수정은 서로 공유
1. Data Parallel 구조
예:
GPU0 -> batch0
GPU1 -> batch1
GPU2 -> batch2
GPU3 -> batch3
각 GPU는 동일한 모델을 가지고 있습니다.
기호 의미
- B : 전체 batch size
- N : GPU 개수
- B/N : GPU당 batch
왜 필요한가
여러 GPU를 활용하여 학습 속도를 높입니다.
주의점
모든 GPU 모델 파라미터는 동일하게 유지되어야 합니다.
2. Forward Pass
각 GPU는 자신의 mini-batch로 forward 계산을 수행합니다.
GPU0 : L0 = loss(model(x0))
GPU1 : L1 = loss(model(x1))
GPU2 : L2 = loss(model(x2))
왜 가능한가
모든 모델 replica가 동일하기 때문입니다.
주의점
forward는 GPU 간 통신 없이 독립적으로 실행됩니다.
3. Backward Pass
각 GPU는 gradient를 계산합니다.
하지만 각 GPU의 gradient는 서로 다릅니다.
그래서 gradient를 평균내야 합니다.
4. Gradient All-Reduce
DDP의 핵심 연산은 All-Reduce입니다.
기호 의미
- g_i : i번째 GPU gradient
- N : GPU 수
- g : 평균 gradient
직관 설명
모든 GPU의 gradient를 합쳐 평균을 만든 뒤 다시 모든 GPU에 전달합니다.
GPU0 -> g0
GPU1 -> g1
GPU2 -> g2
GPU3 -> g3
AllReduce: g = (g0 + g1 + g2 + g3) / 4
결과:
GPU0 = g
GPU1 = g
GPU2 = g
GPU3 = g
왜 필요한가
모든 모델 replica가 동일한 gradient로 업데이트되도록 하기 위함입니다.
주의점
All-Reduce는 GPU 간 통신 비용이 발생합니다.
5. 파라미터 업데이트
동기화된 gradient로 업데이트합니다.
w <- w - eta * g
모든 GPU가 동일한 업데이트를 수행합니다.
결과
모든 GPU 모델은 계속 동일한 상태를 유지합니다.
6. DDP 학습 흐름
1. 모델 복제 (replica 생성)
2. 각 GPU가 mini-batch 처리
3. forward 계산
4. backward 계산
5. gradient all-reduce
6. 파라미터 업데이트
7. 수식 요약
전체 batch gradient:
파라미터 업데이트:
w <- w - eta * g
왜 중요한가
DDP는 single-GPU 학습과 동일한 결과를 유지하면서 학습 속도를 높입니다.
코드-수식 연결
| 개념 | PyTorch 코드 | 설명 |
|---|---|---|
| DDP 모델 | torch.nn.parallel.DistributedDataParallel |
모델 병렬 래핑 |
| gradient 계산 | loss.backward() |
각 GPU gradient |
| all-reduce | torch.distributed.all_reduce() |
gradient 동기화 |
자주 하는 오해 5개
- DDP는 모델을 GPU마다 나누는 것이라고 생각한다
- forward 단계에서 GPU 통신이 발생한다고 생각한다
- 각 GPU가 서로 다른 모델을 학습한다고 생각한다
- gradient를 합치지 않아도 된다고 생각한다
- DDP와 DataParallel이 동일하다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- Data Parallel의 기본 아이디어는 무엇인가?
- DDP에서 모델 replica는 왜 동일해야 하는가?
- gradient all-reduce는 어떤 역할을 하는가?
- 왜 gradient 평균을 사용해야 하는가?
- DDP에서 통신이 발생하는 단계는 언제인가?