【模型精度排查指南】使用MSIT工具排查OM模型精度问题
收藏回复举报
【模型精度排查指南】使用MSIT工具排查OM模型精度问题
发表于2024-12-06 11:27:34
0 查看

一、准备工作

安装CANN6.3.RC1以上版本。

msit推理工具的安装包括msit包依赖的组件包的安装,其中依赖包可以根据需求只添加所需要的组件包。

这里我们仅需要用到msit中的benchmark组件以及compare组件,更多离线安装方式详细信息请参考msit安装链接

源代码安装

git clone https://gitee.com/ascend/msit.git
# 1. git pull origin 更新最新代码 
cd msit/msit

# 2. 安装 msit 包
pip install .

# 3. 通过msit install 命令,安装所需组件,例如需要安装 benchmark 和 compare 时:
msit install benchmark compare

# 4. 如果需要安装所有组件,可以使用 install all:
msit install all

# 5. 安装之后可以使用 msit check 命令检查安装是否成功:
msit check all

二、准备比对模型及数据

准备好我们所需要的模型。例如:onnx模型(onnx能正常推理并正常转换OM)

为了更加准确的比对模型的精度,建议使用真实数据转换为npy或bin文件作为输入数据进行比对

三、进行模型比对

compare功能可以直接通过msit命令行形式启动精度对比。启动方式如下:

不指定模型输入 命令示例,其中路径需使用绝对路径

msit debug compare -gm /home/HwHiAiUser/onnx_prouce_data/resnet_offical.onnx -om /home/HwHiAiUser/onnx_prouce_data/model/resnet50.om \
-c /usr/local/Ascend/ascend-toolkit/latest -o /home/HwHiAiUser/result/test

指定模型输入 命令示例,其中路径需使用绝对路径 (多个输入用,隔开

​
msit debug compare -gm /home/HwHiAiUser/onnx_prouce_data/resnet_offical.onnx -om /home/HwHiAiUser/onnx_prouce_data/model/resnet50.om \
-c /usr/local/Ascend/ascend-toolkit/latest -input /home/HwHiAiUser/result/test/input_0.npy,/home/HwHiAiUser/result/test/input_1.npy -o /home/HwHiAiUser/result/test

四、分析精度比对结果

比对完成后会生成数据文件,下面是详细目录结构(其底层逻辑来源于)

{output_path}/{timestamp}/{input_name-input_shape}  # {input_name-input_shape} 用来区分动态shape时不同的模型实际输入,静态shape时没有该层
├-- dump_data
│   ├-- npu                          # npu dump 数据目录
│   │   ├-- {timestamp}              # 模型所有npu dump的算子输出,dump为False情况下没有该目录
│   │   │   └-- 0                    # Device 设备 ID 号
│   │   │       └-- {om_model_name}  # 模型名称
│   │   │           └-- 1            # 模型 ID 号
│   │   │               ├-- 0        # 针对每个Task ID执行的次数维护一个序号,从0开始计数,该Task每dump一次数据,序号递增1
│   │   │               │   ├-- Add.8.5.1682067845380164
│   │   │               │   ├-- ...
│   │   │               │   └-- Transpose.4.1682148295048447
│   │   │               └-- 1
│   │   │                   ├-- Add.11.4.1682148323212422
│   │   │                   ├-- ...
│   │   │                   └-- Transpose.4.1682148327390978
│   │   ├-- {time_stamp}
│   │   │   ├-- input_0_0.bin
│   │   │   └-- input_0_0.npy
│   │   └-- {time_stamp}_summary.json
│   └-- {onnx or tf or caffe}        # 原模型 dump 数据存放路径,onnx / tf / caffe 分别对应 ONNX / Tensorflow / Caffe 模型
│       ├-- Add_100.0.1682148256368588.npy
│       ├-- ...
│       └-- Where_22.0.1682148253575249.npy
├-- input
│   └-- input_0.bin                  # 随机输入数据,若指定了输入数据,则该文件不存在
├-- model
│   ├-- {om_model_name}.json
│   └-- new_{om_model_name}.onnx     # 把每个算子作为输出节点后新生成的 onnx 模型
├-- result_{timestamp}.csv           # 比对结果文件
└-- tmp                              # 如果 -m 模型为 Tensorflow pb 文件, tfdbg 相关的临时目录

其中我们能能直观的去查看的result_{timestamp}.csv # 比对结果文件

各个字段含义如下:

误差比对类型名称说明
CosineSimilarity进行余弦相似度算法比对出来的结果。取值范围为[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。
MaxAbsoluteError进行最大绝对误差算法比对出来的结果。取值范围为[0, +∞),值越接近于0,表明越相近,值越大,表明差距越大。
AccumulatedRelativeError进行累积相对误差算法比对出来的结果。取值范围为[0, +∞),值越接近于0,表明越相近,值越大,表明差距越大。
RelativeEuclideanDistance进行欧氏相对距离算法比对出来的结果。取值范围为[0, +∞),值越接近于0,表明越相近,值越大,表明差距越大。
KullbackLeiblerDivergence进行KL散度算法比对出来的结果。取值范围为[0, +∞)。KL散度越小,真实分布与近似分布之间的匹配越好。
StandardDeviation进行标准差算法比对出来的结果。取值范围为[0, +∞)。标准差越小,离散度越小,表明越接近平均值。该列显示My Output和Ground Truth两组数据的均值和标准差,第一组展示My Output模型dump数据的数值(均值;标准差),第二组展示Ground Truth模型dump数据的数值(均值;标准差)。
MeanAbsoluteError表示平均绝对误差。取值范围为[0, +∞),MeanAbsoluteError趋于0,RootMeanSquareError趋于0,说明测量值与真实值越近似;MeanAbsoluteError趋于0,RootMeanSquareError越大,说明存在局部过大的异常值;MeanAbsoluteError越大,RootMeanSquareError等于或近似MeanAbsoluteError,说明整体偏差越集中;MeanAbsoluteError越大,RootMeanSquareError越大于MeanAbsoluteError,说明存在整体偏差,且整体偏差分布分散;不存在以上情况的例外情况,因为RMSE(RootMeanSquareError) ≥ MAE(MeanAbsoluteError)恒成立。
RootMeanSquareError表示均方根误差。取值范围为[0, +∞),MeanAbsoluteError趋于0,RootMeanSquareError趋于0,说明测量值与真实值越近似;MeanAbsoluteError趋于0,RootMeanSquareError越大,说明存在局部过大的异常值;MeanAbsoluteError越大,RootMeanSquareError等于或近似MeanAbsoluteError,说明整体偏差越集中;MeanAbsoluteError越大,RootMeanSquareError越大于MeanAbsoluteError,说明存在整体偏差,且整体偏差分布分散;不存在以上情况的例外情况,因为RMSE(RootMeanSquareError) ≥ MAE(MeanAbsoluteError)恒成立。
MaxRelativeError表示最大相对误差。取值范围为[0, +∞),值越接近于0,表明越相近,值越大,表明差距越大。
MeanRelativeError表示平均相对误差。取值范围为[0, +∞),值越接近于0,表明越相近,值越大,表明差距越大。

比对结果判定

  • 模型精度达标与否首要的是看整网的输出结果是否精度达标,如果输出精度达标,则即使中间节点精度存在异常(包括算子溢出),也无需处理,否则需要逐个排查问题节点。
  • 由于存在前置算子精度影响后续算子的问题,可以开启单算子比对(-single True)功能,一次排查所有问题单算子,屏蔽前置算子影响。

比对结果分析

FP16溢出检测:针对比对数据中数据类型为Float16的数据,进行溢出检测。如果存在溢出数据,会在overflow列显示yes

问题节点检测:判断整网比对结果中,是否某层小于阈值,该层后续数据均小于阈值或最后一层小于阈值(余弦相似度<0.99),输出量化误差修正建议。

举例:cke_603903.png

分析:模型只有一个输出,且输出节点余弦相似度0.9999,模型正常,若推理依旧存在问题则排查预处理和后处理是否规范

举例:模型输出节点精度异常低于0.99,从输出向上排查各个算子输入余弦正常,但是输出异常的点

cke_255929.png

这里的concat算子的两个输入精度正常输出异常,大概率是这里影响到后续计算精度

解决措施:

可以尝试使用fp32精度或者原图精度重新进行ATC转换

使用ATC参数--precision_mode=must_keep_origin_dtype  --customize_dtypes=customize_dtypes.cfg(conv2d等算子不支持fp32可以参考链接中设置)

若依旧解决不了比对后将模型及精度结果文件发到CANN板块共同分析定位

本帖最后由 匿名用户2025/04/01 16:38:59 编辑

我要发帖子