【DeepSpeed】deepspeed_config 配置文件中的配置项列举和解释
DeepSpeed 的配置文件通常是一个 JSON 格式的文件,用于控制训练过程中的各个方面,如批次大小、优化器、混合精度训练、ZeRO 优化等。配置文件帮助用户调整 DeepSpeed 的行为,以便在不同的硬件和训练任务下达到最佳性能。一个典型的 DeepSpeed 配置文件可能包含以下几个主要部分:批次大小 (train_batch_size, gradient_accumulation_st
·
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 | 优化器状态卸载设备(none、cpu、nvme)。 |
"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 | 优化器类型(如 Adam、AdamW)。 |
"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 | 通信数据类型(fp16、bf16、fp32)。 |
"fp16" |
与混合精度设置一致。 |
amp.enabled |
bool | 启用自动混合精度(AMP)。 | false |
PyTorch 原生 AMP,与 fp16 互斥。 |
amp.fp16_backend |
string | AMP 后端(apex 或 torch)。 |
"torch" |
仅在 amp.enabled 为 true 时有效。 |
示例:
{
"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_comm、reduce_scatter),确保高带宽互联。
12. 资源
- 官方文档:https://www.deepspeed.ai/docs/config-json/
- 示例代码:DeepSpeed GitHub 的
examples/提供多种配置示例。 - 社区讨论:DeepSpeed GitHub Issues 和论坛。
更多推荐
所有评论(0)