导读
TensorRT 是可以在 NVIDIA 各种 GPU 硬件平台下运行的一个模型推理框架,支持 C++ 和 Python 推理。利用 Pytorch、Tensorflow 或者其它框架训练好的模型,可以转化为 TensorRT 的格式,然后利用 TensorRT 推理引擎去运行该模型,从而提升这个模型在 NVIDIA-GPU 上运行的速度。
可能很多人不太明白 CUDA,CUDNN 和 TensoRT 之间的关系,这里小编为大家做个简单的介绍:
- cuda 是 NVIDIA 推出的用于自家 GPU 进行并行计算的框架,用户可通过 cuda 的 API 调度 GPU 进行加速计算。需要注意的是,只有当要解决的计算问题是可以大量并行计算时才能真正发挥 cuda 的作用。
- cudnn 则是 NVIDIA 推出的用于自家 GPU 进行神经网络训练和推理的加速库,用户可通过 cudnn 的 API 搭建神经网络并进行推理,cudnn 则会将神经网络的计算进行优化,再通过 cuda 调用 gpu 进行运算,从而实现神经网络的加速(当然,你也可以直接使用 cuda 搭建神经网络模型,而不通过 cudnn,但运算效率会低很多)。
- tensorrt 其实跟 cudnn 有点类似,也是 NVIDIA 推出的针对自家 GPU 进行模型推理的加速库,只不过它不支持训练,只支持模型推理。相比于 cudnn,tensorrt在执行模型推理时可以做到更快。
TensorRT Optimizer
TensorRT主要通过下面两种技术来加速模型运行速度:
- tensorrt 对网络结构进行了重构,将一些能合并的运算进行了合并,例如大家所熟知的 CBR,即 Conv,BN 和 ReLU 算子进行合并运算,且针对 gpu 的特性做了特殊的优化。对于 cudnn 来说,执行以上这三个操作可能需要调用三次 cudnn 对应的 api 进行计算,耗时比较长;但 tensorrt 则将三个操作进行了重构合并,进一步减少了推理时间。
- 我们在模型训练的时候,通常采用 float32 数据进行训练,当模型训练完毕,其实无需使用 float32 这么高的精度进行推理。tensorrt 可以执行 float16 和 int8 执行推理,基本上几行代码就能轻松搞定;但 cudnn 执行 float16 推理则相对要写比较多代码,也比较复杂。
上一次我们为大家介绍过《如何使用 VSCode 远程 Linux 配置 C++ 大型工程开发环境》** ,这篇文章主要向大家简单科普下如何在 Ubuntu 系统上正确安装 C++ 版本的 TensorRT 环境并进行相应的调试。**
一、明确ubuntu发行版本、cuda版本和cudnn版本
uname -a // 查看ubuntu发行版本信息
ls -l /usr/local/ | grep cuda // 查看cuda版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 // 查看cudnn版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 // 查看cudnn版本
明确发行版本、cuda版本和cudnn版本
通过使用如上命令可查看linux系统的架构,cuda版本和cudnn版本信息,如上图所示我的linux服务器架构是X86-64位,系统发行版本是20.04,cuda版本是10.0,cudnn版本是7.6.5
注意:TensorRT8.5以下的版本包由于自带了cudnn,所以只需要关注cuda版本,无需关注cudnn版本;而8.5及以上的TensorRT不再捆绑cudnn,所以不仅要明确cuda版本,还需要明确我们系统的cudnn版本,再选择相应cuda和cudnn版本对应的TensorRT8.5及以上的版本进行安装
二、官网下载对应版本的TensorRT
2.1 确定安装方式
TensorRT安装说明文档:https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html#downloading
其实NVIDIA官网提供了四种TensorRT的安装方式:
- Debian Installation
- RPM Installation
- Tar File Installation
- Zip File Installation(只针对Win10系统)
由于本文只讨论Linux的TensorRT安装方式,所以只有前三种适用。下面介绍第1种和第3种安装方式。
三、 dpkg命令安装TensorRT方式
3.1 下载相应版本TensorRT的deb安装文件
TensorRT下载官网:https://developer.nvidia.com/nvidia-tensorrt-download
TensorRT版本列表
如上图所示,进入到TensorRT下载官网后,我们可以发现目前TensorRT有八个大版本,目前TensorRT8的版本只支持cuda11.0及以上的版本,如果大家的cuda是11.0及以上,可选择TensorRT8的版本进行下载安装。
这里由于笔者的cuda版本是10.0,所以目前选择了TensorRT7版本,下载完成之后是一个deb文件,将该deb文件上传至linux服务器某个位置。
选择与cuda版本匹配的TensorRT版本
3.2 安装TensorRT
os="ubuntuxx04"
tag="8.x.x-cuda-x.x"
sudo dpkg -i nv-tensorrt-local-repo-{tag}_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-{tag}/*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install tensorrt
按照如上4个步骤进行TensorRT的安装,其中nv-tensorrt-local-repo-{tag}_1.0-1_amd64.deb要换成自己刚下载的deb文件。由于笔者先前安装过tensorrt7.0的版本,故运行apt-get install tensorrt之后,直接显示已安装了。
安装完成之后,输入命令: dpkg -l | grep TensorRT 如果显示如下图有关tensorrt的信息,说明tensorrt的c++版本安装成功:
四、Tar文件的TensorRT安装方式
4.1 下载相应版本TensorRT的tar安装文件
选择与cuda版本匹配的TensorRT版本
注意:大家根据自己的cuda版本下载相应的tensorrt的tar文件即可(由于笔者换了另外一台cuda11.4的linux服务器,所以下载了tensorrt8.5版本的tar包)
4.2 解压tar安装文件,并测试sampleOnnxMNIST
tar -zxvf TensoRT-8.5.1.7.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz
通过上面命令解压之后,会得到一个解压文件TensorRT-8.5.1.7,然后执行如下两条命令:
cd TensorRT-8.5.1.7/samples/sampleOnnxMNIST
make
会在 TensoRT-8.5.1.7/targets/x_64-linux-gnu/bin/ 文件夹下得到一个sample_onnx_mnist的可执行文件,我们运行它后,会提示不能链接到libnvinfer.so.8的库:
运行sample_onnx_mnist出现缺库现象
这时候,我们通过命令export将tensorrt的库添加到环境变量中,再次运行sample_onnx_mnist,会得到如下输出即表明tensorrt安装成功:
测试TensorRT
总结
考虑到部分在校生精力可能更多的是放在科研上,较少接触到一些关于模型部署的 C++ 项目,这为以后的就业埋下了隐患。因此,本公众号后续会不定时推出关于《深度学习模型部署》系列,主要面向无 C++ 模型部署经验的小白人群,让大家能快速掌握从零基础到部署自定义网络并集成发包全流程(企业级)。