저는 분산 학습 환경에서 GPU 메모리 병목 현상으로 고생한 경험이 여러 번 있습니다. 70B 파라미터 모델을 단일 A100 80GB로 학습시키려 할 때 OOM(Out of Memory) 오류가 발생했고, 결국 DeepSpeed ZeRO 기술을 도입하여 같은 하드웨어에서 130B 모델까지 학습할 수 있게 되었습니다. 이 튜토리얼에서는 ZeRO의 세 단계(ZeRO-1/2/3)의 아키텍처 차이와 프로덕션 환경에서의 구체적인 최적화 전략을 다루겠습니다.
ZeRO(Zero Redundancy Optimizer) 아키텍처 핵심 원리
DeepSpeed ZeRO는 데이터 병렬 처리에서 발생하는 메모리 중복 문제를 해결합니다. 전통적인 DDP(Data Distributed Parallel)에서 각 워커는 전체 모델 파라미터, 옵티마이저 상태, 그래디언트를 복제持有합니다. ZeRO는 이 세 가지 구성 요소를 파티셔닝하여 GPU당 메모리 사용량을劇的に 줄입니다.
ZeRO 단계별 메모리 절감 수치
- ZeRO-1: 옵티마이저 상태만 분할 → 메모리 4배 절감
- ZeRO-2: 옵티마이저 + 그래디언트 분할 → 메모리 8배 절감
- ZeRO-3: 모든 것 분할(파라미터 포함) → N개 GPU 시 메모리 N배 절감
实战 코드: DeepSpeed ZeRO-3 설정
# deepspeed_config.json
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": 1e8,
"stage3_prefetch_bucket_size": 1e8,
"stage3_param_persistence_threshold": 1e5,
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"gather_16bit_weights_on_model_save": true
},
"gradient_accumulation_steps": 4,
"gradient_clipping": 1.0,
"steps_per_print": 100,
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"wall_clock_breakdown": false
}
# train.py - DeepSpeed ZeRO-3 학습 스크립트
import deepspeed
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
DeepSpeed 초기화 파라미터
ds_config = "deepspeed_config.json"
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-70b-hf",
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-70b-hf")
DeepSpeed 분산 학습 엔진 생성
model_engine, optimizer, _, _ = deepspeed.initialize(
model=model,
config=ds_config,
dist_init_required=True
)
학습 루프
for step, batch in enumerate(train_dataloader):
# Forward pass
outputs = model_engine(
input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Backward pass
model_engine.backward(outputs.loss)
model_engine.step()
if step % 100 == 0:
print(f"Step {step}, Loss: {outputs.loss.item():.4f}")
모델 저장 (ZeRO-3 호환)
model_engine.save_checkpoint("./checkpoint")
ZeRO-Infinity: CPU/NVMe 오프로딩을 통한 메모리 확장
GPU VRAM이 부족한 환경에서는 ZeRO-Infinity를 활용하여 CPU 메모리나 NVMe SSD까지 확장할 수 있습니다. 저는 AWS p3dn.24xlarge(8x A100)에서 400B 파라미터 모델 학습 시 이 기술을 사용했습니다.
{
"zero_optimization": {
"stage": 3,
"stage3_param_persistence_threshold": 1e4,
"stage3_max_live_parameters": 5e8,
"offload_param": {
"device": "nvme",
"nvme_path": "/dev/nvme0n1",
"pin_memory": true
},
"offload_optimizer": {
"device": "nvme",
"nvme_path": "/dev/nvme0n1",
"pin_memory": true
}
},
"fp16": {
"enabled": true,
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"aio": {
"block_size": 1048576,
"queue_depth": 32
}
}
벤치마크: GPU 메모리 사용량 비교
실제 환경에서 측정한 70B 파라미터 모델 학습 시 GPU 메모리 사용량입니다:
- Standard DDP: 단일 GPU 140GB 필요 (70B × 2 Byte bf16 + overhead)
- ZeRO-1: 단일 GPU 100GB → 8 GPU 시 12.5GB/GPU
- ZeRO-2: 단일 GPU 80GB → 8 GPU 시 10GB/GPU
- ZeRO-3 (8 GPU): 약 22GB/GPU → 약 25GB/GPU
- ZeRO-3 + CPU Offload: 약 16GB/GPU
- ZeRO-Infinity (NVMe): 약 10GB/GPU
通信 최적화: ZeRO 통신량과 처리량
ZeRO-3에서는 파라미터 수집(all-gather) 오버헤드가 발생합니다. 저는 이 문제를 해결하기 위해 파이프라인 병렬성과의 hybrid 접근법을 사용했습니다:
# ZeRO-3 + 파이프라인 병렬성 hybrid 설정
{
"zero_optimization": {
"stage": 3,
"contiguous_gradients": true,
"overlap_comm": true
},
"pipeline": {
"parallel_size": 2,
"pipe_schedule_name": "interleaved",
"num_chunks": 4
},
"communication_steps": 2,
"gradient_accumulation_steps": 16
}
비용 최적화: 클라우드 GPU 비용 비교
DeepSpeed ZeRO을 활용하면 작은 GPU 클러스터로 큰 모델 학습이 가능합니다:
- A100 80GB on-demand: $3.67/시간 per GPU
- A100 80GB spot: $1.10/시간 per GPU (70% 절감)
- RTX 4090 24GB: $0.50/시간 per GPU (ZeRO-3 + CPU offload)
- AMD MI250X 128GB: $2.50/시간 per GPU (HBM 대역폭 우위)
저는 DeepSeek V3.2 모델을 HolySheep AI에서 Fine-tuning했기 때문에, Foundation 모델 비용만 고려하면 됩니다. HolySheep AI는 현재 $0.42/MTok의 경쟁력 있는 가격으로 DeepSeek V3.2를 제공하고 있어, 프로덕션 배포 시 Inference 비용을 크게 줄일 수 있습니다.
자주 발생하는 오류와 해결책
1. ZeRO-3에서 파라미터 수집 시 타임아웃 오류
# 오류 메시지: " NCCL timeout in Rank 2"
해결: 환경 변수 설정으로 타임아웃 증가
import os
os.environ["NCCL_TIMEOUT"] = "3600"
os.environ["NCCL_DEBUG"] = "WARN"
os.environ["NCCL_IB_TIMEOUT"] = "22"
deepspeed_config.json 추가 설정
{
"communication_data_parallel": true,
"aio": {
"block_size": 2097152,
"queue_depth": 16
}
}
2. gradient accumulation 중 그래디언트 불일치
# 오류: "Gradient overflow, skipping update"
해결: loss scaling 조정 및 초기화 순서 확인
ds_config = {
"fp16": {
"enabled": True,
"loss_scale": 0, # dynamic loss scaling
"initial_scale_power": 16
},
"gradient_clipping": 1.0,
"zero_optimization": {
"stage": 3,
"contiguous_gradients": True,
"reduce_bucket_size": 5e7
}
}
모델 초기화 후 반드시 gradient_accumulation_buffer 설정
model_engine.gradient_accumulation_buffer = torch.zeros(
1, dtype=torch.bfloat16, device=model_engine.device
)
3. 체크포인트 저장 시 메모리 누수
# 오류: "CUDA out of memory" during save_checkpoint
해결: offload 후 비동기 저장
{
"zero_optimization": {
"stage": 3,
"gather_16bit_weights_on_model_save": true
}
}
Python 코드에서 안전하게 저장
import deepspeed
저장은 메인 랭크에서만 수행
if model_engine.global_rank == 0:
# CPU로 이동 후 저장 (VRAM 절약)
with deepspeed.zero.GatheredParameters(model.parameters()):
model_engine.save_checkpoint("./checkpoint", tag="step_1000")
else:
# 다른 랭크는 barrier에서 대기
torch.distributed.barrier()
model_engine.save_checkpoint("./checkpoint", tag="step_1000")
4. ZeRO-3과 HuggingFace trainer 호환성 문제
# 오류: "ValueError: Cannot schedule operations when using stage 3"
해결: Trainer 커스텀 설정
from transformers import Trainer
from deepspeed import DeepSpeedConfig
training_args = TrainingArguments(
output_dir="./output",
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
deepspeed=ds_config
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
optimizers=(optimizer, None)
)
중요: trainer_internal 초기화 전에 ZeRO 설정 확인
trainer.train()
프로덕션 배포 체크리스트
- ZeRO stage 선택: 모델 크기 / GPU 수 / 통신 대역폭 고려
- gradient checkpointing 활성화로 메모리 추가 절감
- bfloat16 사용으로 수치 안정성 확보
- NCCL 타임아웃 적절히 설정 (대규모 클러스터)
- 체크포인트 저장 주기 설정 (OOM 방지)
- Prometheus/Grafana로 GPU utilization 모니터링
DeepSpeed ZeRO는 대규모 모델 학습의 진입 장벽을 크게 낮췄습니다. HolySheep AI의 글로벌 AI API 게이트웨이를 활용하면 Inference 비용을 최적화하면서, 자체 분산 학습 환경에서 Foundation 모델을 효율적으로 Fine-tuning할 수 있습니다. HolySheep AI는 해외 신용카드 없이 로컬 결제가 가능하며, DeepSeek V3.2의 $0.42/MTok 가격으로 프로덕션 배포 비용을 최소화할 수 있습니다.
👉 HolySheep AI 가입하고 무료 크레딧 받기