Transformers documentation
DDP
시작하기
기본 클래스
모델
Preprocessors
추론
Pipeline API
Generate API
최적화
모델과 대화하기
서빙
학습
하드웨어
양자화
생태계 통합
리소스
API
You are viewing main version, which requires installation from source. If you'd like
regular pip install, checkout the latest stable version (v5.22.1).
DDP
DistributedDataParallel (DDP)은 각 GPU에 모델의 전체 사본을 유지합니다. 각 GPU는 겹치지 않는 데이터 샤드를 전방 및 역방향 패스로 처리합니다. 옵티마이저 단계 전에, 올리듀스(all-reduce)가 모든 GPU에 걸쳐 기울기를 평균화하여 모든 모델 사본이 동일하게 유지되도록 합니다. 모델이 단일 GPU에 맞을 때 DDP를 사용하세요.
┌─────────────────┐
│ training data │
└────────┬────────┘
┌──────────────────┼──────────────────┐
│ shard 0 │ shard 1 │ shard 2
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ model │ │ model │ │ model │
│ (copy 0) │ │ (copy 1) │ │ (copy 2) │
│ GPU 0 │ │ GPU 1 │ │ GPU 2 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ grads │ grads │ grads
└──────────────────┼──────────────────┘
all-reduce
(average gradients)
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ optimizer │ │ optimizer │ │ optimizer │
│ step │ │ step │ │ step │
└─────────────┘ └─────────────┘ └─────────────┘
(identical) (identical) (identical)멀티프로세스 런처인 Accelerate와 같이 실행하면 DDP가 자동으로 활성화됩니다.
# 4 GPUs on one machine
accelerate launch --num_processes 4 train.pyDDP 구성
DDP 동작을 제어하려면 이 TrainingArguments를 전달하세요.
gradient_accumulation_steps()는 all-reduce를 수행하는 시점을 결정합니다. Trainer는 중간 누적 단계에서는 all-reduce를 건너뛰고 최종 micro-batch에서만 실행합니다. 예를 들어,gradient_accumulation_steps=4인 경우 all-reduce는 4번의 backward pass마다 실행됩니다.~TrainingArguments.ddp_find_unused_parameters는 forward pass가 끝난 시점에 그래디언트를 받지 않을 파라미터를 autograd 그래프에서 탐색하여 ready 상태로 표시함으로써 all-reduce가 차단되지 않도록 합니다.~TrainingArguments.gradient_checkpointing과 함께 사용하지 마세요. gradient checkpointing은 중간 activations를 폐기하고 필요할 때 다시 계산하기 때문입니다.~TrainingArguments.ddp_bucket_cap_mb는 backward pass 동안 그래디언트를 단일 all-reduce로 배치하기 위한 버킷 크기입니다. 버킷이 클수록 all-reduce 호출 횟수가 줄어들고 런치 오버헤드가 감소합니다.~TrainingArguments.ddp_broadcast_buffers는 모든 forward pass 시작 시 rank 0에서 다른 모든 rank로 모델 버퍼(BatchNorm 실행 통계 등)를 동기화합니다. 모델이 LayerNorm만 사용하는 경우 비활성화하세요.~TrainingArguments.gradient_checkpointing과 함께 사용하지 마세요.~TrainingArguments.ddp_backend은 통신 백엔드를 설정합니다. NVIDIA GPU에는"nccl"을(를) 사용하세요(기본값이며 가장 빠름), CPU 학습이나 디버깅에는"gloo"를(를) 사용하고, 기타 하드웨어에는"xccl","hccl"또는"cncl"을(를) 사용하세요.ddp_timeout()은 모든 프로세스와 연산(all-reduce, broadcast)이 완료되는 데 걸리는 시간 한도를 설정합니다. 대형 모델을 느리게 로드하는 경우와 같이 프로세스가 멈추면, 타임아웃이 무한정 차단되는 대신 오류를 발생시킵니다.
from transformers import TrainingArguments
args = TrainingArguments(
...,
gradient_accumulation_steps=4,
ddp_backend="nccl",
ddp_find_unused_parameters=False,
ddp_bucket_cap_mb=25,
ddp_broadcast_buffers=True,
ddp_timeout=1800,
)다음 단계
- 단일 GPU에 맞지 않을 정도로 큰 모델을 학습하는 경우 FSDP를 참조하세요.
- ZeRO 최적화 및 오프로딩에 대해 DeepSpeed를 참조하세요.
- DDP의 작동 방식에 대한 자세한 내용은 The Ultra-Scale Playbook의 Data Parallelism 장을 참고하세요.