一文了解模型量化中的QAT和PTQ
由于前一段时间在做模型的转换工作,实际部署的时候需要一些模型加速的方法,常用的有各家的inference框架,如mnn,tnn,tensorrt等,这些框架除了fp32精度外,都支持了int8的精度,而量化到int8常常可以使我们的模型更小更快,所以在部署端很受欢迎。
常用的模型量化方式有训练中量化,QAT,和训练后量化,PTQ,之前转trt时,用的就是PTQ,在一些常用的模型上表现还不错,几乎没有什么掉点,但是在复杂模型,如带有swish的模型啊,或者nas搜出来的模型,表现就不尽人意了,主要是这些模型的参数分布比较奇怪或者是激活值分布没有很强的规律,导致量化失效。而QAT则避免了这一问题,通过在训练过程中去缩小这种误差,可以达到更好的性能。下面大概介绍一些这两种方法。
PTQ
首先是PTQ,以tensorrt的Int8量化为例,它的原理是什么呢,简单概括就是对于常用的模型,如googlenet,resnet等,图片经过网络生成的特征图的值往往具有相同的规律。如下图所示:
图中的绿点表示很多张图的统计结果,所以我们可以看出对于同一模型,任意图的特征激活值都呈现了低激活值高密度的特点,而比较大的那些值所占的比例微乎其微,可以忽略不计,根据这个特点,我们在量化