Quantization fundamentals
Hardware background
这部分内容主要探索量化的硬件背景以及如何让推理在设备上跑起来。
图1展示了神经网络中矩阵向量乘法 y = W x + b \boldsymbol{y}=\boldsymbol{W}\boldsymbol{x} + \boldsymbol{b} y=Wx+b的计算示意图,这是矩阵乘法和卷积的一个基础组件,主要通过尽可能多的计算并行来提高NN推理的效率。
该神经网络加速器的两个基本组件分别是:processing elements( C n , m C_{n,m} Cn,m)和accumulators( A n A_{n} An),在上图示例中共有16个processing elements和4个accumulators,具体的计算公式如下:
A n = b n + ∑ m C n , m A_{n}=\boldsymbol{b}_{n} + \sum \limits_{m}C_{n,m} An=bn+m∑Cn,m
其中 C n , m = W n , m x m C_{n,m}=\boldsymbol{W}_{n,m}\boldsymbol{x}_{m} Cn,m=Wn,mxm, W n , m \boldsymbol{W}_{n,m} Wn,m为权重值, x m \boldsymbol{x}_{m} xm为输入数据, b n \boldsymbol{b}_{n} bn为偏移值。
上述计算操作也被称为Multiply-Accumulate (MAC),在大的矩阵乘中这个步骤会重复很多遍,所有循环执行结束后accumulators将被保存用于下一层NN推理。通常神经网络使用float32的权重和激活值进行训练,而MAC操作和数据搬运消耗了推理过程的大部分能量,因此使用低比特定点化或者量化可以获得比较大的收益。低比特量化不仅可以减少数据搬运的次数,同时可以降低MAC操作的尺寸和功耗。
将浮点操作转换为定点,需要先对浮点向量进行定点化。假设浮点向量为 x \boldsymbol{x} x,则其可以表示为:
x ^ = s x ⋅ x i n t ≈ x \widehat{\boldsymbol{x}}=s_{x} \cdot\boldsymbol{x}_{int}\approx \boldsymbol{x} x
=sx⋅xint≈x
其中 s x s_{x} sx浮点类型的尺度因子, x i n t \boldsymbol{x}_{int} xint是整形向量(如int8), x ^ \widehat{\boldsymbol{x}} x
表示量化后的矢量。则MAC操作的量化形式可以表示为:
A ^ n = b ^ n + ∑ m W ^ n , m x ^ m = b ^ n + ∑ m ( s W W n , m i n t ) ( s x x m i n t ) = b ^ n + s W s x ∑ m W n , m i n t x m i n t {\widehat{\boldsymbol{A}}_{n}}={\widehat{\boldsymbol{b}}_{n}}+ \sum \limits_{m}{\widehat{\boldsymbol{W}}_{n,m}}{\widehat{\boldsymbol{x}} _{m}}={\widehat{\boldsymbol{b}}_{n}}+ \sum \limits_{m}(s_{\boldsymbol{W}}{\boldsymbol{W}}_{n,m}^{int})(s_x{\boldsymbol{x}}_{m}^{int})={\widehat{\boldsymbol{b}}_{n}}+s_{\boldsymbol{W}}s_{\boldsymbol{x}}\color{purple}\sum \limits_{m}{\boldsymbol{W}}_{n,m}^{int}{\boldsymbol{x}}_{m}^{int} A
n=b
n+m∑W
n,mx
m=b
n+m∑(sWWn,mint)(sxxmint)=b
n+s