经过数天乃至数周的调试,你的神经网络模型终于在速度与精度上获得了令人满意的结果,并正式进入模型部署方案开发阶段。如何与现有的产品耦合,并在目标设备上最大化模型推演性能,成为一项重要课题。
模型推演通常是指模型接收给定输入数据、完成内部逻辑运算并输出计算结果的过程。尤其是在模型部署阶段,不再需要反向传播计算梯度,推演成为模型的唯一使命。正因如此,推演阶段大概率不会也不需要再使用TensorFlow、PyTorch这样庞杂的框架,而视情况使用专门为模型推演设计的方案。
一些较为流行的模型推演方案包括Google的TensorFlow Serving,META (FaceBook) 的 TorchServe,Microsoft的ONNX Runtme,百度的Paddle Lite,华为的CANN,腾讯的TNN,阿里的MNN等。这些推演方案面向不同的部署场景与运算设备平台,力求最小化模型推演成本。
然而,这些现成的方案并不一定能满足全部应用场景。如果你的模型推演需要运行在搭载了NVIDIA公司GPU的设备上,并且需要与已有的产品做整合,那么,更加底层的TensorRT或许是你的最佳选择。
TensorRT是由NVIDIA公司开发的一款用于在GPU上执行深度神经网络运算的代码库,专注于加速深度神经网络的运算,支持PyThon与C++。虽然在模型训练时Python被大量使用,但在产品基本定型进入最终开发阶段时,从最大化性能的角度考虑,C++是更加理想的选择。这篇文章以物体检测框架YOLO v5为例,介绍了如何使用TensorRT的C++ API实现一个完整的物体检测功能。
教程分为三部分:
- 搭建开发环境,安装必要的依赖项。
- 了解TensorRT开发涉及到的一些基本概念。
- 动手操作,实战YOLO v5示例代码。
作为这篇教程的读者,我假设你已经具备基本的深度神经网络知识,并且有使用Python推演神经网络模型的代码经验。这篇快速教程将重点放在TensorRT的C++ API上,你将会看到使用C++ API完成模型推演与使用Python的一些显著不同之处。
准备好了吗,让我们开始吧!
(全文约5500字)
准备工作
工欲善其事,必先利其器
本教程内容在Ubuntu Server 20.04下测试通过。使用的GPU型号为NVIDIA RTX 3090。部分关键的依赖项目与版本号如下:
- NVIDIA驱动:470.82.01
- CUDA:11.4.3
- cuDNN:8.2.1
- TensorRT:8.2.5.1
- GCC:9.4.0
- Cmake:3.16.3
如果你的库版本低于上述值,最好将其升级到该版本或者更高版本。
如何确定NVIDIA驱动版本
按下 Ctrl + Alt + T
打开终端,然后输入 nvidia-smi
即可显示驱动版本。该命令同时可以显示GPU的型号。
如果你需要安装新驱动,可参阅:
https://yinguobing.com/install-nvidia-driver-runfile-ubuntu-server-20-04/
如何确定CUDA版本
在终端中输入 nvcc --version
命令,即可显示CUDA版本号。
如果你需要安装CUDA,可参阅:
如何确定cuDNN版本
在终端中输入:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
即可显示cuDNN版本信息。
如果需要安装cuDNN,可参考:
如何确定TensorRT版本
在终端中输入 find /usr -name NvInferVersion.h
查找头文件路径,
然后解析头文件内容:
cat /usr/local/TensorRT-8.2.5.1/include/NvInferVersion.h | grep NV_TENSORRT -A 2
即可显示TensorRT版本信息。
如果需要安装TensorRT,可参考:
如何确定GCC版本
在终端中输入 gcc --version
即可显示版本信息。
如果需要安装 GCC,可以在终端中输入:
sudo apt install gcc
如何确定CMake版本
在终端中输入cmake --version
即可显示版本信息。
如果需要安装 cmake,可以在终端中输入:
sudo apt install cmake
上述依赖项是TensorRT开发的基本条件。除此之外,我假设你已经配置好了自己喜欢的集成开发环境。如果不确定的话,可以考虑VS Code,并记得安装C++插件。
恭喜你,可以进入下一章节了。