博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【干货】用tensorRT加速yolov5全记录,包含加速前后的数据对比
阅读量:3904 次
发布时间:2019-05-23

本文共 5273 字,大约阅读时间需要 17 分钟。

TensorRT 实现模型yolov5的加速,附自己测的数据对比

安装tensorRT

前言:这里仅记录博主自己用tar安装tensorRT的流程,对于DEV版本等的安装,请移步其他博客。使用tar安装是博主认为相对比较简单的方式了,要注意的是解压版的tar需要我们手动去修改lib的路径,如果是使用安装版的,就不需要了,安装版需要root权限进行安装。

首先了解自己ubuntu、CUDA和cuDNN版本

  1. 查看cuda版本
cat /usr/local/cuda/version.txt

在这里插入图片描述

  1. 查看cuDNN版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

在这里插入图片描述

  1. 查看ubuntu版本
cat  /etc/issue

在这里插入图片描述

  1. 挑选TensorRT版本(千万不要不符合,也不要比你的环境高也不要低,不然很麻烦,博主自己第一次按的时候没注意看,导致一直报错)
    博主安装的是TensorRT-6.0.1.5

安装TensorRT

# 在home下将下载的压缩文件进行解压tar xzvf TensorRT-6.0.1.5.Ubuntu-16.04.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz # 解压得到TensorRT-6.0.1.5的文件夹,将里边的lib绝对路径添加到环境变量中export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxxxx/TensorRT-6.0.1.5/lib# 如果手动添加到.bashrc文件中,需要执行source .bashrc命令,配好的环境才能生效# 安装TensorRTcd TensorRT-6.0.1.5/pythonpip install tensorrt-6.0.1.5-cp37-none-linux_x86_64.whl# 博主亲测,这里你的python环境并没有限制,py35,py36,py37都可 # 安装UFF,支持tensorflow模型转化cd TensorRT-6.0.1.5/uffpip install uff-0.6.5-py2.py3-none-any.whl # 安装graphsurgeon,支持自定义结构cd TensorRT-6.0.1.5/graphsurgeonpip install graphsurgeon-0.4.1-py2.py3-none-any.whl

以上,我们就成功的将tensorRT安装完了,试着执行一下python,然后看能不能导入这些模块。

如果成功的import tensorrt,那么就算安装成功咯。
ps:import uff的时候,需要提前install tensorflow模块。

2021.2.2更新

今天重新使用了deb安装后,发现和用tar没有什么区别。不过对tensorrt的安装过程又有了一个理解,这里做个记录
上面说的,如果能import成功,就说明安装tensorrt成功,其实这样说是不正确的。
使用pip install安装的tensorrt其实安装的是python依赖,安装成功,意味这我们成功安装了trt的python接口,这样我们就可以import tensorrt,使用trt的各种API接口了。
如果我们要用c++的话,那么理论上只要我们把tar解压成功,版本和cuda以及cudnn对应上,在cmakefile文件中,把对应的tensorrt包路径写正确就ok了,那么tensorrt也能正确使用了。
用deb安装tensorrt的时候,也是需要用命令行来install tensorrt的python依赖的,如果不安装的话,那么自然也import不了

使用tensorRT加速LeNet进行验证

推荐一个大佬的就尝试使用TensorRT的各种API直接进行网络的构建,简单粗暴,还很有效。下面加速yolov5也是使用这里现成的实现。

步骤就是里面说的:
第一步:Run lenet5 in pytorch,按照github指南没有半点问题
在第一步之前,需要安装pytorch,好像对pytorch的版本没有要求??博主安的pytorch是1.7版本的,使用清华源安装比较快:

第二步:Run lenet5 in tensorrt

在这里插入图片描述
一直到cp的地方一般都没有问题,但是在cmake的时候,可能就会报错了。
在这里插入图片描述
报错找到所需的文件:Invinfer。这时,我们需要修改cmakefile.txt文件,因为cmakefile的文件指向的动态链接库和头文件都是系统环境下的,如果你用tar安装tensorRT,你的那几个文件和库都是在你自己的环境下,需要修改cmakefile中指向的路径(如果你跑tensorrtx的其他模型,也是需要修改那个模型下的cmakefile.txt文件)

修改的话,照上面博客说的修改就行,这里就不在说明了

然后应该可以正常编译了,你就可以看到加速后的leNet的输出结果了(我猜你估计也看不出什么变化了)
有一点就是精度几乎一样,说明使用tensorrt加速模型不会降低模型的性能。

tensorRT加速yolov5

我们需要两个github仓库,一个是的官方仓库,一个是的仓库

我们只需要利用前者生成一个wts的权重文件,然后就可以利用这个权重文件在tensorrtx里来进行模型的转换和推断了

git clone https://github.com/wang-xinyu/tensorrtx.gitgit clone https://github.com/ultralytics/yolov5.git# download its weights 'yolov5s.pt' # 这边要注意的是,在yolov5仓库中,在weights内要执行sh文件时,需要修改里面的路径,不然会找不到utlis文件,# 或者你也可以把sh文件移出上一层文件夹中,再执行,就不会有路径问题了。# copy tensorrtx/yolov5/gen_wts.py into ultralytics/yolov5# ensure the file name is yolov5s.pt and yolov5s.wts in gen_wts.py# go to ultralytics/yolov5python gen_wts.py# a file 'yolov5s.wts' will be generated.

将生成的wts文件copy到tensorrtx/yolov5下,

# put yolov5s.wts into tensorrtx/yolov5# go to tensorrtx/yolov5# ensure the macro NET in yolov5.cpp is s  这个s不s,应该根据你一开始生成的wts权重文件是哪个版本决定的mkdir buildcd build# cmake的时候记得修改cmakefile文件的链接库路径和头文件路径cmake ..makesudo ./yolov5 -s             # serialize model to plan file i.e. 'yolov5s.engine'# 推断图片,samples下面应该放你的图片,格式没要求(jpg,其他格式博主没试过)sudo ./yolov5 -d  ../samples # deserialize plan file and run inference, the images in samples will be processed.

推断结束后会输出每张图片推断所花费的时间(不包含数据的预处理和NMS或者其他的后处理时间)

ps:每张图片的运行时间大概要3-5ms

加速前后效果对比

用了100张图片,分辨率没有去考虑,因为这几种对比都是一样的(控制变量法),所以不需要专门去考虑把(太懒了)

下面是大概的一个效果对比
在这里插入图片描述
速度上还是提高了将近3+倍,会不会数量越大,越明显??(应该不会)
现存占用也降低了有25%。

后面会专门写一篇关于跑上面结果的一个全记录(包括修改代码和一些有用的知识点),即可以帮助准备入门的同学,也方便以后自己重新学习。

安装pycuda

今天(2021.01.18)在使用python接口进行推断的时候,需要用到pycuda,使用下面命令安装,一直报错

  • pip安装
pip install pycuda

看网上建议是下载源码自己编译,然后看别人编译记录,好像又是很多问题……

  • 豆瓣源下载

这里推荐大家使用豆瓣源下载pycuda,完全ojbk,不需要自己编译源码

pip --default-timeout=100 install pycuda -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

之前安装啥来着,需要两个多小时,这家伙,直接几秒内就ok了

安装其他的包的时候,只需要将上面命令的pycuda改成你要安装的包名即可
下载飞快,ai了ai了

问题记录

1. import tensorrt时,找不到这个module

出现这个原因就是你的环境没配好,手动添加tensorrt的lib绝对路径到环境变量中

2. ImportError: libcudnn.so.x: cannot open shared object file: No such file or directory

没有找到libcudnn.so.x文件(x为对应版本具体可修改) libcudnn.so.x 是一个软连接,连接到对应的libcudnn.so.x.…… 该文件一般放在/usr/local/cuda/lib64/文件目录下可以查看自己是否有libcudnn.so.x文件,有的话就cp过去。

ps:博主安装的时候没有遇到这种问题,不过看别人有出现,这里就提一下。个人觉得安装tensorrt的时候出现这种问题,应该不是没链接的问题(如果是这种问题的话,说明你一开始的cuDNN都没搞好了)。如果上诉这种问题解决不了,建议重新安装来一遍。

3. 在tensorRT-6.0.1.5外面可以import,但是在文件夹里面,或者其他的文件夹里面import不了

在这里插入图片描述

博主使用的cuDNN是7.6.0版本,为啥会出现找不到8的版本呢??博主又在同样的一台服务器上用两一个账号安装,仍然会出现这个问题。博主现在还没解决,但是博主的实验室服务器多,换台服务器重新安装哈哈哈哈哈。
猜测的原因:cudnn有问题,服务器环境不干净?上面的错误应该是其他的包找不到这个so.8的版本的文件,但是明明下的是对应的7.6的版本,怎么会跑出一个8的版本呢?纯属个人猜测,有知道的忘告知一下,感激不尽(服务器多也不能任性呀)
问就是重装!!!

4. make时遇到问题:

CMake Error: The current CMakeCache.txt directory /workspace/tensorrtx/yolov5/build/CMakeCache.txt is different than the directory /workspace/tensorrtx/yolov5/build where CMakeCache.txt was created. This may result in binaries being created in the wrong place. If you are not sure, reedit the CMakeCache.txt

CMakeCache.txt之前编译时留下的缓存,应该把build删掉重新mdir build 编译。

5. 执行命令sudo ./yolov5 -s 时报错:./yolov5: error while loading shared libraries: libmyelin.so.1: cannot open shared object file: No such file or directory

没有把对应的静态库添加到系统环境变量

博主之前都没有遇到这个,而且明明都在.bashrc文件内添加了环境变量了,但是还是出现了这个问题

使用export的方法,在当前session下把库export一下:

在这里插入图片描述
这时,不要加sudo命令,不然仍然会报错,直接yolov5 -s即可

其他解决方法:

cp -r libmyelin.so.1 /usr/local/lib # libmyelin.so.1 locate一下具体的位置,然后在cp,个人不建议,还是上面的方法比较无害

转载地址:http://rcxen.baihongyu.com/

你可能感兴趣的文章
百练OJ-2815 城堡问题【DFS】
查看>>
CODE[VS] 1025 选菜 【背包】
查看>>
POJ 1724 ROADS【DFS+剪枝】
查看>>
AOJ 847 整数拆段
查看>>
AOJ 848 分数拆分
查看>>
UVA 133 The Dole Queue 【约瑟夫环】
查看>>
XDOJ 1208 B.笑爷买房 【DFS】
查看>>
部门年度工作总结的内容
查看>>
pandas学习笔记
查看>>
Numpy笔记
查看>>
正则表达式
查看>>
python线程进程笔记
查看>>
TensorFlow初学者必须了解的55个经典案例
查看>>
机器学习笔记
查看>>
数十种TensorFlow实现案例汇集:代码+笔记
查看>>
python记录的错误与知识
查看>>
内核中各种套接字的关系
查看>>
linux sysctl 参数实现 暨 ip_forward参数对Linux内核转发影响分析
查看>>
linux 路由表 的一些相关资料
查看>>
Linux 路由 学习笔记 之三 路由查找流程分析
查看>>