TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架。
它旨在与TesnsorFlow、Caffe、Pytorch以及MXNet等训练框架以互补的方式进行工作,专门致力于在GPU上快速有效地进行网络推理。
我们利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速度。
速度提升的比例是比较可观的。
借官方的话来说:
The core of NVIDIA® TensorRT™ is a C++ library that facilitates high-performance inference on NVIDIA graphics processing units (GPUs). TensorRT takes a trained network, which consists of a network definition and a set of trained parameters, and produces a highly optimized runtime engine that performs inference for that network. TensorRT provides API’s via C++ and Python that help to express deep learning models via the Network Definition API or load a pre-defined model via the parsers that allow TensorRT to optimize and run them on an NVIDIA GPU. TensorRT applies graph optimizations, layer fusion, among other optimizations, while also finding the fastest implementation of that model leveraging a diverse collection of highly optimized kernels. TensorRT also supplies a runtime that you can use to execute this network on all of NVIDIA’s GPU’s from the Kepler generation onwards. TensorRT also includes optional high speed mixed precision capabilities introduced in the Tegra™ X1, and extended with the Pascal™, Volta™, Turing™, and NVIDIA® Ampere GPU architectures.
TensorRT支持的平台如下:
支持计算能力在5.0及以上的显卡(当然,这里的显卡可以是桌面级显卡也可以是嵌入版式显卡),我们常见的RTX30系列计算能力是8.6、RTX20系列是7.5、RTX10系列是6.1,如果我们想要使用TensorRT,首先要确认下我们的显卡是否支持。
至于什么是计算能力(Compute Capability),咋说嘞,计算能力并不是描述GPU设备计算能力强弱的绝对指标,准确的说,这是一个架构的版本号。一般来说越新的架构版本号更高,计算能力的第一个数值也就最高(例如3080计算能力8.6),而后面的6代表在该架构前提下的一些优化特性,具体代表什么特性可以看这里:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities
可以通过这里查阅自己显卡的计算能力:https://developer.nvidia.com/zh-cn/cuda-gpus
说回TensorRT本身,TensorRT是由C++、CUDA、python三种语言编写成的一个库,其中核心代码为C++和CUDA,Python端作为前端与用户交互。当然,TensorRT也是支持C++前端的,如果我们追求高性能,C++前端调用TensorRT是必不可少的。
TensorRT的使用场景很多。服务端、嵌入式端、家用电脑端都是我们的使用场景。
- 服务端对应的显卡型号为A100、T4、V100等
- 嵌入式端对应的显卡为AGX Xavier、TX2、Nano等
- 家用电脑端对应的显卡为3080、2080TI、1080TI等
当然这不是固定的,只要我们显卡满足TensorRT的先决条件,用就对了。
三、TensorRT的加速效果怎么样加速效果取决于模型的类型和大小,也取决于我们所使用的显卡类型。
对于GPU来说,因为底层的硬件设计,更适合并行计算也更喜欢密集型计算。TensorRT所做的优化也是基于GPU进行优化,当然也是更喜欢那种一大块一大块的矩阵运算,尽量直通到底。因此对于通道数比较多的卷积层和反卷积层,优化力度是比较大的;如果是比较繁多复杂的各种细小op操作(例如reshape、gather、split等),那么TensorRT的优化力度就没有那么夸张了。
为了更充分利用GPU的优势,我们在设计模型的时候,可以更加偏向于模型的并行性,因为同样的计算量,“大而整”的GPU运算效率远超“小而碎”的运算。
工业界更喜欢简单直接的模型和backbone。2020年的RepVGG(RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)),就是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。相比resnet系列,更加适合充当一些检测模型或者识别模型的backbone。
在实际应用中,TensorRT的加速效果:
- SSD检测模型,加速3倍(Caffe)
- CenterNet检测模型,加速3-5倍(Pytorch)
- LSTM、Transformer(细op),加速0.5倍-1倍(TensorFlow)
- resnet系列的分类模型,加速3倍左右(Keras)
- GAN、分割模型系列比较大的模型,加速7-20倍左右(Pytorch)
TensorRT官方支持Caffe、Tensorflow、Pytorch、ONNX等模型的转换(不过Caffe和Tensorflow的转换器Caffe-Parser和UFF-Parser已经有些落后了),也提供了三种转换模型的方式:
- 使用TF-TRT,将TensorRT集成在TensorFlow中
- 使用ONNX2TensorRT,即ONNX转换trt的工具
- 手动构造模型结构,然后手动将权重信息挪过去,非常灵活但是时间成本略高,有大佬已经尝试过了:tensorrtx
不过目前TensorRT对ONNX的支持最好,TensorRT-8最新版ONNX转换器又支持了更多的op操作。而深度学习框架中,TensorRT对Pytorch的支持更为友好,除了Pytorch->ONNX->TensorRT这条路,还有:
- torch2trt
- torch2trt_dynamic
- TRTorch
总而言之,理论上95%的模型都可以转换为TensorRT,条条大路通罗马嘛。只不过有些模型可能转换的难度比较大。如果遇到一个无法转换的模型,先不要绝望,再想想,再想想,看看能不能通过其他方式绕过去。
参考资料:
TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧!
什么是TensorRT
TensorRT简介–高性能深度学习支持引擎
TensorRT 介绍
TensorRT(1)-介绍-使用-安装
[深度学习]TensorRT为什么能让模型跑快快
内卷成啥了还不知道TensorRT?超详细入门指北,来看看吧!



