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

这篇具有很好参考价值的文章主要介绍了Vitis-AI量化编译YOLOv5(Pytorch框架)并部署ZCU104(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


文章目录

前言

 一、Vitis-AI Pytorch框架量化(vai_q_pytorch)

 二、编写量化脚本并进行量化

 三、模型编译

总结


前言

许多私信想要源码工程,近期会上传到Github仓库,大家有需要自己拿就就可以。

https://github.com/sususjysjy/Vitis-ai-zcu104-yolov5

--------------------------------------------

        虽然Xilinx提供了Vitis-AI用户手册Vitis-AI 2.5用户手册,但是其中对于一些安装和使用介绍极为简略,在安装和使用过程中碰到了一系列问题,所以在这里记录一下使用Vitis-AI过程中遇到的各种坑。

一、Vitis-AI Pytorch框架量化(vai_q_pytorch)

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

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

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

(Ps:正确脚本地址:val_q_pytorch2.5.0脚本)

 二、编写量化脚本并进行量化

      Xilinx用户手册提供的语言可以看一下:

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

      

      ???一脸问号,这只提供了API接口,里面对于模型的处理,数据的导入完全没有介绍,那就只能自己来写,可以参考官方量化脚本。pytorch模型量化代码(minst数据集手写体识别)https://github.com/Xilinx/Vitis-AI-Tutorials/blob/1.4/Design_Tutorials/09-mnist_pyt/files/quantize.py

      可以发现主要包括几部分:读取模型、调用数据集、常规预测函数(包括Detect、前向传播等等)、量化校准、Xmodel生成。

      首先我们来看一下模型的读取。

model = model.to(device)
model_name = "yolov5"
    file_path = os.path.join(args.model_dir, model_name + '.pt')

      根据自己选择使用GPU还是CPU。

if (torch.cuda.device_count() > 0):
    print('You have',torch.cuda.device_count(),'CUDA devices available')
    for i in range(torch.cuda.device_count()):
      print(' Device',str(i),': ',torch.cuda.get_device_name(i))
    print('Selecting device 0..')
    device = torch.device('cuda:0')
  else:
    print('No CUDA devices available..selecting CPU')
    device = torch.device('cpu')

      加载数据集,因为我使用的是Coco数据集,所以Class数为80(具体数字根据自己数据集和所训练的模型决定)。

parser.add_argument('--data_dir',default="datasets/val",
    help='Data set directory, when quant_mode=calib, it is for calibration, while quant_mode=test it is for evaluation')


dataloader = create_dataloader(args.data_dir, imgsz=imgsz, batch_size=batch_size, pad=0.5,stride=32,
                                       workers=workers, prefix=colorstr(f'quant: '))[0]


model.eval()
    nc =80 # number of classes

      在脚本中加入Detect时需要注意,在用户手册中有这么一段话,如下图。

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

       可以看到,脚本中只能包含前传函数,所以需要将特征提取中多余的部分注释掉,仅保留下面代码即可。

z = []
        for i in range(nl):
            bs, _, ny, nx, _no= x[i].shape
            # x[i] = x[i].view(bs, na, no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
            if grid[i].shape[2:4] != x[i].shape[2:4]:
                    grid[i], anchor_grid[i] = _make_grid(anchors,stride,nx, ny, i)

    之后是模型推理部分(部分代码)。

x=model(im)
        # ckpt = torch.load(file_path, map_location=device)
        # paras=ckpt['model'].yaml
        nc = 10  # number of classfication
        no = nc+5 #each anchor's output,include nc(class)+conf(1)+xywh(4),故nc+5
        anchors = [[1.25, 1.625, 2, 3.75, 4.125, 2.875], [1.875, 3.8125, 3.875, 2.8125, 3.6875, 7.4375], [3.625, 2.8125, 4.875, 6.1875, 11.65625, 10.1875]]
        nl = 3  # number of detection layers
        na = 3  # number of anchors
        grid = [torch.zeros(1)] * nl  # init grid
        anchors = torch.tensor(anchors).float().view(nl, -1, 2)
        # register_buffer('anchors', a)
        anchor_grid=[torch.zeros(1)] * nl
        stride = [8, 16, 32]

        脚本写好之后便可以开始模型的量化,分为两步,第一步是量化校准,使用如下命令。可以看到校准过程。

python quantize.py --quant_mode calib --subset_len 1

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

         第二部便是生成.Xmodel文件,使用如下命令,可以看到生成过程。

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

        查看量化后F1参数,精度并没有过多损失。

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

 三、模型编译

       这一步才是最容易踩坑的地方!!可以看到上一步量化后精度还是很不错的!此时大部分工作已经完成,编译时候仅需要一行命令就可以解决,选择相对应FPGA开发板DPU的型号:

vai_c_xir -x ./quantize_result/DetectMultiBackend_int.xmodel -a /opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU104/arch.json -o ./ -n model

       很简单对吧!但是编译结束后,我们发现有多个DPU子图的模型(下图红框位置),说明此时模型并没有被完整的量化编译过来。

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch​      

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

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

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

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

vitis ai yolo,Vitis-Ai部署全过程,fpga开发,人工智能,pytorch

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


   

总结

       以上就是今天要讲的我在使用Vitis-AI过程中才的一些坑,本文仅仅简单介绍了Vitis-AI量化编译的过程,后续在ZCU104开发板的部署将持续更新。文章来源地址https://www.toymoban.com/news/detail-783626.html

到了这里,关于Vitis-AI量化编译YOLOv5(Pytorch框架)并部署ZCU104(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【问题记录】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)

     -【学习资料】 子豪兄的零基础树莓派教程 https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95%E9%95%9C%E5%83%8F 第2讲:树莓派新手无痛开机指南【子豪兄的树莓派

    2024年02月02日
    浏览(56)
  • 【解惑笔记】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)

     -【学习资料】 子豪兄的零基础树莓派教程 https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95%E9%95%9C%E5%83%8F 第2讲:树莓派新手无痛开机指南【子豪兄的树莓派

    2024年02月14日
    浏览(38)
  • 模型量化(6):Yolov5 QAT量化训练

    2023年08月06日
    浏览(53)
  • 【AI】yolov5:数据下载、图像标注、训练、预测等,超详细笔记;pytorch转onnx再转TensorRT;训练识别口罩

    https://gitcode.net/mirrors/ultralytics/yolov5/ 1)安装pytorch 2)安装cudnn 3)下载yolov5源码: 4)安装yolov5依赖

    2024年02月15日
    浏览(45)
  • YOLOV5 INT8 量化对比

    对比了两种INT8量化, 熵校准的量化有更高的速度,但是吧… 最大最小值校准是一种 INT8 校准算法。在最大最小值校准中, 需要使用一组代表性的校准数据来生成量化参数, 首先将推理中的数据进行统计,计算数据的最小值和最大值,然后根据这些值来计算量化参数。具体步

    2024年02月16日
    浏览(43)
  • YOLOV5-模型轻量化的一些常见方法

    欢迎关注、点赞、评论! YOLOv5是一个基于深度学习的目标检测算法,是YOLO系列算法的最新版本。YOLO是You Only Look Once的缩写,意味着只需要一次前向传递就可以完成目标检测任务,因此具有非常快的检测速度和较高的精度。 相比于YOLOv4,YOLOv5在多个方面进行了改进和优化,包

    2024年01月22日
    浏览(45)
  • TensorRT量化实战课YOLOv7量化:pytorch_quantization介绍

    手写 AI 推出的全新 TensorRT 模型量化实战课程,链接。记录下个人学习笔记,仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化,在其课程的基础上,所整理出的一些实战应用。 本次课程为 YOLOv7 量化实战第一课,主要介绍 TensorRT 量化工具箱

    2024年02月07日
    浏览(48)
  • YOLOv5改进实战 | 更换主干网络Backbone(一)之轻量化网络Ghostnet

    前言 轻量化网络设计 是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝 :移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。 分组卷积 :将卷积操作分解为若干个较小的卷积操作,并将它们分

    2024年02月05日
    浏览(45)
  • OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

    使用OpenVINO模型优化器将YOLOv5模型转换为OpenVINO IR格式,以便在Intel硬件上进行推理。 下载yolov5代码 ultralytics/yolov5 导出模型为onnx模型,接着使用mo导出openvino fp32和fp16模型 将训练数据集准备成可用于量化的格式。 配置量化管道,例如选择适当的量化算法和设置目标精度。 在

    2024年02月08日
    浏览(43)
  • YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

    前言 轻量化网络设计 是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝 :移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。 分组卷积 :将卷积操作分解为若干个较小的卷积操作,并将它们分

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包