在使用昇腾AI处理器的推理功能时,可能存在推理结果和原始模型推理结果不一致的情况,使用精度比对工具可以定位到某个或者某些非用户自定义层出现精度下降的问题,此时需要用户将怀疑有问题的局部网络的相关数据截取出来进行局部结构精度比对,在该背景下,MindStudio提供Caffe和TensorFlow原始网络模型的子模型导出功能方便用户获取数据,导出原理如图1所示。
在MindStudio界面,依次单击菜单栏 ,进入子模型导出界面。
参数 |
说明 |
---|---|
Dump Data Path |
精度比对界面“NPU Dump”中配置的离线模型对应的dump数据。单击右侧的 |
Offline Model File |
精度比对界面“Model File”中配置的离线模型文件。单击右侧的 |
Deploy Model |
|
Deploy Weight |
|
Dump Output Path |
子模型导出目录,单击右侧的 |
Show Result |
单击该按钮,会解析原始模型文件,并将解析后的结果以图的形式呈现在右侧空白区域。 |
Dump |
子模型导出按钮。 |
如果模型转换后导出的.om模型文件中的原模型“Model Name”取值与Caffe原始网络模型文件(*.prototxt)或者TensorFlow原始网络模型文件(*.pb)中的“Model Name”取值不同时,解析网络模型时会弹出如图3所示界面。
其中:
单击图4中间区域框上方的展开算子的所有参数信息,用户也可以逐层单击相关参数左侧的展开按钮
,查看参数的详细信息;单击
折叠所有的算子信息。
图4还展示了每一层算子输出的维度和shape信息,如每一层算子连接线中间的NCHW,1,3,224,224等信息。
在图4所示界面,中间下方为搜索区域。
搜索区域中给出了该模型所用到的所有算子,您可以在搜索区域对话框中输入算子名称,下方搜索区域会列出相关的算子。选择其中一个算子,左侧网络拓扑结构中相应算子会显示绿色选中框,中间区域框上方会展示该层算子的详细信息,包括算子名称、算子输入、输出等信息。
选中某层算子,单击图4中间区域框上方的展开按钮,下方区域框会展示该层所包括所有算子的信息,然后单击
或在中间区域使用“Ctrl+F”快捷键,弹出图5所示搜索界面,其中:
用户在输入框中输入想要查询的信息,比如算子的输入输出、属性等信息,然后在图5界面中勾选搜索特性,单击“Find”进行查找,如果匹配到相关信息,则中间区域框中相关信息会高亮显示,否则会提示“Value not found”。单击Close退出搜索。
当开始节点和结束节点选择不合法时,两个节点外框会变红,出现相应信息提示不合法原因,同时“Dump”按钮置灰,不可导出dump。可根据提示信息对开始节点和结束节点重新选择。
MindStudio后台会在原始网络模型中寻找子模型,然后将子模型导出。界面右下角会有导出进度提示,单击该进度条可以查看详细进度。
该文件夹中不仅包括导出子模型所包括的所有算子的dump信息,还包括子模型
层的输入数据,用于子模型推理时作为输入数据使用。//导出过程中会为子模型添加输入信息 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
如果导出的子模型不包括输入的data层节点,则转换.om离线模型时,请关闭AIPP预处理参数。
输入数据为子模型导出时“Dump Layer”为“Start Layer”层算子对应的Input File文件,根据此信息,在MindStudio安装服务器“dump_data”目录下查找同名Input File文件,即为Start Layer层的输入数据。
进入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格式的输入数据。
将如下脚本中的数据路径替换为实际路径,然后将脚本另存为.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格式。