IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> ubuntu18.04 CUDA10.0 Tensorrtx yolov5部署 -> 正文阅读

[Python知识库]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时会报错,先输入下面两句source即可解决
source activate
source deactivate
# 重试就可以进去了
conda activate tensorrt

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

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

附:Anaconda换源

sudo gedit /home/cza/.pip/pip.conf
# 写入下面两行
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
# 保存

>Tensorrtx

Tensorrtx github官网

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

Run lenet5 in pytorch

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,pytorchx的路径要自己填一下
cd ~
git clone https://github.com/wang-xinyu/tensorrtx
cd /tensorrtx/lenet
cp /xxxx/pytorchx/lenet/lenet5.wts .

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

usr/bin/ld:? cannot find -lnvinfer

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

# 路径自己改
sudo gedit /xxxx/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的安装路径,自己改一下前面的/xxxx/
include_directories(/xxxx/TensorRT-7.0.0.11/include/)
link_directories(/xxxx/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 /xxx/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(/xxxx/TensorRT-7.0.0.11/include/)
link_directories(/xxxx/TensorRT-7.0.0.11/targets/x86_64-linux-gnu/lib/)
# 保存退出

# 编译
mkdir build
cd build
cp /xxxx/yolov5/yolov5s.wts /xxxx/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安装完成。总结一个经验教训:动手之前要耐心去看官方的英文文档,很多途中可能遇到的问题都已经在文档里说明清楚了。但我们总是宁愿去看三四个别人的博客,也不愿意看两段英文。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 23:43:30  更:2021-08-25 23:43:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 22:59:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计