昇腾社区首页
中文
注册

比对步骤(推理场景)

约束

如果是两份基于相同模型、昇腾AI处理器运行生成的dump数据进行精度比对,需确保input个数、output个数、format、shape必须完全一致,否则无法比对;另外,此场景下命令行只需配置-m、-g、-out参数,不需要配置-f、-q参数。

说明

  • 本节涉及的.json文件、目录等名称均为举例,请根据实际环境替换。其中,--out指定的结果存放路径,需确保HwHiAiUser用户具有读写权限。
  • 如果执行过程中报“MemoryError”,则表示数据量过大导致了内存溢出,请将NPU的dump数据文件拆分到多个目录后,再逐一进行比对。
  • 使用量化离线模型在昇腾AI处理器上运行生成的dump数据作为待比对数据时,由于量化与反量化算子之间存在影响精度的中间算子,在比对时会与源数据产生较大的精度损失,所以精度比对时会过滤掉中间算子进行比对,此时输出的结果将不包含整网的所有算子。
  • 昇腾模型压缩工具对原始框架模型进行量化时,会插入量化和反量化算子,而使用ATC工具进行模型转换过程中,会对插入的量化和反量化算子进行融合,此情况下进行量化后模型dump结果与原始模型dump结果的比对可能不准确。因此如果用户想使用通过昇腾模型压缩工具量化后的模型进行精度比对,则需要通过--fusion_switch_file参数关闭部分融合功能,并在精度比对后进行比对步骤(推理场景融合算子精度问题排查)。有关--fusion_switch_file参数关闭算子融合功能的详细介绍请参见ATC工具使用指南的“参数说明>高级功能参数>模型调优选项>--fusion_switch_file”。
  • 当指定的比对数据文件大小超过1GB或全网层信息文件、量化算子映射关系文件等json文件大小超过100MB时,比对过程可能耗时较长,系统提示:'The size (%d) of %s more than the XX, it needs more time to run.'。
  • 基于相同模型(开/关融合)、昇腾AI处理器运行生成的dump数据进行整网比对且指定-s或-r参数时,需同时指定-f和-cf参数。

操作步骤

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

  1. 以HwHiAiUser用户登录开发环境。
  2. 生成json文件。

    Ascend-cann-toolkit安装目录/ascend-toolkit/latest/bin/atc --mode=1 --om=/home/HwHiAiUser/data/resnet50.om --json=/home/HwHiAiUser/data/resnet50.json

  3. 进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare目录。
  4. 执行Tensor比对命令。

    由于dump和npy比对数据文件是由多个文件组成,故下文操作步骤中-m-g参数须指定数据文件所在的父目录。如:/home/HwHiAiUser/MyApp_mind/resnet50,其中resnet50文件夹下直接保存比对数据文件。

    目录结构示例如下:

    root@xxx:/home/HwHiAiUser/MyApp_mind/resnet50# tree
    .
    ├── BatchMatMul.bert_encoder_layer_0_attention_self_MatMul_1.24.1614717261785536
    ├── BatchMatMul.bert_encoder_layer_0_attention_self_MatMul.21.1614717261768864
    ├── BatchMatMul.bert_encoder_layer_10_attention_self_MatMul_1.235.1614717263664916
    #仅为示例,此处省略剩余文件名。
    • 全算法维度比对样例

      python3 msaccucmp.py compare -m /home/HwHiAiUser/MyApp_mind/resnet50 -g /home/HwHiAiUser/Standard_caffe/resnet50 -f /home/HwHiAiUser/data/resnet50.json -out /home/HwHiAiUser/result

      Tensor比对结果result_*.csv文件内容如图1所示。
      图1 全算法维度比对结果
    • 部分算法维度比对样例:

      python3 msaccucmp.py compare -m /home/HwHiAiUser/MyApp_mind/resnet50 -g /home/HwHiAiUser/Standard_caffe/resnet50 -f /home/HwHiAiUser/data/resnet50.json -out /home/HwHiAiUser/result -alg 0,1,2,3

      Tensor比对结果result_*.csv文件内容如图2所示。

      图2 部分算法维度比对结果
    • 部分算子比对样例

      python3 msaccucmp.py compare -m /home/HwHiAiUser/MyApp_mind/resnet50 -g /home/HwHiAiUser/Standard_tf/resnet50 -f /home/HwHiAiUser/data/ -out /home/HwHiAiUser/result -r 1,-1,10

      Tensor比对结果result_*.csv文件内容如图3所示。
      图3 部分算子比对结果

    以上样例仅展示部分比对结果字段,完整字段解释请参见表1

    表1 输出参数说明

    参数

    说明

    Index

    网络模型中算子的ID。

    OpSequence

    算子运行的序列。即-f参数指定的全网层信息文件中算子的ID。仅配置-r或-s参数时展示。

    OpType

    算子类型。指定-f,-cf或-q参数时获取算子类型。

    NPUDump

    表示My Output模型的算子名。

    DataType

    表示My Output侧数据算子的数据类型。

    Address

    dump tensor的虚拟内存地址。用于判断算子的内存问题。仅基于昇腾AI处理器运行生成的dump数据文件在整网比对时可提取该数据。

    GroundTruth

    表示Ground Truth模型的算子名。

    DataType

    表示Ground Truth侧数据算子的数据类型。

    TensorIndex

    表示My Output模型算子的input ID和output ID。

    Shape

    比对的Tensor的Shape。

    OverFlow

    溢出算子。显示YES表示该算子存在溢出;显示NO表示算子无溢出;显示NaN表示不做溢出检测。配置-overflow_detection参数时展示。

    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 ≥ MAE恒成立。

    RootMeanSquareError

    表示均方根误差。取值范围为0到无穷大,MeanAbsoluteError趋于0,RootMeanSquareError趋于0,说明测量值与真实值越近似;MeanAbsoluteError趋于0,RootMeanSquareError越大,说明存在局部过大的异常值;MeanAbsoluteError越大,RootMeanSquareError等于或近似MeanAbsoluteError,说明整体偏差越集中;MeanAbsoluteError越大,RootMeanSquareError越大于MeanAbsoluteError,说明存在整体偏差,且整体偏差分布分散;不存在以上情况的例外情况,因为RMSE ≥ MAE恒成立。

    MaxRelativeError

    表示最大相对误差。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。

    MeanRelativeError

    表示平均相对误差。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。

    CompareFailReason

    算子无法比对的原因。

    若余弦相似度为1,则查看该算子的输入或输出shape是否为空或全部为1,若为空或全部为1则算子的输入或输出为标量,提示:this tensor is scalar。

    备注:

    • 显示“*”,表示在NPU侧新增的算子无对应的标准算子;“NaN”表示无比对结果。
    • 余弦相似度和KL散度比较结果为NaN,其他算法有比较数据,则表明左侧或右侧数据为0;KL散度比较结果为inf,表明右侧数据有一个为0;比对结果为nan,表示dump数据有nan。