DeepSpeed 的配置文件(通常为 JSON 格式,如 ds_config.json)是控制其优化功能的核心工具,涵盖了分布式训练、内存优化、检查点管理等多个方面。以下是 DeepSpeed 配置文件中常见配置项的完整例举和详细解释,旨在帮助理解每个选项的作用及其适用场景。为了便于管理,将配置项按功能分类,并提供示例值和注意事项。


1. 全局训练参数

这些参数定义训练的基本设置,影响批次大小、精度等。

配置项 类型 说明 示例值 注意事项
train_batch_size int 全局批次大小(所有 GPU 的总和)。DeepSpeed 会根据 GPU 数量自动推导每卡批次大小。 64 若设置,优先于 train_micro_batch_size_per_gpu
train_micro_batch_size_per_gpu int 每个 GPU 的微批次大小(micro-batch size)。用于梯度累积。 16 gradient_accumulation_steps 配合,决定有效批次大小。
gradient_accumulation_steps int 梯度累积步数。累积多次微批次梯度后更新参数。 4 有效批次大小 = train_micro_batch_size_per_gpu × gradient_accumulation_steps × GPU 数量。
steps_per_print int 每多少步打印一次训练日志。 100 设为较小值便于调试,过小可能影响性能。
wall_clock_breakdown bool 是否记录详细的训练时间分解(如通信、计算)。 false 开启后可用于性能分析,但会增加开销。

示例

{
  "train_micro_batch_size_per_gpu": 16,
  "gradient_accumulation_steps": 4,
  "steps_per_print": 100,
  "wall_clock_breakdown": false
}

2. 混合精度训练

DeepSpeed 支持 FP16 和 BF16 混合精度训练,降低显存占用并加速计算。

配置项 类型 说明 示例值 注意事项
fp16.enabled bool 启用 FP16 混合精度训练。 true 需要 GPU 支持 FP16(如 NVIDIA Volta 及以上)。
fp16.loss_scale float 初始损失缩放值(0 表示动态缩放)。 0 动态缩放通常更稳定。
fp16.initial_scale_power int 初始损失缩放的 2 的幂次(如 2^16)。 16 仅在 loss_scale 非 0 时有效。
fp16.loss_scale_window int 动态缩放的调整窗口(步数)。 1000 控制缩放调整频率。
fp16.min_loss_scale float 最小损失缩放值。 1 防止缩放过低导致数值不稳定。
fp16.hysteresis int 动态缩放的滞后步数。 2 减少频繁调整缩放的次数。
bf16.enabled bool 启用 BF16 混合精度训练。 false 适合支持 BF16 的硬件(如 NVIDIA Ampere)。

示例

{
  "fp16": {
    "enabled": true,
    "loss_scale": 0,
    "initial_scale_power": 16,
    "loss_scale_window": 1000,
    "min_loss_scale": 1,
    "hysteresis": 2
  },
  "bf16": {
    "enabled": false
  }
}

注意

  • FP16 和 BF16 不可同时启用。
  • BF16 数值范围更大,适合某些模型,但精度略低。

3. 零冗余优化器(ZeRO)

ZeRO 通过分片优化器状态、梯度和参数减少显存冗余。

配置项 类型 说明 示例值 注意事项
zero_optimization.stage int ZeRO 阶段(0=禁用,1=优化器状态分片,2=优化器状态+梯度分片,3=优化器状态+梯度+参数分片)。 2 Stage 3 显存节省最大,但通信开销高。
zero_optimization.allgather_partitions bool 是否在参数更新时收集所有分片。 true 通常设为 true 以确保正确性。
zero_optimization.reduce_scatter bool 是否使用 reduce-scatter 优化梯度聚合。 true 提高通信效率。
zero_optimization.contiguous_gradients bool 是否使用连续内存存储梯度。 true 减少内存碎片,提升性能。
zero_optimization.overlap_comm bool 是否重叠通信和计算。 true 降低通信开销,推荐启用。
zero_optimization.offload_optimizer.device string 优化器状态卸载设备(nonecpunvme)。 "cpu" 卸载到 CPU/NVMe 进一步节省显存。
zero_optimization.offload_optimizer.pin_memory bool 是否使用锁页内存加速 CPU-GPU 传输。 true 推荐启用以提高卸载效率。
zero_optimization.offload_param.device string 参数卸载设备(仅 Stage 3)。 "cpu" 需足够 CPU 内存或 NVMe 容量。
zero_optimization.offload_param.pin_memory bool 是否使用锁页内存加速参数传输。 true 同上。

示例

{
  "zero_optimization": {
    "stage": 2,
    "allgather_partitions": true,
    "reduce_scatter": true,
    "contiguous_gradients": true,
    "overlap_comm": true,
    "offload_optimizer": {
      "device": "cpu",
      "pin_memory": true
    },
    "offload_param": {
      "device": "cpu",
      "pin_memory": true
    }
  }
}

注意

  • Stage 3 需要多 GPU 和高效通信(如 NVLink)。
  • 卸载到 NVMe 需高性能存储设备。

4. 激活检查点(Activation Checkpointing)

激活检查点通过丢弃部分激活值并重新计算,减少显存占用。

配置项 类型 说明 示例值 注意事项
activation_checkpointing.enabled bool 启用激活检查点。 true 显著节省显存,但增加约 20%-30% 计算开销。
activation_checkpointing.partition_activations bool 是否将激活值分片到多 GPU。 true 适合分布式训练,需高效通信。
activation_checkpointing.contiguous_memory_optimization bool 是否优化激活内存分配,减少碎片。 true 推荐启用。
activation_checkpointing.checkpoint_ratio float 检查点比例(0.0 到 1.0,1.0 表示所有层)。 1.0 0.5 可平衡内存和计算。
activation_checkpointing.number_checkpoints int/null 手动指定检查点数量,null 表示自动。 null 通常设为 null 让 DeepSpeed 优化。

示例

{
  "activation_checkpointing": {
    "enabled": true,
    "partition_activations": true,
    "contiguous_memory_optimization": true,
    "checkpoint_ratio": 1.0,
    "number_checkpoints": null
  }
}

5. 模型检查点(Model Checkpointing)

模型检查点用于保存和恢复训练状态。

配置项 类型 说明 示例值 注意事项
checkpoint.enabled bool 启用模型检查点。 true 推荐启用以支持中断恢复。
checkpoint.save_interval int 保存检查点的步数间隔。 1000 平衡存储空间和恢复需求。
checkpoint.path string 检查点保存目录。 "./checkpoints" 确保目录可写且空间充足。
checkpoint.prefix string 检查点文件名前缀。 "model" 生成文件名如 model-step_1000
checkpoint.save_optimizer bool 是否保存优化器状态。 true 设为 false 可减少检查点大小。
checkpoint.save_lr_scheduler bool 是否保存学习率调度器状态。 true 通常与优化器一起保存。

示例

{
  "checkpoint": {
    "enabled": true,
    "save_interval": 1000,
    "path": "./checkpoints",
    "prefix": "model",
    "save_optimizer": true,
    "save_lr_scheduler": true
  }
}

6. 流水线并行(Pipeline Parallelism)

流水线并行将模型分阶段运行,适合超大模型。

配置项 类型 说明 示例值 注意事项
pipeline.enabled bool 启用流水线并行。 true 需要多 GPU 和模型层分割。
pipeline.micro_batch_size int 流水线微批次大小。 16 train_micro_batch_size_per_gpu 一致。
pipeline.stages int/string 流水线阶段数,"auto" 表示自动分配。 "auto" 通常设为 GPU 数量。
pipeline.schedule string 调度策略(如 1f1b、gpipe)。 "1f1b" 1f1b 效率高,适合大多数场景。

示例

{
  "pipeline": {
    "enabled": true,
    "micro_batch_size": 16,
    "stages": "auto",
    "schedule": "1f1b"
  }
}

7. 优化器和调度器

定义优化器和学习率调度器参数。

配置项 类型 说明 示例值 注意事项
optimizer.type string 优化器类型(如 AdamAdamW)。 "Adam" 需与 PyTorch 优化器兼容。
optimizer.params.lr float 学习率。 0.001 根据模型和任务调整。
optimizer.params.weight_decay float 权重衰减。 0.01 防止过拟合。
scheduler.type string 调度器类型(如 WarmupLR)。 "WarmupLR" 可选,需 DeepSpeed 支持。
scheduler.params.warmup_min_lr float 预热最小学习率。 0 预热阶段起始学习率。
scheduler.params.warmup_max_lr float 预热最大学习率。 0.001 通常与 optimizer.params.lr 一致。
scheduler.params.warmup_num_steps int 预热步数。 1000 控制预热阶段长度。

示例

{
  "optimizer": {
    "type": "Adam",
    "params": {
      "lr": 0.001,
      "weight_decay": 0.01
    }
  },
  "scheduler": {
    "type": "WarmupLR",
    "params": {
      "warmup_min_lr": 0,
      "warmup_max_lr": 0.001,
      "warmup_num_steps": 1000
    }
  }
}

8. 其他高级选项

DeepSpeed 提供一些高级配置,用于特定场景或性能优化。

配置项 类型 说明 示例值 适用场景
gradient_clipping float 梯度裁剪阈值。 1.0 防止梯度爆炸。
zero_force_ds_cpu_optimizer bool 强制在 CPU 上运行优化器(即使未卸载)。 false 调试或特定硬件优化。
communication_data_type string 通信数据类型(fp16bf16fp32)。 "fp16" 与混合精度设置一致。
amp.enabled bool 启用自动混合精度(AMP)。 false PyTorch 原生 AMP,与 fp16 互斥。
amp.fp16_backend string AMP 后端(apextorch)。 "torch" 仅在 amp.enabledtrue 时有效。

示例

{
  "gradient_clipping": 1.0,
  "communication_data_type": "fp16",
  "amp": {
    "enabled": false
  }
}

9. 完整配置文件示例

以下是一个综合配置,涵盖多种优化技术:

{
  "train_micro_batch_size_per_gpu": 16,
  "gradient_accumulation_steps": 4,
  "steps_per_print": 100,
  "wall_clock_breakdown": false,
  "fp16": {
    "enabled": true,
    "loss_scale": 0,
    "initial_scale_power": 16,
    "loss_scale_window": 1000,
    "min_loss_scale": 1,
    "hysteresis": 2
  },
  "zero_optimization": {
    "stage": 2,
    "allgather_partitions": true,
    "reduce_scatter": true,
    "contiguous_gradients": true,
    "overlap_comm": true,
    "offload_optimizer": {
      "device": "cpu",
      "pin_memory": true
    }
  },
  "activation_checkpointing": {
    "enabled": true,
    "partition_activations": true,
    "contiguous_memory_optimization": true,
    "checkpoint_ratio": 1.0,
    "number_checkpoints": null
  },
  "checkpoint": {
    "enabled": true,
    "save_interval": 1000,
    "path": "./checkpoints",
    "prefix": "model",
    "save_optimizer": true,
    "save_lr_scheduler": true
  },
  "pipeline": {
    "enabled": false,
    "micro_batch_size": 16,
    "stages": "auto",
    "schedule": "1f1b"
  },
  "optimizer": {
    "type": "Adam",
    "params": {
      "lr": 0.001,
      "weight_decay": 0.01
    }
  },
  "scheduler": {
    "type": "WarmupLR",
    "params": {
      "warmup_min_lr": 0,
      "warmup_max_lr": 0.001,
      "warmup_num_steps": 1000
    }
  },
  "gradient_clipping": 1.0,
  "communication_data_type": "fp16"
}

10. 配置注意事项

  • 优先级train_batch_size 优先于 train_micro_batch_size_per_gpu。若同时设置,需确保一致性。
  • 硬件依赖
    • FP16/BF16 需要支持相应精度的 GPU(如 NVIDIA Volta/Ampere)。
    • ZeRO Stage 3 和流水线并行需要多 GPU 和高效通信(如 NVLink)。
    • 卸载到 NVMe 需高性能存储。
  • 调试
    • 使用 wall_clock_breakdown 分析性能瓶颈。
    • 设置 --log_level DEBUG 查看详细日志。
  • 兼容性
    • 确保 DeepSpeed、PyTorch 和 CUDA 版本匹配。
    • 部分选项(如 amp)与 fp16 互斥,需仔细配置。

11. 适用场景建议

  • 小模型(<1B 参数):使用 ZeRO Stage 1 + FP16,简单高效。
  • 中大模型(1B-10B 参数):ZeRO Stage 2 + 激活检查点,平衡显存和性能。
  • 超大模型(>10B 参数):ZeRO Stage 3 + 流水线并行 + 激活检查点 + 卸载,最大化显存节省。
  • 显存紧张:优先启用激活检查点和卸载(offload_optimizer/offload_param)。
  • 多节点训练:优化通信(overlap_commreduce_scatter),确保高带宽互联。

12. 资源

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐