lingbotvla优化器
train_lingbotvla.py#L516-541 优化器构建逻辑分析
核心逻辑
这段代码实现了双路径优化器构建策略:根据配置选择 Muon 优化器或传统优化器(AdamW)。
代码逐行解析
第516行:Muon 优化器分支
if args.train.optimizer == "muon":
optimizer = build_muon_optimizer(
model,
args.train,
lr=args.train.lr,
weight_decay=args.train.weight_decay,
)
Muon 优化器是 PyTorch 2.9+ 引入的新型优化器,核心特点:
| 特性 | 说明 |
|---|---|
| 正交优化 | 使用 Newton-Schulz 方法计算梯度的正交近似 |
| 无偏置校正 | 无需 AdamW 中的 bias correction |
| 学习率自适应 | 根据参数形状自动调整学习率 |
| 分布式支持 | DistributedMuon 支持 FSDP2 分片 |
第523-531行:参数组统计
muon_groups, adamw_groups = (
optimizer.optimizers[0].param_groups,
optimizer.optimizers[1].param_groups if len(optimizer.optimizers) > 1 else [],
)
muon_summary = {f"lr={g['lr']:.2e}": len(g["params"]) for g in muon_groups}
adamw_summary = {f"lr={g['lr']:.2e}": len(g["params"]) for g in adamw_groups}
logger.info_rank0(
f"Muon enabled. Muon groups: {muon_summary}; AdamW (1D/embed) groups: {adamw_summary}"
)
关键设计:Muon 优化器返回的是 CombinedOptimizer,包含两个子优化器:
┌─────────────────────────────────────────────────────────────┐
│ CombinedOptimizer │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ optimizer.optimizers[0] │ │ optimizer.optimizers[1] │ │
│ │ DistributedMuon │ │ AdamW │ │
│ │ ┌────────────────────┐ │ │ ┌────────────────────┐ │ │
│ │ │ 2D Linear weights │ │ │ │ 1D biases │ │ │
│ │ │ 3D MoE expert stacks│ │ │ │ Embedding layers │ │ │
│ │ │ Attention weights │ │ │ │ LM head │ │ │
│ │ └────────────────────┘ │ │ │ Layer norms │ │ │
│ └─────────────────────────┘ │ └────────────────────┘ │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
第532-541行:传统优化器分支
else:
optimizer = build_optimizer(
model,
lr=args.train.lr,
weight_decay=args.train.weight_decay,
fused=False,
optimizer_type=args.train.optimizer,
post_training=args.model.post_training,
param_groups=moe_param_groups,
)
支持的优化器类型:
adamw:标准 AdamW 优化器anyprecision_adamw:混合精度 AdamW
build_muon_optimizer 内部机制
从 [optimizer.py](file:///Users/mac/projects/robot/lingbot-vla-v2/lingbotvla/optim/optimizer.py#L263-330) 可以看到完整流程:
1. 参数分类
muon_params, adamw_params, muon_names, adamw_names = split_muon_adamw_params(
model,
extra_adamw_name_patterns=getattr(args_train, "muon_exclude_name_patterns", None),
)
参数路由规则([muon.py#L147-200](file:///Users/mac/projects/robot/lingbot-vla-v2/lingbotvla/optim/muon.py#L147-L200)):
| 参数类型 | 条件 | 路由到 |
|---|---|---|
| Muon | 2D(Linear权重)或 3D(MoE专家栈) | DistributedMuon |
| AdamW | 1D(偏置、norm)、Embedding、lm_head | AdamW |
| AdamW | 名称匹配 embed_tokens, embedding, lm_head, output_layer |
AdamW |
2. MoE 专家学习率缩放
use_expert_lr = bool(getattr(args_train, "use_moe", False)) and bool(
getattr(args_train, "use_moe_expert_lr", False)
)
if use_expert_lr:
token_scale = (args_train.token_num_experts / args_train.token_top_k) ** 0.5
for idx in token_moe_layers:
layer_to_scale[idx] = token_scale
原理:MoE 专家参数需要按 sqrt(num_experts / top_k) 缩放学习率,以补偿专家稀疏激活。
3. 构建分布式 Muon
muon_opt = DistributedMuon(
muon_groups,
lr=lr,
weight_decay=weight_decay,
momentum=float(getattr(args_train, "muon_momentum", 0.95)),
nesterov=bool(getattr(args_train, "muon_nesterov", True)),
ns_steps=int(getattr(args_train, "muon_ns_steps", 5)),
adjust_lr_fn=getattr(args_train, "muon_adjust_lr_fn", "match_rms_adamw"),
)
关键超参数:
| 参数 | 默认值 | 作用 |
|---|---|---|
momentum |
0.95 | 动量系数 |
nesterov |
True | 是否使用 Nesterov 动量 |
ns_steps |
5 | Newton-Schulz 迭代步数 |
adjust_lr_fn |
"match_rms_adamw" |
学习率自适应策略 |
4. 组合优化器
inner_opts: List[Optimizer] = [muon_opt]
if adamw_groups:
adamw_opt = AdamW(adamw_groups, lr=lr, ...)
inner_opts.append(adamw_opt)
return CombinedOptimizer(inner_opts)
DistributedMuon 核心算法
从 [muon.py#L257-415](file:///Users/mac/projects/robot/lingbot-vla-v2/lingbotvla/optim/muon.py#L257-L415) 可以看到优化步骤:
标准步骤(局部参数)
# 1. 动量更新
buf_local.lerp_(grad_local, 1 - momentum)
update_local = grad_local.lerp(buf_local, momentum) # Nesterov
# 2. Newton-Schulz 正交化
ortho_local = batched_newton_schulz(update_local, ns_coefficients, ns_steps, eps)
# 3. 学习率自适应
adjusted_lr = _adjust_lr(lr, adjust_lr_fn, lr_shape)
# 4. 权重衰减 + 参数更新
p_local.mul_(1 - lr * weight_decay)
p_local.add_(ortho_local.to(dtype=p_local.dtype), alpha=-adjusted_lr)
大规模步骤(FSDP2 分片参数)
对于 FSDP2 分片的参数,采用 mega-batch 策略:
Phase 1: 局部动量更新(无需通信)
↓
Phase 2: Stack + 批量 all-gather(一次 NCCL 调用)
↓
Phase 3: Batched Newton-Schulz(一次计算)
↓
Phase 4: 局部切片 + 参数更新
优势:将 NCCL 调用次数从 O(num_params) 降低到 O(num_unique_shapes)。
学习率自适应策略
adjust_lr_fn 支持两种策略:
def _adjust_lr(lr, adjust_lr_fn, param_shape):
fan_out, fan_in = param_shape[:2]
if adjust_lr_fn == "original":
return lr * math.sqrt(max(1.0, fan_out / fan_in))
if adjust_lr_fn == "match_rms_adamw":
return lr * 0.2 * math.sqrt(max(fan_out, fan_in))
| 策略 | 公式 | 适用场景 |
|---|---|---|
original |
lr × sqrt(max(1, fan_out/fan_in)) |
原始 Muon 论文 |
match_rms_adamw |
lr × 0.2 × sqrt(max(fan_out, fan_in)) |
与 AdamW RMS 等效 |
与 train_pi0.py 的对比
| 脚本 | Muon 支持 | MoE 参数组 | 深度对齐参数组 |
|---|---|---|---|
| [train_lingbotvla.py](file:///Users/mac/projects/robot/lingbot-vla-v2/tasks/vla/train_lingbotvla.py#L516) | ✅ | ✅ | ✅ |
| [train_pi0.py](file:///Users/mac/projects/robot/lingbot-vla-v2/tasks/vla/train_pi0.py#L425) | ❌ | ❌ | ❌ |
train_pi0.py 仅使用基础的 build_optimizer,不支持 Muon 和复杂的参数分组策略。
总结
这段代码实现了分层优化器构建策略:
- Muon 路径:针对大规模模型,将 2D/3D 参数路由到
DistributedMuon(正交优化),1D/embedding 参数路由到AdamW(传统优化) - AdamW 路径:传统优化器,支持
adamw和anyprecision_adamw
核心设计亮点:
- 参数智能路由:根据维度和名称自动分类参数
- MoE 学习率缩放:自适应调整专家参数学习率
- 分布式优化:
DistributedMuon支持 FSDP2,mega-batch 策略减少通信开销 - 学习率自适应:根据参数形状动态调整学习率
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)