Skip to content

DeepSpeed ZeRO-3 全参数分片实践

ZeRO-3 是 DeepSpeed 最激进的显存优化方案,将模型参数、梯度和优化器状态全部分片。本文介绍 ZeRO-3 的生产配置和性能调优实践。

DeepSpeed ZeRO-3实践

完整配置

python
# ZeRO-3 生产配置
ds_config = {
    "zero_optimization": {
        "stage": 3,

        # 参数分片配置
        "overlap_comm": True,
        "contiguous_gradients": True,
        "reduce_bucket_size": 5e8,          # 梯度归约桶大小
        "stage3_prefetch_bucket_size": 5e8,  # 参数预取桶大小
        "stage3_param_persistence_threshold": 1e5,  # 小参数不分片
        "stage3_max_live_parameters": 1e9,   # 同时在 GPU 上的最大参数量
        "stage3_max_reuse_distance": 1e9,    # 参数复用距离

        # CPU Offload(可选)
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": True,
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": True,
        },

        # 通信优化
        "sub_group_size": 1e8,
        "round_robin_gradients": True,
    },

    "gradient_accumulation_steps": 4,
    "train_batch_size": 128,
    "fp16": {
        "enabled": True,
        "loss_scale": 0,
        "initial_scale_power": 16,
    },
}

参数预取优化

ZeRO-3 在前向传播时需要 AllGather 参数,预取策略决定了通信与计算的重叠程度:

python
# 启动训练
deepspeed --num_gpus=8 train.py \
    --deepspeed ds_config_zero3.json \
    --model_name meta-llama/Llama-2-7b-hf \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4

关键调优参数

参数作用推荐值
reduce_bucket_size梯度归约粒度5e8 - 1e9
stage3_prefetch_bucket_size参数预取粒度5e8 - 1e9
stage3_max_live_parametersGPU 上活跃参数上限1e9 - 2e9
stage3_param_persistence_threshold不分片的小参数阈值1e5

CPU Offload 实践

ZeRO-3 + CPU Offload 可以在有限 GPU 上训练超大模型:

python
# ZeRO-3 + CPU Offload 训练 70B 模型(4×A100-40GB)
ds_config_offload = {
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {"device": "cpu", "pin_memory": True},
        "offload_param": {"device": "cpu", "pin_memory": True},
    },
}
配置GPU 显存CPU 内存训练速度
ZeRO-3 (8GPU)40GB × 864GB100%
ZeRO-3 + Offload (4GPU)40GB × 4512GB~35%
ZeRO-3 + Offload (2GPU)80GB × 2512GB~20%

Offload 优化

  • 使用 pin_memory=True 加速 CPU-GPU 数据传输
  • NVMe Offload 可将优化器状态卸载到 SSD,进一步降低 CPU 内存需求
  • Offload 场景建议使用 gradient_accumulation_steps ≥ 8 隐藏 CPU-GPU 传输延迟

Offload 性能代价

CPU Offload 会显著降低训练速度(约 3-5 倍)。仅在 GPU 显存不足时使用。如有条件,优先增加 GPU 数量而非使用 Offload。

相关资源

最近更新