大家好,我是极智视界,本文介绍一下 谈谈昇腾CANN量化。
昇腾CANN的量化体现在AMCT工具,也即模型压缩工具,后面再来说AMCT,这篇先聊一下昇腾CANN的量化执行流程和原理。量化是指对原始框架的模型权重weights 和 数据activation 进行低比特化int8的处理,以此可以达到的优化效果如下:
量化分为训练后量化(Post-Training Quantization) 和 量化感知训练(Quantization-Aware Training),这里主要讲的是训练后量化。量化一般不依赖于硬件,所以不管是昇腾的量化还是英伟达的量化甚至是嵌入式设备的量化,都是不用跑在运行环境上的,一般用普通CPU来跑量化的过程就可以了,跑完量化过程后生成一个量化后的模型,然后再送入下一个推理流程。咱们一般指的量化就是权重和数据从float32->int8
的过程,但是并不是所有的算子都会进行量化处理,如一些非线性算子(如激活算子)一般就不量化,所以网络中可能会插入一些所谓的dequant
的算子,这些算子一定会和quant
算子成对出现,量化的运行原理可以用下图来展示:
量化常用的算法有二值化、线性量化和对数量化,线性量化又可以根据是否有offset
细分为对称量化和非对称量化两种,而CANN里的量化算法采用了线性量化方式,并将对称和非对称量化方式进行了归一。
CANN的量化可以用如下表达式进行表示:
其中scale
是缩放因子,offset
是偏移量。前面已经说到CANN的量化算法是对称量化和非对称量化的归一,这是什么意思呢?咱们先来看看对称量化和非对称量化是怎么回事。
首先来看对称量化,过程可以用下图来表示:
对称量化公式可以表示为:
其中的scale
的计算方式如下,int8数据对应的表示范围为[-128*scale, 127*scale]
。
再来看非对称量化,过程可以用下图来表示:
非对称量化公式可以表示为:
其中scale
为fp32浮点数,datauint8
为uint8的定点数,offset
是int8的定点数,scale
和offset
的计算方式如下:
接着咱们来看CANN的归一化方法,即通过将非对称量化公式通过简单的数据变换,使量化后的数据与对称量化算法在数据格式上保持一致,即均为int格式。具体的变换过程如下:
其中:
通过上述变换后,可以将量化数据也转换统一为int8格式,从而达到量化数据格式的归一,在确定scale
和变换后的offset'
后,可以得到CANN量化的计算方式,如下:
下篇咱们来说说CANN的量化怎么用。
好了,以上分享了谈谈昇腾CANN量化,希望我的分享能对你的学习有一点帮助。