昇腾社区首页
中文
注册

问题定位

定位流程

传统模型精度问题定位流程如图1所示。

图1 定位流程
  1. 检查硬件环境配置、CANN包版本以及其他依赖库版本是否匹配。
    • 是,继续定位。
    • 否,重新配置环境、软件包和依赖库,查看精度问题是否消失,如果还未消失,继续定位问题。
  2. 挑选存在明显精度问题的BadCase进行分析定位。
  3. 使用msit debug compare工具采集比对模型的全量dump数据。
    • 比对结果误差较小,需对前后处理过程进行排查,确定是否为累计误差问题。
    • 比对结果误差较大,找到首个不满足精度标准的算子,分析定位误差根因。
  4. 如果确定是算子实现导致,需要联系技术工程师提供进一步的技术支持

定位步骤

  1. 检查环境配置。

    如果传统模型在某一类硬件环境上执行推理时精度正常,但在其他硬件或配置环境执行推理时精度异常,则需要排查版本配置,需检查各个组件的版本是否一致,且和硬件环境适配,版本配套问题请查看MindStudio版本说明》中的“版本配套关系

    例如,可执行以下命令,查看CANN的版本。

    cat cann安装路径/ascend-toolkit/latest/version.cfg
  2. 执行以下命令,使用ATC工具进行模型转换。
    atc --model=model_path --framework=5 --output=output_path --soc_version=soc_version

    其中,命令中的参数解释如表1所示。

    表1 参数说明

    参数

    说明

    --model

    模型文件所在路径。示例:$HOME/module/resnet50*.onnx。

    --framework

    原始框架类型,其中5表示ONNX。

    --output

    生成的离线模型路径。示例:$HOME/module/out/onnx_resnet50。

    --soc_version

    昇腾AI处理器的型号。具体使用型号查询方法请参见ATC离线模型编译工具用户指南中的“参数说明 > 基础功能参数 > 目标芯片选项 > --soc_version章节。

  3. 使用msit debug compare工具快速获取模型比对结果。compare一键式全流程精度比对(推理)功能将推理场景的精度比对做了自动化。用户输入原始模型(onnx)、对应的离线模型和数据,自动输出整网比对的结果,也可以输入dump好的cpu、npu侧的算子数据直接进行精度比对。msit debug compare工具安装请参见msit debug compare功能使用指南
    1. 执行以下命令,启动精度对比。
      msit debug compare -gm golden_model path -om om_model path  [可选参数]

      相关参数说明可参见命令行入参说明

      如果已经有真实场景的输入数据,推荐优先指定输入数据进行调测。示例如下:

      msit debug compare -gm /home/HwHiAiUser/onnx_produce_data/resnet_official.onnx -om /home/HwHiAiUser/onnx_produce_data/model/resnet50.om \
      -i /home/HwHiAiUser/result/test/input_0.bin -c /usr/local/Ascend/ascend-toolkit/latest -o /home/HwHiAiUser/result/test

      其中,-i,–-input为模型的输入数据路径,多个输入以英文逗号分隔,例如:/home/input_0.bin,/home/input_1.bin。

      本场景会根据文件输入size和模型实际输入size自动进行组batch,但需保证数据除batch size以外的shape与模型输入一致。如果输入为npy文件,该功能会自动将npy文件转化为bin文件。

    2. 落盘数据的目录结构可参见对比输出结果说明

      其中result_{timestamp}.csv文件为比对结果文件,包含了整网所有算子的dump数据比对结果,主要用于分析模型精度问题。比对结果的含义与基础精度比对工具完全相同,其中每个字段的说明可参见精度调试工具用户指南中的完整比对结果参数说明“章节。

      其中,核心比对指标如表2所示,任意一个指标超出阈值即为精度异常。

      表2 核心比对指标

      误差对比算法

      说明

      阈值

      CosineSimilarity

      余弦相似度,进行余弦相似度算法比对出来的结果。

      >0.99

      RelativeEuclideanDistance

      欧氏相对距离,进行欧氏相对距离算法比对出来的结果。

      <0.05

      KullbackLeiblerDivergence

      KL散度,进行KL散度算法比对出来的结果。

      <0.005

      RootMeanSquareError

      均方根误差。

      <1.0

      MeanRelativeError

      平均相对误差。

      <1.0

      • 可以优先查看CosineSimilarity和RelativeEuclideanDistance指标,快速感知结果。CosineSimilarity代表两个高维张量的方向是否一致,RelativeEuclideanDistance代表两个向量的距离远近。
      • 模型精度是否达标,首要的是看整网的输出结果是否精度达标,如果输出精度达标,即使中间节点精度存在异常(包括算子溢出),也无需处理,否则需要逐个排查问题节点。更多指标细节可参考对比结果分析步骤
  4. 问题分析。
    1. 核心分析

      由于比对结果文件中的算子呈现,并不是完全的执行顺序,因此算子在文件中的先后顺序,并不完全代表其在模型结构拓扑图中的先后顺序。在分析时我们需要从文件中找到第一个出现精度异常的算子,并查看它在模型拓扑图中的位置,寻找它以及它上一个算子,查看精度是否符合标准。主要分为以下几种情况:

      • 算子的输入一致,输出不一致,说明该算子存在精度问题,需要分析误差原因。
      • 算子有多个输入和多个输出,部分输入出现NaN的情况,其他一致,但是输出不一致,该算子也可能存在精度问题,需要根据模型结构找到算子的前一个节点的输出,作为下一个节点的输入来进一步分析。
      • 算子有多个输入和多个输出,输入一致,部分输出出现NaN的情况,并且其后续算子输入不一致,说明该算子可能存在精度问题。

      使用netron工具打开onnx模型,便可获得模型拓扑结构图,单击节点可以观察到其输入节点的信息,结合比对结果可以快速获取上一个节点的相关信息。

    2. 累积误差和前后处理问题分析
      • 如果比对结果中无明显精度骤降的情况,但整网输出有差异,且和标杆数据相比,推理过程的前后处理方式都一致,则说明是累计误差问题。此时可以尝试通过提升模型精度的方法来解决,需要在ATC转换时增加控制精度的参数,具体可参考ATC离线模型编译工具用户指南中的“参数说明 > 高级功能参数 > 算子调优选项章节。
      • 如果比对结果中无明显精度骤降的情况,整网输出无差异,但在业务层面有差异,需要结合业务场景,检查输入数据是否不一致,输出数据处理方式不一致等情况。