1. 问题描述
关键词:预训练、分布式训练、断点续训、指标异常
1.1 现象
mindformers网络训练,关闭监控时保存的ckpt,在断点续训后加载ckpt,同时开启监控,首loss不一致。
1.2 软件版本
mindspore:2.6
mindformers:1.6
2. 问题定位与根因分析
2.1 定位工具与方法
- MindSpore dump工具,保存断点续训前后的数据。 使用文档:Dump功能调试 | MindSpore 2.7.1 教程 | 昇思MindSpore社区。
- msprobe自动比对,自动比对数据,快速找到首差异。使用文档: MindStudio-Probe/docs/msprobe/11.accuracy_compare_MindSpore.md · Ascend/MindStudio-Probe - GitCode
- 日志打印,定位权重加载具体问题。
2.2 定位步骤与过程
2.2.1 Dump断点续训前后数据
开启确定性计算,保存断点续训前后的数据。
通过配置全量统计信息Dump
{
"common_dump_settings": {
"op_debug_mode": 0,
"dump_mode": 0,
"path": "/home/workspace/dump/dump_monitor_false_bak",
"net_name": "Net",
"iteration": "all",
"saved_data": "statistic",
"input_output": 0,
"kernels": ["Default/Conv-op12"],
"support_device": [0,1,2,3,4,5,6,7],
"statistic_category": ["max", "min", "l2norm"]
},
"e2e_dump_settings": {
"enable": true,
"stat_calc_mode": "device"
}
}
分别保存关闭监控续训和开启监控续训的两份数据monitor_true和monitor_false
2.2.2 数据比对,寻找首差异
使用msprobe工具kernel级别比对功能
配置文件compare.json
{
"npu_path": "/home/workspace/dump/dump_monitor_true",
"bench_path": "/home/workspace/dump/dump_monitor_false",
"rank_id": [],
"step_id": []
}
执行命令
msprobe -f mindspore compare -i ./compare.json -o output
输出结果
第一个编号为rank,第二个为迭代数。
因为是loss对不齐,因此从后向前分析,先找最后一个rank(rank7)的比较结果,筛选 L2norm diff 去掉为0的,第一个差异在Default_TensorMove-op0.0.input.0算子,首个计算算子差异为
Default_network-MFPipelineWithLossScaleCell_network-_VirtualDatasetCell__backbone-PipelineCell_network-LlamaForCausalLM_model-LlamaModel_norm_out-LlamaRMSNorm_RmsNorm-op0.0.input.1
查看IR图,TensorMove和PrimFunc_RmsNorm是输入输出关系,TensorMove直接从param加载数据。
结合dump数据,不开监控时,norm值为45.274299621582,开启监控,值为0,怀疑是ckpt加载有问题。
2.2.3 权重加载问题定位
通过dump和比对分析,model.norm_out.weight值在开启监控续训时,值为0,怀疑是权重加载出现问题。
在mindformers和mindspore中打日志定位权重加载问题。在权重去冗余加载的广播过程中,广播前,rank6的model.norm_out.weight权重正常,广播后权重为0。确认是去冗余加载问题。
比较开关监控前的权重layout信息,发现开了监控续训,正向的loss监控中会增加loss.device_local_loss权重,layout有变化。
2.3 根本原因
监控会引入params,导致layout变化。在2.6版本中,权重去冗余机制不支持这种场景,导致部分权重加载错误,值为0。2.7 版本已解决此问题。
3. 解决方案
3.1 具体措施
关闭权重去冗余保存 or 升级MindSpore为2.7以上版本。
3.2 验证结果
不开监控,关闭去冗余保存 → 续训,开监控,关闭去冗余,精度可以对齐。
4. 经验总结与预防措施
4.1 经验教训
MindSpore 2.7版本之前,断点续训权重加载不能改变网络的任意一个权重(包含增加,修改等),否则会出现权重加载位置错乱等问题,影响续训精度。
短信
4.2 最佳实践/检查清单
断点续训稳定复现的精度问题,如果是loss差异,优先排查ckpt加载问题。
如果ckpt没有问题,可以通过dump工具和自动比对功能,快速寻找首差异,找到问题突破点。





