文档
注册

子模型导出与比对

概述

在使用昇腾AI处理器的推理功能时,可能存在推理结果和原始模型推理结果不一致的情况,使用精度比对工具可以定位到某个或者某些非用户自定义层出现精度下降的问题,此时需要用户将怀疑有问题的局部网络的相关数据截取出来进行局部结构精度比对,在该背景下,MindStudio提供Caffe和TensorFlow原始网络模型的子模型导出功能方便用户获取数据,导出原理如图1所示。

  • 若需使用TensorFlow框架的子模型导出功能,请自行安装TensorFlow 1.15 AI框架和Python3(版本要求:3.7.5~3.7.11)。
  • 若需使用Caffe框架的子模型导出功能,请自行安装Caffe AI框架并确保框架能在Python3.7或Python3.9下正常运行,其中yolov2、yolov3以及量化后的网络模型暂不支持在Caffe AI框架下的子网导出,Caffe AI框架支持的操作系统请参见Caffe官网中“Installation”模块;Windows系统不支持使用Caffe框架的子模型导出功能。
图1 子模型导出原理
  1. 使用ATC工具,将原始模型转换成适配昇腾AI处理器的离线模型,详情请参见模型转换和调优
  2. 使用转换后的离线模型进行推理。
  3. 如果推理结果和原始模型推理结果不一致,则通过精度比对,将怀疑有问题的原始网络模型的局部网络模型相关数据导出,详情请参见导出步骤。重复进行子模型导出与子模型的精度比对,将问题定位至最小模型。
  4. 针对最小模型进行优化。

    如果问题解决,则重新进行模型转换,然后进行模型推理。

导出入口

MindStudio界面,依次单击菜单栏Ascend > Dump Network,进入子模型导出界面。

导出步骤

  1. MindStudio界面菜单栏选择Ascend > Dump Network进入子模型导出界面,如图2所示。
    图2 子模型导出界面
    表1 界面参数以及按钮说明

    参数

    说明

    Dump Data Path

    精度比对界面“NPU Dump”中配置的离线模型对应的dump数据。单击右侧的选择dump目录。

    Offline Model File

    精度比对界面“Model File”中配置的离线模型文件。单击右侧的选择离线模型文件。

    Deploy Model

    • 原始网络模型文件,单击右侧的选择MindStudio安装服务器相应文件。
    • 如果为昇腾模型压缩工具量化后的模型文件,则此处需要选择量化后可在昇腾AI处理器部署的模型文件。

    Deploy Weight

    • 原始网络模型权重文件,若模型文件与权重文件在MindStudio安装服务器相同位置,选择模型文件后,权重文件会自动填充,否则需要用户单击右侧的自行选择。
    • 如果为昇腾模型压缩工具量化后的权重文件,则此处需要选择量化后可在昇腾AI处理器部署的权重文件。
      说明:

      只有原始网络模型文件为Caffe模型时,才会显示并需要添加Caffe模型权重文件(*.caffemodel)。

    Dump Output Path

    子模型导出目录,单击右侧的选择导出目录,若没有目录,请先自行创建。

    Show Result

    单击该按钮,会解析原始模型文件,并将解析后的结果以图的形式呈现在右侧空白区域。

    Dump

    子模型导出按钮。

  2. 配置好参数后,单击“Show Result”,解析原始网络模型。

    如果模型转换后导出的.om模型文件中的原模型“Model Name”取值与Caffe原始网络模型文件(*.prototxt)或者TensorFlow原始网络模型文件(*.pb)中的“Model Name”取值不同时,解析网络模型时会弹出如图3所示界面。

    • 单击“Yes”继续解析,进入图4
    • 单击“No”,返回子模型导出界面。
    图3 Model Name取值不同
    解析成功的原始网络模型如图4所示。
    图4 解析成功结果
    其中:
    • 查看算子信息

      单击图4中间区域框下方相关参数左侧的展开按钮,查看参数的详细信息;单击折叠所有的算子信息。

    • 查看算子输出shape信息

      图4还展示了每一层算子输出的维度和shape信息,如每一层算子连接线中间的NCHW,1,3,224,224等信息。

    • 搜索算子

      图4所示界面,中间下方为搜索区域。

      搜索区域中给出了该模型所用到的所有算子,您可以在搜索区域对话框中输入算子名称,下方搜索区域会列出相关的算子。选择其中一个算子,左侧网络拓扑结构中相应算子会显示绿色选中框,中间区域框上方会展示该层算子的详细信息,包括算子名称、算子输入、输出等信息。

      图5 搜索算子内部信息
    • 搜索算子内部信息

      图4中的输入框输入想要查询的信息,之后单击即可逐个查找。

  3. 选中怀疑有问题的局部网络模型第一个节点(输入节点),右键选择start;选中最后一个节点(输出节点)右击选择endstartend中间的节点则为蓝色选中状态。
    • 选中了输入和输出节点后,如果想更换输入或输出节点,则在新的节点上右击选择相应的属性即可,新的节点颜色随之变化,原有节点恢复原始颜色。
    • 如果在某个节点选择start,并在该节点上方节点选择end,则无法选择。
  4. 确定输入节点和输出节点后,单击“Dump”导出子模型。

    MindStudio后台会在原始网络模型中寻找子模型,然后将子模型导出。界面右下角会有导出进度提示,单击该进度条可以查看详细进度。

    若出现图6所示信息,则说明导出成功。
    图6 导出成功提示

查看导出成功后结果

  1. 进入MindStudio安装服务器“Dump Output Path”所在目录可以看到以时间戳命名的文件夹dump_result_xxxx_xx_xx_xx_xx_xx,其中:
    • dump.prototxt:导出的Caffe子模型文件。
    • dump.pb:导出的TensorFlow子模型文件。
    • dump.caffemodel:导出的子模型权重文件(Caffe模型特有)。
    • dump_data:选中的Start LayerEnd Layer中间,子模型所包括的所有算子的dump数据信息。

      该文件夹中不仅包括导出子模型所包括的所有算子的dump信息,还包括子模型Start Layer层的输入数据,用于子模型推理时作为输入数据使用。

  2. MindStudio界面“Output”窗口可以看到导出日志(如下日志中的所有数据都为样例数据,请以实际导出模型为准):
    //导出过程中会为子模型添加输入信息
    2020-05-22 16:27:57  Add Layer Into Prototxt:
    name: "pool1_input_0"
    type: "Input"
    top: "conv1"
    input_param {
      shape {
        dim: 1
        dim: 64
        dim: 112
        dim: 112
      }
    }
    
    //导出子模型的所有算子的dump数据信息
    2020-05-22 16:27:57  Output Dump Path:/home/username/dumpdate/dumpresult/ir6/dump_result_2020_05_22_16_27_44/dump_data
    
    //Start Layer与End Layer中间某层算子的dump信息其中Output File表示Dump Layer层算子对应离线模型中相应算子的输出dump数据,Input File表示Dump Layer层算子对应的离线模型中相应算子的输入dump数据
    2020-05-22 16:27:58  Dump Layer:[res2a_branch2c, bn2a_branch2c, scale2a_branch2c]
    Output File:Conv2D.res2a_branch2cres2ares2a_relu.151.1585884515795667
    Input File:Conv2D.res2a_branch2bres2a_branch2b_relu.149.1585884515771632
    ...
    
    //Start Layer与End Layer中间所有算子的dump信息
    2020-05-22 16:27:58  Export Layer:pool1,res2a_branch1,bn2a_branch1,scale2a_branch1,res2a_branch2a,bn2a_branch2a,scale2a_branch2a,res2a_branch2a_relu,res2a_branch2b,bn2a_branch2b,scale2a_branch2b,res2a_branch2b_relu,res2a_branch2c,bn2a_branch2c,scale2a_branch2c,res2a,res2a_relu
  3. 用户可以将导出的子模型再次进行精度比对,如果问题解决则进入下一步导出子模型重新执行推理验证。

导出子模型重新执行推理

  1. 1导出的子模型,参见模型转换和调优转换成.om离线模型文件。

    如果导出的子模型不包括输入的data层节点,则转换.om离线模型时,请关闭AIPP预处理参数。

  2. 1导出的子模型“start”层的输入数据,转换成bin格式,用户执行推理时,作为离线模型的输入数据使用。
    1. 查找“start”层的输入数据。

      输入数据为子模型导出时“Dump Layer”“start”层算子对应的Input File文件,根据此信息,在MindStudio安装服务器“dump_data”目录下查找同名Input File文件,即为“start”层的输入数据。

    2. pb格式输入数据转成numpy格式。

      进入MindStudio安装服务器,切换到Ascend-cann-toolkit安装目录/ascend-toolkit/latest/tools/operator_cmp/compare路径,执行如下命令将pb格式的输入数据转换成numpy格式:

      python3 shape_conversion.py -i pb格式输入数据绝对路径 -format NCHW -o 转换为numpy格式数据的存放路径

      上述命令中的路径请根据实际情况进行替换,转换完成后,可以在numpy格式数据的存放路径看到.npy格式的输入数据。

    3. numpy格式输入数据转成bin格式。

      将如下脚本中的数据路径替换为实际路径,然后将脚本另存为.py格式,例如submodeldataprocess.py。

      import numpy as np
      
      # 将numpy二进制格式转换为原始二进制格式
      conv1_relu_0 = np.load(
          "/home/username/dumpdate/subModelData/xxx.npy")  # .npy格式的输入数据的绝对路径
      conv1_relu_0 = conv1_relu_0.astype(np.float16)
      conv1_relu_0.tofile(
          "/home/username/dumpdate/subModelData/xxx.bin")  # 转换为bin格式数据的存放路径

      将submodeldataprocess.py脚本上传到MindStudio安装服务器任意路径,然后执行如下命令将.npy格式的输入数据转换成bin格式:

      python3 submodeldataprocess.py

      进入bin格式数据的存放路径,可以看到.npy格式的输入数据已经转换成bin格式。

  3. 将导出的原始网络子模型在原始环境中执行推理业务,然后将12中的离线模型和输入数据在昇腾AI处理器执行推理业务,查看两者推理结果是否有差异。如果仍有差异,则参见精度比对使用1中导出的原始网络子模型与1原始网络子模型转换后的离线模型重新和原始模型标杆数据进行精度比对。
  4. 重复执行子模型导出与子模型精度比对,把问题定位到最小模型,针对最小模型进行优化。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词