[MS-2.6][MF-1.6][精度]断点续训场景监控功能导致权重去冗余功能异常

1. 问题描述

关键词:预训练、分布式训练、断点续训、指标异常

1.1 现象

mindformers网络训练,关闭监控时保存的ckpt,在断点续训后加载ckpt,同时开启监控,首loss不一致。

1.2 软件版本

mindspore:2.6
mindformers:1.6

2. 问题定位与根因分析

2.1 定位工具与方法

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工具和自动比对功能,快速寻找首差异,找到问题突破点。

1 Like

欢迎大家一起交流精度调试相关内容~

1 Like