핵심 인사이트 (3줄 요약)
- 본질: 데이터 병렬화 (Data Parallelism)는 모델을 복제하고 데이터를 나누는 방식이며, 모델 병렬화 (Model Parallelism)는 모델 자체를 나누어 단일 Graphics Processing Unit (GPU) 메모리 한계를 넘는 방식이다.
- 가치: 데이터 병렬화는 처리량 확장에 가장 단순하고 강력하지만 모델 크기를 줄여 주지 않으며, 모델 병렬화는 초대형 모델 학습을 가능하게 하지만 통신과 스케줄링 복잡도를 크게 높인다.
- 판단 포인트: 모델이 한 GPU에 들어가면 먼저 데이터 병렬화와 Fully Sharded Data Parallel (FSDP)를 검토하고, 한 레이어조차 한 장비에 담기지 않을 때 Tensor Parallelism과 Pipeline Parallelism까지 조합하는 것이 실무적 순서다.
Ⅰ. 개요 및 필요성
분산 학습 (Distributed Training)은 "GPU가 느리다"보다 먼저 "GPU 한 장에 모델이 안 들어간다"는 문제에서 출발한다. 예를 들어 70B 파라미터 모델을 Brain Floating Point 16-bit (BFloat16) 기준 가중치 2바이트, 그래디언트 2바이트, Adam 옵티마이저 상태 8바이트로만 계산해도 파라미터당 약 12바이트가 필요하다. 활성값과 체크포인팅 오버헤드를 빼고도 대략 840GB 수준이어서 80GB GPU 한 장으로는 물리적으로 불가능하다.
┌────────────────────────────────────────────────────────────────────┐
│ Memory wall of large-model training │
├────────────────────────────────────────────────────────────────────┤
│ 70B params │
│ × (weights 2B + grads 2B + Adam states 8B) │
│ ≈ 840 GB before activations │
│ │
│ A100 80GB x 1 -> impossible │
│ A100 80GB x N -> only possible if compute/memory are partitioned │
└────────────────────────────────────────────────────────────────────┘
여기서 두 가지 다른 병목이 갈린다. 첫째는 처리량 병목이다. 모델은 한 GPU에 들어가지만 학습이 너무 오래 걸리는 경우다. 둘째는 용량 병목이다. 모델 자체가 한 GPU 메모리에 담기지 않는 경우다. 데이터 병렬화는 전자에, 모델 병렬화는 후자에 먼저 대응한다.
따라서 분산 학습 설계의 핵심 질문은 단순히 "GPU를 몇 장 쓸 것인가"가 아니다. "무엇을 나눌 것인가", "어디서 통신할 것인가", "어느 병목이 먼저 오는가"를 구분해야 한다. 이 구분이 없으면 GPU 수는 늘었는데 속도도, 학습 가능 모델 크기도 기대만큼 오르지 않는다.
- 📢 섹션 요약 비유: 숙제가 너무 많을 때는 같은 문제집을 여러 친구가 나눠 푸는 방법이 있고, 문제집이 너무 두꺼워 한 명 가방에 안 들어갈 때는 앞장과 뒷장을 서로 나눠 드는 방법이 있다. 분산 학습은 이 두 상황을 구분하는 일이다.
Ⅱ. 아키텍처 및 핵심 원리
데이터 병렬화와 모델 병렬화의 차이는 "분할 대상"이 어디냐에 있다. 데이터 병렬화는 모델 복사본을 여러 GPU에 두고 미니배치를 나누어 계산한 뒤, 각 GPU가 만든 그래디언트를 합친다. 모델 병렬화는 한 번의 순전파와 역전파 자체가 여러 GPU를 지나가도록 모델 가중치나 레이어를 나눈다.
┌────────────────────────────────────────────────────────────────────┐
│ Where the split happens │
├───────────────────────────────┬────────────────────────────────────┤
│ Data Parallelism │ Model Parallelism │
├───────────────────────────────┼────────────────────────────────────┤
│ batch B0 -> GPU0 [full model] │ GPU0 [part of layer / stage] │
│ batch B1 -> GPU1 [full model] │ GPU1 [part of layer / stage] │
│ batch B2 -> GPU2 [full model] │ GPU2 [part of layer / stage] │
│ batch B3 -> GPU3 [full model] │ GPU3 [part of layer / stage] │
│ after backward: All-Reduce │ during forward/backward: send │
│ same weights on all GPUs │ activations / partial sums │
└───────────────────────────────┴────────────────────────────────────┘
| 전략 | 무엇을 나누나 | 대표 통신 | 가장 잘 해결하는 문제 |
|---|---|---|---|
| 데이터 병렬화 (DP) | 미니배치 | Gradient All-Reduce | 처리량 확장 |
| 텐서 병렬화 (Tensor Parallelism, TP) | 한 레이어의 행렬 | All-Gather, All-Reduce | 거대한 레이어 메모리 |
| 파이프라인 병렬화 (Pipeline Parallelism, PP) | 레이어 스테이지 | Activation hop | 깊은 모델 분할 |
| FSDP / ZeRO | 파라미터·그래디언트·옵티마이저 상태 | Shard gather / reduce-scatter | 데이터 병렬화의 메모리 중복 완화 |
데이터 병렬화의 핵심 공식은 단순하다. Global Batch = Local Batch × Replica 수 × Gradient Accumulation. 이 방식은 구현이 비교적 쉽고, PyTorch Distributed Data Parallel (DDP)처럼 표준 프레임워크 지원도 강하다. 대신 모델은 각 GPU에 그대로 복제되므로, 모델이 한 GPU에 들어가지 않는 순간 데이터 병렬화만으로는 해결되지 않는다.
모델 병렬화는 다시 두 갈래로 나뉜다. 텐서 병렬화는 한 레이어의 큰 행렬 곱을 여러 GPU로 분할하고, 파이프라인 병렬화는 레이어 묶음을 스테이지로 나누어 순차적으로 통과시킨다. 텐서 병렬화는 고속 상호연결이 필수이고, 파이프라인 병렬화는 마이크로배치를 사용해 버블을 줄여야 효율이 난다.
- 📢 섹션 요약 비유: 데이터 병렬화는 여러 주방이 같은 레시피로 동시에 요리하는 것이고, 모델 병렬화는 한 접시가 너무 커서 재료 손질, 굽기, 플레이팅을 서로 다른 주방에 맡기는 것이다.
Ⅲ. 비교 및 연결
실무에서는 데이터 병렬화와 모델 병렬화를 대립 개념으로만 보면 부족하다. 둘은 경쟁 관계라기보다 병목에 따라 이어지는 단계다. 모델이 한 GPU에 들어가고 배치 크기를 키우고 싶다면 데이터 병렬화가 먼저다. 모델은 들어가지만 옵티마이저 상태 때문에 메모리가 빠듯하면 FSDP나 ZeRO가 그다음이다. 그마저 부족해 한 레이어 자체가 너무 크면 텐서 병렬화, 레이어 깊이가 너무 커지면 파이프라인 병렬화가 들어온다.
| 비교 축 | 데이터 병렬화 | 모델 병렬화 |
|---|---|---|
| 모델 복제 | 있음 | 없음 또는 부분만 유지 |
| 메모리 절감 | 거의 없음 | 큼 |
| 처리량 확장 | 매우 좋음 | 상황에 따라 제한 |
| 구현 난이도 | 낮음 | 중간~높음 |
| 통신 위치 | 스텝 끝 그래디언트 동기화 | 레이어 내부 또는 스테이지 경계 |
| 네트워크 민감도 | 상대적으로 낮음 | 매우 높음 |
하드웨어 토폴로지도 선택을 바꾼다. 텐서 병렬화는 레이어마다 통신이 자주 발생하므로 NVLink 같은 고대역폭 링크 안쪽에 배치하는 편이 좋다. 반면 데이터 병렬화는 스텝 끝에서만 동기화하므로 노드 간 InfiniBand를 타도 상대적으로 견디기 쉽다. 그래서 대형 학습 클러스터는 보통 노드 내부는 TP/PP, 노드 간은 DP라는 층위 구조를 갖는다.
┌────────────────────────────────────────────────────────────────────┐
│ Typical placement of hybrid parallelism │
├────────────────────────────────────────────────────────────────────┤
│ Node 0: GPU0 GPU1 GPU2 GPU3 <- TP / PP over NVLink │
│ Node 1: GPU4 GPU5 GPU6 GPU7 <- TP / PP over NVLink │
│ │ │ │
│ └────── DP gradient sync across nodes over InfiniBand ────────┘ │
└────────────────────────────────────────────────────────────────────┘
여기서 FSDP는 중요한 연결 고리다. 이름 때문에 모델 병렬화처럼 보이기 쉽지만, 철학적으로는 데이터 병렬화 계열이다. 모델을 복제하되 파라미터와 상태를 샤딩해 메모리 낭비를 줄이기 때문이다. 즉 분산 학습은 DP와 MP의 이분법보다, 복제-샤딩-분할을 어디까지 섞을 것인가의 스펙트럼으로 이해하는 편이 정확하다.
- 📢 섹션 요약 비유: 같은 이삿짐을 여러 트럭이 나눠 싣는 것이 데이터 병렬화라면, 너무 큰 가구를 분해해서 트럭 여러 대에 실어야 하는 것이 모델 병렬화다. 실제 이사는 보통 두 방법을 함께 쓴다.
Ⅳ. 실무 적용 및 기술사 판단
실무에서 가장 먼저 해야 할 일은 병렬화 기법 선택이 아니라 메모리와 통신 프로파일링이다. 파라미터, 그래디언트, 옵티마이저 상태, 활성값 중 무엇이 먼저 한계에 닿는지 알아야 하기 때문이다. 그 다음 원칙은 "가장 단순한 방법부터 시작해, 정말 필요할 때만 더 복잡한 병렬화로 간다"이다.
┌────────────────────────────────────────────────────────────────────┐
│ Practical decision order │
├────────────────────────────────────────────────────────────────────┤
│ model fits on one GPU? │
│ ├─ yes -> start with DDP / gradient accumulation │
│ │ │
│ └─ no │
│ │ │
│ ▼ │
│ memory issue from replicated states? │
│ ├─ yes -> FSDP / ZeRO │
│ └─ no, single layer too large -> TP │
│ deep model across many GPUs -> add PP │
└────────────────────────────────────────────────────────────────────┘
| 상황 | 권장 선택 | 이유 |
|---|---|---|
| 모델이 한 GPU에 충분히 들어감 | DDP | 가장 단순하고 디버깅이 쉬움 |
| 모델은 들어가지만 메모리 여유가 적음 | FSDP / ZeRO | 복제 상태를 줄여 더 큰 배치 가능 |
| Attention / MLP 한 층이 너무 큼 | TP | 레이어 내부 행렬을 쪼개야 함 |
| 레이어 수가 많고 장비가 많음 | PP + 마이크로배치 | 여러 스테이지를 동시에 활용 |
| 다중 노드 대규모 Large Language Model (LLM) 학습 | DP + TP + PP 하이브리드 | 처리량, 메모리, 토폴로지 균형 |
안티패턴
- 고속 링크가 없는 노드 간에 세밀한 텐서 병렬화를 강제로 확장하는 것
- 배치 크기만 키우다 최적화 안정성과 수렴 품질을 잃는 것
- 통신 병목을 무시하고 GPU 수만 늘려 선형 확장을 기대하는 것
- 체크포인팅 전략 없이 복잡한 병렬화만 추가해 장애 복구 시간을 키우는 것
기술사 답안에서는 "DP는 속도, MP는 용량"이라는 1차 구분 위에, FSDP/ZeRO와 TP/PP의 경계를 덧붙이면 답안 깊이가 살아난다. 특히 토폴로지에 따라 병렬화 계층을 배치한다는 점을 넣으면 실무성이 높아진다.
- 📢 섹션 요약 비유: 회사를 옮길 때 작은 짐은 사람 수를 늘려 나르면 되고, 너무 큰 냉장고는 분해하거나 특수 장비를 써야 한다. GPU 병렬화도 먼저 어떤 짐이 문제인지 봐야 한다.
Ⅴ. 기대효과 및 결론
분산 학습을 올바르게 설계하면 학습 시간 단축과 모델 규모 확장을 동시에 달성할 수 있다. 데이터 병렬화는 실험 회전 속도를 높여 주고, 모델 병렬화는 단일 장비 한계를 넘어 대형 모델 연구를 가능하게 만든다. 여기에 FSDP, TP, PP를 적절히 섞으면 수십억~수백억 파라미터 모델도 실용적인 시간 안에 학습할 수 있다.
하지만 병렬화가 곧바로 효율을 의미하지는 않는다. 통신 오버헤드, 버블, 체크포인트 복잡도, 디버깅 난이도는 GPU 수와 함께 커진다. 특히 네트워크가 약한 환경에서는 모델 병렬화가 계산 이득보다 통신 손해를 더 크게 만들 수 있다.
따라서 이 주제는 "GPU를 많이 쓰는 법"보다 "병목에 맞게 분할 축을 고르는 법"으로 기억하는 것이 정확하다. 처리량 문제는 데이터 병렬화, 메모리 문제는 모델 병렬화, 그리고 초대형 모델은 하이브리드 병렬화라는 계단식 판단이 핵심이다.
- 📢 섹션 요약 비유: 큰 공연을 준비할 때 같은 악보를 여러 연주자가 나눠 연습하는 것과, 한 사람이 들 수 없을 만큼 큰 악기를 여러 명이 함께 다루는 것은 다른 문제다. 분산 학습은 이 둘을 구분하고 조합하는 지휘 기술이다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| DDP (Distributed Data Parallel) | 모델 복제 + 배치 분할의 표준 구현 |
| All-Reduce | 데이터 병렬화에서 그래디언트를 동기화하는 핵심 통신 |
| FSDP (Fully Sharded Data Parallel) | 데이터 병렬화의 메모리 중복을 줄이는 샤딩 전략 |
| Tensor Parallelism | 한 레이어의 거대한 행렬을 여러 GPU로 분할 |
| Pipeline Parallelism | 레이어 묶음을 스테이지로 나눠 순차 처리 |
| NVLink / InfiniBand | 병렬화 계층 배치에 직접적인 영향을 주는 상호연결 |
📈 관련 키워드 및 발전 흐름도
Single-GPU training
│
├─ throughput wall -> Data Parallelism (DDP)
├─ memory wall from replicated states -> FSDP / ZeRO
└─ layer too large -> Tensor Parallelism / Pipeline Parallelism
▼
Hybrid 3D parallelism (DP + TP + PP)
│
▼
Large-scale foundation model training
이 흐름은 분산 학습이 단순한 GPU 추가가 아니라, 병목 유형에 따라 병렬화 축을 단계적으로 확장하는 과정임을 보여준다.
👶 어린이를 위한 3줄 비유 설명
- 데이터 병렬화는 같은 문제집을 여러 친구가 나눠 풀고 마지막에 답을 모아 보는 거예요.
- 모델 병렬화는 문제집이 너무 두꺼워서 앞장은 한 친구, 뒷장은 다른 친구가 맡는 거예요.
- 아주 큰 숙제는 두 방법을 같이 써서 빨리도 하고, 한 사람 가방이 터지지 않게 해요.