配置文件说明
动态图(PyNative)训练使用一个 YAML 文件集中管理所有可配置项,由 mindformers/pynative/config/config.py 的 dataclass 配置体系(TrainConfig 及其子配置类)在对 YAML 文件加载时进行解析与校验:
YAML 顶层每一段对应
TrainConfig的一个字段,映射到一个子配置类;加载时这些子配置类会对配置项进行类型转换与合法性检查,校验失败直接抛错(如
global_batch_size必须为正);标注
allow_extra = True的配置类允许写入类中未声明的额外字段,框架原样透传给底层模块(如模型结构超参、调度器超参)。
顶层段与对应特性页速查
一份完整配置由以下 14 个顶层段组成(对应 TrainConfig 的字段)。下表给出每段的配置类、是否允许额外字段(allow_extra),以及深入说明所在的特性页:
顶层段 |
配置类 |
|
详见页面 |
|---|---|---|---|
|
|
否 |
|
|
|
否 |
本章节 |
|
|
否 |
|
|
|
是 |
|
|
|
是 |
|
|
|
否(其中 |
|
|
|
是 |
本章节 + 模型配置README |
|
|
否 |
|
|
|
否 |
训练指标监控(Profiling 小节) |
|
|
否 |
|
|
|
否 |
|
|
|
否 |
|
|
|
列表项为 是 |
本章节 |
allow_extra = False:写入未声明字段会直接报Unknown configuration keys。allow_extra = True:未声明字段被原样透传给底层(如优化器实现、模型类、调度器、Callback 注册器)。这意味着字段表里列出的是 固定字段,其余字段是 按类型扩展的透传字段,需查对应实现确认其名称与含义。
每个子配置类都有默认值,因此 绝大多数段可省略,省略时整段使用默认配置(如 recompute、swap、profiler 不写即关闭)。必须显式提供的只有:model(模型类型与结构)、train_dataset(数据来源)、以及训练规模相关的 training。
完整 YAML 骨架
下面是一份从 checkpoint 到 callbacks 的端到端、可直接保存运行的最小完整 train.yaml。注释标注了哪些段可省略走默认。模型段以 DeepSeek-V3 为例,实际请换成目标模型的结构超参。
# ===== 权重保存与加载(可省略,省略则按默认保存到 save_path)=====
checkpoint:
# 保存配置,默认
enable_save: True
save_path: "./output/ckpt"
save_interleaved_steps: 1000
# 加载配置
load_path: "" # 默认为空,表示不加载权重
no_load_optim: False # 断点续训务必为 False
# ===== 训练规模(建议显式提供)=====
training:
steps: 1000
local_batch_size: 1
global_batch_size: 8
max_norm: 1.0
seed: 42
# ===== 多维并行(可省略,省略则纯 FSDP 单策略)=====
parallelism:
data_parallel_shard: -1 # -1 表示自动按可用卡数切分
tensor_parallel: 1
pipeline_parallel: 1
context_parallel: 1
expert_parallel: 1
# sequence_parallel: False # 随 TP 自动开启,当前不支持关闭(无需配置此项,详见并行训练文档第六节)
# ===== 优化器(type 固定,其余按优化器类型透传)=====
optimizer:
type: AdamW
betas: [0.9, 0.95]
eps: 1.e-8
weight_decay: 0.01
# ===== 学习率调度(type/learning_rate 固定,warmup 等按调度器类型透传)=====
lr_scheduler:
type: ConstantWarmUpLR
learning_rate: 1.e-5
warmup_ratio: 0 # 透传字段,含义见具体学习率调度器的实现
# ===== 数据集(必须提供数据来源)=====
train_dataset:
dataloader:
type: BlendedMegatronDatasetDataLoader
datasets_type: "GPTDataset"
sizes: [1000, 0, 0]
column_names: ["input_ids", "labels", "loss_mask", "position_ids"]
shuffle: False
config: # 完整字段见「数据集」文档
seq_length: 4096
split: "1, 0, 0"
eod: 1
pad: -1
create_attention_mask: False
create_compressed_eod_mask: False
data_path:
- '1'
- "/path/megatron_data_text_document"
drop_remainder: True
num_parallel_workers: 8
# ===== 模型(必须提供):model_type/architectures 固定,其余结构超参透传 =====
model:
model_type: deepseek_v3
architectures: DeepseekV3ForCausalLM
vocab_size: 129280
seq_length: 4096
hidden_size: 1792
num_hidden_layers: 12
num_attention_heads: 8
use_flash_attention: True
compute_dtype: "bfloat16"
# ===== 以下段均可整段省略,省略即关闭对应能力 =====
monitor:
moe_monitor:
save_tokens_per_expert_interval: 100
target_layers: [0, 1, 2]
profiler:
enable_profiling: False
recompute:
mode: "None"
swap:
enable: False
callbacks: []
将上面内容保存为 train.yaml 后,按 加载与启动 一节的命令即可拉起训练。
checkpoint —— 权重保存与加载
是什么:控制权重与优化器状态的保存与加载,包括保存路径、保存频率、保留数量、是否异步、断点续训时的加载行为。
何时用:训练都需要它来落盘;断点续训、增量微调、跨卡均衡加载等场景需要重点调整 load_path 与 no_load_optim。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
是否保存权重 |
|
|
权重保存目录 |
|
|
最多保留的 checkpoint 数,超出按时间淘汰旧的 |
|
|
每多少步保存一次 |
|
|
为 |
|
|
异步保存,减少保存阻塞 |
|
|
保存文件名前缀 |
|
|
保存时去除分布式冗余数据,减小文件体积 |
|
|
加载目录;为空则不加载,从头训练 |
|
|
跨卡均衡加载 |
|
|
为 |
|
|
加载线程数 |
|
|
保存全局 layout 缓存,加速后续加载/恢复 |
断点续训需要恢复优化器状态,必须保证
no_load_optim: False(默认)。若no_load_optim: True,仅恢复模型权重,无法精确接续训练。
YAML 配置示例如下:
checkpoint:
enable_save: True
save_path: "./output/ckpt"
save_max: 3
save_interleaved_steps: 500
async_save: True
prefix: "qwen3"
load_path: "./output/ckpt" # 断点续训:指向上次保存目录
no_load_optim: False
training —— 训练基础参数
是什么:训练步数、批大小、梯度裁剪、随机种子等运行规模参数。
何时用:每次训练都需要;调整吞吐/收敛行为时主要改这里。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
总训练步数 |
|
|
每卡 batch size,必须为正 |
|
|
全局 batch size,必须为正;梯度累积步数由 |
|
|
梯度裁剪的目标范数:全局梯度范数超过该值时按比例缩放梯度 |
|
|
随机种子 |
|
|
确定性训练,开启此开关可以确保多次重复相同任务的结果完全一致,但会造成性能下降 |
global_batch_size 与 local_batch_size 都必须为正,否则加载时 TrainingConfig.__post_init__ 直接抛错 must be positive。此外训练初始化时要求 data_parallel × local_batch_size <= global_batch_size(不满足直接抛错),并据此用整数除法推导梯度累积步数(global_batch_size // (data_parallel × local_batch_size));非整除不会报错,而是向下取整(有效全局批次相应变小)。
梯度裁剪在每个优化器步恒定执行,先求全局梯度范数,再用
clip_coef = max_norm / (global_norm + eps),当clip_coef < 1时按比例缩放梯度。max_norm越大越不易触发缩放,但并不存在用非正值关闭裁剪的语义,请保持max_norm > 0。
YAML 配置示例如下:
training:
steps: 2000
local_batch_size: 2
global_batch_size: 16
max_norm: 1.0
seed: 1234
deterministic: False
parallelism —— 多维并行
是什么:声明 FSDP/HSDP、张量并行(TP)、上下文并行(CP)、流水线并行(PP)、专家并行(EP)、序列并行(SP)等并行策略及其细化选项。
何时用:单卡/小规模可整段省略走默认(纯 FSDP);多卡大模型按显存与吞吐需求组合各并行维度。
怎么配(ParallelismConfig 全部字段):
字段 |
默认值 |
说明 |
|---|---|---|
|
|
FSDP 切分数, |
|
|
FSDP 切分策略 |
|
|
FSDP 前向后是否重新分片: |
|
|
FSDP 参数/状态 CPU offload |
|
|
关闭 FSDP 自动梯度均分(用 sum 而非 mean) |
|
|
张量并行度(TP) |
|
|
上下文并行度(CP) |
|
|
CP 实现方法 |
|
|
启用 Hyper-Parallel 异步 CP hook |
|
|
CP 内 Ulysses 度,混合 CP 时必填 |
|
|
CP 输入准备路径支持的注意力 mask 类型 |
|
|
流水线并行度(PP 阶段数) |
|
|
每个 PP 阶段的层分配(支持不均匀/交错放置) |
|
|
PP 调度策略 |
|
|
交错的 model chunk 数 |
|
|
PP 阶段通信 overlap |
|
|
PP 阶段计算 overlap |
|
|
PP 中 dxdw 通信拆分 |
|
|
序列并行(SP)。当前 SPMD 路径不使用此字段:开启 TP 即自动启用 SP,暂不支持单独关闭 |
|
|
专家并行度(EP,MoE) |
|
|
每设备的 NPU rank 数 |
|
|
MoE token 分发方式: |
当 moe_token_dispatcher_type: alltoall_deredundancy 时,必须满足 expert_parallel >= npu_nums_per_device,否则 ParallelismConfig.__post_init__ 抛错。reshard_after_forward_policy 仅接受 always/never/default,其它取值在 FSDP 初始化时报错。YAML 配置示例如下:
# 示例:FSDP + TP + PP + MoE EP 组合
parallelism:
data_parallel_shard: -1
reshard_after_forward_policy: "default"
cpu_offload: False
disable_gradient_division: True
tensor_parallel: 2
pipeline_parallel: 2
pipeline_parallel_overlap_p2p: True # PP overlap 系列
pipeline_parallel_overlap_b_f: True
context_parallel: 1
expert_parallel: 8 # MoE:EP >= npu_nums_per_device
npu_nums_per_device: 8
moe_token_dispatcher_type: "alltoall_deredundancy"
各维度含义、组合约束与显存/吞吐取舍见 分布式并行训练。
optimizer —— 优化器
是什么:优化器类型与超参。OptimizerConfig 标注 allow_extra = True,type 之外的具体实现超参按优化器类型透传。
何时用:每次训练都需要;切换 AdamW/Muon 或调整 weight decay 行为时改这里。
怎么配(固定字段):
字段 |
默认值 |
说明 |
|---|---|---|
|
|
优化器类型(如 |
|
|
一阶/二阶动量系数 |
|
|
数值稳定项 |
|
|
权重衰减系数 |
|
|
参数名规则列表,与此项匹配的参数强制开启 weight decay |
|
|
参数名规则列表,与此项匹配的参数强制关闭 weight decay |
|
|
对 bf16/fp16 参数注册反向 hook,将梯度转换至 fp32 后累积,使梯度累积与优化器更新在 fp32 精度下进行 |
optimizer:
type: AdamW
betas: [0.9, 0.95]
eps: 1.e-8
weight_decay: 0.1
weight_decay_exclude: ["bias", "norm"] # norm/bias 不做衰减
accumulate_allreduce_grads_in_fp32: True
更多优化器与超参说明见 训练超参数与优化器。
lr_scheduler —— 学习率调度
是什么:学习率调度策略。LrSchedulerConfig 仅声明 两个固定字段:type 与 learning_rate;其余字段(如 warmup_ratio、warmup_steps、min_lr 等)按调度器类型透传,并非固定字段。
何时用:每次训练都需要;切换 warmup/衰减策略时需要修改这里。
怎么配(固定字段):
字段 |
默认值 |
说明 |
|---|---|---|
|
|
调度器类型(如 |
|
|
基础学习率 |
下面示例中的 warmup_ratio 是非固定字段,会透传给所选调度器 ConstantWarmUpLR 。
lr_scheduler:
type: ConstantWarmUpLR
learning_rate: 1.e-5
warmup_ratio: 0 # 透传字段,按调度器类型解析
调度器类型清单与各自专有字段见 训练超参数与优化器。
train_dataset —— 数据集
是什么:数据加载器与数据集配置。train_dataset 顶层字段对所有加载器生效;dataloader 段标注 allow_extra = True,Megatron 加载器(BlendedMegatronDatasetDataLoader)特有字段写在其中。
何时用:每次训练都需要提供数据来源。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
加载器子配置 |
|
加载器类型 |
|
|
|
是否打乱数据 |
|
|
数据列名 |
|
|
使用python多进程 |
|
|
丢弃不足一个 batch 的尾部样本 |
|
|
并行数据加载 worker 数 |
|
|
预取批次数 |
|
|
启用 NUMA 亲和加载 |
dataloader 内固定字段为type、shuffle、column_names、python_multiprocessing,其余非固定字段需要按具体加载器类型透传。
以下示例配置可用于加载Megatron格式数据集:
train_dataset:
dataloader:
type: BlendedMegatronDatasetDataLoader
column_names: ["input_ids", "labels", "loss_mask", "position_ids"]
shuffle: False
drop_remainder: True
num_parallel_workers: 8
prefetch_size: 1
numa_enable: False
Megatron 数据集的制作、字段与场景化配置见 数据集。
model —— 模型
是什么:模型类型与结构超参。ModelConfig 仅 model_type 与 architectures 为固定字段,其余全部结构超参(hidden_size、num_hidden_layers、MoE 配置等)通过透传交给模型类。
何时用:每次训练都必须提供。
怎么配(固定字段):
字段 |
默认值 |
说明 |
|---|---|---|
|
|
模型类型标识(如 |
|
|
模型架构类名(如 |
model:
model_type: deepseek_v3
architectures: DeepseekV3ForCausalLM
# 以下均为透传的结构超参,须与所选模型匹配
vocab_size: 129280
seq_length: 4096
hidden_size: 1792
intermediate_size: 3072
num_hidden_layers: 12
num_attention_heads: 8
use_flash_attention: True
compute_dtype: "bfloat16"
# MoE 结构超参(如适用)
n_routed_experts: 8
num_experts_per_tok: 4
model 段除两个固定字段外都是透传项,字段名/默认值由所选模型类决定,写错的字段不会报 Unknown keys,但会在模型构造时被忽略或导致报错,请以目标模型的结构定义为准。
monitor —— 训练监控
是什么:训练稳定性健康检查、训练状态监控、TensorBoard 日志、MoE 监控。各子项均有默认,整段可省略。
何时用:需要可视化/落盘训练指标,或排查训练异常(梯度爆炸、loss 异常、MoE 负载不均)时启用。
怎么配(子段与关键字段):
子段 |
关键字段(默认值) |
说明 |
|---|---|---|
|
|
本地/设备级 norm 与 loss 监控 |
|
|
MoE 每专家 token 数记录( |
yaml示例如下:
monitor:
train_state:
local_loss: True
moe_monitor:
save_tokens_per_expert_interval: 100
target_layers: [0, 1, 2]
字段细节见 训练指标监控。
profiler —— 性能分析
是什么:采集性能 profiling 数据(算子耗时、内存、调用栈等)。enable_profiling 默认关闭,整段可省略。
何时用:定位性能瓶颈、分析算子分布与显存占用时启用,并配合指定步区间避免数据量过大。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
是否开启 profiling |
|
|
起始步(必须为正) |
|
|
结束步(必须为正,且须 |
|
|
结果保存目录, |
|
|
指定采集的 rank 列表, |
|
|
采集级别( |
|
|
是否采集轻量级打点数据 |
|
|
是否采集 Tensor 内存数据 |
|
|
是否采集 Python 侧调用栈 |
start_step 与 end_step 都必须为正,且必须满足 start_step <= end_step,否则 ProfilerConfig.__post_init__ 直接抛错。
YAML 配置示例如下:
profiler:
enable_profiling: True
start_step: 3
end_step: 5
profiler_level: 1
profile_memory: True
with_stack: True
profiler_rank: [0]
output_path: "./output/profile"
分析方法与生成文件解读见 训练指标监控 的 Profiling 小节。
recompute —— 重计算
是什么:activation checkpoint(重计算),用前向重算换显存。PyNative 下通过对指定层/模块包裹 checkpoint wrapper 实现。
何时用:显存吃紧时启用;按层全量重算(full)或只对部分模块重算(select)。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
重计算模式: |
|
|
|
|
|
|
full_recompute_layer 与 select_module 的值都是 字符串 spec 列表,单个序号写 '5',区间写 '0-3'(闭区间,含端点,即第 0、1、2、3 层共 4 层)。请加引号写成 ['0-3'],避免裸 [0-3] 被 YAML 误解析;spec 必须严格升序且不重叠,最大层号需小于模型层数(合法范围 [0, num_layers-1])。
mode: full 示例(按层全量重算):
recompute:
mode: "full"
full_recompute_layer: ['0-3'] # 前 4 层全量重算
mode: select 示例(按模块选择性重算):
recompute:
mode: "select"
select_module:
"attention": ['0-1'] # 第 0、1 层的 attention 模块重算
"mlp": ['2'] # 第 2 层的 mlp 模块重算
策略选择与显存收益见 训练内存优化。
recompute_comm —— 通信重计算
是什么:对通信算子做选择性重计算,进一步降低显存峰值。与 recompute.mode 相互独立,由自身 enable 单独控制。
何时用:在常规重计算之外仍需压显存,且通信算子保存的中间值占用可观时启用。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
是否开启通信重计算 |
|
|
|
示例如下:
recompute_comm:
enable: True
select_module:
"attention.qkv": ['0-3']
详见 训练内存优化。
swap —— 激活值 SWAP(offload)
是什么:将 transformer block 或指定算子的激活值 offload 到 CPU,反向时再取回,以带宽换显存。
何时用:显存严重不足、重计算仍不够时启用。代价是反向时从 CPU 取回数据的延迟。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
是否开启 transformer block / 算子 offload |
|
|
反向 FlashAttention 之前预取激活值的算子提前量,用于掩盖 CPU→NPU 取回延迟 |
|
|
整层 offload 配置列表,每项形如 |
|
|
算子级 offload 配置列表,每项形如 |
default_prefetch 在动态图下用于在执行反向 FlashAttention 前提前发起激活值取回,掩盖 CPU→NPU 数据搬运延迟;其值表示提前的算子数,取值范围 [1, num_layers-1](越界会校验报错)。layer_swap/op_swap 中的 layers 同样是带引号的层 spec 字符串列表。
整层 offload 示例:
swap:
enable: True
default_prefetch: 1
layer_swap:
- layers: ['0-1'] # offload 第 0、1 层
算子级 offload 示例:
swap:
enable: True
op_swap:
- op_name: "attention"
layers: ['0'] # 第 0 层的 attention 算子 offload
- op_name: "mlp"
layers: ['1'] # 第 1 层的 mlp 算子 offload
详见 训练内存优化。
callbacks —— 训练回调
是什么:训练回调列表(List[CallbackConfig])。每个列表项是一个回调配置,type 为必填字段,其余字段按回调类型透传。框架内置回调始终生效,这里配置的是额外自定义回调。
何时用:需要在训练过程中插入自定义逻辑(打印、保存、监控等)时使用;不需要可写 callbacks: [] 或整段省略。
怎么配:
字段 |
默认值 |
说明 |
|---|---|---|
|
|
回调类型,对应已注册到 |
其余字段 |
— |
按回调类型透传给其构造函数 |
callbacks:
- type: MyCustomCallback
log_interval: 10 # 透传给该回调的构造参数
框架会对每个列表项调用注册器实例化对应回调,type 必须是已注册的回调类名。
加载与启动
动态图训练任务统一通过run_mindformer.py拉起,执行单卡任务可参考如下命令:
python run_mindformer.py --config train.yaml --mode 1 --use_parallel False
多卡任务可通过scripts目录下的msrun_launcher.sh脚本执行,参考如下命令:
bash scripts/msrun_launcher.sh "run_mindformer.py --config train.yaml --mode 1" 8 # 8表示8卡任务
最小可跑示例与启动细节见 快速开始。