一、准备工作
安装CANN6.3.RC1以上版本。
msit推理工具的安装包括msit包和依赖的组件包的安装,其中依赖包可以根据需求只添加所需要的组件包。
这里我们仅需要用到msit中的benchmark组件以及compare组件,更多离线安装方式详细信息请参考msit安装链接
源代码安装
二、准备比对模型及数据
准备好我们所需要的模型。例如:onnx模型(onnx能正常推理并正常转换OM)
为了更加准确的比对模型的精度,建议使用真实数据转换为npy或bin文件作为输入数据进行比对
三、进行模型比对
compare功能可以直接通过msit命令行形式启动精度对比。启动方式如下:
不指定模型输入 命令示例,其中路径需使用绝对路径
指定模型输入 命令示例,其中路径需使用绝对路径 (多个输入用,隔开)
四、分析精度比对结果
比对完成后会生成数据文件,下面是详细目录结构(其底层逻辑来源于)
其中我们能能直观的去查看的result_{timestamp}.csv # 比对结果文件
各个字段含义如下:
比对结果判定
- 模型精度达标与否首要的是看整网的输出结果是否精度达标,如果输出精度达标,则即使中间节点精度存在异常(包括算子溢出),也无需处理,否则需要逐个排查问题节点。
- 由于存在前置算子精度影响后续算子的问题,可以开启单算子比对(-single True)功能,一次排查所有问题单算子,屏蔽前置算子影响。
比对结果分析
FP16溢出检测:针对比对数据中数据类型为Float16的数据,进行溢出检测。如果存在溢出数据,会在overflow列显示yes
问题节点检测:判断整网比对结果中,是否某层小于阈值,该层后续数据均小于阈值或最后一层小于阈值(余弦相似度<0.99),输出量化误差修正建议。
举例:
分析:模型只有一个输出,且输出节点余弦相似度0.9999,模型正常,若推理依旧存在问题则排查预处理和后处理是否规范
举例:模型输出节点精度异常低于0.99,从输出向上排查各个算子输入余弦正常,但是输出异常的点

这里的concat算子的两个输入精度正常输出异常,大概率是这里影响到后续计算精度
解决措施:
可以尝试使用fp32精度或者原图精度重新进行ATC转换
使用ATC参数--precision_mode=must_keep_origin_dtype --customize_dtypes=customize_dtypes.cfg(conv2d等算子不支持fp32可以参考链接中设置)
若依旧解决不了比对后将模型及精度结果文件发到CANN板块共同分析定位
一、准备工作
安装CANN6.3.RC1以上版本。
msit推理工具的安装包括msit包和依赖的组件包的安装,其中依赖包可以根据需求只添加所需要的组件包。
这里我们仅需要用到msit中的benchmark组件以及compare组件,更多离线安装方式详细信息请参考msit安装链接
源代码安装
二、准备比对模型及数据
准备好我们所需要的模型。例如:onnx模型(onnx能正常推理并正常转换OM)
为了更加准确的比对模型的精度,建议使用真实数据转换为npy或bin文件作为输入数据进行比对
三、进行模型比对
compare功能可以直接通过msit命令行形式启动精度对比。启动方式如下:
不指定模型输入 命令示例,其中路径需使用绝对路径
指定模型输入 命令示例,其中路径需使用绝对路径 (多个输入用,隔开)
四、分析精度比对结果
比对完成后会生成数据文件,下面是详细目录结构(其底层逻辑来源于)
{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 # 比对结果文件
各个字段含义如下:
比对结果判定
比对结果分析
FP16溢出检测:针对比对数据中数据类型为Float16的数据,进行溢出检测。如果存在溢出数据,会在overflow列显示yes
问题节点检测:判断整网比对结果中,是否某层小于阈值,该层后续数据均小于阈值或最后一层小于阈值(余弦相似度<0.99),输出量化误差修正建议。
举例:
分析:模型只有一个输出,且输出节点余弦相似度0.9999,模型正常,若推理依旧存在问题则排查预处理和后处理是否规范
举例:模型输出节点精度异常低于0.99,从输出向上排查各个算子输入余弦正常,但是输出异常的点
这里的concat算子的两个输入精度正常输出异常,大概率是这里影响到后续计算精度
解决措施:
可以尝试使用fp32精度或者原图精度重新进行ATC转换
使用ATC参数--precision_mode=must_keep_origin_dtype --customize_dtypes=customize_dtypes.cfg(conv2d等算子不支持fp32可以参考链接中设置)
若依旧解决不了比对后将模型及精度结果文件发到CANN板块共同分析定位