Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)

Vitis-AI使用记录:

(记录一下使用vitis-ai过程中遇到的坑)

1、我们使用的是pytorch框架的yolo模型,在使用vitis-ai量化前根据指导手册,要安装vai_q_pytorch,但是需要注意,我们在安装过程中一直在报错,如下图。

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第1张图片

上图中几个package一直无法下载,一开始根据下方报错,以为是代理问题,我们尝试寻找代理服务器去下载,发现还是这几个包无法正常下载。

仔细观察了无法下载的几个package,发现有一个共同特点,就是版本号均为2.5.0,这就很奇怪了,为什么全都是2.5.0版本的package无法下载,于是去看xilinx提供的下载脚本,突然发现这么一行,改行命令是提供下载地址的,如下图:

此时恍然大悟啊!官方提供的最新脚本中版本号是2.0.0,而执行安装命令时默认安装版本号是2.5.0,所以下载好的package里没有所需要的版本号,自然无法安装对应package。知道问题后,接下来就是寻找2.5.0版本的下载包地址(个人觉得Xilinx很狗,这么大的企业,对这些软件的维护,修改信息全都放在GitHub上)。在GitHub Xilinx账号下找到了其更新后的下载脚本,接下来就很简单了,将更新后的脚本copy到conda环境中,重新运行命令即可正常安装。可以看到下图中版本号为正确的2.5.0

(Ps:正确脚本地址:

https://github.com/Xilinx/Vitis-AI/blob/master/docker/dockerfiles/replace_pytorch.sh)

2、编写量化脚本的问题。Xilinx用户手册提供的语言可以看一下:

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第2张图片

???一脸问号,这只提供了API接口,里面对于模型的处理,数据的导入完全没有介绍,那就只能自己来写。可以参考官方pytorch模型量化代码(minst数据集手写体识别)

(https://github.com/Xilinx/Vitis-AI-Tutorials/blob/1.4/Design_Tutorials/09-mnist_pyt/files/quantize.py)

可以发现主要包括几部分:读取模型、调用数据集、常规预测函数(包括Detect、前向传播等等)、量化校准、Xmodel生成。下图是Val中一部分代码,定义了nc、no、na等一系列参数,以及anchor。

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第3张图片

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第4张图片

3、编译过程

这一步才是最容易踩坑的地方!!可以看到上一步量化后精度还是很不错的!此时大部分工作已经完成,编译时候仅需要一行代码就可以解决:

很简单对吧!只需要将红框的位置换为我们自己开发板相对应DPU型号即可。但是编译结束后,我们发现有多个DPU子图的模型(下图红框位置),说明此时模型并没有被完整的量化编译过来。

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第5张图片

红框位置正确编译后应该只会生成一个子图,也就是DPU subgraph number为1,那么问题出在哪里呢?

首先需要检查量化脚本中是否按照手册要求仅保留前传函数,其余函数均移除,经过检查是没有问题的。

那么问题只能是模型中存在了DPU不能够识别的算子,才会导致生成多个子图,我们打开DPUCZDX8G产品指南,可以清楚看到该型号下DPU所支持的算子,如下图。

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第6张图片

相信大家看到后肯定明白问题出在哪里了!那就是激活函数的问题,我们本次yolo模型选用的是yolov5 6.0及以上版本,这些版本中一个显著的变化就是激活函数已经更改为SiLu,我们可以看到SiLu并不在该型号DPU支持算子目录下,为了验证猜想,我们将生成的.Xmodel用Netron工具打开,我们可以看到量化后模型结构(其中一小部分)如下图:

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第7张图片

可以看到红框部分就是我们所用模型的激活函数,果然!激活函数是silu,不是DPU所支持的算子类型,我们将其改为ReLu,之后重新编译,得到下图:

Vitis-AI 量化编译Yolov5并部署至ZCU104(Pytorch框架)_第8张图片

可以看到,DPU subgraph number为1!编译成功!!

你可能感兴趣的:(fpga开发)