ubuntu18.04 CUDA10.0 Tensorrtx yolov5部署

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

一、选择兼容的版本

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


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

ubuntu kernel gcc glibc GPU GPU Driver CUDA cuDNN TensorRT opencv
18.04 4.15.0 7.3 2.27

GTX1050ti

470.57.02 10.0 7.6 7.0.0.11 3.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 Toolkit Toolkit Driver Version
Linux x86_64 Driver Version Windows 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的要求可以在表里找到

Distribution Kernel* GCC GLIBC ICC PGI XLC CLANG
……
Ubuntu 18.04.1 4.15.0 7.3.0 2.27 NO 18.x 13.1.x, 16.1.x 6.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,记下你保存在哪儿了

ubuntu18.04 CUDA10.0 Tensorrtx yolov5部署_第1张图片

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和cuDNN TensorRT 结果

用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//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//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的安装路径,自己改一下
include_directories(/home//TensorRT-7.0.0.11/include/)
link_directories(/home//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//TensorRT-7.0.0.11/include/)
link_directories(/home//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安装完成。总结一个经验教训:动手之前要耐心去看官方的英文文档,很多途中可能遇到的问题都已经在文档里说明清楚了。但我们总是宁愿去看三四个别人的博客,也不愿意看两段英文。

你可能感兴趣的:(深度学习,ubuntu)