目录
Ubuntu22.04环境配置
如果您对tensorrt不是很熟悉,请务必保持下面库版本一致。
请注意: Linux系统安装以下库,务必去进入系统bios下,关闭安全启动(设置 secure boot 为 disable)
1.1 安装工具链和opencv
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install git
sudo apt-get install gdb
sudo apt-get install cmake
sudo apt-get install libopencv-dev
1.2 安装Nvidia相关库
注:Nvidia相关网站需要注册账号。
1.2.1 安装Nvidia显卡驱动
ubuntu-drivers devices
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470-server # for ubuntu18.04
(看看自己的驱动,如果已经选了就不用了)
nvidia-smi
这个就是已经选过驱动了
只要安装cuda12.2以下的CUDA版本就可以
1.2.2 安装 cuda11.7
我在这里选中11.7的版本,主要因为pytorch目前支持的最高版本是11.7.
CUDA下载连接:https://developer.nvidia.com/cuda-11-7-1-download-archive
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
sudo sh cuda_11.7.1_515.65.01_linux.run
选择continue
记得全屏,然后一直想下键,移动到最后,输入accept
这里有一点需要注意一下,因为之前已经安装过显卡驱动了,所以这里需要取消Driver(光标移动到Driver,然后按enter即可取消,不取消会导致安装终止),然后移动光标到Install,按enter执行安装
按照说明配置即可
vim ~/.bashrc
输入以下命令
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-11.3
刷新环境变量和验证
source ~/.bashrc
nvcc -V
安装cuDNN
网址 :https://developer.nvidia.com/rdp/cudnn-archive#a-collapse805-111
cuDNN v8.5.0 August 8th for CUDA 11.x
安装
$ tar -xvf cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz
$ sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
$ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
出现以下信息说明安装成功,由于安装的cuDNN版本是8.5.0,所以MAJOR、MINOR、PATCHLEVEL依次是8、5、0
下载下载 tensorrt
本教程中,tensorrt只需要下载\、解压即可,不需要安装。
进入网站:https://developer.nvidia.com/nvidia-tensorrt-8x-download
解压
tar -zxvf TensorRT-8.5.2.2.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz
验证是否安装成功
cd TensorRT-8.4.2.4/samples/sampleOnnxMNIST
make
cd ../../bin/
导出tensorrt环境变量(it is important!),注:将LD_LIBRARY_PATH:后面的路径换成你自己的!后续编译onnx模型的时候也需要执行下面第一行命令导出tensorrt环境变量(it is important!),注:将LD_LIBRARY_PATH:后面的路径换成你自己的!后续编译onnx模型的时候也需要执行下面第一行命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zyk/下载/TensorRT-8.5.2.2/lib
./sample_onnx_mnist
下载仓库TensorRT-Alpha并设置
git clone https://github.com/FeiYull/tensorrt-alpha
设置您自己TensorRT根目录:
git clone https://github.com/FeiYull/tensorrt-alpha
cd tensorrt-alpha/cmake
vim common.cmake
# 在文件common.cmake中的第20行中,设置成你自己的目录,别和我设置一样的路径eg:
# set(TensorRT_ROOT /root/TensorRT-8.4.2.4)
从yolov5源码中导出onnx文件
可以直接从网盘下载onnx文件[weiyun]:weiyun or google driver ,你也可以自己下载仓库,然后按照下面指令手动导出onnx文件:
# 下载yolov5源码
git clone https://github.com/ultralytics/yolov5
安装 yolov5环境
pip install -r requirements.txt
pip install onnx==1.12.0
用以下指令导出onnx模型文件,640表示模型的输入分辨率为:640X640,1280同理表示:1280X1280。建议使用640对应的小模型。
# 640
python export.py --weights=yolov5n.pt --dynamic --include=onnx
python export.py --weights=yolov5s.pt --dynamic --include=onnx
python export.py --weights=yolov5m.pt --dynamic --include=onnx
python export.py --weights=yolov5l.pt --dynamic --include=onnx
python export.py --weights=yolov5x.pt --dynamic --include=onnx
# 1280
python export.py --weights=yolov5n6.pt --dynamic --include=onnx
python export.py --weights=yolov5s6.pt --dynamic --include=onnx
python export.py --weights=yolov5m6.pt --dynamic --include=onnx
python export.py --weights=yolov5l6.pt --dynamic --include=onnx
python export.py --weights=yolov5x6.pt --dynamic --include=onnx
利用tensorrt编译onnx模型
将你的onnx模型放到这个路径:tensorrt-alpha/data/yolov5
cd tensorrt-alpha/data/yolov5
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zyk/tensorrt_deployment/TensorRT-8.5.2.2/lib
编译onnx模型指令,640表示模型的输入分辨率为:640X640,1280同理表示:1280X1280。注意:编译onnx格式的模型会得到例如xxxx.trt格式的文件,下文推理要用到。
/home/zyk/tensorrt_deployment/TensorRT-8.5.2.2/bin/trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
其他指令:
# 640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5n.onnx --saveEngine=yolov5n.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5m.onnx --saveEngine=yolov5m.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5l.onnx --saveEngine=yolov5l.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5x.onnx --saveEngine=yolov5x.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
# 1280
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5n6.onnx --saveEngine=yolov5n6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5s6.onnx --saveEngine=yolov5s6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280
如果还是嫌慢,可以用fp16 半精度的命令(提速1倍)
./trtexec --onnx=yolov8n-pose.onnx --saveEngine=yolov8n-pose-fp16.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640 --fp16
编译执行yolov5-tensorrt工程
使用命令行编译下代码
cd tensorrt-alpha/yolov5
mkdir build
cd build
cmake ..
make -j10
出现报错:
libyolov8.so: undefined reference to `sample::splitToStringVec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
collect2: error: ld returned 1 exit status
CMakeFiles/app_yolov8.dir/build.make:147: recipe for target 'app_yolov8' failed
make[2]: *** [app_yolov8] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/app_yolov8.dir/all' failed
make[1]: *** [CMakeFiles/app_yolov8.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
原因:仓库默认tensorrt8.4.2.4,你使用了更新版本,如:tensorrt8.6.1.6
解决:修改cmakelist就行,sample::splitToStringVec函数在文件:/samples/common/sampleUtils.cpp,所以这里直接在原来cmakelists中增加这个文件就行,如
按照需求执行推理,支持推理一张图片、在线推理视频文件,或者在线从摄像头获取视频流并推理。
# 640
# infer an image
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=1 --img=../../data/6406401.jpg --show --savePath=../
# infer video
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=8 --video=../../data/people.mp4 --show
# infer web camera
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=2 --show --cam_id=0
# 1280
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5s6.trt --size=1280 --batch_size=1 --img=../../data/6406401.jpg --show --savePath
fp16对比添加之前速度快1倍+