ubuntu18.04 CUDA10.0 Tensorrtx yolov5部署

由于项目需要使用Jetson nano开发板,所以想在自己电脑上安装ubuntu18.04并部署TensorRT加速的yolov5,这样一来所有的调试都可以在本地做好,不然的话板子性能较低,跑什么都慢,浪费时间。

一、选择兼容的版本

在开始之前,最最重要的就是版本的选择,想在ubuntu上让TensorRT的yolov5跑起来,中间涉及到非常多的版本选择,一旦不配套,就会直接面临重装,相当麻烦。


>首先列出需要作出版本选择的条目,以及我成功时使用的版本

ubuntukernelgccglibcGPUGPU DriverCUDAcuDNNTensorRTopencv
18.044.15.07.32.27

GTX1050ti

470.57.0210.07.67.0.0.113.4.15

这些版本的选择,真的是一个很头疼的问题,但是在开始选择之前,先介绍一下怎么查看你现有的版本,哪条命令出不来结果就说明哪个没装好

# unbuntu
cat /etc/issue

# ubuntu kernel
cat /proc/version
uname -a 

# gcc 
which gcc
gcc -v 

# glibc 
ldd --version ldd

# GPU driver
nvidia-smi

# CUDA
nvcc -V

# cuDNN
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

>然后我解释一下这些要求是哪儿来的

要求一:tensorrtx要求cuda10.0 / cudnn7.6.5 / TensorRT7.0.0

TensorRT是一个C++版本的深度学习架构,和tensorflow、pytorch是平行关系。我们想用TensorRT部署yolov5到开发板,那就分为两步,1.安装TensorRT,2.用TensorRT的语法重写yolov5网络。但是用TensorRT自己写一遍yolov5真的太麻烦了,我们也不会。那我们就可以用tensorrtx,这位大神用TensorRT的语法复现了yolov5等经典网络,相当于把第2步帮我们做好了,但是他对我们的环境提出了要求:

Ubuntu16.04 / cuda10.0 / cudnn7.6.5 / tensorrt7.0.0 / opencv3.3 would be the example, other versions might also work, just need you to try.

我try了一下ubuntu用18.04发现可以的,opencv用3.4.15也是可以的,但是cuda10.0 / cudnn7.6.5 / tensorrt7.0.0 的版本我没敢随便选。

要求二:CUDA10.0要求显卡驱动高于410.48

nvidia对我们的CUDA和GPU Driver的版本提出了要求,详见cuda-toolkit-release-notes

CUDA ToolkitToolkit Driver Version
Linux x86_64 Driver VersionWindows x86_64 Driver Version
CUDA 11.4 Update 1>=470.57.02>=471.41
………………
CUDA 10.0.130>= 410.48>= 411.31

要求三:我们的显卡对驱动的要求

我们自己的显卡对驱动也有要求,并不是所有版本都支持。可以使用ubuntu-drivers devices来查看支持的显卡驱动,如果发现支持的驱动全都没超过410.48,那这条路就走不通了。如果支持>= 410.48的驱动,但你现在使用不是它,那么可以用sudo apt install nvidia-driver-xxx来安装

要求四:CUDA10.0对ubuntu版本,系统内核,gcc,glibc的要求

CUDA10.0的要求可以在表里找到

DistributionKernel*GCCGLIBCICCPGIXLCCLANG
……
Ubuntu 18.04.14.15.07.3.02.27NO18.x13.1.x, 16.1.x6.0.0

其他版本的CUDA要求在这里

我最不能理解的就是,为啥官方文档没把CUDA10.0对系统的要求和对显卡驱动的要求放在一起,真够难找的

二、配环境,装依赖

一步步的来解决吧,我就是这么成功的,中间出了问题别烦躁,相信自己一定行,大不了看看英文文档。


>ubuntu 18.04  kernel 4.15.0  gcc7.3  glibc2.27  

ubuntu18.04安装完后自带的kernel一般是4.15.0~4.18.0左右,gcc是7.3的,glibc是2.27的。也就是说,如果你是新装的18.04系统,那么这四个要求就自动满足了。

但是我在这里就出了许多问题,其一是,我有一次手滑,在系统问我要不要更新的时候点了更新,所以我的kernel变成了5.几的;其二是,我这台电脑之前装过ROS,对gcc有要求,我自己降了gcc版本,所以我的gcc版本不够7.3。实测如果什么都不管直接开始装CUDA的话是会失败的。

内核的降级可以参考ubuntu 删除不需要的内核 【转载】

先看一下自己gcc的情况

gcc -v
sudo dpkg -l | grep gcc

如果你现在没有gcc,那就比较简单

sudo apt-get  install  build-essential
gcc --version

如果你是有gcc,但不需要保留,则先卸载再用上面命令安装,gcc卸载比较麻烦,还要按你之前安装gcc的方法来分情况讨论,误操作容易搞崩系统,这里我也不太清楚应该怎么做

如果你需要保留现在的gcc版本,想让7.3与现在版本并存,参考Ubuntu 1804 gcc、g++不同版本的切换


>显卡驱动

nvidia-smi # 查看现在用的显卡驱动

ubuntu-drivers devices # 查看支持的显卡驱动

sudo ubuntu-drivers autoinstall # 自动安装推荐的驱动

sudo apt install nvidia-driver-xxx # 自选

>CUDA10.0

显卡驱动更新后可以开始装CUDA10.0,tensorrtx教程中使用.deb文件进行安装,我尝试后发现报错了

cuda : 依赖: cuda-10-0 (>= 10.0.130) 但是它将不会被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

也没有其他的报错信息,但我的显卡驱动确实已经更新好了,很奇怪,无奈只能换个方法,用.run文件进行安装。

注:如果这里你用.deb文件就能成功,那么后面的CUDA,TensorRT,opencv的安装都可以用tensorrtx教程给出的方法,这样会简单许多。但我看到其他教程也反映说用.deb文件安装CUDA容易失败,你可以自己先试一下用.deb

这里要感谢这篇文章给我提供的帮助,虽然版本不同,但思路是正确的 

Ubuntu 16.04 上安装 CUDA 9.0 详细教程

开始用.run文件安装

首先去nvidia官网下载runfile,记下你保存在哪儿了

lsmod | grep nouveau

没输出则继续,有输出的话说明nouveau驱动正在加载,需手动禁用(参考上面链接,我没遇到)

重启电脑,在登录界面不要输密码,直接按Ctrl+Alt+F1进入命令行(如果你没输入密码就进了系统,先在设置->用户里把"自动登录"关了) (Ctrl+Alt+F1没反应的话试试Ctrl+Alt+F2)

sudo service lightdm stop  # 关图形界面
sudo sh cuda_10.0.130_410.48_linux.run  # 执行安装程序

读协议,按住回车,最后输入accept同意协议 (按ctrl+c可以跳过读协议)

Install NVIDIA Accelerated Graphics Driver for …?
是问要不要安装显卡驱动,我们已经装了,选择no
Do you want to install OpenGL Libraries? 
如果你的电脑是双显卡,且当前是非NVIDIA的GPU在工作,则一定要选择no,否则可以yes,我选择no
Do you want to run nvidia-xconfig?
我选了no
剩下的都选yes,问你路径的话直接回车

安装成功后,会提示你installed,否则会显示failed

同时按住Ctr+Alt+F7,返回到图形化登录界面,输入密码登录(这里我的电脑是用Ctrl+Alt+F1),如果能够成功登录,重启 

进行检查

ls /dev/nvidia*

应有如图五项,其中包括/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-uvm则说明成功 (没出现这些的话说明安装不完全,可以参考上面链接)

添加环境变量

sudo gedit /etc/profile
# 在文件末尾,添加以下两行
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64{LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

重启,检查显卡驱动与CUDA版本

cat /proc/driver/nvidia/version
nvcc -V

尝试编译cuda提供的例子

cd ~/NVIDIA_CUDA-10.0_Samples/
make

我中途在simpleGL报错如下

/usr/bin/ld: 找不到 -lglut
Makefile:305: recipe for target 'simpleGL' failed

sudo apt-get install freeglut3 freeglut3-dev  # 修复
make  # 重新make

出现Finished building CUDA samples 表示成功

运行编译生成的二进制文件

cd ~/NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release
./deviceQuery
./bandwidthTest

Result = PASS代表成功


>cuDNN7.6.5

下载cuDNN v7.6.5 for CUDA10.0,选择cuDNN Library for LINUX,需要登陆,登一下

将压缩包解压

cd ~/cudnn-10.0-linux-x64-v7.6.5.32
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include 
sudo cp -P cuda/lib64/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.h | grep CUDNN_MAJOR -A 2

打印出cuDNN版本信息就成功了, 如果遇到问题,就去cuDNN官网看下文档


>TensorRT7.0.0.11

TensorRT的安装可以参考tensorrtx教程。实际上它给出了全套软件的安装方法,包括CUDA。但是它教程里是用.deb文件安装的,而nvidia TensorRT文档说了:

The Debian and RPM installations automatically install any dependencies, however, it:
--requires sudo or root privileges to install
--provides no flexibility as to which location TensorRT is installed into
--requires that the CUDA Toolkit and cuDNN have also been installed using Debian or RPM packages.
--does not allow more than one minor version of TensorRT to be installed at the same time

CUDA和cuDNNTensorRT结果

用deb安装

用deb安装可以成功
没用deb安装用deb安装会失败
用runfile安装用tarfile安装可以成功

所以我这里没得选,只能用tar file安装。在此感谢一下这篇文章【干货】用tensorRT加速yolov5全记录,包含加速前后的数据对比

先下载TensorRT7.0.0.11,需要登陆,注意对应版本,找到TensorRT 7.0.0.11 for Ubuntu 18.04 and CUDA 10.0 TAR package

安装,注意环境变量路径要自己改

# 安装TensorRT
tar xzvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz
# 配置环境变量
sudo gedit ~/.bashrc
# 把下面这行加在末尾 注意路径要自己改一下
export LD_LIBRARY_PATH=/home/<user_name>/TensorRT-7.0.0.11/lib:$LD_LIBRARY_PATH
# 保存
source ~/.bashrc
# 安装python版
cd ~/TensorRT-7.0.0.11/python
pip install tensorrt-7.0.0.11-cp37-none-linux_x86_64.whl

# 安装其他工具
cd ..
cd uff
pip install uff-0.6.5-py2.py3-none-any.whl
cd ..
cd graphsurgeon
pip install graphsurgeon-0.4.1-py2.py3-none-any.whl

>opencv3.4.15

参考的是Ubuntu16.04安装opencv3.4.1

先到opencv官网,点击对应版本的source下载opencv安装包opencv-3.4.15.zip,解压

# 安装依赖
sudo apt-get install build-essential 
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

# 安装opencv
cd ~/opencv-3.4.15
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local  ..
make -j8
sudo make install

# 添加环境变量
sudo gedit /etc/ld.so.conf.d/opencv.conf   
# 末尾添加
/usr/local/lib
sudo ldconfig  # 使得上面的配置路径生效

# 配置bash
sudo gedit /etc/bash.bashrc   
# 末尾添加下面两行
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH
# 保存
source /etc/bash.bashrc 
sudo updatedb # 更新

# 检查是否成功
cd ~/opencv-3.4.15/samples/cpp/example_cmake
cmake .
make
./opencv_example

sudo make install会比较慢,最后的检查没报错就ok了


>Anaconda

下一步的Tensorrtx就要用到pytorch了,先装一下Anaconda环境

Anaconda清华源下载Anaconda3-5.2.0-Linux-x86_64

bash Anaconda3-5.2.0-Linux-x86_64.sh

是否加环境变量? yes
是否安装Microsoft VSCode? no

# 创建虚拟环境
conda create -n tensorrt python=3.7
# 第一次用conda activate tensorrt时会报错
# CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
# 输入提示中的第一条命令,像这样
echo ". /home/<user_name>/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc
# 重启生效,不想重启的话,这样也可以立即生效
source ~/.bashrc
# 重试就可以进去了
conda activate tensorrt

后面要用到yolov5,我们顺手把yolov5下载下来,配好环境 

cd ~
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt

附:Anaconda换源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --show

>Tensorrtx

Tensorrtx github官网

安装与验证教程:Getting Started with TensorRTx, Run lenet5

Run lenet5 in pytorch

cd ~
git clone https://github.com/wang-xinyu/pytorchx
cd pytorchx/lenet
# 要用pytorch,先激活虚拟环境
conda activate tensorrt
python lenet5.py
python inference.py

results:
[[0.0950, 0.0998, 0.1101, 0.0975, 0.0966, 0.1097, 0.0948, 0.1056, 0.0992, 0.0917]]

python inference.py这一步会生成一个.wts文件,我们TensorRTX使用的模型就是这个格式的,而.wts文件的获取方法一般是:拿现有网络的模型通过一定方式转换为.wts格式(例如yolov5,原本模型是.pt文件,运行一个python脚本——gen_wts.py,就能转化为.wts文件,让TensorRTX使用)

Run lenet5 in tensorrtx

# 回主目录,下载tensorrtx
cd ~
git clone https://github.com/wang-xinyu/tensorrtx
cd tensorrtx/lenet
cp ~/pytorchx/lenet/lenet5.wts .

这时直接按照官方教程去编译会出错

usr/bin/ld:  cannot find -lnvinfer

原因是,我们TensorRT是用tarfile安装的,这个nvinfer是TensorRT里的一个模块,系统没找到它的路径,我们需要手动配置cmakelist.txt文件,把我们自己的安装路径给他替换掉

sudo gedit ~/tensorrtx/lenet/CMakeLists.txt
# 找到下面两行 
include_directories(/usr/include/x86_64-linux-gnu/)
link_directories(/usr/lib/x86_64-linux-gnu/)
# 替换为TensorRT-7.0.0.11的安装路径,自己改一下<user_name>
include_directories(/home/<user_name>/TensorRT-7.0.0.11/include/)
link_directories(/home/<user_name>/TensorRT-7.0.0.11/targets/x86_64-linux-gnu/lib/)
# 保存

可以编译了 

cd ~/tensorrtx/lenet
mkdir build
cd build
cmake ..
make

# 如果make成功了
./lenet -s

这里可能会遇到报错,

如果是
./lenet: error while loading shared libraries: libcudnn.so.7: cannot open shared object file: No such file or directory

那么应该是你的cuDNN没装好,重新配置一下

如果是
./lenet: error while loading shared libraries: libmyelin.so.1: cannot open shared object file: No such file or directory

那么应该是TensorRT的环境变量没配置好,重新配置一下

解决所有问题了以后继续

./lenet -d

Output:
0.0949623, 0.0998472, 0.110072, 0.0975036, 0.0965564, 0.109736, 0.0947979, 0.105618, 0.099228, 0.0916792,

我们对比一下前面pytorchx的输出,发现是很接近的,就说明成功了 


>yolov5

上一步我们已经在TensorRTX里面跑通了一个简单的网络lenet5,那么在TensorRTX里使用yolov5也大同小异。主要思路就是三步:1.把原来用pytorch写的代码下载下来,用pytorch跑通;2.从TensorRTX文件夹里把gen_wts.py脚本复制过去,运行,获得.wts文件;3.把.wts文件复制回TensorRTX,编译运行。

跑通原版yolov5

cd ~/yolov5
# 前面装了虚拟环境并配好了yolov5的requirements
conda activate tensorrt
python detect.py

这里会自动帮你下载yolov5s.pt,需要联网,搞不定的话也可以直接去github下载

获得.wts文件

cd ~/yolov5
cp ~/tensorrtx/yolov5/gen_wts.py .
python gen_wts.py yolov5s.pt

把.wts文件复制回TensorRTX,编译运行

编译之前还是需要在cmakelist.txt里改一下路径

cd ~/tensorrtx/yolov5
sudo gedit CMakeLists.txt
# 替换这两行
include_directories(/usr/include/x86_64-linux-gnu/)
link_directories(/usr/lib/x86_64-linux-gnu/)

include_directories(/home/<user_name>/TensorRT-7.0.0.11/include/)
link_directories(/home/<user_name>/TensorRT-7.0.0.11/targets/x86_64-linux-gnu/lib/)
# 保存退出

# 编译
mkdir build
cd build
cp ~/yolov5/yolov5s.wts ~/tensorrtx/yolov5/build
cmake ..
make

# -s 命令用于生成.engine文件,三个参数分别是.wts文件,.engine文件和model标识[s/m/l/x/...]
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s 
# -d 命令用于执行推理,两个参数分别是engine和要测试的目录
sudo ./yolov5 -d yolov5s.engine ../samples

运行没报错,就可以在文件夹里看到带框的zidane.jpg了


至此,ubuntu18.04+CUDA10.0+Tensorrtx+yolov5安装完成。总结一个经验教训:动手之前要耐心去看官方的英文文档,很多途中可能遇到的问题都已经在文档里说明清楚了。但我们总是宁愿去看三四个别人的博客,也不愿意看两段英文。

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值