对比结果说明

简介

本节以非量化昇腾AI处理器运行生成的dump数据与非量化onnx模型npy数据比对为例,介绍对比结果分析步骤,下文中参数说明均以该示例介绍,请根据您的实际情况进行替换。

对比输出结果说明

{output_path}/{timestamp}/{input_name-input_shape}  # {input_name-input_shape}用来区分动态shape时不同的模型实际输入,静态shape时没有该层
├-- dump_data
│   ├-- npu                          # npu dump数据目录
│   │   ├-- {timestamp}              # 模型所有npu dump的算子输出,dump为False情况下没有该目录
│   │   │   └-- 0                    # Rank设备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
│   │   ├-- {timestamp}
│   │   │   ├-- output_0.bin
│   │   │   └-- output_0.npy
│   │   └-- {timestamp}_summary.json
│   └-- {onnx}        # 原模型dump数据存放路径,onnx分别对应ONNX模型
│       ├-- Add_100.0.1682148256368588.npy
│       ├-- input_Add_100.0.1682148256368588.npy  # 如果是ONNX模型,则会dump输入数据,并增加对应的input前缀
│       ├-- ...
│       └-- Where_22.0.1682148253575249.npy
├-- input
│   └-- input_0.bin                  # 随机输入数据,若指定了输入数据,则该文件不存在
├-- model
│   ├-- {om_model_name}.json
│   └-- new_{om_model_name}.onnx     # 把每个算子作为输出节点后新生成的ONNX模型
└-- result_{timestamp}.csv           # 比对结果文件

比对结果文件各字段含义说明

  • 比对结果 在文件 result_{timestamp}.csv 中,比对结果的含义与基础精度比对工具完全相同,其中每个字段的含义可参考 《CANN商用版 精度调试工具用户指南》中的“附录 > 完整比对结果参数说明”章节。
  • 下面简要介绍说明结果信息:

    OpType NPUDump DataType Address GroundTruth DataType TensorIndex Shape Overflow CosineSimilarity ... MeanRelativeError CompareFailReason IsNpuOps IsOutputNode IsPrecisionError
    Sub Sub_26Mul_28 float16 NaN Sub_26,Mul_28 float32 Sub_26Mul_28:output:0 [1,1,1,108] NO 1 ... 0.000364 NO NO NO

如上所示的结果文件中主要关注以下几项:

  • [NPUDump]:这个对应om模型中的算子,由于融合规则,可能会对应多个GPU/CPU算子。
  • [DataType]:一共有两个,一个是NPU侧的数据类型,一个是CPU/GPU侧的数据类型,二者有所不同,可能会有精度损失问题。
  • [GroundTruth]:om算子所对应的onnx模型算子。
  • [Overflow]:数据是否出现上溢出或下溢出。
  • [CompareFailReason]:比对失败原因,误差可能会因为除零非法或者不对应等原因造成无法计算,变为NaN值,会列出详细原因。
  • [IsNpuOps]:用于过滤是否为npu独有节点。
  • [IsOutputNode]:用于过滤是否为模型的整网输出节点。
  • [IsPrecisionError]:用于过滤是否为精度异常的节点。
  • [CosineSimilarity]...[MeanRelativeError]:这是各类误差比对类型结果,主要需要看是否某一项超过精度阈值(即某项异常),若超过则需要重点关注。各对比算法说明如下:
误差比对类型名称 说明
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,表明越相近,值越大,表明差距越大。

比对结果分析

  • 精度指标

    误差对比算法 精度正常的参考标准
    CosineSimilarity > 0.99
    RelativeEuclideanDistance < 0.05
    KullbackLeiblerDivergence < 0.005
    RootMeanSquareError < 1.0
    MeanRelativeError < 1.0
  • 模型精度达标与否首要的是看整网的输出结果是否精度达标,如果输出精度达标,则即使中间节点精度存在异常(包括算子溢出),也无需处理,否则需要逐个排查问题节点。

[RelativeEuclideanDistance]: