Pipeline Parallelism
파이프라인 병렬 처리가 딥러닝 모델을 여러 GPU에 분할하는 방식을 알아보세요. 메모리 부족 오류를 방지하고 분산 학습을 최적화하는 방법을 살펴보세요.
파이프라인 병렬화는 모델을 깊이 방향으로 분할하여 GPU와 같은 여러 컴퓨팅 장치에 대규모 신경망 (NN)을 분산하도록 설계된 고급 분산 학습 기법입니다. 최신 아키텍처의 모델 가중치와 optimizer 상태가 단일 accelerator의 메모리 한도를 초과하면 엔지니어는 네트워크의 순차적 레이어를 여러 "스테이지"로 분할합니다. 예를 들어 처음 10개 레이어를 GPU 0에 배치하고 다음 10개 레이어를 GPU 1에 배치할 수 있습니다. 순전파 중에는 데이터가 한 장치에서 다음 장치로 흐릅니다. 이러한 장치를 연결하면 연구자들은 하드웨어로 인해 발생하는 메모리 부족 오류 없이 대규모 딥러닝 (DL) 알고리즘을 학습할 수 있습니다.
파이프라인 병렬화 작동 방식#
레이어를 장치 간에 나누는 단순한 구현은 "파이프라인 버블"이라는 심각한 비효율을 초래합니다. 레이어가 순차적으로 처리되므로 GPU 0이 초기 레이어를 처리하는 동안 GPU 1은 완전히 유휴 상태가 됩니다. 하드웨어 활용률을 극대화하기 위해 최신 파이프라인 스케줄러는 전체 배치 크기를 더 작은 "마이크로 배치"로 나눕니다.
전체 배치가 완료되기를 기다리는 대신 GPU 0은 첫 번째 마이크로 배치를 GPU 1에 전달하는 즉시 두 번째 마이크로 배치 처리를 시작합니다. Microsoft DeepSpeed 및 PyTorch Distributed Pipelining API와 같은 도구는 일반적으로 1F1B (순전파 1회, 역전파 1회) 스케줄링 전략을 사용합니다. 이 방법은 서로 다른 마이크로 배치에 대해 순전파와 역전파를 번갈아 동시에 계산하여 파이프라인 버블과 메모리 사용량을 크게 줄입니다. 최근 2024년과 2025년의 발전으로는 컴퓨팅 클러스터 전체의 유휴 시간을 거의 제거하는 optimizer 인식 가중치 예측 전략인 Zero Bubble Pipeline Parallelism도 도입되었습니다.
관련 병렬화 기법 구분#
파이프라인 병렬화는 분산 컴퓨팅 전략으로 구성된 더 넓은 생태계의 일부로 작동합니다. AI 모델을 효과적으로 확장하려면 각 기법의 차이점을 이해하는 것이 중요합니다:
- 모델 병렬화: 모델을 장치 간에 분할하는 포괄적인 용어입니다. 파이프라인 병렬화는 모델 병렬화의 매우 구체적인 형태로, 아키텍처를 깊이 방향에 따라 순차적으로 분할합니다.
- 텐서 병렬화: 파이프라인 병렬화의 깊이 방향 분할과 달리 텐서 병렬화는 개별 행렬 연산을 GPU 간에 수평으로 분할합니다. 이 두 기법은 처리량을 극대화하기 위해 자주 결합됩니다.
- 데이터 병렬화: 데이터 병렬화는 모든 GPU에 전체 모델을 복제하고 학습 데이터를 각 GPU에 분산합니다. 단일 장치의 VRAM에 기본적으로 들어갈 수 있는 객체 탐지 및 이미지 세그멘테이션 아키텍처인 Ultralytics YOLO26 모델처럼 작고 고도로 최적화된 모델의 경우, PyTorch의 DistributedDataParallel (DDP)을 통한 데이터 병렬화가 학습을 가속하는 데 선호되는 방법입니다.
AI 및 ML의 실제 활용 사례#
복잡한 인프라를 확장하는 것은 최신 최첨단 AI 시스템을 구축하는 데 필수적입니다:
- 기반 모델 학습: Meta의 Llama 3와 같은 거대한 대규모 언어 모델 (LLMs) 및 기반 모델을 개발하려면 텐서 병렬화, 데이터 병렬화, 파이프라인 병렬화를 결합해야 합니다. NVIDIA Megatron-LM과 같은 프레임워크는 이러한 전략을 활용하여 AWS SageMaker와 같은 클라우드 플랫폼에서 수천 개의 GPU에 걸쳐 대규모 전문가 혼합 (MoE) 아키텍처를 학습합니다.
- 고해상도 의료 진단: 헬스케어 분야의 AI 및 과학적 모델링에서는 3D 볼륨 스캔으로 인해 단일 accelerator에 담기에는 너무 큰 activation이 생성되는 경우가 많습니다. 네트워크 레이어를 노드 간에 파이프라인으로 처리하면 연구 병원에서 이미지 해상도를 저하하지 않고 방대한 MRI 데이터셋으로 심층 네트워크를 학습할 수 있습니다.
코드 예제: 레이어 분할 개념#
과거에는 장치 간에 레이어를 분산하려면 복잡한 사용자 지정 코드가 필요했습니다. 오늘날에는 기본 로직을 사용하여 특정 레이어를 서로 다른 장치 식별자에 매핑합니다. 다음은 PyTorch에서 네트워크 스테이지를 장치 간에 분할하는 방식을 개념적으로 나타낸 것으로, 파이프라인 병렬 연산의 기반을 마련합니다:
import torch.nn as nn
class SimplePipelineModel(nn.Module):
def __init__(self):
super().__init__()
# Stage 1 is assigned to the first GPU
self.stage1 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:0")
# Stage 2 is assigned to the second GPU
self.stage2 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:1")
def forward(self, x):
# The forward pass seamlessly crosses device boundaries
x_out = self.stage1(x.to("cuda:0"))
return self.stage2(x_out.to("cuda:1"))기반 모델을 생성하려면 복잡한 오케스트레이션이 필요하지만, 빠르고 확장 가능한 컴퓨터 비전 (CV) 프로젝트를 배포하는 작업은 일반적으로 더 간단합니다. 간소화된 모델 배포와 자동화된 multi-GPU 활용을 위해 개발자는 Ultralytics Platform이 워크로드를 자동으로 확장하도록 활용합니다. 강력한 모델 학습 팁을 활용하는 이 플랫폼은 인프라 관리를 추상화하여 엔지니어가 실시간 추론이 가능한 정확한 AI 솔루션 구축에 전적으로 집중할 수 있도록 합니다.









