Pipeline Parallelism
파이프라인 병렬 처리는 모델의 연속된 레이어를 서로 다른 GPU에 배치하고 마이크로배치를 순차적으로 전달하므로, 단일 GPU보다 큰 모델도 학습할 수 있습니다.
파이프라인 병렬화는 분산 학습 기법으로, 신경망을 깊이 방향으로 여러 연속 레이어 그룹인 스테이지로 나누고 각 스테이지를 별도의 GPU에 배치한 뒤 한 스테이지의 활성값을 다음 스테이지로 전달합니다. 모든 GPU를 계속 사용하기 위해 각 배치를 더 작은 마이크로배치로 나누고, 조립 라인의 부품처럼 스테이지들을 통과하게 합니다. 이를 레이어 간 모델 병렬화라고도 합니다. Yanping Huang이 이끈 Google 연구진은 2018년 11월 GPipe를 통해 마이크로배치 접근 방식을 널리 알렸습니다. 연구진은 5억 5,700만 개의 파라미터를 가진 AmoebaNet을 학습하여 ImageNet에서 top-1 정확도 84.4%를 달성했으며, 60억 개의 파라미터와 128개 레이어를 갖춘 다국어 번역용 트랜스포머도 학습했습니다.
마이크로배치와 파이프라인 버블#
한 번에 배치 하나만 처리하면 한 스테이지만 작업하고 나머지는 대기합니다. 스테이지 2는 스테이지 1이 끝나야 시작할 수 있으며, 역전파 중에는 순서가 반대로 바뀝니다. 마이크로배치를 사용하면 스테이지 1이 첫 번째 마이크로배치를 스테이지 2에 넘기는 즉시 두 번째 마이크로배치를 시작할 수 있습니다. 파이프라인을 채우고 비우는 동안 남는 유휴 슬롯을 버블이라고 합니다. 스테이지 4개와 마이크로배치 6개를 사용하는 GPipe 방식의 순전파 스케줄을 출력하면 다음과 같은 모양이 됩니다.
stages, micro_batches = 4, 6
steps = micro_batches + stages - 1 # time steps until the last micro-batch leaves the last stage
for stage in range(stages):
row = ""
for t in range(steps):
m = t - stage # stage s starts micro-batch m once stage s-1 hands it over
row += f" F{m}" if 0 <= m < micro_batches else " ."
print(f"GPU {stage}:{row}")
# Every stage idles for stages - 1 of the steps, in the forward and again in the backward pass
bubble = (stages - 1) / steps
print(f"Idle fraction: {bubble:.0%}")출력은 계단 형태입니다. GPU 0은 처음 아홉 단계 중 여섯 단계에서 F0부터 F5까지 순전파를 수행한 뒤 대기하고, GPU 3은 세 단계 동안 대기한 다음 F0를 시작하며, 마지막 줄은 Idle fraction: 33%입니다. 버블 비율은 (스테이지 수 − 1) / (마이크로배치 수 + 스테이지 수 − 1)이므로, 동일한 4개 스테이지를 통과하는 마이크로배치를 24개로 늘리면 버블이 11%로 줄어듭니다. 모든 마이크로배치의 그래디언트는 단일 옵티마이저 단계 전에 합산되며, 이는 그래디언트 누적과 동일한 계산이므로 전체 배치로 학습할 때와 같은 업데이트가 이루어집니다. GPipe는 각 스테이지 내의 활성값도 버리고 역전파 중에 다시 계산하는데, 이는 그래디언트 체크포인팅의 한 형태입니다.
파이프라인 스케줄#
이후의 스케줄은 메모리 사용량을 줄이거나 버블을 축소하기 위해 동일한 작업의 순서를 바꿉니다.
- 1F1B: 2018년 PipeDream 시스템에서 도입되었으며, 파이프라인이 가득 찬 뒤 각 스테이지에서 순전파 마이크로배치 하나와 역전파 마이크로배치 하나를 번갈아 처리합니다. 그러면 각 스테이지는 모든 마이크로배치가 아니라 스테이지 수만큼의 마이크로배치에 대해서만 활성값을 보유합니다.
- 인터리브 1F1B: 각 GPU에 여러 개의 더 작고 서로 인접하지 않은 스테이지를 할당합니다. NVIDIA의 Megatron-LM 팀은 이 방식으로 처리량이 10% 이상 향상되었다고 보고했으며, 3,072개 GPU에서 1조 파라미터 모델을 502 petaFLOP/s로 학습해 최고 성능의 52%를 달성했습니다.
- 제로 버블: 역전파를 두 부분으로 나눕니다. 이전 스테이지가 기다리는 스테이지 입력에 대한 그래디언트와, 나중에 유휴 슬롯을 채울 수 있는 가중치 그래디언트입니다. 메모리 예산이 비슷한 조건에서 처리량이 1F1B보다 최대 23% 높습니다.
PyTorch는 파이프라이닝 API에서 이를 ScheduleGPipe, Schedule1F1B, ScheduleInterleaved1F1B, ScheduleInterleavedZeroBubble, ScheduleDualPipeV로 제공합니다. 이 API는 모델을 스테이지로 나누기도 합니다. DualPipe는 DeepSeek-V3에서 비롯되었으며, DeepSeek-V3 팀은 16개의 파이프라인 스테이지를 사용해 계산과 통신을 겹쳐 실행하고 버블을 줄였습니다.
파이프라인 병렬화의 적용 분야#
스테이지는 마이크로배치마다 경계에서 활성값만 한 번씩 교환하므로, 파이프라인 병렬화는 모든 레이어 내부에서 통신하는 텐서 병렬화보다 서버 간 연결 속도가 느린 환경에 더 적합합니다. 따라서 대규모 학습에서는 두 방식을 함께 사용합니다. Meta는 Llama 3 405B를 학습할 때 각 8-GPU 서버 내에서 8방향 텐서 병렬화를, 서버 간에는 16개 파이프라인 스테이지를, 64~128개 복제본 간에는 데이터 병렬화를 사용했습니다. vLLM과 같은 서빙 엔진도 대규모 언어 모델(LLM)에 노드가 두 개 이상 필요할 때 동일한 분할 방식을 사용합니다. 가장 느린 스테이지가 전체 파이프라인의 속도를 결정합니다. 또한 언어 모델의 첫 번째와 마지막 스테이지에는 임베딩 테이블과 출력 레이어도 포함되므로, Llama 3에서는 두 스테이지에 각각 트랜스포머 레이어를 하나씩 적게 배정했습니다.
관련 접근 방식은 작업을 다른 방식으로 분할합니다.
- 텐서 병렬화: 각 레이어 내부의 가중치 행렬을 분할하므로 모든 GPU가 모든 레이어에 참여합니다.
- 컨텍스트 병렬화: 긴 입력 시퀀스를 여러 GPU에 나눕니다.
- 분할 학습: 네트워크를 깊이 방향으로 나누는 방식이지만 조직 간에 분할하므로, 데이터 소유자가 후속 레이어를 실행하는 서버에 원시 데이터를 보내지 않습니다.
데이터 병렬화는 모든 GPU에 모든 레이어를 유지하고 대신 배치를 나눕니다. 모델이 단일 장치에 들어가는 경우에는 이 방식만으로 충분합니다. Ultralytics YOLO26은 여러 GPU에서 이 방식으로 학습합니다. 학습 모드에서 device=[0, 1, 2, 3] 및 batch=64를 사용하면 각 GPU가 전체 객체 탐지 모델로 이미지 16개를 처리하고, PyTorch DistributedDataParallel은 각 역전파가 끝난 후 GPU 간 그래디언트를 평균화합니다.










