由于项目需要使用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,记下你保存在哪儿了
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安装完成。总结一个经验教训:动手之前要耐心去看官方的英文文档,很多途中可能遇到的问题都已经在文档里说明清楚了。但我们总是宁愿去看三四个别人的博客,也不愿意看两段英文。