已关闭
[Bug]: 动态图在配置mtp, aux_loss,expert_bias的情况下,开启pp无法精度对齐 #2356
zzzkeke创建于  6月16日关闭于  6月24日
zzzkeke
zzzkeke成员
6月16日 创建

Checklist

🐞 问题详细描述

动态图在配置mtp, aux_loss,expert_bias的情况下,开启pp=4和单卡加载相同模型,采用相同配置,无法精度对齐
配置:
num_nextn_predict_layers: 1 # 1 mtp_loss_scaling_factor: 0.3 moe_router_load_balancing_type: "aux_loss" moe_aux_loss_coeff: 0.001 moe_router_enable_expert_bias: True moe_router_bias_update_rate: 0.001
精度对齐结果:
image.png
image.png
image.png
image.png

详细的环境信息描述

NPU

其他辅助信息

版本信息

master

Thanks for contributing 🎉!

likedislike
zzzkekezzzkeke成员
6月16日 添加了label:bug
zzzkekezzzkeke成员
6月16日 添加了label:bug
zzzkekezzzkeke成员
6月16日 问题后端类型 由 [] 改变为 [Ascend]
zzzkekezzzkeke成员
6月16日 关联分支 由 [] 改变为 [master]
zzzkekezzzkeke成员
6月16日 关联组件 由 [] 改变为 [B-SIG-MindFormers-Train]
JJava不加糖成员
6月18日 关联了pull request:fix(pynative): 单卡路径补设辅助loss(MTP/MoE-aux/Indexer)反向缩放,修复单卡与多卡MTP精度不对齐
Java不加糖成员
6月18日 评论:

定位到根因并已提修复 PR !8432(Fixes #2356)。

根因:MTP(以及 MoE-aux / Indexer)辅助 loss 的反向缩放 main_loss_backward_scale 只在 base_models/gpt/parallelize.py 末尾通过 set_loss_scale(get_loss_sense(...)) 设置,而该 parallelize 路径只在 trainer.py 的 enable_parallel = world_size > 1 下执行。单卡 world_size==1 跳过整个 _apply_parallelism,这些 scaler 的 scale 保持默认 Tensor(1.0) 而非 1/grad_accum,导致 MTP 等辅助 loss 的梯度被放大(probe 实测:单卡 scale=1.0,dp2=0.0625),单卡训练从第一步优化器更新起就和多卡(含 pp=4)分叉 → 即本 issue 的「单卡与多卡无法精度对齐」。

实证:同一初始权重下,单卡 vs dp2 逐 step loss 相对误差,step10 修复前 0.28%(→step50 约 1.8%),修复后 0.0013%(噪声级);mtp=0 时本就对齐(0.0015%),与 dtype 无关(fp32 同样发散)。

修复(PR !8432):trainer.py 给 if self.enable_parallel: 加 else: 分支,对单卡用 enable_parallel=False 调一次 get_loss_sense + set_loss_scale,与多卡路径对齐。

likedislike
zzzkekezzzkeke成员
6月24日 issue状态由 TODO 改变为 ACCEPTED
zzzkekezzzkeke成员
6月24日 issue状态由 ACCEPTED 改变为 WIP
zzzkekezzzkeke成员
6月24日 issue状态由 WIP 改变为 DONE
zzzkekezzzkeke成员
6月24日 关闭了 issue