前言
最近在学习yolo相关的知识,关于yolo的原理,网络,代码等部分,互联网上已经有了比较充足的分享,基本上一路学来都比较顺利,在最后部署的部分碰到了一些小问题,简单记录一下,也供同样学习yolo模型的朋友们参考。
大部分朋友学习yolo应该都是用的ultralytics发布在github上的yolov5代码,关于yolov5相关的介绍我就不废话了,虽然之前提到关于yolov5,网络上已经有了充分的资源,但是因为yolov5的代码仍在不停更新(感谢无数的开源者),所以网上的一些资源有些也难免过时,让参考者绕一些弯路,所以我将分享一下我在v7.0版本的yolov5模型部署过程中的一些踩坑经验。
可能遇到的坑,文章中都有可能有效的解决措施:
(1)转换ONNX模型时,报错。
ONNX: export failure ❌ 0.0s: Unsupported ONNX opset version: 17
(2)Windows安装tensorrt时,报错。
The package you are trying to install is only a placeholder project on PyPI.org repository.
This package is hosted on NVIDIA Python Package Index.
(3)Linux转换tensorrt模型时,报错。
[TRT] [W] CUDA initialization failure with error: 35. Please check your CUDA installation: http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
TensorRT: export failure ❌ 3.7s: pybind11::init(): factory function returned nullptr
(4)转换TensorRT模型时,显存不够报Warning。
[TRT] [W] Requested amount of GPU memory (1073741824 bytes) could not be allocated. There may not be enough free memory for alloca
tion to succeed.
[TRT] [W] Skipping tactic 9 due to insufficient memory on requested size of 1073741824 detected for tactic 0x000000000000003c.
Try decreasing the workspace size with IBuilderConfig::setMemoryPoolLimit().
(5)转换TensorRT模型时,显存不够报错。
[TRT] [W] Requested amount of GPU memory (1024 bytes) could not be allocated. There may not be enough free memory for allocation t
o succeed.
[TRT] [E] 2: [globWriter.cpp::nvinfer1::builder::HybridGlobWriter::HybridGlobWriter::397] Error Code 2: OutOfMemory (no further in
formation)
ONNX
关于模型部署的一些基本知识,我推荐可以看这篇文章,当然我也才接触模型部署几天而已,并没有了解的很深入。一言以蔽之,将pytorch模型部署在一些终端上,我们需要先将.pt模型转换为.onnx的中间表示,再将.onnx的中间表示转换为能够在推理引擎上运行的模型。而.onnx模型除了是我们连接二者的桥梁,它本身也是可以运行在ONNXRuntime上的模型。
模型部署基础知识
将yolov5训练得到的pt模型转换为onnx非常简单,首先我们需要先安装两个python库。在使用yolov5时,我们都知道需要先执行指令
pip install -r requirements.txt
来安装运行yolov5必须的python库。如果我们打开requirements.txt查看,我们可以发现,还有一些注释掉的库没有被安装,其中就有用于模型转换的库,所以我们需要根据我们的目标模型安装其中的python库。
在安装了onnx相关的库之后,我们就可以使用yolov5提供的export.py文件导出onnx模型了,通过参数选择待转换的权重文件与导出格式即可,生成的.onnx模型文件和原权重文件在同一目录下。
在转换onnx模型时,可能会遇到报错
ONNX: export failure ❌ 0.0s: Unsupported ONNX opset version: 17
只需要在转换时调整参数opset即可,需要根据安装的onnx库的版本调整,我安装的onnx库的版本是1.12.0。因此最后转换onnx模型的命令是
python export.py --weights 要转换的权重文件相对于执行路径(…/yolov5)的相对路径 --include onnx --opset 12
OPENVINO
将.pt模型转换为openvino模型我踩的一个坑是,因为早期的yolov5的export.py中并不支持直接将.pt模型转换为openvino模型,所以网络上的资源大部分都会提供如何安装openvino相关支持的方法,如今如果再采用这样的方法无疑是绕了弯路。现在只需要和转换onnx模型一样,安装相应的库之后,我们直接使用指令就可以完成.pt模型到openvino模型的转换,代码会自动帮你完成.pt到.onnx到openvino的转换,非常方便,指令参考如下:
python export.py --weights .pt权重文件路径 --include openvino
和.pt权重文件,.onnx权重文件不同的是,openvino的模型是一个以_openvino_model结尾的目录,我们在使用模型时直接调用这个目录即可,yolov5目前已经支持这种调用方式了。
python detect.py --weights D:\MITK\yolov5\weights\l\yolov5l_openvino_model\
TensorRT
TensorRT应该是最容易出问题的部分了,根据我的踩坑经历,TensorRT的坑主要集中在安装部分。
(1)Windows不支持通过pip的方式安装tensorrt相关的库,在pip安装时会报错。
The package you are trying to install is only a placeholder project on PyPI.org repository.
This package is hosted on NVIDIA Python Package Index.
(2)Linux系统尽管支持通过pip的方式安装tensorrt相关的库,但是通过pip方式安装的tensorrt库后,在执行export.py时会报错。这个错误的原因似乎是因为TensorRT与CUDA的版本不匹配,然而pip安装的TensorRT是8.6.0版本,CUDA是11.6版本,按道理是可以匹配的。
[TRT] [W] CUDA initialization failure with error: 35. Please check your CUDA installation: http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
TensorRT: export failure ❌ 3.7s: pybind11::init(): factory function returned nullptr
上述两个问题,我个人认为都是安装TensorRT这一步的问题,TensorRT并不适合用pip的方式安装,无论是Windows系统还是Linux系统,我都建议通过从官网下载安装包的方式安装TensorRT。
TensorRT官方下载地址
目前我选择的TensorRT的版本是8.5版本,在此基础上根据你的操作系统,CUDA版本选择相应的TensorRT安装包即可。Windows系统只有一个选择这里就不赘述,Linux系统下有多种选择,因为笔者并不熟悉Linux系统,所以选择了用.tar.gz压缩包安装。
Windows和Linux系统下载得到的安装包,目录结构和后续的操作都是基本相同的,所以这里主要用Windows系统下的安装来做示范。
我们下载得到安装包之后,安装包的目录如下,其中有两个目录比较重要,第一个是lib目录,第二个是python目录。
对于lib目录,如果是Windows系统,我们需要将这个目录下的全部文件复制到CUDA安装目录的bin目录中(按照常理来说,在你开始尝试YOLO时就应该已经配置好了CUDA,cuDNN,pytorch的环境,不会不清楚CUDA安装目录的bin目录,如果不知道,烦请查阅CUDA的安装教程)。
对于Linux系统,我们则需要通过命令将lib目录加到PATH中,因为笔者也不太清楚Linux操作系统,这里提供一条我使用的指令。
export LD_LIBRARY_PATH=lib目录绝对路径:$LD_LIBRARY_PATH
下一步,我们进入python目录,同时激活yolov5运行的虚拟环境(如果不使用虚拟环境可以不激活),该目录下有数个whl文件用于安装tensorrt库,我们只需要根据我们的python版本选择相应的whl文件,pip安装即可。
pip install tensorrt-8.5.3.1-cp38-none-win_amd64.whl
补充:Linux系统下似乎并非不能用pip的方式直接安装tensorrt,报错可能是因为显存不足导致的,如果有相似的情况还请大家能够分享一下。
20230414:
对于Linux而言不需要这么复杂,经过个人的测试,基本上可以确定上述报错是由于tensorrt的版本问题,使用pip直接安装tensorrt完全可以直接使用,但是需要指定版本,不指定版本会自动安装8.6.0版本的tensorrt,指定为8.5.3.1版本就可以。
pip install tensorrt==8.5.3.1
参考:Windows TensorRT安装
Linux TensorRT安装
安装了TensorRT之后,我们就可以通过export.py转换模型了,指令也是相同的。这里需要注意转换tensorrt模型时,我们需要使用GPU设备来转换,所以需要额外制定一下device参数。
python export.py --weights pt权重路径 --include engine --device 0
这里需要注意,如果显存不够,转换时会报Warning,提示跳过了一些策略,虽然并不影响engine模型的生成,但不知道会不会影响最终的加速效果。
[TRT] [W] Requested amount of GPU memory (1073741824 bytes) could not be allocated. There may not be enough free memory for alloca
tion to succeed.
[TRT] [W] Skipping tactic 9 due to insufficient memory on requested size of 1073741824 detected for tactic 0x000000000000003c.
Try decreasing the workspace size with IBuilderConfig::setMemoryPoolLimit().
当然,如果显存过小,模型的转化也可能无法完成。
[TRT] [W] Requested amount of GPU memory (1024 bytes) could not be allocated. There may not be enough free memory for allocation t
o succeed.
[TRT] [E] 2: [globWriter.cpp::nvinfer1::builder::HybridGlobWriter::HybridGlobWriter::397] Error Code 2: OutOfMemory (no further in
formation)
这些问题都只能通过增加显存的方式来解决。
小结
折腾了大概两天关于模型的部署,算是勉强把yolov5模型的部署操作弄明白了,希望能够帮助到需要的人。