TensorRT 性能优化方式
对于训练好的深度学习网络模型结构和权重参数,在导入到 TensorRT 推理引擎优化器之后,会对其在模型结构和权重参数上进行一系列的全局优化,优化过程如下图所示。TensorRT 对网络模型结构和权重参数的优化主要包括层与张量融合和权重与激活精度校准,本节将对这两种优化方式进行简单地介绍。
1层与张量融合
对于实例分割领域来说,为了追求更高的检测框平均精度和分割掩码平均精度,其网络模型结构越来越复杂,包含大量的卷积层和全连接层等神经网络模块。在对网络模型做前向推理时,网络结构中的每一个卷积操作都需要 GPU 调用不同的 CUDA 核心去执行计算来获取结果。对于卷积操作中的张量运算,CUDA核心的计算速度是非常快的,但是,大量的卷积层和全连接层会使得 CUDA 核心的调用和张量的读写浪费大量的时间。同时,主存和显存之间大量的数据拷贝操作也是对 GPU 时间的浪费。TensorRT 通过对不同网络层之间的垂直融合和水平融合,使得网络结构的层数大大减少。同时,也会删除没有使用到的输出层以及一些等同没有操作的层结构。
如下图 所示,层间垂直融合就是把卷积层、偏置层和激活层融合成一个CBR 网络模块结构,通过这种方式的层间垂直融合之后,在网络模型执行前向推理时,GPU 只需要调用一个 CUDA 核心。
如下图所示,层间水平融合就是把多个权重参数不同且结构相同层融合成一个更宽的层结构,通过这种方式的层间水平融合之后,在网络模型执行前向推理时,GPU 只需要调用一个 CUDA 核心。
通过对庞大且复杂的深度神经网络结构进行层间水平融合和层间垂直融合之后,网络结构中的层数更少,在前向推理的过程中,使用到的 CUDA 核心数量也就更少,进而降低了 CUDA 核心调用和张量读写的时间并提高了 CUDA 核心的利用率,因此整个深度神经网络的结构更小,推理速度更快。
2权重与激活精度校准
在深度神经网络模型训练的后期阶段,由于反向传播梯度变化很小,如果权重参数的精度不够,训练结果将无法进一步收敛,因此,许多深度学习框架中的张量存储和运算过程都是使用 32 位的浮点数(Full 32-bit precision,FP32)。然而,在深度神经网络模型训练完成之后,在应用部署的程序中不需要反向传播,只有前向推理的过程,因此,可以通过降低数据精度的方式来提高网络前向推理的速度以及降低显存的空间占用。但是,在使用低精度表示的数据进行前向推理时会存在信息丢失的问题,从而导致推理结果性能的下降。目前,TensorRT 已经支持 FP16 和 INT8 的计算,在对深度神经网络模型结构的优化的过程中,TensorRT 也会对权重参数进行优化校准,使得推理结果性能的损失降到最低。从下图中可以看出,TensorRT 使用 INT8 精度的数据获取的前向推理的结果仅损失了不到 0.5%的性能。
页:
[1]