Pytorch模型为什么要用tensorrt、onnx等工具部署,直接写成c的不可以吗?

补充:对于这个问题我自己的理解是要不要用工具部署要参考客观的条件和需求。比如我的模型是在有英伟达gpu的服务器上部署,这样用工具比较更好;如果我的模型…
关注者
28
被浏览
25,680

6 个回答

导读

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主要通过下面两种技术来加速模型运行速度:

  1. tensorrt对网络结构进行了重构,将一些能合并的运算进行了合并(比如conv,bn,relu算子进行合并运算),且针对gpu的特性做了优化。对于cudnn来说,执行完conv,bn和relu三个操作可能需要调用三次cudnn对应的api进行计算,耗时比较长;但tensorrt则将三个操作进行了重构合并,进一步减少了推理时间
  2. 我们在模型训练的时候,通常采用float32数据进行训练,当模型训练完毕,其实无需使用float32这么高的精度进行推理。tensorrt则可以执行float16和int8执行推理,基本上几行代码搞定;但cudnn执行float16推理则相对要写比较多代码,也比较复杂

上一篇文章我们介绍了如何使用VSCode远程Linux配置C++大型工程开发环境,这篇文章则介绍一下在ubuntu系统如何正确安装C++版本的TensorRT并测试。

1. 明确ubuntu发行版本、cuda版本和cudnn版本

  1. uname -a // 查看ubuntu发行版本信息
  2. ls -l /usr/local/ | grep cuda // 查看cuda版本
  3. cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 // 查看cudnn版本
  4. 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及以上的版本进行安装

2. 官网下载对应版本的TensorRT

2.1 确定安装方式

TensorRT安装说明文档: docs.nvidia.com/deeplea

其实NVIDIA官网提供了四种TensorRT的安装方式:

  1. Debian Installation
  2. RPM Installation
  3. Tar File Installation
  4. Zip File Installation(只针对Win10系统)

由于本文只讨论Linux的TensorRT安装方式,所以只有前三种适用。下面介绍第1种和第3种安装方式。

3. dpkg命令安装TensorRT方式

3.1 下载相应版本TensorRT的deb安装文件

TensorRT下载官网: developer.nvidia.com/nv
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"
  1. sudo dpkg -i nv-tensorrt-local-repo- {os}- {tag}_1.0-1_amd64.deb
  2. sudo cp /var/nv-tensorrt-local-repo- {os}- {tag}/*-keyring.gpg /usr/share/keyrings/
  3. sudo apt-get update
  4. 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++版本安装成功:

4. 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,然后执行如下两条命令:

  1. cd TensorRT-8.5.1.7/samples/sampleOnnxMNIST
  2. 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++项目。本公众号的《TensorRT模型部署系列》主要面向无C++模型部署经验的人群,让你掌握从零基础到部署自定义网络并集成发包全流程(企业级)。欢迎大家关注本系列文章,《TensorRT模型部署系列》的下一篇文章主要讲解如何编写cmakelists使用tensorrt库,并进行测试验证,欢迎持续关注!


如果您也对人工智能和计算机视觉全栈领域感兴趣,强烈推荐您加入有料、有趣、有爱的公众号『CVHub』,每日为大家带来精品原创、多领域、有深度的前沿科技论文解读及工业成熟解决方案!欢迎添加小编卫星号: cv_huber,备注"知乎",加入 CVHub 官方学术&技术交流裙,一同探讨更多有趣的话题!