【量化】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 距离。由此得到如下近似表达式:


开销分析
产生了新的、不可忽视的运行时开销(Runtime Overhead)。
虽然我们前面提到 I-BERT 的激活值量化采用的是静态 Scale,但在 I-EXP 和 I-SOFTMAX 这两个非线性算子的微观计算图内部,为了保证纯整数计算不溢出且逼近高精度,它引入了以下几处新的运行时开销:
- 动态自适应截断(Data-dependent Clipping / Boundary Realignment)
看 I-EXP 内部的这两行:
- z←⌊−q/qln2⌋z \leftarrow \lfloor -q / q_{\ln 2} \rfloorz←⌊−q/qln2⌋
- qp←q+zqln2q_p \leftarrow q + z q_{\ln 2}qp←q+zqln2
转移的开销表现:
这里隐藏了一个极其关键的动态截断与平移逻辑。因为 qqq 是负数(在 Softmax 中减去了 max(q)\max(q)max(q) 后的减法结果 q~\tilde{q}q~ 全为负),为了让多项式 I-POLY 能在 [−ln2,0][-\ln 2, 0][−ln2,0] 这个极小的、高精度固定的范围内进行拟合,算法在运行时必须对每一个输入 qqq 计算它包含了多少个 ln2\ln 2ln2(即计算 zzz),然后通过 q+zqln2q + z q_{\ln 2}q+zqln2 将其“拉回”到这个标准边界内。
- 运行时开销: 这意味着在运行时,硬件必须为每一个元素动态执行一次整数除法或复杂的位移条件判定(下取整操作 ⌊⋅⌋\lfloor \cdot \rfloor⌊⋅⌋),随后还要做一次乘法和加法。这种依赖数据实际大小的边界对齐,在硬件执行流中会带来控制逻辑开销。
- 动态位移调整开销(Dynamic Bit Shifts)
看 I-EXP 返回前的这一行:
- qout,Sout←qL>>z,SLq_{\text{out}}, S_{\text{out}} \leftarrow q_L >> z, S_Lqout,Sout←qL>>z,SL
转移的开销表现:
利用 ex=2x⋅log2ee^x = 2^{x \cdot \log_2 e}ex=2x⋅log2e 的原理,前面算出来的 zzz 就是对应的二进制指数。因此,多项式算出的整型结果 qLq_LqL 必须通过右移 zzz 位(>> z)来完成最终的缩放。
- 运行时开销: 这里的右移位数 zzz 不是一个常数,而是取决于输入数据 qqq 动态计算出来的变量。在 SIMD 或 NPU 硬件中,执行“固定位移(Static Shift)”速度极快,但执行“变量位移(Variable/Dynamic Shift)”通常无法直接硬件并行,甚至会造成向量化执行的流水线气泡(Pipeline Bubbles),形成了新的运行时延迟。
- Softmax 内部的全局动态极大值搜索与求和(Reduction Overhead)
看 I-SOFTMAX 内部:
- q~←q−max(q)\tilde{q} \leftarrow q - \max(q)q~←q−max(q)
- qout,Sout←qexp/sum(qexp),Soutq_{\text{out}}, S_{\text{out}} \leftarrow q_{\text{exp}} / \text{sum}(q_{\text{exp}}), S_{\text{out}}qout,Sout←qexp/sum(qexp),Sout
转移的开销表现:
虽然这里没有“量化参数”的估计,但为了防止整数指数爆炸,算法必须在线(Online)找出当前行向量的 max(q)\max(q)max(q)。
- 运行时开销: 这一步和最后的 sum(qexp)\text{sum}(q_{\text{exp}})sum(qexp) 一样,都是全局数据规约(Global Reduction)操作。它迫使硬件必须打破局部的流水线,把这一行的数据全部扫一遍找出最大值,再扫一遍做减法。这种访存密集型的同步操作是硬件延迟(Latency)的主要来源。
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
20260702 回顾
在 I-BERT 的全整型(Integer-only)量化方案中,低阶整数多项式和牛顿迭代法并不是漫无目的地到处乱用,而是非常精准地应用在 Transformer 的三大核心非线性算子中:GELU 激活函数、Softmax 和 LayerNorm。
具体到每种操作上,它们的具体分工和具体数学手段如下:
1. LayerNorm(层归一化):用于逼近“平方根倒数”
LayerNorm 的标准公式为:
y=x−μσ2+ϵ×γ+βy = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \times \gamma + \betay=σ2+ϵx−μ×γ+β
-
痛点操作:在整型域中,计算方差 σ2\sigma^2σ2 是简单的整数乘加(MAC),但要计算 1σ2+ϵ\frac{1}{\sqrt{\sigma^2 + \epsilon}}σ2+ϵ1 (平方根倒数)在硬件上极其困难,因为传统的开方和除法需要浮点单元。
-
I-BERT 的具体解法:
-
第一步:多项式粗估计。先用一个特殊的二进有理数或定点数方法,粗略估计出一个基础范围。
-
第二步:牛顿-拉弗森迭代法(Newton-Raphson Iteration)。
令 f(y)=1y2−x=0f(y) = \frac{1}{y^2} - x = 0f(y)=y21−x=0(其中 xxx 是整数方差,我们要迭代求出 y=1xy = \frac{1}{\sqrt{x}}y=x1)。
其迭代更新公式为:
yn+1=yy2(3−x⋅yn2)y_{n+1} = \frac{y_y}{2} (3 - x \cdot y_n^2)yn+1=2yy(3−x⋅yn2) -
操作细节:在这个迭代公式里,只有整数乘法、减法和位移(除以 2 变成右移 1 位)。I-BERT 在整数域内执行 1~2 次这个纯整数的牛顿迭代循环,就能以极高精度逼近出方差的平方根倒数,彻底消灭了浮点开方。
2. Softmax:用于逼近“指数函数 exp(x)\exp(x)exp(x)”与“倒数 1∑\frac{1}{\sum}∑1”
Softmax 的标准公式为:
Pi=exp(xi−xmax)∑jexp(xj−xmax)P_i = \frac{\exp(x_i - x_{\max})}{\sum_j \exp(x_j - x_{\max})}Pi=∑jexp(xj−xmax)exp(xi−xmax)
- 痛点操作 ①:计算 exp(x)\exp(x)exp(x)。
- I-BERT 的具体解法(低阶多项式):
- 它利用数学性质:exp(x)=2x⋅log2e\exp(x) = 2^{x \cdot \log_2 e}exp(x)=2x⋅log2e。
- 将其拆分为整数部分和小数部分:x⋅log2e=z+γx \cdot \log_2 e = z + \gammax⋅log2e=z+γ(其中 zzz 是整数,γ∈[0,1)\gamma \in [0, 1)γ∈[0,1) 是小数)。
- 核心的多项式应用在这里:用一个二阶(低阶)整数多项式 L(γ)L(\gamma)L(γ) 来逼近 2γ2^\gamma2γ。
2γ≈C0+C1γ+C2γ22^\gamma \approx C_0 + C_1 \gamma + C_2 \gamma^22γ≈C0+C1γ+C2γ2
-
这里的系数 C0,C1,C2C_0, C_1, C_2C0,C1,C2 被全部缩放并量化为整数。最终计算 exp(x)\exp(x)exp(x) 只需要执行两次整数乘法、几次加法,再结合 2z2^z2z 的低成本整型左移位(Bit Shift)操作即可完成。
-
痛点操作 ②:计算除法 1∑exp\frac{1}{\sum \exp}∑exp1。
-
I-BERT 的具体解法(牛顿迭代):
-
同样,为了避免硬件上昂贵的整数除法器,I-BERT 使用牛顿迭代法来求分母的倒数(令 f(y)=1y−sum=0f(y) = \frac{1}{y} - \text{sum} = 0f(y)=y1−sum=0,迭代公式为 yn+1=yn(2−sum⋅yn)y_{n+1} = y_n(2 - \text{sum} \cdot y_n)yn+1=yn(2−sum⋅yn))。通过纯整数的乘法和位移迭代求出倒数后,将“除法”转变为“整数乘法”。
3. GELU 激活函数:用于逼近“误差函数 erf(x)\text{erf}(x)erf(x)”
GELU 的标准近似公式为:
GELU(x)=0.5x(1+tanh(2π(x+0.044715x3)))\text{GELU}(x) = 0.5x \left(1 + \tanh\left(\sqrt{\frac{2}{\pi}} (x + 0.044715x^3)\right)\right)GELU(x)=0.5x(1+tanh(π2(x+0.044715x3)))
- 痛点操作:里面的 tanh\tanhtanh 和双曲正切非常难用整数表达。
- I-BERT 的具体解法(低阶分段多项式):
- I-BERT 直接抛弃了复杂的 tanh\tanhtanh 变换,将整个 32 位整型输入域根据 xxx 的大小切分成不同的区间(Sign & Magnitude 判定)。
- 在核心的激活区,直接用一个二阶整数多项式 a⋅x2+b⋅x+ca \cdot x^2 + b \cdot x + ca⋅x2+b⋅x+c 来拟合 GELU 的曲线。
- 操作细节:由于系数 a,b,ca, b, ca,b,c 提前被量化成了固定的整数常量,硬件在执行 GELU 时,只需要做一次整数判定(Sign/Clamping),然后直接塞进这个二阶多项式里做两次整数乘法(MAC 算子)即可吐出结果。
💡 核心逻辑总结
| 作用算子 | 痛点数学操作 | I-BERT 的具体整数替代手段 |
|---|---|---|
| LayerNorm | 1x\frac{1}{\sqrt{x}}x1(平方根倒数) | 牛顿-拉弗森迭代(只用整数乘法、减法、右移) |
| Softmax | exp(x)\exp(x)exp(x)(指数函数) | 二阶整数多项式(拟合尾数)+ 核心位移(处理整数幂) |
| Softmax | 1sum\frac{1}{\text{sum}}sum1(矩阵规约除法) | 牛顿迭代(将除法变为纯整数乘法循环) |
| GELU | tanh(x)\tanh(x)tanh(x)(双曲激活) | 分段二阶整数多项式(用 ax2+bx+ca x^2 + b x + cax2+bx+c 强行拟合曲线) |
通过这套组合拳,I-BERT 把所有需要浮点硬件(FPU)或复杂硬件查找表(LUT)的非线性算子,全部降维成了“整数乘加(MAC)+ 硬件位移(Shift)”的微观指令组合。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)