地平线旭日X3派试用-天工开物工具链试用完成模型转换上板部署

上一篇帖子https://developer.horizon.ai/forumDetail/98129467158916313,对x3pi的基本操作有了初步了解,接下来这篇帖子我们体验一下x3派对应的天工开物工具链

个人理解我们的x3派和树莓派等一些普通的arm开发板相比,最主要的优势就是x3pi上带有bpu模块,可以加速神经网络计算

工具链官方文档在这里https://developer.horizon.ai/api/v1/fileData/doc/cn/index.html#x3j3,整体来说官方文档非常完善,用户可能用到的细节都包括了,不过对于新手来说可能有点太过全面,直接看可能会找不到。

从一个完全没有用过工具链同学的角度来说,可能更需要一个简单的例子体验一下从工具链环境准备、模型转换示例、模型转换好后该如何在板上infer,接下来我就先从这三个方面来体验下天工开物工具链:

1.1工具链环境搭建

工具链环境主要需要两部分,一个是具体的运行环境以docker镜像(docker_openexplorer_centos_7_xj3_v2.3.3.tar.gz)的形式发布,另一个是工具链压缩包(horizon_xj3_open_explorer_v2.3.3_20220727.tar.gz),主要包括了转换工具及示例。这俩部分都可以从资源中心下载,这里我下载了2.3.3的docker镜像(2.2.3的镜像像是有问题,导入失败),官方的docker hub repo中也提供了镜像可以直接docker pull不过我建议还是先下载好镜像压缩包然后再手动导入(直接docker pull速度可能非常慢),导入时直接执行

docker image load -i docker_openexplorer_centos_7_xj3_v2.3.3.tar.gz 就可以,导入成功后docker image ls就可以看到对应的镜像

0

导入docker成功后,进入解压好的工具链文件夹,下面有docker run脚本,脚本主要内容就是把整个工具链文件夹及数据集文件夹挂载到镜像生成的容器中,如果是自己导入镜像的话,由于镜像名称发生变化,这个脚本执行起来会有问题,需要手动改下脚本里的image name。

0

0

修改晚后执行脚本就可以进入到docker容器中,我们执行一下hb_mapper及hbdk-cc命令输出正常,说明整个环境已经OK,hb_mapper为模型转换工具,hbdk-cc为模型编译工具

0

这里插播一下,作为地平线的算法工程师我们平时工作中常用的是hbdk-cc,因为我们内部的模型都是采用的都是量化训练方案,训好的模型,直接用hbdk-cc编译为hbm模型,一开始看到我们板子上模型都是bin结尾的还有点奇怪,还顺手试了下直接在开发板上用easy_dnn 库load业务hbm模型发现没法load。后来看了下工具链的文档,搞清楚了bin和hbm的区别,目前我们x3派提供的是后量化模型转换的方案 。

0

量化训练方案

0

浮点转定点工具

0

环境搞定,接下来就进行模型转换工作,我们以最简单的分类任务为例,介绍下整个模型转换流程,这里我以mobilenetv2_onnx模型为例进行介绍,进入到工具链对应samples文件夹下,主要由几个脚本文件构成,还有一个对应名称的yaml文件

完成模型转换的话其实前三步就够用了,01脚本check模型中所有op是否支持,02脚本生成模型需要的校准数据,03脚本完成模型的转换,yaml文件配置了整个模型转换配置,包括模型输入、校准、编译这几部分。yaml里哪些参数具体是什么意思,有什么设置的选项,注释已经写的比较清楚了

0

直接按照顺序执行相应的脚本就可以,这里贴一下执行03模型转换脚本的输出。

0

执行完后在model_output文件夹下就可以看到编译好的模型bin文件了。有了bin文件我们就可以在板子使用easy_dnn接口加载模型然后进行infer了。infer之前有一点需要特别注意就是转换好模型的输入数据格式应该是什么。

这里我们看一下模型转换时input相关的参数,就是yaml里对应设置的部分,原始onnx模型输入数据格式为rgb,输入大小为1x3x224x224,我们转换好的模型输入为nv12,输入部分的从nv12到rgb格式转换及数据归一化都是模型转换工具帮我们直接添加到转换好的模型中,所以我们转换好的模型输入的数据应该为nv12格式。

明确了模型输入的格式接下来我们试一下在板子上infer模型,这部分代码其实可以直接复用板子上/app/ai_inference/01_basic_sample/test_mobilenetv1.py的代码,模型的路径改一下,这里我还加了下forward测速的部分,实际测一下模型infer的速度

由于论坛粘贴代码有问题,帖子我也发在个人博客了,可以去这里https://www.yjblog.net/post/326.html直接粘贴代码

0

0

0

执行下代码,可以看到对这张斑马图片识别正确,mobilenetv2模型在板子上forward 10000次一共花了28.7s,fps约为347,这个速度我只能套用一句马老师的名言(手动狗头),刷一下很快啊,我们的bpu确实有点东西。

到这里我们工具链的整个使用流程就走完了。这里我还尝试了修改模型编译使用的bpu核数默认编译参数使用单核,我们修改为2核,但我实际测出来2核的fps为266竟然没有单核的高?

这个不太符合预期得问问我们工具链的同学,是哪里操作不正确

0

本来我想在板子上跑一下读研时训练的mxnet ssd模型,但转换onnx就遇到了问题,一个是softmaxactivation op的问题这个查阅资料(https://zhuanlan.zhihu.com/p/166267806)是可以替换的

0

0

但ssd中anchor相关的一些op onnx还没有支持(https://github.com/onnx/onnx/issues/2086),理论上这部分可以先从模型中去掉,然后把这部分操作放在cpu上去实现,这块我也没有再花时间再去实现。

0