
verl 的 Automodel 后端接入指南基于 nemo_automodel 的 SFT 训练引擎解析【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verlverlHybridFlow在verl/workers/engine/automodel/下实现了对Automodelnemo_automodel后端的完整接入由AutomodelEngine与AutomodelEngineWithLMHead两个引擎类承担模型构建、并行化、优化器分片、LR 调度、梯度裁剪与检查点管理而训练循环、数据管道与损失函数仍由 verl 自身提供。本文以docs/workers/automodel_workers.rst为主线结合 引擎实现、工具函数、配置文件 与两个 SFT 示例脚本系统讲解 Automodel 后端的架构分工、能力边界、配置参数与端到端使用方式帮助读者掌握从单卡小模型到 MoE 专家并行大模型的实际训练配置方法。一、Automodel 后端是什么Automodel即 nemo_automodel后端是 verl 中与 FSDP、Megatron、VeOmni、Torchtitan 并列的一种训练引擎后端。其核心设计是职责分层Automodel 侧负责模型构建model building、并行化parallelization、优化器分片optimizer sharding、LR 调度LR scheduling、梯度裁剪gradient clipping与检查点管理checkpointingverl 侧继续承担训练循环training loop、数据管道data pipeline与损失函数loss function。这一分工在引擎类的 docstring 中被明确描述见 transformer_impl.py。从实现上看AutomodelEngine继承自 verl 的BaseEngine并在initialize()中依次调用build_automodel_model()构建模型、_build_optimizer()构建优化器、_build_lr_scheduler()构建 LR 调度器、_build_checkpointer()构建检查点器见 transformer_impl.py整个生命周期都围绕 nemo_automodel 的基础设施展开。1.1 版本要求原文档明确列出了运行 Automodel 后端的依赖版本依赖版本Automodelnemo_automodelr0.3.0transformersv5.0.0同时示例脚本头部注释补充了更细的约束见 run_qwen2_5_0_5b_automodel.sh需要transformers5.3.0与torchao若训练 MoE 模型还需要grouped_gemmgithub.com/fanshiqing/grouped_gemmv1.1.4。这些是运行前必须满足的环境前提。1.2 优势与局限原文档给出了 Automodel 后端的核心卖点与当前限制Pros优势开箱即用地支持 FSDP2 与 TP 分布式策略无需手工配置复杂的分片与张量并行方案原生支持 MoE 模型 Expert ParallelismEP通过 DeepEP 实现专家并行适合大参数量稀疏激活模型TransformerEngineTE集成对 attention、linear 层与 RMSNorm 提供融合优化内核直接支持任意 HuggingFace 模型无需 checkpoint 转换NeMoAutoModelForCausalLM.from_pretrained()直接以 HF 模型路径加载见 utils.py。Cons局限暂不支持 Pipeline ParallelismPP这一限制在配置类中同样被硬性校验——AutomodelEngineConfig.__post_init__()中assert self.pp_size 1pp_size 1会直接抛出异常见 engine.py。二、架构两个引擎类与注册机制Automodel 后端由两个引擎类构成均位于 transformer_impl.py类职责AutomodelEngine基类引擎持有模型、优化器、LR 调度器与检查点器实现前向/反向批处理、梯度裁剪、设备 offload、checkpoint 保存/加载等通用逻辑AutomodelEngineWithLMHead带 LM Head 的语言模型引擎实现prepare_model_inputs/prepare_model_outputs/forward_step完成去 padding 数据处理、logits 计算、log-prob 提取与损失计算两个类由init.py 统一导出。2.1 引擎注册AutomodelEngineWithLMHead通过装饰器完成注册见 transformer_impl.pyEngineRegistry.register(model_typelanguage_model, backend[automodel], device[cuda]) class AutomodelEngineWithLMHead(AutomodelEngine):这意味着当配置model_typelanguage_model、engineautomodel且运行在 CUDA 设备上时verl 的EngineRegistry见 base.py会定位到该引擎类完成实例化。EngineRegistry.get_engine_cls还支持通过环境变量VERL_ENGINE_DEVICE/VERL_ENGINE_VENDOR覆盖设备与厂商选择逻辑。2.2 启动时的兼容性补丁引擎构造时见 transformer_impl.py会尽早应用两组补丁保证 Automodel 与 transformers v5 / TransformerEngine 的兼容from nemo_automodel._transformers.utils import apply_cache_compatibility_patches from nemo_automodel.shared.te_patches import apply_te_patches apply_cache_compatibility_patches() apply_te_patches()apply_cache_compatibility_patches()针对 transformers v5 的缓存兼容性补丁apply_te_patches()TransformerEngine 相关补丁保障 TE 后端正常工作。三、分布式策略与并行配置3.1 三种分布式策略Automodel 后端通过engine.distributed_strategy选择底层并行实现映射关系在 utils.py 的build_distributed_config_from_engine_config()中完成distributed_strategy底层配置类说明fsdp2FSDP2Config默认策略。支持sequence_parallel、FSDP2 混合精度策略MixedPrecisionPolicy、activation_checkpointing、defer_fsdp_grad_syncmegatron_fsdpMegatronFSDPConfigMegatron-FSDPZeRO-3 风格全分片仅支持activation_checkpointing当 world_size 1 时会额外调用fully_shard_optimizer对优化器进行分片见 utils.pyddpDDPConfig普通数据并行仅支持activation_checkpointing随后create_device_mesh()依据tp_size、pp_size、cp_size、ep_size、dp_replicate_size与world_size构建设备网格device_mesh与 MoE 网格moe_mesh。FSDP2 策略下的混合精度策略见 utils.py配置项默认值含义mp_param_dtypebf16参数保存 dtypemp_reduce_dtypefp32梯度归约 dtypemp_output_dtypebf16前向输出 dtype3.2 并行度配置项AutomodelEngineConfig见 engine.py提供的并行度参数参数默认值说明tp_size1张量并行大小pp_size1流水线并行大小仅支持 1cp_size1上下文并行大小ep_size1MoE 专家并行大小dp_replicate_size1HSDP 的数据并行复制大小1 表示纯分片sequence_parallelfalseTP 计划中的序列并行开关defer_fsdp_grad_synctrue将 FSDP 梯度同步推迟到最后一个 micro-batchactivation_checkpointingfalse激活检查点重计算开关enable_fp8falseFP8 训练开关enable_compilefalse对模型启用torch.compilemodel_dtypefp32模型权重加载精度fp32/bf16/fp16/autoattn_implementationflash_attention_2注意力实现sdpa、flash_attention_2、eager、teparam_offloadfalse参数 offload 到 CPUoptimizer_offloadfalse优化器状态 offload 到 CPUforward_onlyfalse仅前向模式如参考策略引擎内部会依据这些参数构建设备网格并通过get_data_parallel_rank()/get_data_parallel_size()/get_data_parallel_group()等方法向上层暴露 DP 维度信息见 transformer_impl.py。3.3 模型构建的后端选择逻辑build_automodel_model()见 utils.py在调用NeMoAutoModelForCausalLM.from_pretrained()前会做一系列后端决策FP8enable_fp8True时注入FP8Config编译enable_compileTrue时注入CompileConfigHF 实现回退当ep_size 1且模型架构为 Qwen / Llama 时强制使用 HF 实现force_hfTrueBackendConfig未强制使用 HF 时将backend_config字典转为BackendConfig传入MoE 并行化ep_size 1时将moe_config转为MoEParallelizerConfig并默认继承分布式配置中的mp_policy注意力实现与 dtype透传attn_implementation与torch_dtype。3.4 BackendConfig算子后端选择engine.backend_config是一组直接传递给 nemo_automodelBackendConfig的关键字参数完整默认值见 automodel.yaml控制模型各层算子用 TE 还是 PyTorch 实现、MoE 采用何种分发策略键默认值可选值说明attnsdpate,sdpaTE 融合注意力或 PyTorch SDPAlineartetorch,teTE 融合线性层支持 FP8或标准 PyTorch 线性层rms_normtorch_fp32torch,torch_fp32,tetorch_fp32在 FP32 下计算 RMSNorm对 MoE 数值稳定性更好rope_fusiontrue布尔融合 RoPE 内核要求 CP1dispatchertorchtorch,deepepMoE token 分发标准 all-gather 本地计算或 DeepEP 优化的 all-to-all吞吐更高expertsgmmgmm,torch_mm,torch,teMoE 专家计算后端gmm需安装grouped_gemmtorch_mm使用torch._grouped_mm无外部依赖te使用 TE GroupedLineargate_precisionnull—Gate 计算精度null 表示自动enable_hf_state_dict_adaptertrue布尔HF state dict 适配器保证 checkpoint 兼容enable_fsdp_optimizationsfalse布尔启用 Automodel 中的 FSDP 专项优化fake_balanced_gatefalse布尔调试用伪平衡门控fake_gate_noise0.0浮点伪平衡门控噪声3.5 MoE 并行化配置moe_config当ep_size 1时engine.moe_config被转换为MoEParallelizerConfig默认值见 automodel.yaml键默认值说明ignore_router_for_acfalse是否将 router 排除在激活检查点之外reshard_after_forwardfalse前向后立即对专家参数重分片用计算换内存lm_head_precisionnullLM Head 精度null 自动wrap_outer_modeltrue是否对最外层模型做 FSDP 包装四、训练流程与关键实现细节4.1 前向-反向批处理forward_backward_batch()见 transformer_impl.py是训练循环的核心入口统计loss_mask的 token 总数并在 DP 组内all_reduce用于动态批大小调整调用prepare_micro_batches()将 batch 拆分为 micro-batch训练模式下调用prepare_for_grad_accumulation()准备梯度累积若ep_size 1还会通过MoEAuxLossAutoScaler将 MoE 辅助损失的 backward scale 设为 DP 组大小以抵消 FSDP 的梯度 allreduce见 transformer_impl.py对每个 micro-batch 执行forward_step并loss.backward()最后一个 micro-batch 前调用prepare_for_final_backward()通知 MoE 准备最终反向。4.2 优化器与梯度裁剪优化器通过 nemo_automodel 的build_optimizer构建见 transformer_impl.py目标类由optimizer_impl.optimizer动态拼接如transformer_engine.pytorch.optimizers.fused_adam.FusedAdam。optimizer_step()使用scale_grads_and_clip_grad_norm完成梯度缩放与裁剪clip_grad并处理两种异常情况见 transformer_impl.py若grad_norm非有限值NaN/Inf跳过本轮更新并zero_grad若模型实现update_moe_gate_bias则在参数更新后同步更新 MoE gate bias。4.3 LR 调度LR 调度完全委托给 Automodel 的OptimizerParamScheduler见 transformer_impl.py其参数映射关系verl 配置调度器参数说明lrmax_lr最大学习率init_lr_ratio默认 0.1init_lr lr * init_lr_ratiowarmup 起点min_lr_ratio默认 0.01min_lr lr * min_lr_ratio衰减终点lr_warmup_steps_ratio/lr_warmup_stepslr_warmup_stepswarmup 步数lr_warmup_steps 0时由 ratio 折算total_training_stepslr_decay_steps总步数运行时注入lr_scheduler_typelr_decay_style支持constant、cosine、linear、inverse-square-root4.4 去 Padding 与 log-prob 计算AutomodelEngineWithLMHead.prepare_model_inputs()支持两种输入模式use_remove_paddingremove-padding 模式默认输入以 jagged/nested tensor 形式传入配合torch.roll计算input_ids_rmpad_rolled作为 LM 标签当attn_implementationte时额外传入qkv_formatthd、cu_seqlens、max_seqlen见 transformer_impl.py非 remove-padding 模式将 nested tensor 填充pad为(batch_size, max_seq_len)的稠密张量。prepare_model_outputs()则负责从模型输出中提取 log-prob与熵若开启calculate_entropyTP 下的 DTensor 处理当 logits 为按词表维度分片的DTensor时先full_tensor()聚合再计算 log-softmax见 transformer_impl.py温度缩放logits 除以temperature.clamp(min1e-8)融合内核use_fused_kernelsTrue时直接取output.log_probs/output.entropy熵计算支持分块entropy_from_logits_with_chunking默认块大小 2048与 checkpointingentropy_checkpointing。4.5 设备 offload 与检查点引擎通过to(device...)统一管理参数/优化器/梯度的 CPU 与 GPU 迁移见 transformer_impl.py具体搬运逻辑在 utils.py 中实现offload_automodel_model_to_cpu先将 FSDP 状态置为TrainingState.IDLE再reshard()并cpu()load_automodel_model_to_gpu/offload_automodel_optimizer/load_automodel_optimizer模型与优化器状态的异步搬运。检查点由Checkpointer完成见 transformer_impl.py保存格式为safetensorssave_consolidatedTrue合并分片save_checkpoint同时保存模型权重、优化器状态与 LR 调度器状态load_checkpoint按local_path/model目录探测模型权重位置后加载。五、端到端实战两个 SFT 示例原文档给出了两个 SFT 训练示例脚本均位于examples/sft/gsm8k/目录仓库内实际路径为 examples/sft/gsm8k/。5.1 基础示例Qwen2.5-0.5B FSDP2最小化示例使用Qwen/Qwen2.5-0.5B-InstructFSDP2 策略且不开任何并行对应脚本 run_qwen2_5_0_5b_automodel.shbash examples/sft/gsm8k/run_qwen2_5_0_5b_automodel.sh 4 /tmp/automodel_sft_test脚本接收两个必选参数nproc_per_node每节点进程数与save_path输出目录后续可追加其他配置覆盖。核心配置解读配置示例值说明data.train_files/data.val_files$HOME/data/gsm8k_sft/*.parquet训练/验证数据parquet 格式data.train_batch_size128训练 batch 大小data.pad_modeno_padding无填充模式data.use_dynamic_bsztrue动态批大小data.max_token_len_per_gpu2048每 GPU 最大 token 数model.pathQwen/Qwen2.5-0.5B-InstructHF 模型路径model.use_remove_paddingtrue去除 paddingengineautomodel—选择 Automodel 后端engine.distributed_strategyfsdp2FSDP2 分布式策略engine.tp_size/pp_size/cp_size/ep_size1关闭 TP/PP/CP/EPoptim.lr1e-5学习率optim.lr_warmup_steps_ratio0.2warmup 比例optim.weight_decay0.1权重衰减optim.clip_grad1.0梯度裁剪阈值optim.lr_scheduler_typecosine余弦衰减trainer.total_epochs2训练轮数trainer.seed1111随机种子5.2 进阶示例Qwen3-30B MoE 专家并行大规模示例使用Qwen/Qwen3-30B-A3B-BaseMoE 模型开启 EP8、DeepEP 分发、TransformerEngine 后端与torch_mm专家实现对应脚本 run_qwen3_30b_automodel.shbash examples/sft/gsm8k/run_qwen3_30b_automodel.sh 8 /tmp/automodel_sft_30b该脚本与基础示例的关键差异配置示例值说明data.train_fileshellaswag SFT 数据使用 hellaswag 数据集data.max_token_len_per_gpu8192更大的 token 预算model.trust_remote_codetrueQwen3 需要远程代码engine.ep_size8专家并行度 8engine.backend_config.dispatcherdeepepDeepEP 优化的 all-to-all 分发engine.backend_config.attn/linearteTE 融合注意力与线性层engine.backend_config.rms_normtorch_fp32FP32 RMSNormMoE 数值稳定性engine.backend_config.expertstorch_mm使用torch._grouped_mm无外部 grouped_gemm 依赖engine.activation_checkpointingtrue开启激活重计算engine.model_dtypebf16bf16 权重engine.attn_implementationteTE 注意力配合 thd 格式optim.optimizer/optimizer_implFusedAdam/transformer_engine...fused_adamTE 融合 Adamoptim.master_weightstrue保存 FP32 master 权重optim.store_param_remainderstrue保存参数余数optim.exp_avg_dtype/exp_avg_sq_dtypebf16一阶/二阶矩 bf16trainer.total_training_steps100固定训练步数LR 调度依赖关于optim.exp_avg_dtype等精度参数的取值支持fp32、bf16、fp16或完整的torch.float32形式引擎内部会将短名映射为 torch dtype见 transformer_impl.py。5.3 优化器完整参数表两个脚本共同使用的optimautomodel配置类为AutomodelOptimizerConfig定义见 optimizer.py默认值见 automodel.yaml参数默认值说明optimizerAdamW优化器类名optimizer_impltorch.optim优化器导入模块可指向torchao.optim、bitsandbytes.optim、TE 的 fused_adam 等lr1e-5学习率映射为调度器 max_lrlr_warmup_steps_ratio0.0warmup 比例lr_warmup_steps 0时生效lr_warmup_steps-1warmup 步数0 时覆盖 ratioweight_decay0.01权重衰减betas[0.9, 0.999]Adam betasclip_grad1.0梯度范数裁剪init_lr_ratio0.1初始 LR lr × ratiomin_lr_ratio0.01最小 LR lr × ratiolr_scheduler_typecosineconstant/cosine/linear/inverse-square-rootwd_incr_styleconstant权重衰减递增风格eps1e-8Adam epsilonmaster_weightsfalseFP32 master 权重store_param_remaindersfalse参数余数存储exp_avg_dtype/exp_avg_sq_dtype/master_weight_dtypenull优化器状态 dtypefp32/bf16/fp16override_optimizer_config{}直接透传的额外优化器参数六、工程验证与测试支撑Automodel 后端已纳入 verl 的工程验证体系可从以下仓库证据交叉印证配置文档化engine/automodel.yaml 与 optim/automodel.yaml 给出了全部参数的默认值与注释说明是排查配置问题的一手参考配置类校验AutomodelEngineConfig 在__post_init__中强校验strategy automodel、distributed_strategy取值合法、pp_size 1AutomodelOptimizerConfig 校验lr_scheduler_type取值范围非法配置会在启动阶段即报错引擎注册与分发EngineRegistrybase.py负责按model_type/backend/device分发引擎类Automodel 引擎以language_modelautomodelcuda注册测试用例仓库中已有 Automodel 相关的 CPU 级测试如 tests/utils/test_config_on_cpu.py 对配置解析的校验可结合脚本验证配置的正确性。此外verl 的配置文档一致性检查tests/special_sanity/test_config_docs.py也会校验配置项与文档的一致性保证示例脚本中的参数均有据可查。七、使用建议与注意事项版本对齐务必使用 Automodel r0.3.0 与 transformers v5.x示例脚本要求5.3.0低版本可能缺少_transformers/shared.te_patches等新接口MoE 依赖选择backend_config.expertsgmm需要单独安装grouped_gemm希望零外部依赖时选择torch_mmtorch._grouped_mmPP 不可用pp_size必须为 1需要流水线并行请选择 verl 的 Megatron 后端动态批大小data.use_dynamic_bszTrue时按max_token_len_per_gpu动态组批配合pad_modeno_padding与use_remove_paddingTrue可获得最大吞吐LR 调度依赖总步数total_training_steps由训练循环运行时注入使用固定步数训练如trainer.total_training_steps100时调度行为最可预期确定性调试需要可复现结果时可开启full_determinismTrue会显著影响性能仅用于调试见 engine.py 相关说明。总体而言Automodel 后端是 verl 面向 NVIDIA 生态FSDP2 TP EP/DeepEP TransformerEngine的高效 SFT 训练路径它把 nemo_automodel 成熟的大模型训练基础设施与 verl 灵活的 RL 训练框架无缝拼接让使用者既能享受 Automodel 的并行化与算子优化能力又能沿用 verl 统一的数据管道、训练循环与配置体系——这也是“HybridFlow”混合流程理念在 SFT 场景下的直接体现。【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考