Data Parallelism (DP)
아이디어
•
같은 모델 전체를 모든 GPU에 복제하고, 미니배치를 분할(=마이크로배치)해 각 GPU가 독립적으로 F/B를 수행.
•
백워드가 끝나면 그라디언트 평균(= All-Reduce) 후 동일한 파라미터 갱신.
통신
•
스텝당 핵심은 그라디언트 All-Reduce 1회(실제 구현은 Reduce-Scatter + All-Gather).
•
통신량(바이트) ≈ 모든 파라미터 그라드 크기 × 2.
•
모델이 클수록 통신이 비싸지만, 통신 시점은 ‘스텝 말’로 몰림(계층별로 쪼개지지 않음).
장점
•
구현 난이도 최저(DDP 한 줄 래핑으로 시작).
•
모델/코드 수정 거의 없음.
•
연산-통신 오버랩(bucket, overlap) 최적화가 성숙.
단점
•
모델 상태(파라미터/그라드/옵티마이저)가 전부 중복 → 대형 LLM에서 메모리 병목.
•
한 GPU에 모델이 “한 번은” 올라와야 하므로 단일 GPU 메모리 한계를 못 넘음.
예시/팁
•
7B 파라미터, bf16 파라미터/그라드(각 2B), Adam 옵티마(두 모멘트 fp32, 8B):
◦
파라미터 ≈ 14GB, 그라드 ≈ 14GB, 옵티마 ≈ 56GB → 한 GPU에 84GB+ 필요(대략치).
◦
이 때문에 대개 ZeRO/FSDP 또는 TP/PP를 곁들임.
•
그라드 누적(gradient accumulation) 으로 글로벌 배치를 키우되, 누적 스텝 증가 시 스텝당 통신 빈도는 그대로라 스케줄링은 수월.
Tensor Parallelism (TP) (intra-layer parallelism)
아이디어
•
레이어 내부 텐서를 축으로 분할해 여러 GPU가 한 연산을 나눔.
•
트랜스포머에서 자주 쓰는 분할:
◦
Column-parallel Linear: W ∈ [H, 4H]의 출력 차원(열)을 N-way로 쪼갬 → 각 GPU가 자기 열 블록만 곱.
◦
Row-parallel Linear: W ∈ [4H, H]의 입력 차원(행)을 분할 → 각 GPU의 부분 결과를 All-Reduce로 합침.
◦
주의: self-attention 헤드도 head-dim 기준으로 분할해 QKV/프로젝션 단계마다 가더/리듀스가 섞임.
통신
•
레이어마다 여러 번 발생(예: MLP 2회, 어텐션 2~4회 수준).
•
통신량은 보통 활성(activation) 크기에 비례하며, 시퀀스 길이/배치/히든 차원에 민감.
•
저지연·고대역 NVLink/NVSwitch 내에서 특히 효율적. 노드 간 TP는 레이턴시로 손해가 큼.
장점
•
단일 레이어가 한 GPU 메모리를 넘는 경우를 직접 해결(파라미터가 1/N로 쪼개짐).
•
병렬도(TP degree)를 높이면 연산 자체가 분산되어 단일 모듈의 벽을 허무는 데 최적.
단점
•
통신이 매우 빈번(계층마다) → 네트워크 품질에 민감.
•
구현 복잡(커스텀 분할, fused kernel, shape 규율).
•
텐서 차원이 분할 친화적이어야(예: H, 4H가 TP degree로 나누어떨어짐).
예시/팁
•
4-way TP, H=6144인 블록에서
◦
Column-parallel: 각 GPU는 W_col ∈ [6144, 24576/4]만 보유·계산, 출력 All-Gather 1회.
◦
Row-parallel: 각 GPU는 W_row ∈ [24576/4, 6144]만 보유·계산, 출력 All-Reduce 1회.
•
권장 맵핑: TP는 노드 내부(NVLink/NVSwitch) 에 묶고, 노드 간엔 가급적 피함.
Pipeline Parallelism (PP)
아이디어
•
레이어 블록을 스테이지로 나눠 GPU에 배치.
•
배치를 마이크로배치 M개로 쪼개 파이프에 흘려보냄.
•
스케줄:
◦
GPipe: 모든 F를 다 돈 뒤 모든 B(버블 큼).
◦
1F1B(PipeDream-Flush): warm-up 후 각 스텝에서 F와 B를 교차해 버블 감소.
◦
Interleaved: 스테이지를 더 쪼개 평준화/오버랩 증대.
통신
•
스테이지 경계에서 활성/그라드 P2P 전송(마이크로배치마다).
•
통신량은 보통 경계 텐서(시퀀스×히든) 크기에 좌우.
•
TP보다 빈도는 적지만, **마이크로배치 수(M)**가 작으면 경계 왕복 부담이 커짐.
M: PP에서 한 번의 옵티마이저 스텝 동안 연속으로 흘려보내는 마이크로배치 개수
장점
•
파라미터/옵티마/그라드 메모리 1/P로 감소(스테이지 수 P).
•
레이어 순서 보존, TP보다 구현 난도 낮음.
단점
•
파이프라인 버블: 대략 비효율 ≈ (P−1)/M. M이 작으면 손실 큼.
•
스테이지 로드 불균형(어텐션/MLP 비대칭) → 병목.
•
디버깅/체크포인트/오프로딩 경로가 복잡해질 수 있음.
예시/팁
•
24층 트랜스포머, 4-stage PP, M=8이면 버블 비율 ≈ (4−1)/8=37.5% → 1F1B와 Interleaved로 완화.
•
스테이지 경계는 활성 텐서가 작은 지점(예: 2D 패치 후 시퀀스 축소, 프로젝션 이후 등)으로 잡으면 통신 부담이 줄어듬.
•
PP는 노드 간 확장에 유리(경계 통신 패턴이 단순·예측 가능).
시간 → t1 t2 t3 t4 t5 t6 t7 t8 ...
Stage0 F#1 F#2 F#3 F#4 F#5 F#6 B#6 B#5 ...
Stage1 F#1 F#2 F#3 F#4 F#5 F#6 B#6 ...
Stage2 F#1 F#2 F#3 F#4 F#5 F#6 ...
Stage3 F#1 F#2 F#3 F#4 F#5 F#6 ...
Python
복사
3) DP/TP/PP vs DeepSpeed(ZeRO) (보강 비교)
아래는 “무엇을 나누는가 / 통신 패턴 / 메모리 / 구현 난도 / 권장 조합/시나리오” 관점의 비교입니다.
무엇을 ‘나누는가’
•
DP: 연산은 각자, **모델 상태(파라미터/그레디언드/옵티마이저)**는 모두 복제.
•
TP: 레이어 내부 텐서를 분할(연산 자체를 쪼갬).
•
PP: **레이어 블록(순차)**을 분할(연산 자체를 스테이지화).
→ 12-layer Transformer에서
•
Pipeline Parallelism은 레이어 0–6을 GPU0에, 레이어 7–11을 GPU2에 나눠서 붙이는 방법
•
메모리가 부족할 경우 해당 레이어 블록을 GPU0+1, GPU2+3로 Tensor Parallelism을 적용해서 내부 계산을 분산하는 방식
•
ZeRO: 연산은 DP와 동일한 형태를 유지하면서 모델 상태를 샤딩(Stage-1: 옵티마이저 / 2: +그레디언트 / 3: +파라미터).
통신 패턴(빈도·크기·위치)
•
DP: 스텝 말 그라드 All-Reduce 1회 중심(대용량 한 번).
•
ZeRO-1/2: 통신량은 DDP와 비슷(그라드/옵티마의 파티션 처리로 시점·버킷만 달라짐).
•
ZeRO-3: 포워드/백워드 중 레이어별로 파라미터 All-Gather/Shard, 백워드 후 그라드 Reduce-Scatter → 레이어마다 통신이 분산(총량은 DDP 대비 증가).
•
TP: 각 레이어마다 All-Reduce/All-Gather 다수(저지연/고대역 의존).
•
PP: 스테이지 경계 P2P 전송(M에 비례해 빈번), 경계 텐서 크기에 좌우.
메모리 관점
•
DP: 상태 전부 중복 → 가장 큼.
•
TP: 파라미터 1/T, 일부 활성도 축에 따라 줄어듦(완전 1/T는 아님). 옵티마이저/그레디언트는 각 분할에 상응해 감소.
•
PP: 파라미터/옵티마이저/그레디언트는 1/P, 다만 M개의 in-flight 활성이 스테이지별로 상주.
•
ZeRO-3: 상태 전체(파라미터/그라드/옵티마)를 1/N_d로 분할(필요 순간만 수집). DP 코드 감각 유지하면서 메모리 대폭 절약. CPU/NVMe 오프로딩과 결합 가능.
구현 난도/코드 변경
•
낮음: DP(DDP) ≲ ZeRO(설정/런처 중심).
•
중간: PP(스테이지 나누기, 스케줄·체크포인트 관리).
•
높음: TP(커스텀 분할, 커널·shape 제약).
성능/확장 가이드(현실적인 조합)
•
단일 노드(8×GPU, NVLink)
◦
모델이 단일 GPU에 ‘한 번도’ 안 올라가면 → ZeRO-3/FSDP 또는 TP 필요.
◦
우선순위: ZeRO-2(+activation ckpt) → 안 되면 ZeRO-3/FSDP → 그래도 안 되면 TP 병행.
•
다중 노드(클러스터)
◦
노드 내부: TP(혹은 ZeRO-3)로 레이어/상태 분산.
◦
노드 간: PP로 스테이지 확장 + 바깥쪽에 DP(데이터 샤딩) 얹는 **하이브리드(DP×PP×TP×ZeRO)**가 일반적.
◦
규칙: TP는 노드 내부, PP는 노드 간, DP는 최외곽, ZeRO는 메모리 압축기로 전 범위에서 사용.
⇒ 모델 파라미터는 DP × PP × TP를 통해 분산하고, Optimizer state 는 ZeRO로 DP 축을 따라 샤딩(optimizer state 중복 문제 완화)한다
언제 무엇을 택할까 (의사결정 체크리스트)
•
A. 단일 레이어가 한 GPU에 안 들어간다 → TP가 필수(또는 ZeRO-3로 파라미터 샤딩 + 오프로딩, 그래도 안 되면 TP 추가).
•
B. 전체 모델은 들어가지만 옵티마이저/그레디언트 때문에 vram 터진다 → ZeRO-1/2(옵티마/그래드 샤딩)부터.
•
C. 노드 간로 크게 확장하고 싶다 → PP로 스테이지 분리(경계 텐서/버블 최적화) + 내부에서 TP/ZeRO.
•
D. 코드 변경 최소화 & 빠른 가동 → ZeRO-2/3(FSDP) 먼저 시도.
•
E. Throughput이 통신에 막힌다 →
◦
TP 빈도↓: TP degree를 낮추거나 NVLink 내로만 묶기.
◦
PP 버블↓: 마이크로배치 M 증가, 1F1B/Interleaved 채택, 스테이지 재밸런싱.
◦
ZeRO-3: 파라미터 프리패치/오버랩 옵션 조정.
간단 종합 예시(70B, 다중 노드)
•
각 노드 8×GPU: 노드 내부 TP=8(NVLink), ZeRO-1/2로 상태 샤딩.
•
노드 수 8개: PP=8 스테이지로 수직 확장(경계는 활성 텐서가 작은 지점에).
•
바깥에 DP=2~4로 데이터 샤딩 및 글로벌 배치 확장.
•
메모리는 TP×PP로 파라미터/옵티마이저가 분산, 통신은 **TP(내부 빈번)/PP(경계)/DP(스텝 말)**로 계층화.
•
필요 시 ZeRO-3(혹은 FSDP) 를 일부 스테이지/모듈에 적용해 파라미터 상주량을 더 줄임.