DeepSpeed


1. DeepSpeed란?

  • DeepSpeed는 Microsoft에서 개발한 PyTorch 기반의 라이브러리로
  • 대규모 딥러닝 모델의 학습을 가속하고 메모리 효율을 높이는 데 사용


한 줄 요약: DeepSpeed는 대규모 모델 학습을 위한 최적화된 라이브러리이며, 특히 ZeRO를 통해 GPU 메모리 부담을 획기적으로 줄일 수 있음


2. DeepSpeed의 핵심 기능

(1) ZeRO (Zero Redundancy Optimizer)

  • 효과: 메모리 사용량 감소

  • How? 기존 DDP보다 더 효율적으로 모델, 옵티마이저, 그래디언트를 여러 GPU에 분산 저장

  • 단계별 메모리 절약 (ZeRO-1, ZeRO-2, ZeRO-3)

    • ZeRO-1: 옵티마이저 상태만 분산
    • ZeRO-2: 옵티마이저 상태 + 그래디언트 분산
    • ZeRO-3: 모델 파라미터까지 분산 (FSDP와 유사)


from deepspeed import DeepSpeedConfig, init_distributed
import deepspeed

# ZeRO 설정
ds_config = {
    "train_micro_batch_size_per_gpu": 2,
    "zero_optimization": {
        "stage": 2  # ZeRO-2: 옵티마이저 상태와 그래디언트 분산
    }
}

# DeepSpeed 모델 초기화
model, optimizer, _, _ = deepspeed.initialize(model=model, config_params=ds_config)


(2) 3D 병렬화 (ZeRO + 모델 병렬화 + 데이터 병렬화)

  • DP (데이터 병렬화): 여러 GPU에서 동일한 모델을 학습 (DP, DDP)
  • MP (모델 병렬화): 모델을 여러 GPU에 나누어 저장 (Tensor Parallelism, Pipeline Parallelism)
  • ZeRO 메모리 최적화까지 적용

\(\rightarrow\) 초대형 모델 학습 가능!!


(3) Offload 기술 (CPU/NVMe Offloading)

(옵티마이저 상태 등의) 일부 연산을 “CPU 또는 NVMe로 이동”하여 GPU 메모리 부담을 줄임

ds_config = {
    "zero_optimization": {
        "stage": 3,  # ZeRO-3: 파라미터까지 분산 저장
        "offload_optimizer": {
            "device": "cpu"  # 옵티마이저 상태를 CPU로 오프로딩
        }
    }
}

model, optimizer, _, _ = deepspeed.initialize(model=model, config_params=ds_config)


(4) 자동 혼합 정밀도 학습 (FP16, BF16)

  • FP32 → FP16 변환: 연산 속도 증가 및 메모리 절약
  • NVIDIA의 Tensor Core 최적화 활용 가능.
ds_config = {
    "fp16": {
        "enabled": True  # FP16 연산 활성화
    }
}

model, optimizer, _, _ = deepspeed.initialize(model=model, config_params=ds_config)


(5) 비동기 I/O 및 체크포인트 최적화

  • 체크포인트 저장/불러오기 속도 향상
  • 여러 GPU에서 동시에 체크포인트 로드 가능


Gradient Checkpointing

순전파 시 모든 활성화 값(activation)을 저장하지 않고, 필요할 때 다시 계산해서 메모리 절약.

import torch
from torch.utils.checkpoint import checkpoint

class CheckpointedModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = torch.nn.Linear(512, 512)
        self.linear2 = torch.nn.Linear(512, 512)

    def forward(self, x):
        x = checkpoint(self.linear1, x)  
        x = checkpoint(self.linear2, x)  
        return x

model = CheckpointedModel()


Activation Partitioning

순전파 시 GPU에 저장되는 activation을 여러 GPU에 분산하여 메모리 절약.

ds_config = {
    "zero_optimization": {
        "stage": 3,
        "contiguous_gradients": True,
        "partition_activations": True  # Activation을 여러 GPU에 분산 저장
    }
}

model, optimizer, _, _ = deepspeed.initialize(model=model, config_params=ds_config)


3. Summary

DeepSpeed를 사용해야 하는 경우?

  • GPU 메모리가 부족한 경우 (ZeRO-3 + Offload 기능으로 해결)
  • 초대형 모델 (GPT-3, LLaMA 등) 학습을 해야 할 때
  • FSDP보다 더 세밀한 메모리 최적화가 필요할 때
  • 데이터 병렬화 + 모델 병렬화 + ZeRO를 동시에 활용할 때


Summary Table

DeepSpeed 기능 역할 코드
ZeRO 옵티마이저 상태, 그래디언트, 파라미터를 분산 저장 zero_optimization 설정
Gradient Checkpointing Activation을 다시 계산하여 메모리 절약 torch.utils.checkpoint 사용
Offload 옵티마이저 상태를 CPU/NVMe로 이동 "offload_optimizer" 설정
FP16/BF16 반정밀도 연산으로 메모리 절약 및 속도 향상 "fp16": {"enabled": True}
Activation Partitioning Activation을 여러 GPU에 분산 저장 "partition_activations": True