文章目录
- 1、什么是 TensorRT?
- 2、TensorRT 的优势
- 3、TensorRT 加速 PyTorch 模型的基本流程
- 3.1 训练模型和保存模型
- 3.2 导出模型
- 3.3 转换为 TensorRT 引擎
- 3.4 加载与推理
- 4、基础环境配置
- 4.1 安装nvidia驱动
- 4.2 安装CUDA
- 4.3 安装cuDNN
在软件工程领域,部署是将开发完成的软件投入实际使用的过程,通常涉及环境配置和软件安装等步骤。类似地,深度学习模型的部署是指将训练好的模型置于特定环境中运行的过程。然而,模型部署面临更为复杂的挑战:
-
环境配置复杂:深度学习模型通常依赖于大型框架(如PyTorch、TensorFlow),这些框架在生产环境(如手机、开发板)中的安装和配置较为困难。
-
计算资源需求高:深度学习模型结构复杂,需要大量计算资源才能满足实时运行需求,因此必须对模型的运行效率进行优化。
鉴于这些挑战,模型部署不能仅依赖简单的环境配置和安装。经过多年的探索,工业界和学术界已经形成了一套流行的模型部署流程,通常包括模型压缩、优化、转换和集成等步骤,以确保模型能够在生产环境中高效运行。
PyTorch 作为深度学习领域的主流框架,相信大家已经能够熟练运用。它提供了从数据预处理、模型设计、训练监控到结果保存的完整解决方案,能够轻松应对图像分类、目标检测、图像分割等计算机视觉任务。
在模型推理阶段,常规做法是使用 torch.load()
加载模型并结合 NumPy 进行数据预处理。这种方式在实时性要求不高且硬件资源充足的场景下能够满足需求。然而,当面临硬件资源受限或高帧率要求的场景时,PyTorch 的性能瓶颈就会显现,难以满足实际需求。
1、什么是 TensorRT?
TensorRT(NVIDIA TensorRT)是 NVIDIA 提供的一款高性能深度学习部署推理优化库,专门用于加速在 NVIDIA GPU 上运行的深度学习模型。它提供了一系列优化手段,如运算融合(Layer Fusion)、精度校准(Precision Calibration)、张量优化(Tensor Optimization)等,能够显著提升模型推理速度,并降低延迟。
2、TensorRT 的优势
计算加速:TensorRT 通过内核融合(Kernel Fusion)、权重量化(Weight Quantization)和图优化(Graph Optimization)等技术,大幅提升模型推理效率。
低延迟:TensorRT 采用高效的内存管理策略,减少了数据传输和计算的开销,降低了推理延迟。在算力比较强的设备上,影响推理速度的更有可能出现在数据传输上。比如cv2读取的图片需要复制到cuda显存中,再进行推理。比如可能推理只需要1ms,但是复制过程需要耗时需要2ms。所以如何控制好数据复制带来的时间开销对极值的速度优化也非常重要。
支持多种精度:TensorRT 支持 FP32、FP16 和 INT8 精度,可以根据应用场景灵活调整计算精度,权衡计算速度与模型精度。一般使用FP16会有巨大的提速,而精度几乎不变。
集成性强:TensorRT 可以与 PyTorch、TensorFlow 等主流深度学习框架结合使用,支持 ONNX 格式的模型,便于模型转换与优化。
3、TensorRT 加速 PyTorch 模型的基本流程
TensorRT 是 NVIDIA 推出的高性能深度学习推理库,能够显著加速深度学习模型的推理速度。对于 PyTorch 用户而言,利用 TensorRT 加速模型推理可以带来显著的性能提升。
TensorRT部署主要流程如下:
3.1 训练模型和保存模型
首先,使用 PyTorch 框架训练您的深度学习模型。确保模型训练完成后,保存模型的权重参数。
3.2 导出模型
为了将 PyTorch 模型转换为 TensorRT 引擎,需要先将模型导出为 TorchScript 或 ONNX 格式。这两种格式都是通用的模型表示形式,能够被 TensorRT 识别和处理:
-
TorchScript: PyTorch 自带的模型导出格式,可以将 PyTorch 模型转换为静态图表示。
-
ONNX: 开放的神经网络交换格式,支持多种深度学习框架之间的模型转换。
3.3 转换为 TensorRT 引擎
TensorRT 提供了 ONNX 解析器和 TorchScript 解析器,可以分别加载 ONNX 模型和 TorchScript 模型。
TensorRT 会根据目标硬件平台对模型结构进行优化,例如:
- 层融合: 将多个层融合为一个层,减少计算量和内存访问次数。
- 精度校准: 将模型中的浮点数转换为低精度数据类型,例如 FP16 或 INT8,以提升推理速度。
- 内存优化: 优化模型的内存访问模式,减少内存带宽瓶颈。
在优化模型结构之后,TensorRT 会构建一个高效的推理引擎。该引擎包含了模型的计算图、优化后的参数以及针对目标硬件平台的指令集。
构建完成的 TensorRT 引擎可以序列化为文件,方便后续加载和使用。
3.4 加载与推理
使用 TensorRT API 加载序列化后的 TensorRT 引擎。
将推理数据转换为 TensorRT 引擎所需的格式。
调用 TensorRT 引擎的推理接口,执行模型推理。
从 TensorRT 引擎中获取推理结果,并进行后续处理。
无论是在哪种Nvidia设备和哪种编程语言,都遵循以上的主要步骤。其中需要关注的学习重点是:
- 如何转换 TensorRT 引擎: 包括模型导出、解析器使用、优化配置、引擎构建和序列化等。
- 如何使用 TensorRT 推理: 包括引擎加载、数据准备、推理执行和结果获取等。
当然其他步骤也有很大的学问,但是对于没有特殊需求的简单部署,重点还是上面两个环节。
4、基础环境配置
为了方便后续的学习,这里先学习一下环境的配置。TensorRT是nvidia针对nvidia显卡的模型部署框架。所以以下都是针对Nvidia显卡的配置。
其中安装nvidia驱动、CUDA和cuDNN在使用pytorch都有安装经验。这里主要介绍在Ubuntu20.04上为4070Ti配置环境的过程。
4.1 安装nvidia驱动
在ubuntu上安装nvidia驱动有一个坑,容易黑屏。根据我的经验发现是由于显示管理器冲突造成的。
ubuntu桌面实际上分为两部分:显示管理器(Display Manager)和桌面环境 (Desktops Environment)。
显示管理器主要提供用户登录服务,用户输入用户名和密码后进行验证,并启动后续桌面环境。而桌面环境就是一般理解的桌面程序。也就是用户验证和桌面环境实际上是分开的,两部分都有相应的常用方案:
常见的显示管理器:lightdm、gdm3、kdm、sddm
常见的桌面环境:GNOME、KDE、Xfce、LXDE
可以通过cat /etc/X11/default-display-manager查看当前显示管理器,可以通过echo $XDG_CURRENT_DESKTOP查看当前桌面环境。
网上有很多ubuntu安装nvidia驱动黑屏的经验,可以参考。我的解决办法是换一个显示管理器(为了以防万一可以先按照网上的试试,我的方式虽然成功了但是只测试过一次):
sudo apt install lightdm
sudo dpkg-reconfigure lightdm
# 弹出的选择框选择lightdm后重启
为了以防万一,也需要禁用nouveau驱动:
# 安装依赖
sudo apt-get install dkms build-essential linux-headers-generic
# 打开conf文件
sudo vim /etc/modprobe.d/blacklist.conf
#在末尾添加,然后保存退出编辑
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
# 禁用第三方驱动
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
# 更新并重启
sudo update-initramfs -u
sudo reboot
在Nvidia驱动下载页面搜索自己设备的驱动程序,下载比较新的驱动。下载后依次执行:
# 修改权限
sudo chmod 775 NVIDIA-Linux-x86_64-470.82.00.run
# 卸载之前的nvidia驱动
sudo apt-get remove nvidia* && sudo apt autoremove
# 如果是基于run文件安装的程序,则需要找到run文件目录并执行命令完成卸载
# sudo bash XXX.run --uninstall
# 执行安装程序,全部选择默认即可
sudo bash NVIDIA-Linux-x86_64-470.82.00.run
安装完毕并重启,可以正常启动不黑屏,并且nvidia-smi
命令可用,代表完成安装
4.2 安装CUDA
CUDA版本可以参考nvidia-smi
结果的右上角CUDA Version
来确定,或者结合pytorch所需版本确定。
CUDA安装包从CUDA Toolkit Archive下载。根据自己的设备选择,但是最后选择runfile(local)。选择完毕后会给出下面的Installation Instructions
,在终端执行,完成下载和安装。
安装时弹出,是否接受条约,输入accept接受。
这一步选择安装选项,如果安装上一步安装了nvidia驱动,则取消掉Driver选项。若选中会重新安装这个版本的驱动。然后选择最底下的Install
开始安装。
安装成功后会显示:
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-11.8/
Please make sure that
- PATH includes /usr/local/cuda-11.8/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-11.8/lib64, or, add /usr/local/cuda-11.8/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.8/bin
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 520.00 is required for CUDA 11.8 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
sudo <CudaInstaller>.run --silent --driver
Logfile is /var/log/cuda-installer.log
此时提醒我们将cuda加入环境变量,具体操作为:
# 打开.bashrc
vim ~/.bashrc
# 在末端添加如下内容,注意cuda版本换成自己的
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
# 保存并退出编辑后,更新./bashrc
source ~/.bashrc
最后重启终端后,用命令查询版本nvcc -V
:
至此安装成功
4.3 安装cuDNN
首先去cuDNN Archive下载和cuda版本适配的Tar或者zip包,解压后:
# 假设你的cudnn文件夹名为cuDNNFolder
# 1.解压下载的cuDNN的tar包.
tar -xvf cuDNNFolder.tar.xz
# 2. 复制cuDNN文件(*代表符合该规则的所有文件)到cuda-11.8中去
sudo cp cuDNNFolder/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp -P cuDNNFolder/lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
在~/.bashrc文件中添加环境变量:
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/targets/x86_64-linux/lib:$LD_LIBRARY_PATH
最后更新:source ~/.bashrc