模型量化技术(入门级理解,不涉及复杂公式和深入的原理)

量化技术

量化的概念

一般是高精度浮点数表示的网络权值以及激活值用低精度(例如8比特定点)来近似表示

达到模型轻量化,加速深度学习模型推理,目前8比特推理已经比较成熟

使用低精度的模型推理的优点:

①模型存储主要是每个层的权值,量化后模型占用空间小,32比特可以缩减至8比特

并且激活值用8比特后,减小了内存的访问带宽需求

②单位时间内处理定点运算指令比浮点数运算指令多

量化的分类

一般按照量化阶段不同分为后量化和训练时量化,用的比较多的是后量化,像tensorRT和RKNN

按照量化映射方法又可以分为对称量化和非对称量化

对称量化(int8  -128-127)

              

 

 

 

 

对称算法是通过一个收缩因子,将FP32中的最大绝对值映射到8比特的最大值,最大绝对值的负值(注意此值不是fp32的最小值,是最大绝对值的相反数,故对称)映射到

8比特的最小值,有对应的映射公式(较复杂,不做展示)如图所示。一般不采用zero-point。

收缩因子:

 

 

 

对于fp32的值若均匀分布在0左右,映射后的值也会均匀分布,若fp32的值分布不均匀,映射后不能充分利用

映射空间。

非对称量化(uint8   0-255)

                 

 

 

 

 

 

通过收缩因子和零点(用于偏移),将 FP32 张量 的 min/max 映射分别映射到 8-bit 数据的 min/max ,有对应的映射公式(较复杂,不做展示)

收缩因子: 

 

加入零点的原因,0有特殊意义如padding,若不加零点z,量化后会映射到0,加入零点z后,浮点0量化后映射到0-255中间的一个数字。

可以无误差地量化浮点数中的数据 0,从而减少补零操作(比如卷积中的padding zero)在量化中产生额外的误差。

缺点是只有正数,有的处理方式是把0点左移到-128,范围控制在【-128,127】中,但还是非对称量化。

对称与非对称的优缺点:

非对称可以处理好FP32数据分布不均匀的情况。

若对称算法产生的量化后数据很多都是在【0,127】内,左边的范围利用很少,减弱了量化数据的表示能力,影响模型精度

 

 

量化的粒度

一般分为通道级量化和张量级量化,(不具体介绍概念)

通常张量的每一个通道代表一类特征,因此不同通道之间可能有数据分布相差较大情况,此时适合使用通道级量化

一般而言卷积中建议对权值使用非对称通道级的量化,激活采用张量级量化

TensorRT后量化算法

不饱和的线性量化就是量化后的数据扎堆在某一个范围(导致本不该相同的变为相同的),存在一些范围利用少的情况,会导致精度损失较大。

TensorRT量化方法:

  激活值饱和量化(右图),选择合适的阈值T

  权值非饱和量化(左图)

 

 TensorRT另一个主要的优化是在层间融合或张量融合

模型推理的时候,每一次的操作都是由gpu启动不同的cuda核心来完成的,大量的时间花在cuda核心启动和读写操作上,造成了内存带宽的瓶颈和GPU资源浪费。TENSORRT通过层间融合,横向融合把卷积偏置激活合并成一个结构,并且只占用一个cuda核心,纵向融合把结构相同,权值不同的层合并成一个更宽的层,也是占用一个cuda核心,因此整个模型结构更小更快。

 参考:

https://www.cnblogs.com/qccz123456/p/11767858.html

公众号 gaintpanda

rknn开发社区资料,文档

http://t.rock-chips.com/forum.php?mod=viewthread&tid=1226

posted @ 2020-07-20 22:29  you-wh  阅读(6957)  评论(0编辑  收藏  举报
Fork me on GitHub