精度问题分析流程

精度比对完成后若存在精度问题,则需要进行问题分析并找出解决方案,图1以Caffe推理应用场景为例提供精度问题分析基本思路参考。

图1 精度问题分析基本思路

以下介绍图1中各步骤的具体操作:

  1. 确认第一层data层的输入数据是否正确:找一张有精度问题的图片,编译、指令仿真、Caffe都用这张图片。比较仿真和Caffe每层的相似度。而后按照上图中顺序进行判断。
  2. 确认data层的相似度是否为≥0.999:
    • 是:执行下一个判断。
    • 否:确认data层输入一致。检查均值[mean_file]、缩放[data_scale]、预处理方式[norm_type],是否和Caffe一致。(Mxnet和Darknet(yolo))网络训练时,默认是RGB,所以转换模型时需要配置[RGB——order]为RGB。
  3. 确认是否存在data层相似度0.99+,逐层下降,最后一层小于0.95的情况:
    • 是:确认是否量化误差导致。

      修改ATC的配置项,配置[dump_data]为1,输出校准数据到mapper_quant目录。

      配置[forward_quantization_option]为1,即只做数据量化,权重不量化。比较mapper_quant和caffe的相似度,如果相似度达标,说明是权重量化误差导致。

      配置[forward_quantization_option]为2,即只做权重量化,数据不量化。比较mapper_quant和caffe的相似度,如果相似度达标,说明是数据量化误差导致。

      • 是:使用AMCT工具进行Calibration校准或者重训。
      • 否:向技术支持人员反馈问题。
    • 否:执行下一个判断。
  4. 确认是否存在最后一层相似度为0.99,中间某些层相似度<0.90的情况:
    • 是:确认层的匹配情况。

      ATC优化网络结构,以适应硬件执行,所以相似度比较时有可能层和Caffe不匹配。

      1. 判断是否为Inplace写法,即top与bottom名称相同。某些层不支持Inplace,需要拆分。例如conv + tanh,在Caffe支持Inplace,只输出tanh的数据,而ATC不支持conv与tanh融合,分别输出conv和tanh,所以比较时需要注意。
      2. 判断是否为ATC修改网络。请查看cnn_net_tree.dot(ATC编译时生成),和原来的prototxt比较,是否修改了网络结构。如SPP层拆分为Pooling和Concat,所以要与Concat的结果比,或直接观察后面层的相似度(即执行下一个判断)。
      3. 层匹配,但相似度较低,向技术支持人员反馈问题。
    • 否:执行下一个判断。
  5. 如果所有层的相似度均为0.99+且绝对误差也很小,则可能是后处理的问题,确认后处理是否正确。

    假设Caffe的结果经过Caffe的后处理画框或分类,则把仿真结果也使用Caffe的后处理,观察是否正常画框或分类。

    如果正常,则说明是板端后处理问题,请比较板端和Caffe的后处理代码。

    如果不正常,而数据的相似度为0.99且绝对误差很小,则说明Caffe的后处理代码对数据很敏感,请检查Caffe的后处理代码。

  6. 向技术支持人员反馈问题。

    请将以下信息反馈给技术支持人员:

    • 如果是Caffe则返回prototxt、caffemodel,如果是PyTorch则返回ONNX模型和py定义,pth文件。如果不方便提供模型,请提供问题层对应的prototxt、py、pth、weights和输入/输出数据。
    • 编译用的参数、图片、均值文件。
    • 编译时打印的ATC版本号,如:Mapper Version 1.0.0.0_B010(PICO_1.0) 2110161033840ed952(CPU)(INST_2.0.9)