hrt_model_exec新增参数说明

前言

从J5工具链的1.1.33版本开始,板端工具hrt_model_exec新增了两个参数,分别是dump_intermediate和hybrid_dequantize_process:前者用于dump模型每层的输入输出,是否dump BPU子图内部的输出取决于模型编译时的yaml参数设置;后者用于将模型的int输出反量化成float保存,若输出已经是float则直接保存。

dump_intermediate

基本介绍

该参数可以dump模型每一层的输入数据和输出数据,支持hrt_model_exec的infer和perf两种模式。-
可设置的值和对应功能如下表所示:

作用

0

不dump数据

1

数据保存类型为bin,其中BPU节点输出为aligned*数据

2

数据保存类型为bin和txt,其中BPU节点输出为aligned*数据

3

数据保存类型为bin和txt,其中BPU节点输出为valid*数据

*关于aligned和valid的详细说明,可以查看模型输入输出对齐规则解析:-
https://developer.horizon.cc/forumDetail/118364000835765837-
**作为模型输出节点的BPU节点依然是aligned数据,

使用示例

-
resnet18.bin

这是resnet18.bin模型的结构图,NV12格式的输入数据首先转换成YUV444格式送入BPU子图执行计算,之后依次经过反量化、Softmax、Reshape共3个CPU节点。在J5板端,可以使用以下命令验证dump_intermediate参数的效果:

hrt_model_exec perf --model_file=resnet18.bin --frame_count=1 --dump_intermediate=1

执行结束后,同目录下会出现多个.bin文件,BPU子图和CPU节点的输入输出数据均已得到保存。

# BPU子图的输入输出
layer-0-bpu-ResNet-18_subgraph_0-input-0-data...y0.data.bin
layer-0-bpu-ResNet-18_subgraph_0-input-0-data...uv0.data.bin
layer-0-bpu-ResNet-18_subgraph_0-output-0-fc1000_nhwc2nchw...
# 反量化节点的输入输出
layer-1-Dequantize-replaced_fc1000_1_HzDequantize-input-0-fc1000_nhwc2nchw...
layer-1-Dequantize-replaced_fc1000_1_HzDequantize-input-1-fc1000_x_scale...
layer-1-Dequantize-replaced_fc1000_1_HzDequantize-output-0-replaced_fc1000...
# Softmax节点的输入输出
layer-2-Softmax-prob-input-0...
layer-2-Softmax-prob-output-0...
# Reshape节点的输入输出
layer-3-Reshape-fc1000_reshape_output-input-0-fc1000...
layer-3-Reshape-fc1000_reshape_output-input-1-fc1000_reshape_output_shape...
layer-3-Reshape-fc1000_reshape_output-output-0...

与layer_out_dump的关联

在模型编译阶段使用的yaml文件中,模型参数组有一个layer_out_dump参数,该参数用于指定混合异构模型是否保留输出BPU子图中间层值的能力,默认为False。若设置为True,则使用dump_intermediate时,BPU子图内部每个节点的输出数据都会被保存下来。

与环境变量对比

J5板端的环境变量_HB_DNN_DUMP_INTERMEDIATE_同样能起到dump数据的效果,使用方式如下:

export _HB_DNN_DUMP_INTERMEDIATE_=1  # 保存为bin格式,BPU节点输出aligned数据
export _HB_DNN_DUMP_INTERMEDIATE_=2  # 保存为bin+txt格式,BPU节点输出aligned数据
unset _HB_DNN_DUMP_INTERMEDIATE_     # 取消上述dump功能

该环境变量和dump_intermediate参数都会受到yaml配置文件中layer_out_dump参数的影响,但二者的使用场景存在差异:环境变量在运行自己编写的代码调用模型推理时起作用,而dump_intermediate参数用于hrt_model_exec的infer和perf功能。需要注意的是,二者互不干扰,配置一个并不会影响另一个的效果。

hybrid_dequantize_process

基本介绍

混合异构模型的BPU子图往往会有反量化节点,为了算法模型部署的整体性能更优,我们经常会在yaml文件中配置remove_node_type: "Dequantize"进行移除,并将反量化操作融合进后处理中。这样编译出的bin模型没有反量化节点,会给精度验证带来困难。然而,虽然反量化节点被删除,但反量化节点的信息依然会被保留。hybrid_dequantize_process参数适用于这类删去了反量化节点的bin模型,可以反量化整型输出数据并保存。-
该参数只支持hrt_model_exec的infer模式,使用时需要同时配置enable_dump=true以dump模型的输入输出数据。-
若设置hybrid_dequantize_process=true,则反量化整型输出数据,将所有输出按float类型保存为txt文件,其中模型输出为valid数据,支持配置dump_txt_axis参数控制换行规则和dump_precision参数控制小数点位数(这两个参数的使用说明可查阅J5工具链手册5.5.2章节),需要注意的是,该功能只适用于输出维度是四维的模型。-
若设置hybrid_dequantize_process=false,则直接保存模型输出的aligned数据,不做任何处理。

使用示例

-
resnet18_modified.bin

这是resnet18_modified.bin模型的结构图,模型尾部原有的反量化、Softmax、Reshape算子均已被删除。在J5板端,可以使用以下代码验证hybrid_dequantize_process参数的效果:

hrt_model_exec infer --model_file=resnet18_modified.bin --input_file="zebra_cls.jpg"
 --enable_dump=true --hybrid_dequantize_process=true

执行结束后,同目录下会出现两个新文件:

# 模型的输入数据
model_infer_input_0.bin
# 模型的输出数据
model_infer_output_0.txt

打开txt文件,保存的float数据共有1000行,对应了模型的1000个分类输出。

-0.396960288 
-0.995065153 
-1.082874775 
-0.209824324 
-0.894206643 
-0.405459940 
-0.801682532 
0.668304086 
-0.302481890 
2.425250769 
......

一致性验证

接下来对以上数据的正确性进行验证,我们针对resnet18.bin模型,只删除尾部的Softmax和Reshape算子,保留Dequantize算子,现在模型结构图如下:-

-
resnet18_dequantize.bin

之后运行如下命令:

hrt_model_exec infer --model_file=resnet18_dequantize.bin --input_file="zebra_cls.jpg" --enable_dump=true --hybrid_dequantize_process=true

打开生成的txt文件,查看保存数据,与上一步生成的保存数据完全相同。

-0.396960288 
-0.995065153 
-1.082874775 
-0.209824324 
-0.894206643 
-0.405459940 
-0.801682532 
0.668304086 
-0.302481890 
2.425250769
......

至此,一致性验证完成,配置hybrid_dequantize_process参数保存的float数据正确。