TensorRT如何加速人脸识别
|
TensorRT 开发者分别对网络推理过程中涉及的权重 ( weights ) 和激活值 ( activation ) 做了实验,得出对权重做饱和映射相对于不饱和方式并没有精度的提高,而对激活值做饱和映射有明显的精度提升。因此在 TensorRT 中对权重采用的是不饱和映射的方式,对激活值采用的是饱和映射的方式。 那么为什么非饱和映射的方式相对饱和映射有精度的提升?此外非饱和映射中的 T 要如何选取呢?首先来看下图右边所示,该图是 resnet-152 网络模型中间层的激活值统计,横坐标是激活值,纵坐标是统计数量的归一化表示。
可以看到图 4 中白线左边的激活值分布比较的集中重合,而白线(该线对应的就是阈值 T 线)右边,即红色框内的激活值就比较的分散,而且在红色框内的激活值在整个层中所占的比例比较少,因此这部分可以不考虑到映射关系中,如图右边所示。研究发现大部分的网络都具有这种大部分激活值集中,少量激活值分散的特点。 T 值需要满足 FP32 模式到 INT8 模式转换的信息损失最小化,而信息损失可以用 KL 散度(也叫做相对熵)来衡量,即如式(3)所示: KL_divergence(P, Q) := SUM( P[i] * log( P[i] / Q[i] ), i) (3) 其中 P,Q 分别表示 FP32 和 INT8 模式下的分布,每一层 tensor 对应的 T 值都是不同的,而确定 T 值的过程被称为校准(Calibration), 如图 5 所示校准的原理图。
首先需要在校准数据集(Calibration Dataset)做 FP32 推理,然后获取每一层激活值的直方图,并用不同的量化阈值生成相应的量化分布。其中量化阈值就如上面的激活值直方图中,等间隔的虚线所对应的激活值就是量化阈值,我们需要的 T 值就是这些虚线中能够使得 KL 散度最小化的激活值。这个校准是需要一些时间的,所以每次进行量化的时候,会将校准得到的 T 值都保存在相应的文件中,待下次进行 FP32 到 INT8 推理模式转换的时候,直接读取保存了每层 T 值的文件,这样可以节省整个流程的时间。 显而易见的是校准数据集(Calibration Dataset)会直接的影响到激活值的分布,进而影响到 T 值的选择。校准数据集要具有代表性、多样性,比如在图像分类应用中,校准数据集的要能够代表所有的分类目标。验证集 (validation dataset) 的子集是比较理想的校准集,当然有人或许会问,把全部的数据用于校准不就可以最好的体现原始数据分布么?但是这样的话也会增加整个流程的时间,而经过研究和实验表明校准集只需要 1000 个样本即可。 TensorRT INT8 量化的性能和精度,图 6 和图 7 来自 Nvidia 官方的 PPT。
(编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |






