00 引言
GPU迁移到昇腾的大模型,或是基于昇腾开发的大模型在训练过程中经常会出现精度溢出、loss曲线跑飞、不收敛等精度异常情况,而训练loss指标等不能精准指导精度异常定界,无法区分是训练软件栈中哪个部分的问题。msprobe(MindStudio Probe)精度调试工具针对这些问题可以帮我们快速定界定位。
msprobe(MindStudio Probe)精度调试工具支持多维度的训练过程数据采集,如Module级、API级前反向输入输出、权重梯度等数据;数据采集完成后还可以与正常训练的标杆数据进行比对,可以快速寻找差异点进一步分析。
msprobe工具为mstt工具链的精度工具,更多介绍请参见《MindStudio Training Tools》。
本文以Resnet50模型的精度调试为例,主要介绍msprobe的精度数据采集、精度比对功能,供用户参考快速上手使用。
02 准备工作
完成模型开发&迁移后,得到可正常执行训练任务的GPU和NPU环境。分别在GPU和NPU环境下安装msprobe工具,执行如下命令:

pip3 install mindstudio-probe
03 精度数据采集
精度数据采集即msprobe的dump功能,可以采集模型训练过程中API或Module层级的前反向输入输出数据,支持采集的数据包括Module的层次关系、Module或API的输入输出的真实数据和统计值信息、Module或API的调用栈等等。详细操作请参见精度数据采集。
执行采集
分别在GPU和NPU环境下的训练脚本(main.py文件)中添加工具,如下所示。其中在GPU环境下执行训练时,下列脚本中不需要添加24 25行。

 23
 24 import torch_npu
 25 from torch_npu.contrib import transfer_to_npu
 26
 27 from msprobe.pytorch import PrecisionDebugger, seed_all
 28 seed_all(seed=1234, mode=True)  # 固定随机种子,开启确定性计算,保证每次模型执行数据均保持一样
...
310 def train(train_loader, model, criterion, optimizer, epoch, device, args):
...
324     end = time.time()
325
326     debugger = PrecisionDebugger(dump_path="./dump_data", task="tensor", step=[0, 1])
327     for i, (images, target) in enumerate(train_loader):
328         debugger.start()
...
337         # compute output
338         output = model(images)
339         loss = criterion(output, target)
...
347         # compute gradient and do SGD step
348         optimizer.zero_grad()
349         loss.backward()
350         optimizer.step()
...
359         debugger.stop()
360         debugger.step()
  1. 执行训练脚本命令,工具会将模型训练过程中的精度数据采集下来。

python main.py -a resnet50 -b 32 --gpu 1 --dummy

日志打印出现如下信息表示前两个step的数据采集成功,即可手动停止模型训练查看采集数据。

********************************
 * msprobe ends successfully. * 
********************************

结果查看
dump_path参数指定的路径下会出现会存在如下目录结构,可以根据需求选择合适的数据进行分析。

dump_data/
├── step0
    └── rank
        ├── construct.json             # level为L0时,保存Module的层级关系信息,当前场景为空
        ├── dump.json                  # 保存前反向API的输入输出的统计量信息和溢出信息等
        ├── dump_tensor_data           # 保存前反向API的输入输出tensor的真实数据信息等
        │   ├── Functional.adaptive_avg_pool2d.0.backward.input.0.pt
        │   ├── Functional.adaptive_avg_pool2d.0.backward.output.0.pt
        │   ├── Functional.adaptive_avg_pool2d.0.forward.input.0.pt
        │   ├── Functional.adaptive_avg_pool2d.0.forward.output.0.pt
        ...
        └── stack.json                 # 保存API的调用栈信息
├── step1
...

04 精度比对
msprobe比对功能依赖dump工具采集的数据,计算模型整网NPU侧和标杆设备(如CPU、GPU等,以下标杆设备以GPU为例))的误差指标(如余弦相似度、相对误差小于千分之一的比例、最大值误差等),标记可疑的精度异常API或Module,快速定位精度问题根因。详细操作请参见精度比对。
执行比对
将GPU环境下dump的精度数据拷贝至NPU环境。
创建比对配置文件compare.json,文件内容示例如下:

{
"npu_path": "./npu/dump_data/step0/rank/dump.json",
"bench_path": "./gpu/dump_data/step0/rank/dump.json",
"stack_path": "./npu/dump_data/step0/rank/stack.json",
"is_print_compare_log": true
}
  1. 执行比对,命令如下:
    msprobe -f pytorch compare -i ./compare.json -o ./compare_result/accuracy_compare -s
    出现如下打印说明比对成功:

    ...
    Compare result is /xxx/compare_result/accuracy_compare/compare_result_{timestamp}.xlsx
    ...
    The advisor summary is saved in: /xxx/compare_result/accuracy_compare/advisor_{timestamp}.txt
  2. msprobe compare ends successfully. *


  3. 比对结果文件分析。
    compare会在./compare_result/accuracy_compare生成两个文件,分别如下:
    advisor_{timestamp}.txt:文件中给出了可能存在精度问题的API的专家建议
    compare_result_{timestamp}.xlsx:文件列出了所有执行精度比对的API详细信息和比对结果,可通过颜色标记、比对结果(Result)、计算精度达标情况(Accuracy Reached no Not)、错误信息提示(Err_Message)定位可疑算子,但鉴于每种指标都有对应的判定标准,还需要结合实际情况进行判断。示例如下:

05 总结
本文介绍了一种基于昇腾工具的 Resnet50 模型精度调优方法。训练中常现精度异常且难定界,msprobe 精度调试工具可多维度采集数据并与标杆比对。以Resnet50 模型为例,先在 GPU 和 NPU 环境装工具,经精度数据采集、执行训练脚本获取数据,再将 GPU 数据拷至 NPU,创建配置文件执行比对,最后分析生成的 txt 和 xlsx 结果文件定位精度问题。