tensorRT-介绍

前面介绍了tensorRT的安装过程,这里就介绍一下tensorRT的用途,以及为啥能实现网络加速。当前,深度学习的发展推动了一大批的深度学习框架,caffe,tf,pytorch等等,然而基于这些框架搭建出来的网络的效率一直是大家所关注的,为提高网络效率,通常都会对网络进行压缩,而网络压缩的最常见的两个思路就是:量化和剪枝。相比剪枝来说,网络的量化更容易实现。tensorRT就是通过量化,将FP32位权值数据优化为 FP16 或者 INT8,而推理(前向计算过程)精度不发生明显的降低。TensorRT是一个C++库,TensorRT由英伟达(NVIDIA)发布,目前包括TensorRT1、TensorRT 2、TensorRT 3、tensorRT 4。由于环境的问题,我使用的是tensorRT 3.0.4版本。下面说一下tensorRT都支持哪些输入。下面是我根据官网翻译了一部分,想具体了解tensorRT可以看这里

tensorRT输入

tensorRT输入之网络框架 :TensorRT3支持所有常见的深度学习框架包括Caffe、Chainer、CNTK、MXnet、PaddlePaddle、Pytorch、TensorFlow以及Theano。
tensorRT输入之网络层:目前tensorRT支持所有标准层,包括如下这些层:

tensorRT输入之接口:TensorRT3支持模型导入方式包括C++ API、Python API、NvCaffeParser和NvUffParser。

对于caffe和tensorflow,tensorRT直接提供了模型导入器,可以直接载入模型,对于其他的深度学习框架需要自己定义网络API接口。

  • caffe : 1)可以使用C++/Python API导入模型:通过代码定义网络结构,并载入模型weights的方式导入;2)也可以使用NvCaffeParser导入模型:导入时输入网络结构prototxt文件及caffemodel文件即可。
  • tensorflow: 训练完成后,使用uff python接口将模型转成uff格式,之后使用NvUffParaser导入;

tensorRT优化细节

网络模型在导入至TensorRT后会进行一系列的优化,主要优化内容如下图所示。

优化1 Layer & Tensor Fusion

tensorRT在解析得到计算流图之后会对计算流图进行优化,这部分优化不会改变图中最底层计算内容,而是会去重构计算图来获得更快更高效的执行方式,即计算不变优化计算方法。如下图所示,下图是GoogLeNet 中的inception模块。

TensorRT的垂直和水平层融合和层消除优化简化了GoogLeNet Inception模块图,减少了计算和内存开销。
下表列出了常见几个网络在TensorRT优化后的网络层数量,很明显的看到TensorRT可以有效的优化网络结构、减少网络层数从而带来性能的提升。

优化2 FP16 and INT8 Precision Calibration

大多数的网络都是使用FP32进行模型训练,因此模型最后的weights也是FP32格式。但是一旦完成训练,所有的网络参数就已经是最优,在推理过程中是无需进行反向迭代的,因此可以在推理中使用FP16或者INT8精度计算从而获得更小的模型,这样使用的显存也更小。

上面介绍了一个层之间的优化,以及精度的量化,其实tensorRT还做了很多优化工作,比如Kernel Auto-Tuning,Dynamic Tensor Memory,等等。这里就不一一介绍。