作者:永恒多一天_313 | 来源:互联网 | 2023-09-23 06:34
Sparsity&Quantization之自我理解SparsityQuantizationDNN的最初的动力是以precise为中心,但随着DNN在Edge的推广&
Sparsity & Quantization 之自我理解
DNN的最初的动力是以precise为中心,但随着DNN在Edge的推广,Latency和Throuput则成了inference过程中关心的问题;为了后者,即使损失些精度,都是可以接受的。
Inference的时间消耗主要分两部分: Computing 和 Data move。如何在这两部分节约时间,则就各显神通。如果就Ineference本身而言,目前常用的方法也就是Sparsity和Quantization。
Sparsity 其中Sparsity处于比较尴尬的位置。公司的VPU处理器的一个卖点就是Sparsity,但是推广时被问得最多的就是Sparsity能带来多大的性能收益。因为DNN在训练阶段,考虑到Edge端资源受限,会采用各种剪枝技术紧凑网络,最后生成的网络weights中很少有能够压缩的成分。至于Activation sparsity,在图像处理方面,少有用武之地。
就Sparsity技术本身而言,能减少数据搬移量(值为0的数据不搬移),且减少数据计算量(值为0的数据不计算),但也需要额外的硬件支撑,并且还需要有额外的meta数据做管理。所以也只有在Sparsity rate达到一定的阀值时,可能才有收益。
Quantization 而Quantization在Edge端则被广泛使用。数据位宽的变小,在Computing 和 Data move这两个方面都会有明显的性能提高,但对网络模型的要求就比较高了。
由于一般的DNN都是float数据类型,为int8/int4等数据类型,常用的做法是用工具将网络模型转换为支持Quantilization的模型。转换的过程,其实就是线性压缩和平移的算术过程。
Quantization有per layer和per channel两种方式,但是基于和normalization同样的道理,per channel的物理意义更清楚。Float转int8所固有的问题也是Quantization的问题,由于表示的数据范围变小,如何做数据映射则成了避不开的问题。这方面的资料挺多,就不展开了,主要提带来的问题。
在VPU上使能一个网络模型时,一般以在CPU的准确度为基准;经过Quantization后,会在VPU上得到自己的准确度。有时两者相差比较大,问题一般就出在min/max超出了阀值;或者某些layer的activation分布得不均匀,无法以线性的方式做压缩。就需要手工调节,修改scale和shift,或者针对特殊layer,修改数据映射方法。
一个比较完备的 神经网络模型量化综述, 记录下来。