Chapter 07
DeepSpeed config 全字段词典
7.1 这章怎么用
本章不是要你背全部字段,而是给一份"凭印象查得到"的索引:
- 新写一份 config 时,对照本章的 8 个"段落"组织 JSON;
- 看到不认识的字段 → 在本章按段落找;
- 本章找不到 →
grep -rn '"<字段>"' deepspeed/runtime/config.py。
7.2 一份 config.json 的 8 个段落
{
// 段落 1:batch / accumulation
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": 1.0,
"steps_per_print": 100,
"wall_clock_breakdown": false,
// 段落 2:精度(fp16 / bf16 二选一)
"bf16": { "enabled": "auto" },
"fp16": { "enabled": false },
// 段落 3:optimizer
"optimizer": {
"type": "AdamW",
"params": { "lr": 1e-4, "betas": [0.9, 0.95], "eps": 1e-8, "weight_decay": 0.01 }
},
// 段落 4:scheduler
"scheduler": {
"type": "WarmupDecayLR",
"params": { "total_num_steps": 10000, "warmup_min_lr": 0, "warmup_max_lr": 1e-4, "warmup_num_steps": 200 }
},
// 段落 5:ZeRO(重头戏)
"zero_optimization": {
"stage": 3,
"offload_optimizer": { "device": "cpu", "pin_memory": true },
"offload_param": { "device": "none" },
"overlap_comm": true,
"contiguous_gradients": true,
"stage3_gather_16bit_weights_on_model_save": true
},
// 段落 6:activation checkpointing
"activation_checkpointing": {
"partition_activations": false,
"cpu_checkpointing": false,
"contiguous_memory_optimization": false,
"synchronize_checkpoint_boundary": false,
"profile": false
},
// 段落 7:通信 / 数据
"communication_data_type": "fp32",
"prescale_gradients": false,
"data_efficiency": { ... }, // 数据效率(curriculum learning)
// 段落 8:杂项
"zero_allow_untested_optimizer": true,
"zero_force_ds_cpu_optimizer": true,
"torch_compile": { "enabled": false }
}
7.3 段落 1:batch / accumulation
| 字段 | 类型 | 说明 |
|---|---|---|
train_batch_size | int / "auto" | 全局 batch = micro × accum × dp_world |
train_micro_batch_size_per_gpu | int / "auto" | 单卡一次 forward 的样本数 |
gradient_accumulation_steps | int / "auto" | 多少 micro 才反传一次 |
gradient_clipping | float / "auto" | 梯度裁剪阈值,0 表示不裁 |
steps_per_print | int | 多少步打印一次 loss |
wall_clock_breakdown | bool | 打开会打印 fwd / bwd / step 各自耗时(debug 神器) |
关系
三个 batch 字段必须满足
train_batch_size = micro × accum × dp_world_size,
填错会被 DS 直接 reject。常见用法:写两个,留 train_batch_size: "auto",让框架推算。
7.4 段落 2:精度
| 字段 | 说明 |
|---|---|
fp16.enabled | 开 fp16 混精 |
fp16.loss_scale | 0 = 动态;其他 = 静态 |
fp16.initial_scale_power | 动态时初始 scale = $2^{\text{power}}$,默认 16 |
fp16.loss_scale_window | 多少步无溢出后翻倍 scale |
fp16.hysteresis | 连续 N 步无溢出才升 scale |
fp16.min_loss_scale | scale 下限 |
bf16.enabled | 开 bf16;H100/A100 推荐 |
注意
fp16 和 bf16 不能同时 enabled;推荐 A100/H100 用 bf16,老卡(V100 / T4)用 fp16。
7.5 段落 3:optimizer
支持的内置 type(来自 deepspeed/ops/adam/ 等):
| type | 来源 | 用途 |
|---|---|---|
Adam / AdamW | DS fused 实现(如 op 编了);否则回退 PyTorch | 默认 |
Lamb | DS fused | 大 batch 训练 |
OneBitAdam | DS 实现 | 低带宽集群 |
Lion | DS fused | 新型优化器 |
Muon | 2026/05 新增 | 分布式 Muon |
不在白名单的优化器(如 PyTorch 自带的 SGD)需要加:
"zero_allow_untested_optimizer": true
7.6 段落 4:scheduler
| type | params |
|---|---|
WarmupLR | warmup_min_lr, warmup_max_lr, warmup_num_steps |
WarmupDecayLR | 同上 + total_num_steps |
OneCycle | cycle_first_step_size, cycle_first_stair_count, ... |
LRRangeTest | lr_range_test_min_lr, lr_range_test_step_size, ... |
对 HF Trainer 来说,scheduler 通常由 Trainer 自己接管,不写这段更稳。
7.7 段落 5:zero_optimization
第 5、6 章已经讲过 stage 和 offload 字段,这里补全剩余项:
| 字段 | 说明 |
|---|---|
stage | 0 / 1 / 2 / 3 |
overlap_comm | 通信和计算重叠(强烈建议开) |
contiguous_gradients | 梯度内存连续 |
reduce_bucket_size | reduce-scatter 桶大小 |
allgather_partitions | stage 1/2 时 all-gather 切片 |
allgather_bucket_size | 同上桶大小 |
reduce_scatter | stage 1/2 是否用 reduce-scatter |
cpu_offload(旧) | 等价新版 offload_optimizer.device=cpu |
sub_group_size | stage 3 把参数分组,每组单独 all-gather |
stage3_prefetch_bucket_size | 提前 prefetch 多少参数 |
stage3_param_persistence_threshold | 小于此 size 的参数不切(开销大于收益) |
stage3_max_live_parameters | 同时活跃的参数数上限 |
stage3_max_reuse_distance | 多少距离内的参数复用 |
stage3_gather_16bit_weights_on_model_save | save 时把切分参数 gather 回 fp16 |
round_robin_gradients | 跨卡 round-robin 累积梯度,减峰值 |
elastic_checkpoint | 弹性扩缩容 |
zero_hpz_partition_size | ZeRO++ 的分层分区大小 |
zero_quantized_weights | ZeRO++ 量化权重通信 |
zero_quantized_gradients | ZeRO++ 量化梯度通信 |
7.8 段落 6:activation_checkpointing
大模型训练几乎必开:
"activation_checkpointing": {
"partition_activations": true, // ZeRO-3 时切激活
"cpu_checkpointing": false, // 激活也 offload 到 CPU
"contiguous_memory_optimization": true,
"number_checkpoints": null,
"synchronize_checkpoint_boundary": false,
"profile": false
}
HF Trainer 用户通常在 TrainingArguments 设 gradient_checkpointing=True 即可,DS 这段会自动衔接。
7.9 段落 7:通信 / 数据
| 字段 | 说明 |
|---|---|
communication_data_type | fp32 / fp16 / bf16,all-reduce 用的精度 |
prescale_gradients | scaling 前先 prescale,缓解 fp16 溢出 |
data_efficiency.data_sampling.curriculum_learning.enabled | curriculum learning 数据采样 |
data_efficiency.data_routing.random_ltd.enabled | Random-LTD 数据路由 |
compression_training | 权重 / 激活压缩训练 |
7.10 段落 8:杂项 / debug
| 字段 | 说明 |
|---|---|
zero_allow_untested_optimizer | 允许非内置优化器 |
zero_force_ds_cpu_optimizer | 开 cpu offload 时强制用 DS 的 cpu_adam |
torch_compile.enabled | 用 PyTorch 2.x compile() 包模型 |
flops_profiler | 测 FLOPs / 内存 |
monitor_config | TensorBoard / WandB / CSV 监控 |
autotuning | 自动找最佳 batch / accum / zero stage |
7.11 三份"开箱可用"的模板
A. 小模型 SFT(13B 以下 / 8 卡 / 显存够)
{
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"train_batch_size": "auto",
"gradient_clipping": "auto",
"bf16": { "enabled": "auto" },
"zero_optimization": {
"stage": 2,
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": "auto",
"allgather_bucket_size": "auto"
}
}
B. 70B 全参 / 8 卡(要 offload)
{
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"train_batch_size": "auto",
"gradient_clipping": "auto",
"bf16": { "enabled": "auto" },
"zero_optimization": {
"stage": 3,
"offload_optimizer": { "device": "cpu", "pin_memory": true },
"offload_param": { "device": "cpu", "pin_memory": true },
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
}
C. 极限 ZeRO-Infinity(NVMe offload)
{
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"bf16": { "enabled": "auto" },
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "nvme",
"nvme_path": "/local_nvme/ds_swap",
"pin_memory": true
},
"offload_param": {
"device": "nvme",
"nvme_path": "/local_nvme/ds_swap",
"buffer_count": 5,
"buffer_size": 1e8,
"max_in_cpu": 1e9
},
"aio": {
"block_size": 1048576,
"queue_depth": 8,
"thread_count": 1,
"single_submit": false,
"overlap_events": true
},
"overlap_comm": true,
"stage3_gather_16bit_weights_on_model_save": true
}
}
7.13 真实默认值表(从源码 grep 出来的,不是猜的)
到处都在写 "auto" 的副作用是:用户经常不知道"没写、也没填 auto 时默认值是多少"。下表是 deepspeed/runtime/zero/config.py 里 DeepSpeedZeroConfig(line 90 起)的真实默认值:
| 字段 | 默认值 | 行号 | 备注 |
|---|---|---|---|
stage | 0 | 95 | 不写就退化为 DDP |
contiguous_gradients | True | 102 | CPU offload 时强制 True |
reduce_scatter | True | 108 | False 退化为 all-reduce |
reduce_bucket_size | 5e8 | 113 | ~500 MB |
allgather_partitions | True | — | stage 1/2 用 |
allgather_bucket_size | 5e8 | 132 | ~500 MB |
overlap_comm | None | 138 | 动态默认:stage 0/1 False,stage 2/3 True;强烈建议显式写 true |
load_from_fp32_weights | True | — | 恢复 checkpoint 时用 fp32 master |
elastic_checkpoint | False | — | 弹性扩缩容 |
sub_group_size | 1e9 | — | stage 3 参数分组上限 |
stage3_prefetch_bucket_size | 5e8 | — | "auto" 时由引擎按 model.config.hidden_size 估算 |
stage3_param_persistence_threshold | 1e5 | — | numel 小于此值的参数不切(开销大于收益) |
stage3_max_live_parameters | 1e9 | — | 同时驻留 GPU 的参数 numel 上限 |
stage3_max_reuse_distance | 1e9 | — | 多少 numel 距离内的参数复用 |
stage3_gather_16bit_weights_on_model_save | False | — | 默认 False;保存 HF 格式时一定要手动开 |
round_robin_gradients | False | — | 跨卡 round-robin 梯度,减峰值显存 |
zero_hpz_partition_size | 1 | — | ZeRO++ HPZ:节点内分区数;>1 才启用 |
zero_quantized_weights | False | — | ZeRO++ 通信前权重 int8 量化 |
zero_quantized_gradients | False | — | ZeRO++ 通信前梯度 int4 量化 |
同文件还有 ZeroStageEnum(line 81):
# runtime/zero/config.py:81
class ZeroStageEnum(Enum):
disabled = 0
optimizer_states = 1 # 切优化器状态
gradients = 2 # 切优化器 + 梯度
weights = 3 # 切优化器 + 梯度 + 参数
max_stage = 3
7.14 deprecated 字段映射
| 旧字段(仍能用) | 等价新字段 |
|---|---|
cpu_offload | offload_optimizer.device = "cpu" |
cpu_offload_param | offload_param.device = "cpu"(config.py:181) |
cpu_offload_use_pin_memory | offload_*.pin_memory = true |
cpu_offload_optimizer | offload_optimizer.* |
这些字段在源码里通过 pydantic 的 json_schema_extra: { "deprecated": true } 标记。它们当下还能跑,但会出 deprecation warning,新项目别用。
7.15 2024 之后新增字段对照
| 字段 | 归属段 | 含义 |
|---|---|---|
optimizer.type = "muon" | optimizer | 启用 Muon 优化器 |
每个 param_group 上的 use_muon: true/false | optimizer.params | 混合 Muon + AuxAdam(如 embedding 不走 Muon) |
zero.zenflow.topk_ratio | zero | 保留在 GPU 立即更新的梯度比例(默认 0.1) |
zero.zenflow.select_strategy | zero | "auto" / "step" / "epoch" |
zero.zenflow.overlap_step | zero | True 用并行工厂;False 用顺序工厂 |
zero.zenflow.offload | zero | 是否把 ZenFlow 自己的 cache 也 offload |
offload_optimizer.super_offload | zero | 启用 SuperOffload worker 进程 |
offload_optimizer.cpuadam_cores_perc | zero | worker 占多少 CPU 核(默认 0.8) |
offload_optimizer.ratio | zero | 多少比例的参数走 SuperOffload(默认 1.0) |
compile.deepcompile | 顶层 compile 段 | 启用 DeepCompile |
compile.free_activation | compile | 编译期分析后激进释放激活 |
compile.offload_activation | compile | 激活也 offload |
compile.offload_opt_states | compile | 优化器状态 offload(与 ZeRO offload 协同) |
compile.passes | compile | 启用哪些 pass:["z1","z3","autosp"] |
compile.double_buffer | compile | 双缓冲通信 |
autotuning.tuner | autotuning | "gridsearch" / "random" / "modelbased" |
autotuning.max_evals | autotuning | 最大配置评估次数 |
sequence_parallel_size | 顶层 | Ulysses / ALST 序列并行度 |
7.16 字段拼错不会报错
坑
DeepSpeedConfig 用 pydantic 解析,默认忽略未知字段,只输出 warning 不报错。
你把 reduce_bucket_size 拼成 reduce_bucker_size 训练能跑,但 bucket 用了内置默认 5e8 —— 怎么调都没效果。
校验方法:
- 训练启动时关注首屏的
Unrecognized config field: ...warning; - 需要严格校验时,把字段名贴到
runtime/zero/config.py或runtime/config.py里 grep 一下,不存在就肯定是拼错; - 用
python -c "from deepspeed.runtime.zero.config import DeepSpeedZeroConfig; print(DeepSpeedZeroConfig.model_fields.keys())"直接列出所有合法字段名。
7.17 字段写错的常见提示
| 报错 | 多半原因 |
|---|---|
pydantic.ValidationError | 类型不对,看 traceback 的 loc 字段 |
ds_config has 'fp16' and 'bf16' both enabled | 两个混精同时开 |
train_batch_size != micro * accum * dp_world | 三个 batch 字段不一致 |
cpu offload requires cpu_adam op | 没编 cpu_adam,见第 2 章 |
大量 warning 未使用字段 | 拼错的字段会被忽略,不会报错,关注 warning |