Chapter 07

DeepSpeed config 全字段词典

📌 本章基于 deepspeed/runtime/config.py 与 deepspeed/runtime/zero/config.py · commit 510ebe58e4e4 。 新版加字段时去这两个文件 grep 最准。

7.1 这章怎么用

本章不是要你背全部字段,而是给一份"凭印象查得到"的索引:

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 推荐
注意 fp16bf16 不能同时 enabled;推荐 A100/H100 用 bf16,老卡(V100 / T4)用 fp16。

7.5 段落 3:optimizer

支持的内置 type(来自 deepspeed/ops/adam/ 等):

type来源用途
Adam / AdamWDS 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

typeparams
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_savesave 时把切分参数 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.enabledcurriculum 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.pyDeepSpeedZeroConfig(line 90 起)的真实默认值:

字段默认值行号备注
stage 0 95不写就退化为 DDP
contiguous_gradients True 102CPU offload 时强制 True
reduce_scatter True 108False 退化为 all-reduce
reduce_bucket_size 5e8 113~500 MB
allgather_partitions True stage 1/2 用
allgather_bucket_size 5e8 132~500 MB
overlap_comm None138动态默认: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_saveFalse 默认 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_memoryoffload_*.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/falseoptimizer.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_perczero 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 —— 怎么调都没效果。

校验方法:

  1. 训练启动时关注首屏的 Unrecognized config field: ... warning;
  2. 需要严格校验时,把字段名贴到 runtime/zero/config.pyruntime/config.py 里 grep 一下,不存在就肯定是拼错;
  3. 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