第一章 综述
NVIDIA的TensorRT是一个基于GPU高性能前向运算的C++库。TensorRT导入网络定义,通过合并tensors与layers,权值转换,选择高效中间数据类型,基于层参数与性能评估的选择,来进行网络优化。
TensorRT提供模型导入途径来帮助你对训练好的深度学习模型进行表示,同于TensorRT的优化与运行。这种优化工具自动进行图优化,层融合,并利用多样化的高度优化的计算核心寻找最快的模型实现方式。输出可以前向运算时可以运行这个网络的运行库。
TensorRT提供了一种基础能力,使得用户可以在Pascal与VoltaGPU上选择性进行快速多精度应用。TensorRT用gcc4.8进行编译。
1.1 TensorRTLayers
TensorRT直接支持以下类型的层:
Activation
激活层通过逐像素激活函数实现。支持的激活类型包括,RELU,tanh与sigmoid.
BatchGemm
批矩阵相乘层实现了批矩阵的乘法运算。在矩阵相乘前矩阵可以进行转置。当维度不匹配的时候会进行适当的矩阵扩展。
Concatenation
连接层在通道维度上将宽高相同的tensors进行连接。
Constant
Constant层是一个提供本层参数的tensor,使得常量在计算时可以方便使用。
Convolution
Convolution层计算3D卷积(通道,高,宽),可选择是否使用偏置。
Deconvolution
Deconvolution层实现了去卷积运算,可选择是否使用偏置。
ElementWise
ElementWise层也叫做Eltwise层,实现了逐像素操作。支持加法,乘法,最大,减法,除法,指数运算。
Flatten
Flatten层在保持batch_size的同时,将输入转成一个向量。假设第一个维度表示batch大小。Flatten只能在全连接层前使用。
FullConnected
全连接层实现了矩阵向量积运算,可选择是否使用偏置。
Gather
Gather层实现了聚集操作,将一个数据tensor,一个索引tensor,一个数据tensor axis作为输入,利用索引index将数据tensor重建索引。当前,只有TensorRT C++API支持。
LRN
LRN层实现跨通道局部响应归一化。
MartrixMultipy
矩阵乘法层实现了一系列的矩阵相乘运算。在乘法运算前可以选择是否将矩阵转置。当维度不匹配的时候会进行适当的矩阵扩展。
Padding
Padding层实现了tensors的空间0扩展。Padding可以是不同维度,不对称的,也可以是正的(tensor扩展结果),或者负的(均值结果)。
Plugin
Plugin层允许用户实现原生TensorRT不支持的层。
Pooling
Pooling层在通道维度实现池化操作。支持最大池化与均值池化。
Ragged SoftMax
Ragged SoftMax实现了包含不同长度序列tensor的跨通道的Softmax。序列的长度利用另外一个tensor输入。
Reduce
Reduce使用降维算法实现了tensors降维操作。降维运算支持像素相乘,最大,最小,平均。目前只有TensorRT的C++API支持这个层。
RNN
这个层在RNNV2层出现后已经弃用了,然而还是向下兼容。
RNNv2
RNNv2实现了类似递归神经网络,GRU,LSTM这样的递归层。当前支持RNN,GPU,LSTM。
Scale
Scale层实现了逐tensor,逐通道,逐权重的仿射变换,与或运算,以及常数幂运算。
Shuffle
Shuffle层用来实现tensors得重新排序,可以用来进行reshape或者数据转换。
SoftMax
SoftMax实现了跨通道的softmax。
Squeeze
Squeeze层将tensor中维度为1的shape。
TopK
TopK层在一个维度中寻找TopK元素,返回降维的tensor,与一个位置索引的tensor。
Unary
Unary支持元素级的一元操作。支持exp,log,sqrt,recip,abs与neg操作。
注:
BatchNormalization可以利用TensorRT的Scale层实现。
卷积层进行的操作实际上是相关操作。这样主要是考虑通过TensorRT API导入权重,而不是通过NVCaffe解析库。