专栏算法工具链【J6工具链部署实用技巧-1】如何修改bc和hbm模型的输入输出名称和顺序

【J6工具链部署实用技巧-1】如何修改bc和hbm模型的输入输出名称和顺序

momo(社区版)2024-08-25
258
0

背景

J6算法工具链的参考算法示例在使用export接口导出qat.bc的时,输入名称默认为{'_input_0','_input_1',...},输出名称默认为{'_output_0','_output_1',...},但是在板端部署场景下,部署代码可能需要根据hbm模型的输入名称来准备输入数据(hbm模型的输入输出名称和顺序和bc模型一致),根据输出名称来适配后处理代码,导出qat.bc的默认配置已满足不了需求,本文将基于J6工具链中的多输入多输出参考算法bev_sparse_resnet50来演示如何修改输入顺序及name、输出name。

export接口介绍

在正式修改模型输入输出之前,首先介绍一下导出伪量化bc的export接口(from horizon_plugin_pytorch.quantization.hbdk4 import export ),如下所示:

参考算法默认输入

启动OE docker环境,进入OE包的horizon_j6_open_explorer_v3.0.17-py310_20240705/samples/ai_toolchain/horizon_model_train_sample/scripts路径下,运行export_hbir.py脚本:

运行此脚本前,需要修改configs/bev/bev_sparse_resnet50_nuscenes.py脚本:

  • 使用config文件同级目录下的README.md提供的链接下载训练好的权重,并对应配置config文件中 的ckpt_dir;
  • 下载nuscenes_kmeans900.npy并对应配置config文件中的anchor_file参数,nuscenes_kmeans900.npy可在附件下载。
export_hbir.py脚本运行完成后,在ckpt_dir的目录下会生成qat.bc和quantized.bc(quantized.bc为伪量化qat.bc convert后生成的定点bc),然后再使用hb_model_info qat.bc查看bc模型的输入输出顺序和名称,如下所示:

输入顺序修改

hbir的输入顺序与导出bc给定的example_inputs字典的顺序相关,所以,如果我们想修改导出qat.bc和quanized.bc的输入顺序,只需要修改example_inputs字典中key/value的顺序即可,下面介绍一下如何操作。
export_hbir.py脚本中读取的example_inputs就是config文件中的deploy_inpus字段,这里我们将bev/bev_sparse_resnet50_nuscenes.py文件中的deploy_inpus字段修改为,如下:
然后我们再运行一次export_hbir.py脚本,使用hb_model_info qat.bc查看bc模型的输入输出顺序和名称,如下所示:

我们可以看到,bc模型的输入顺序已经修改成功了。

输入输出name修改

修改输入输出名称的方法就是配置export接口中的input_names,这里需要注意的是,修改input_names时需要注意example_inputs的顺序,以免在板端部署时准备输入的时候出现失误。这里为了简单,直接修改了export_hbir.py脚本(通用化操作时可以根据config文件中deploy_inputs的key来配置对应的输入name),修改脚本中HbirExporter类的__call__函数,配置export接口的input_names和output_names,输入类型字符串构成的列表,如下所示:
然后我们再运行一次export_hbir.py脚本,使用hb_model_info qat.bc查看bc模型的输入输出顺序和名称,如下所示:
我们可以看到,bc模型输入输出的name已经修改成功,然后我们再使用tools/compile_perf_hbir.py(将导出的qat.bc编译成上板部署的hbm模型,或者参考笔者编写的另一篇文章(地平线J5参考算法如何移植到J6?)来调用编译器的接口修改和编译qat.bc模型。

Q&A

那么,在修改输入输出name之前,我们应该如何获取正确的输入输出顺序以保证name配置的正确性呢?

如何确定输入name?

答:根据config文件中给定的deploy_inputs字典中的tensor顺序和shape来确定输入的name,为了稳妥起见,在运行export_hbir.py脚本时可以print一下export接口的example_inputs输入。

如何确定输出name?

答:运行export_hbir.py脚本时会打印出模型输出的顺序、name和shape,如下所示,我们可以基于这个

输出信息来配置输出的name,从而来适配对应head的后处理代码。

算法工具链
社区征文征程6技术深度解析官方教程
+3
评论0
0/1000