☰
VLA训练栈深度揭秘:OpenDM的Muon+AdamW优化器、FSDP分布式训练与混合精度策略
2026/10/8 7:23:15 网站建设 项目流程

VLA训练栈深度揭秘:OpenDM的Muon+AdamW优化器、FSDP分布式训练与混合精度策略

【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendm

OpenDM 是面向开放世界具身智能的视觉-语言-动作(VLA)基础模型 DM0.5 的开源训练与推理框架。本文将带你完整拆解它的 VLA 训练栈核心:自研的 Muon+AdamW 混合优化器、基于 FSDP 的多卡分布式训练,以及 bf16/fp32 双套混合精度策略,帮助你快速理解大模型微调背后的工程细节。

🧭 先搞清楚:OpenDM 训练栈由什么组成

OpenDM 的训练入口集中在opendm/exp/dm05_exp.py,整个训练流程由四块配置驱动:模型配置、优化器配置、Trainer 配置和数据配置。其中与"训练效率"直接相关的三大件是:

  • 优化器:Muon+AdamW 混合优化器,代码在 opendm/optimizer/muon_adamw.py
  • 分布式训练:基于 HuggingFace Transformers Trainer 扩展的DMTrainer,代码在 opendm/trainer/trainer.py
  • 混合精度策略:精度常量与策略定义在 opendm/constants/precision.py

多卡训练通过 script/dm05_launcher.sh 一键拉起,它内部调用torchrun启动 8 卡进程并设置 NCCL 通信参数,上手体验可参考 docs/zh/dm05_finetuning.md。

🚀 核心揭秘一:Muon + AdamW 混合优化器

这是 OpenDM 训练栈最有意思的部分。为什么不用一个优化器打天下?因为 VLA 模型里有两类"性格"完全不同的参数:

  • VLM 主干(视觉编码器 + 语言模型):参数量大、梯度稀疏敏感,适合稳定的 AdamW
  • Action Expert(动作专家模块的隐层权重矩阵):全是 2D 矩阵,负责把视觉语言表征转成机器人动作,用 Muon 正交化更新收敛更快

参数如何分流

在 FSDP 包裹模型之前,mark_muon_parameters会扫描所有可训练参数,按以下规则选中 Muon 组(见 opendm/optimizer/muon_adamw.py 中的is_default_muon_parameter):

条件说明
必须 2 维Muon 只能作用于矩阵,1D 参数(如 bias、LayerNorm)一律排除
名称匹配参数路径包含action_expert且位于layers下、以.weight结尾
排除项嵌入层、lm_head之外的 embedding、所有 norm 层

未被选中的参数自动进入 AdamW 组。整个分流逻辑由 opendm/exp/dm05_exp.py 中DM05OptimizerConfig的optim字段控制,设为muon_adamw即启用混合优化器,adamw则退化为纯 AdamW。

Muon 的工作原理:牛顿-舒尔茨正交化

Muon(MomentUm)的核心思想是:不直接用梯度方向更新权重,而是先把梯度"正交化"到最优的更新方向上。OpenDM 用5 步牛顿-舒尔茨(Newton-Schulz)迭代近似矩阵的零次幂(见zeropower_via_newtonschulz5),相比 SVD 分解,只需几次矩阵乘法就能逼近,算力友好得多。

关键超参默认值(DM05OptimizerConfig):

超参默认值含义
muon_momentum0.95动量系数
muon_nesterovTrue启用 Nesterov 动量
muon_ns_steps5牛顿-舒尔茨迭代步数
muon_moonlight_coefficient0.2学习率缩放系数
base_lr2.5e-5基础学习率

Muon 组的有效学习率还有一个巧妙的修正:lr × muon_lr_scale × 0.2 × sqrt(max(shape)),用矩阵最大维度开根号来平衡不同形状层的更新幅度,避免大矩阵更新过小、小矩阵更新过大。

为 FSDP 分片量身定制的细节

分布式训练下,每个 GPU 只持有矩阵的一部分切片,而正交化必须基于完整矩阵计算。OpenDM 为此设计了MuonShardPlan分片计划:先通过all_gather探测各 rank 持有的分片大小,拼出完整矩阵 → 执行牛顿-舒尔茨正交化 → 再切回本 rank 的切片做参数更新。这种"分片计算、整矩阵正交"的设计,是 Muon 能无缝跑在 FSDP 上的关键,也解释了为什么必须在 FSDP 包裹前先记录参数形状。

📡 核心揭秘二:FSDP 分布式训练策略

DMTrainer继承自 HuggingFace 的Trainer,在_link_exp_config中为多卡场景配置了 FSDP(见 opendm/trainer/trainer.py):

  • fsdp = "shard_grad_op":参数和梯度、优化器状态都跨卡分片,显存占用最低,适合 DM0.5 这种大模型
  • use_orig_params = True:保留原始参数视图,这正是 Muon 需要读取/写回完整矩阵形状的前提
  • sync_module_states = True:多机场景下从 rank 0 同步初始权重,保证各节点一致
  • backward_prefetch = "BACKWARD_PRE":提前预取下一层参数,让通信与计算重叠
  • seed += rank:每张卡使用不同随机种子,让数据增强等随机过程真正并行化

在自动包裹(auto-wrap)策略上,OpenDM 做了自定义:不采用 Transformers 默认的 PEFT 自动包裹,而是让DM05ForConditionalGeneration.fsdp_wrap_modules()显式返回分片边界——整个 Action Expert + VLM 的最后若干层作为一个单元,既保证分片粒度合理,又避免了逐层包裹带来的通信开销。

此外训练还默认开启VLM 与 Action Expert 双路梯度检查点(vlm_gradient_checkpointing/ae_gradient_checkpointing),并用 Liger Kernel 融合 RMSNorm 等操作,进一步压低显存、提升吞吐;VLM 的 token 嵌入层(及其共享权重的lm_head)默认冻结。

⚖️ 核心揭秘三:bf16 与 fp32 两套混合精度策略

OpenDM 把精度策略抽象为一个precision_policy字段(定义在 opendm/constants/precision.py),提供两档:

bf16_mixed(默认策略)

模型以 bfloat16 存储,走标准 AMP 自动混合精度路径。bf16 与 fp32 具有相同位宽和更大的动态范围,训练大模型不易溢出,是吞吐与稳定性的最佳平衡点。

fp32_mixed(高精度策略)

模型权重保持 fp32(MODEL_DTYPE = torch.float32),仅前向计算通过torch.autocast以 bf16 执行(见 opendm/model/dm05/dm05_utils.py 的dm05_autocast),同时:

  • 显式关闭 TF32(TF32_ENABLED = False),保证矩阵乘精度可控
  • FSDP 侧通过set_mixed_precision("fp32")覆盖默认配置,权重分片以 fp32 保存
  • 敏感线性层(如动作投影)通过linear_fp32强制在 fp32 下完成投影,避免低精度污染动作输出

这个策略适合对数值精度敏感的场景,代价是显存和速度。两种策略只需一个配置项切换:

--model-config.precision-policy bf16_mixed # 默认,追求吞吐 --model-config.precision-policy fp32_mixed # 高精度,追求数值稳定

📋 训练栈默认参数速查表

项目默认值配置位置
优化器adamw(可切 muon_adamw)DM05OptimizerConfig.optim
基础学习率2.5e-5DM05OptimizerConfig.base_lr
学习率调度cosine_with_min_lr(min_lr_rate=0.1)DM05TrainerConfig
梯度裁剪max_grad_norm = 1.0DMTrainer._link_exp_config
每卡 batch size4DM05TrainerConfig.per_device_train_batch_size
精度策略bf16_mixedDM05ModelConfig.precision_policy
FSDP 模式shard_grad_op + use_orig_paramsDMTrainer(多卡时自动启用)
梯度检查点VLM + Action Expert 均开启DM05ModelConfig

🏁 如何动手:从 Demo 训练开始

理解了上面的机制,上手只需三步:

  1. 启动多卡训练:运行script/dm05_launcher.sh --exp playground/dm05_sft_demo.py --nproc_per_node 8 --task train ...,脚本会自动设置 NCCL 环境变量并拉起 8 卡(详见 script/dm05_launcher.sh)
  2. 切换优化器:在实验配置中将--optimizer-config.optim muon_adamw传入,即可体验 Muon+AdamW 混合优化
  3. 调整精度策略:用--model-config.precision-policy fp32_mixed开启高精度模式

更多数据集注册、归一化统计与训练流程细节,建议配合官方文档 docs/zh/dm05_finetuning.md 和 docs/zh/dm05_libero_lora_training.md 一起阅读。

OpenDM 这套"Muon 正交化 + FSDP 分片感知 + 双档混合精度"的组合,展示了 VLA 大模型训练栈如何在不牺牲收敛质量的前提下,把显存和算力用到极致。掌握这些底层机制后,你可以更有底气地为自己的机器人模型调参。

【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询