【量化】I-BERT: Integer-only BERT Quantization
摘要
在这项工作中,我们提出了 I-BERT,这是一种面向基于 Transformer 的模型的新型量化方案,其整个推理过程均仅采用整数运算。依托于针对非线性操作(如 GELU、Softmax 和 Layer Normalization)的轻量级纯整数近似方法,I-BERT 能够实现端到端的纯整数 BERT 推理,无需任何浮点计算。
1、介绍
尽管先前研究已证明了纯整数推理的可行性(Jacob 等,2018;Yao 等,2020),但这些方法仅集中于计算机视觉领域中使用简单卷积神经网络(CNN)层、批归一化(Batch-Normalization)(Ioffe 和 Szegedy,2015)以及 ReLU 激活函数的模型。这些算子均为线性或分段线性算子。
由于 Transformer 架构中使用了非线性运算,例如 GELU、Softmax 和层归一化(LayerNorm),这些方法无法直接应用于基于 Transformer 的模型。另一个挑战在于,使用低精度处理 GELU、Softmax 和 LayerNorm 会导致显著的精度下降。
我们提出了针对 GELU 和 Softmax 的高效且精确的纯整数运算的新算子。具体而言,我们使用轻量级的二阶多项式对 GELU 和 Softmax 进行近似,这些多项式可通过纯整数算术进行求值。我们采用了多种技术来减小近似误差,使 GELU 的最大误差达到 1.8×10−21.8 × 10^−21.8×10−2,Softmax 的最大误差达到 1.9×10−31.9 × 10^−31.9×10−3。详见第 3.4 和 3.5 节。
- 对于 LayerNorm,我们通过利用一种已知的用于整数平方根计算的算法(Crandall & Pomerance, 2006)来实现纯整数运算。详见第 3.6 节。
- 我们利用对 GELU、Softmax 和 LayerNorm 的这些近似方法,设计了一种仅使用整数运算的量化方案。具体而言,我们采用 INT8 乘法与 INT32 累加来处理嵌入(Embedding)和矩阵乘法(MatMul)。随后,非线性操作(GELU、Softmax 和 LayerNorm)均在 INT32 累加结果上计算,并重新量化回 INT8。我们使用整数表示整个计算图中的所有参数和激活值,且从不将其转换为浮点数。图 1(右侧)给出了示意图说明。

3. Methodology
3.1. Basic Quantization Method

3.2 非线性的整数量化
整数量化(integer-only quantization)的关键在于,所有运算均仅使用整数算术,完全避免浮点计算。与线性操作(例如矩阵乘法 MatMul)或分段线性操作(例如 ReLU)不同,非线性操作(例如 GELU、Softmax 和 LayerNorm)在此方面并非易事。原因在于,先前工作中的整数量化算法(Jacob 等,2018;Yao 等,2020)依赖于算子的线性性质。例如,对于线性矩阵乘法操作,MatMul(Sq) 等价于 S · MatMul(q)。这一性质允许我们对量化输入 q 应用整数矩阵乘法,然后再乘以缩放因子 S,从而得到与对去量化后的输入 Sq 应用浮点矩阵乘法相同的结果。
重要的是,这一性质并不适用于非线性操作,例如
GELU(Sq)≠S⋅GELU(q)。 GELU(Sq) ≠ S · GELU(q)。 GELU(Sq)=S⋅GELU(q)。
我们采用仅支持整数运算的多项式来近似非线性激活函数 GELU 和 Softmax。多项式计算仅涉及加法和乘法,这些操作均可通过整数算术实现。因此,若能找到这些运算的良好多项式近似,便可在整个推理过程中仅使用整数算术。例如,以形式 a(x+b)2+ca(x + b)^2 + ca(x+b)2+c 表示的二阶多项式,可以按照算法 1 所示的方式高效地仅用整数算术进行计算。
3.3. Polynomial Approximation of Non-linear Functions
在利用多项式逼近函数方面,已有大量研究工作(Stewart, 1996)。我们采用一类插值多项式(interpolating polynomials):已知一组包含 n+1n+1n+1 个互异数据点的函数值 {(x0,f0),…,(xn,fn)}\{(x_0, f_0), \ldots, (x_n, f_n)\}{(x0,f0),…,(xn,fn)},目标是寻找一个次数不超过 nnn 的多项式,使其在这些点处的函数值与给定函数值完全一致。据已知,存在唯一一个次数不超过 nnn 且通过这些所有数据点的多项式(Waring, 1779)。
挑战在于找到一个恰当的低阶多项式,以尽可能逼近 Transformer 中所使用的非线性函数。这正是我们在下一部分讨论的内容:分别在 § 3.4 和 § 3.5 中对 GELU 和 Softmax 进行探讨,并证明仅使用二阶多项式即可实现高精度的近似。
3.4. Integer-only GELU
GELU(Hendrycks & Gimpel,2016)是一种在 Transformer 模型中使用的非线性激活函数,其定义为:

直接计算误差函数(erf)中积分项在计算上效率低下。因此,人们提出了多种不同的近似方法来评估 GELU。例如,Hendrycks 和 Gimpel(2016)建议利用 Sigmoid 函数来近似 erf 函数。
然而,这种近似方法在仅使用整数的量化场景中并不可行,因为 Sigmoid 本身是一个非线性函数,需要浮点运算。为解决这一问题,可以采用 Howard 等人(2019)提出的硬 Sigmoid(h-Sigmoid)来近似 Sigmoid(该方法最初是为高效计算机视觉模型而设计),从而获得 GELU 的仅整数近似形式:
我们将此近似称为 h-GELU。尽管 h-GELU 可以使用整数运算进行计算,但我们观察到,在 Transformer 模型中用 h-GELU 替代 GELU 会导致显著的性能下降。如表 1.2 所示,h-GELU 与 GELU 之间存在较大差距;图 2(左侧)也清晰地展示了这两种函数之间的明显差异。
解决上述问题的一种简单方法是使用多项式来近似 GELU,通过求解以下优化问题:
其中 L(x)L(x)L(x) 是一个用于近似误差函数 erf\text{erf}erf 的二阶多项式。直接优化式 (7) 会得到较差的近似结果,因为 erf\text{erf}erf 的定义域为整个实数集。为解决这一问题,我们仅在有限范围内优化 L(x)L(x)L(x),因为当 xxx 取值较大时,erf\text{erf}erf 趋近于 1(或 -1)。此外,我们利用 erf\text{erf}erf 为奇函数(即 erf(−x)=−erf(x)\text{erf}(-x) = -\text{erf}(x)erf(−x)=−erf(x))的性质,因此仅需在正半轴范围内进行近似。在确定最佳插值点(即式 (3) 中的 (xi,fi)(x_i, f_i)(xi,fi))并应用上述调整后,我们得到如下多项式:

3.5. Integer-only Softmax

用整数算术近似 Softmax 层极具挑战性,因为 Softmax 中使用的指数函数是无界的且变化剧烈。因此,早期的 Transformer 量化方法(Bhandare 等,2019;Zafrir 等,2019)在对该层进行处理时采用浮点算术。部分先前工作提出了带插值的查找表(Schraudolph,1999),但我们仍然避免使用查找表,并力求实现一种纯基于算术的近似方法。此外,尽管 Hauser 和 Purdy(2001)提出了针对指数函数的多项式近似方法,但其所用的多项式阶数显著偏高,且仅适用于有限的有限定义域。
与 GELU 类似,我们无法使用高阶多项式;即便使用此类多项式,也难以有效近似 Softmax 中的指数函数。然而,通过限制 Softmax 的近似范围,这一问题是可以得到解决的。

其中 xmax=maxi(xi)x_{\max} = \max_i (x_i)xmax=maxi(xi)。请注意,此时进入指数函数的所有输入,即 x~i=xi−xmax\tilde{x}_i = x_i - x_{\max}x~i=xi−xmax,均为非正数。我们可以将任意非正实数 x~\tilde{x}x~ 分解为 x~=(−ln2)z+p\tilde{x} = (-\ln 2)z + px~=(−ln2)z+p,其中商 zzz 为非负整数,余数 ppp 为属于区间 (−ln2,0](-\ln 2, 0](−ln2,0] 的实数。于是,x~\tilde{x}x~ 的指数函数可以表示为:
其中,>> 表示按位右移操作。因此,我们只需在紧凑区间 p ∈ (−ln 2, 0] 上对指数函数进行近似。与所有实数的定义域相比,这一范围要小得多。有趣的是,惠普(HP)公司的 Itanium 2 处理器也曾采用过该方法的一个变体(Detrey & de Dinechin, 2005; Thomas et al., 2004),但采用查找表来评估 exp§。
我们使用二次多项式在该区间内近似指数函数。为了确定多项式的系数,我们最小化指数函数在区间 (−ln2,0](-\ln 2, 0](−ln2,0] 上的 L2L_2L2 距离。由此得到如下近似表达式:


3.6. Integer-only LayerNorm
LayerNorm 在 Transformer 中常被使用,涉及多种非线性运算,例如除法、平方和开方。该操作用于对跨通道维度的输入激活进行归一化。其归一化过程描述如下
平方根函数可以通过基于整数运算的迭代算法高效计算,该算法由 Crandall 与 Pomerance(2006)提出,如算法 4 所述。对于任意非负整数输入 n,该算法基于牛顿法迭代搜索 [sqrt(n)] 的精确值,且仅使用整数算术运算。由于对于任何 INT32 类型的输入,该算法最多在四次迭代内收敛,且每次迭代仅包含一次整数除法、一次整数加法和一次位移操作,因此其计算开销极低。LayerNorm 中其余的非线性操作(如除法和平方)也可通过整数算术 straightforward 地计算得出。

-
牛顿法 (Newton’s Method):
也称为牛顿-拉夫逊方法。这是一个在数学和计算机科学中非常著名的求根算法。- 原理:通过不断逼近的方式来寻找方程的根。对于求 n\sqrt{n}n,其实就是求解方程 x2−n=0x^2 - n = 0x2−n=0 的正根。
- 迭代公式:经典的牛顿法迭代公式是 xnew=12(xold+nxold)x_{new} = \frac{1}{2}(x_{old} + \frac{n}{x_{old}})xnew=21(xold+xoldn)。
- 文本中的优化:标准的牛顿法涉及除法和乘法,且通常处理浮点数。文本中提到的算法(参考 Crandall & Pomerance, 2006)对这一公式进行了改造,使其能够仅在整数域内收敛。
-
⌊n⌋\lfloor \sqrt{n} \rfloor⌊n⌋ (向下取整的平方根):
符号 ⌊⋅⌋\lfloor \cdot \rfloor⌊⋅⌋ 表示“地板函数”(Floor function),即向下取整。- 例如:如果 n=10n=10n=10,10≈3.16\sqrt{10} \approx 3.1610≈3.16,那么 ⌊10⌋=3\lfloor \sqrt{10} \rfloor = 3⌊10⌋=3。
- 在整数运算中,我们通常只关心结果的整数部分,因为精度要求不高且计算更快。
-
位运算 (Bit-shifting):
将二进制数字向左或向右移动。- 右移一位(
>> 1)相当于除以 2。 - 左移一位(
<< 1)相当于乘以 2。 - 优势:在计算机底层,移位操作比加、减、乘、除都要快得多,也省电得多。
- 右移一位(
2. 算法工作流程详解
文本提到该算法(Alg. 4)用于计算 isqrt(n)(整数平方根)。其核心逻辑如下:
- 输入:一个非负整数 nnn(例如,32位整数 INT32)。
- 初始化:设置一个初始猜测值(通常可以是 nnn 或 n/2n/2n/2 或 1)。
- 迭代过程:
- 利用牛顿法的变体公式进行更新。
- 关键优化:每一步迭代仅包含三种操作:
- 整数除法 (
integer division):计算 n/xcurrentn / x_{current}n/xcurrent。 - 整数加法 (
integer addition):将结果与当前猜测值相加。 - 位运算/移位 (
bit-shifting):通常用于模拟除以 2 的操作(即 (a+b)/2(a + b) / 2(a+b)/2 可以写成 (a+b)>>1(a + b) >> 1(a+b)>>1),从而避免使用较慢的除法指令。
- 整数除法 (
- 终止条件:当猜测值不再变化,或者变化超过允许误差时停止。
- 输出:最终的整数结果,即 ⌊n⌋\lfloor \sqrt{n} \rfloor⌊n⌋。
5. 结论
我们提出了 I-BERT,这是一种针对 Transformer 的纯整数量化方案,其整个推理过程均采用纯整数算术运算。I-BERT 的关键要素包括对 GELU、Softmax 和 LayerNorm 等非线性运算的近似方法,这些方法使得能够以整数计算实现近似。
参考
https://zhuanlan.zhihu.com/p/8560290289
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)