SVP工具链相关功能支持及注意事项(高级选项)
在模型转换时,由NNIE_CONFIG_PATH环境变量声明的nnie.cfg文件,提供原先SVP工具链相关功能,支持除caffemodel_file、prototxt_file、is_simulation、instructions_name外其他字段的配置,相关注意实现如下:
板端运行输入Format须是NHWC
转换后的ms模型只接受NHWC格式的数据输入,若image_type被声明为0,则接收NHWC格式的float32数据,若image_type被声明为1,则接收NHWC的uint8数据输入。
image_list说明
nnie.cfg中image_list字段含义与原先不变,当image_type声明为0时,按行提供chw格式数据,无论原先模型是否是nchw输入。
image_type限制
MindSpore Lite不支持image_type为3和5时的网络输入,用户设为0或1。
image_list和roi_coordinate_file个数说明
用户只需提供与模型输入个数相同数量的image_list,若模型中含有ROI Pooling或PSROI Pooling层,用户需提供roi_coordinate_file,数量与顺序和prototxt内的ROI Pooling或PSROI Pooling层的个数与顺序对应。
prototxt中节点名_cpu后缀支持
SVP工具链中,可通过在prototxt文件的节点名后使用_cpu后缀来,声明cpu自定义算子。MindSpore Lite中忽略_cpu后缀,不做支持。用户若想重定义MindSpore Lite已有的算子实现或新增新的算子,可通过自定义算子注册的方式进行注册。
prototxt中Custom算子支持
SVP工具链中,通过在prototxt中声明custom层,实现推理时分段,并由用户实现cpu代码。在MindSpore Lite中,用户需在Custom层中增加op_type属性,并通过自定义算子注册的方式进行在线推理代码的注册。
Custom层的修改样例如下:
layer {
name: "custom1"
type: "Custom"
bottom: "conv1"
top: "custom1_1"
custom_param {
type: "MY_CUSTOM"
shape {
dim: 1
dim: 256
dim: 64
dim: 64
}
}
}
在该示例中定义了一个MY_CUSTOM类型的自定义算子,推理时用户需注册一个类型为MY_CUSTOM的自定义算子。
prototxt中top域的_report后缀支持
MindSpore Lite在转换NNIE模型时,会将大部分的算子融合为NNIE运行的二进制文件,用户无法观察到中间算子的输出,通过在top域上添加”_report“后缀,转换构图时会将中间算子的输出添加到融合后的层输出中,若原先该算子便有输出(未被融合),则维持不变。
在推理运行时,用户可通过回调运行得到中间算子输出。
MindSpore Lite解析_report的相应规则,及与inplace机制的冲突解决,参照《HiSVP 开发指南》中的定义说明。
inplace机制
使用Inplace层写法,可运行芯片高效模式。转换工具默认将Prototxt中符合芯片支持Inplace层的所有层进行改写,用户如需关闭该功能,可通过如下环境声明:
export NNIE_DISABLE_INPLACE_FUSION=off # 设置为on或未设置时,使能Inplace自动改写
当自动改写被关闭时,若需对个别层使能芯片高效模式,可手动改写Prototxt里面的相应层。
多图片batch运行及多step运行
用户若需同时前向推理多个输入数据(多个图片),可通过输入维度Resize将模型输入的第一维resize为输入数据个数。NNIE模型只支持对第一个维度(’n’维)进行resize,其他维度(’hwc’)不可变。
对于循环或lstm网络,用户需根据step值,配置TIME_STEP环境变量,同时resize模型输入。
设一次同时前向推理的数据的个数为input_num,对于序列数据输入的节点resize为input_num * step,非序列数据输入的节点resize为input_num。
含有proposal算子的模型,不支持batch运行,不支持resize操作。
节点名称的变动
模型转换为NNIE模型后,各节点名称可能发生变化,用户可通过netron打开模型,得到变化后的节点名。
proposal算子使用说明
MindSpore Lite提供Proposal算子的样例代码,在该样例中,以自定义算子注册的方式实现proposal算子及该算子infer shape的注册。用户可将其修改为自身模型匹配的实现后,进行集成使用。
你可以在这里下载完整的样例代码:
https://gitee.com/mindspore/docs/tree/r1.5/docs/sample_code/nnie_proposal
分段机制说明及8段限制
由于NNIE芯片支持的算子限制,在含有NNIE芯片不支持的算子时,需将模型分段为可支持层与不可支持层。
板端芯片支持最多8段的可支持层,当分段后的可支持层数量大于8段时,模型将无法运行,用户可通过netron观察Custom算子(其属性中含有type:NNIE),得到转换后的NNIE支持层数量。