TensorRT int8推理的精度接近fp32, 但是存储空间更小,对memory的带宽消耗也少,同时推理速度也有一定的提升。是一项很重要的技术。
跟fp16和fp32不一样,使用int8推理必须先要做calibriation,其实就是再做浮点数定点化的一些操作,然后将一些关键数据保存下来,下次使用时,就不用重新生成了。这些数据会被记录到一个calibration table的文件中。为了生成calibration table需要准备一个calibration dataset, 通常要500-1000个samples, 这些samples要有代表性,task中的每个类别都要能涵盖住,最好时validation set的一个子集。
有了calibration dataset,使用一些常用的优化算法,比如nvidia介绍的,每一层的activation value 分布的KL散度,fp32的KL散度和int8对应的KL散度要很相似。优化算法跑完会输出一个calibration table或者calibration cache, TensorRT将优化封装到nvinfer library中了,只提供了几个简单的接口,将calibration table保存下来。
calibration table格式如下:
TensorRT: Performing Inference In INT8 Using Custom Calibration