Pipeline Bubble은 어떻게 줄어드는가
Naive pipeline의 (P-1)/P idle ratio부터 GPipe, 1F1B, Interleaved, Chimera까지 — bubble 감소 4세대의 수학적 전개와 메모리 트레이드오프를 추적한다.
단일 GPU 메모리를 초과하는 모델을 학습하려면 레이어를 여러 GPU에 분할해야 한다. 문제는 레이어 간에 의존성이 존재한다는 것 — GPU 0이 끝나야 GPU 1이 시작할 수 있다. 이 순차 의존성이 만들어내는 idle time을 bubble이라 부른다. 4세대에 걸친 스케줄링 알고리즘이 이 bubble을 어떻게 줄여왔는가?
Naive Pipeline의 Bubble
개 GPU에 레이어를 균등 분할하고 단일 mini-batch를 순차 처리하면, 매 시점에 정확히 하나의 GPU만 활성화된다.
Time: 0 1 2 3 4 5 6 7 (P=4)
GPU 0: F . . . B . . .
GPU 1: . F . . . B . .
GPU 2: . . F . . . B .
GPU 3: . . . F . . . B
단일 mini-batch를 개 stage로 순차 처리할 때, GPU idle ratio는 다음과 같다.
따라서 effective throughput은 이상적 병렬화의 에 불과하다.
총 시간 . 각 GPU의 active time . 각 GPU의 idle time . 전체 idle ratio .
이면 87.5% bubble이다. 8대의 GPU를 빌려 1대 분량의 계산을 하는 셈이다.
GPipe — Micro-batching으로 Bubble을 희석한다
GPipe (Huang et al., 2019)의 핵심 아이디어는 단순하다. Mini-batch를 개 micro-batch로 쪼개 파이프라인에 연속으로 흘려보내면, GPU간 의존성을 더 세밀하게 겹칠 수 있다.
Time: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 (P=4, M=4)
GPU 0: F1 F2 F3 F4 B1 B2 B3 B4 . . . . . .
GPU 1: . F1 F2 F3 F4 B1 B2 B3 B4 . . . . .
GPU 2: . . F1 F2 F3 F4 B1 B2 B3 B4 . . . .
GPU 3: . . . F1 F2 F3 F4 B1 B2 B3 B4 . . .
개 micro-batch로 분할한 경우, bubble ratio는 다음과 같다.
총 시간 . 각 GPU의 active time . Idle time per GPU . Idle ratio .
이면 bubble 이다. 실용적 선택은 — 이때 bubble은 20% 미만이다.
대가가 있다. GPipe는 모든 개 micro-batch의 forward를 완료한 후 backward를 시작한다. 이 “all-forward-then-backward” 구조는 backward 직전까지 모든 activation을 메모리에 보유해야 한다 — activation memory .
1F1B — 같은 Bubble, 절약된 메모리
PipeDream (Narayanan et al., 2019)의 1F1B(1-Forward-1-Backward) schedule은 forward와 backward를 교대로 실행한다. 각 GPU가 한 micro-batch의 forward를 끝내면 가능한 가장 빠른 시점에 이전 micro-batch의 backward를 실행한다.
1F1B schedule 하에서 각 stage의 activation memory는 다음과 같다.
여기서 는 micro-batch당 activation 크기다.
GPU 가 forward 를 수행하면 (시간 ), 해당 activation은 GPU 에서 backward 가 실행될 때 (시간 )까지 보유된다. 이 duration 동안 GPU 가 동시에 보유하는 micro-batch 수는 최대 개 (dependency chain 깊이에 의해 제한된다).
Bubble ratio는 GPipe와 동일하다 — . Timeline의 총 길이가 로 같고 각 GPU의 active time도 으로 같기 때문이다. 1F1B의 기여는 bubble 감소가 아니라 activation memory를 에서 로 줄인 것이다. 인 대규모 학습에서 이 차이는 수십 GB에 달한다.
GPipe는 구현이 단순하고 staleness가 없다. 대신 activation memory가 으로 micro-batch 수에 비례한다. 1F1B는 activation memory를 로 제한하지만 forward-backward 교대 스케줄링이 더 복잡하다. 두 방식 모두 bubble ratio는 으로 동일하다.
Interleaved 1F1B — 한 GPU가 여러 Stage를 맡는다
1F1B의 한계는 파이프라인 깊이 에 있다. GPT-3 (96 레이어, )에서 bubble은 이다. 이를 20% 미만으로 낮추려면 가 필요하고, 이는 activation memory 급증으로 이어진다.
Megatron-LM (Narayanan et al., 2021)의 Interleaved 1F1B는 다른 접근을 취한다. 각 physical GPU가 개 virtual stage를 담당하게 한다. Physical GPU 8대에 를 적용하면 total depth 가 된다.
를 높일수록 bubble은 낮아진다. 대가는 activation memory — virtual stage당 레이어가 늘어나는 만큼 메모리도 증가한다.
# P_simple = 8GPUs, 1F1B: bubble = 7/(7+M)
# Interleaved V=4, P_eff = 32: bubble = 31/(31+M)
# 실제 bubble 비교 (M=32 기준):
# 1F1B: 7/39 ≈ 17.9%
# Interleaved: 31/63 ≈ 49.2% ← 더 나쁘다?
역설적으로 보이지만, Interleaved는 같은 GPU 수로 더 큰 모델을 수용할 때 의미 있다. 단순 1F1B로는 올릴 수 없는 96레이어 모델을 8 GPU에 올리면서, micro-batch 을 충분히 키워 bubble을 관리하는 전략이다.
Chimera — Bubble을 기하학적으로 반감시킨다
Li & Hoefler (2021)의 Chimera는 근본적으로 다른 접근을 취한다. Stage 0에서만 micro-batch를 주입하는 단방향 파이프라인 대신, stage 0과 stage 양쪽에서 동시에 micro-batch를 주입한다.
양쪽에서 동시에 파이프라인이 시작되면, warm-up과 cold-down이 절반으로 단축된다. 이론적 bubble은 다음과 같다.
일 때 비교하면:
| 방식 | Bubble ratio |
|---|---|
| 1F1B | |
| Chimera |
수치만 보면 개선폭이 작아 보인다. 실제 이점은 동일한 bubble을 절반의 으로 달성할 수 있다는 데 있다 — 즉 activation memory 압박이 줄어든다.
양방향 파이프라인을 위해 각 GPU는 두 파이프라인의 activation을 동시에 보유해야 한다 — activation memory 2배. 1F1B의 가 이미 수십 GB에 달하는 대규모 모델에서 이 2배는 종종 prohibitive하다. Chimera는 개념적으로 중요하지만 단독 사용보다는 selective recomputation이나 CPU offload와 결합해야 실용적이다.
정리
4세대 스케줄링 알고리즘의 진화를 하나의 표로 정리한다.
| 방식 | Bubble ratio | Activation memory | 핵심 아이디어 |
|---|---|---|---|
| Naive | Sequential | ||
| GPipe | Micro-batching | ||
| 1F1B | F-B 교대 | ||
| Interleaved | Virtual stage | ||
| Chimera | 양방향 주입 |
각 방식은 bubble과 메모리 사이의 다른 균형점을 선택한다. 실제 대규모 모델 학습(GPT-3, LLaMA 등)에서는 1F1B 또는 Interleaved 1F1B가 표준으로 자리잡았다. 다음 글에서는 이 파이프라인 병렬화 위에 ZeRO sharding이 어떻게 겹쳐지는지 추적한다.