生产中的大模型量化技术
大模型量化
目录
摘要:
本文系统讲解实际生产中大模型量化技术,从最基础的线性量化原理出发,深入剖析两种主流后训练量化算法:GPTQ 和 AWQ。并给出 GPTQ 与 AWQ 在实际生产中的选型建议
注:
文章配有完整的数学推导与数值示例,保证看懂!
INT8:用 8 个 bit 表示一个整数
FP16:用 16 个 bit 表示一个浮点数
在训练时,用高精度来存储参数。对梯度计算友好。
70B 模型 FP16 权重:70 × 10⁹ × 2 字节 = 140GB。
部署时,70B 模型 INT4:70 × 10⁹ × 0.5 字节 = 35GB
优点:
- 节省显存
- 硬件吞吐高,访存量少,使得推理速度高。
量化的核心:将连续值映射到离散值
假设一组 FP16 权重,数值范围在 [-2.5, 2.5],要量化到 INT4(
2
4
=
16
2^{4}=16
24=16 个离散值,有符号 INT4 从 -8 到 7)。
最朴素的做法叫线性量化:
线性量化四个步骤:
缩放因子(步长)
s
c
a
l
e
=
m
a
x
−
m
i
n
q
max
−
q
min
=
2.5
−
(
−
2.5
)
7
−
(
−
8
)
≈
0.333
scale=\frac{max-min}{q_{\max}-q_{\min}} =\frac{2.5-(-2.5)}{7-(-8)} \approx0.333
scale=qmax−qminmax−min=7−(−8)2.5−(−2.5)≈0.333
意思是:整数每变化 1,浮点值大约变化 0.333。
因此原本连续的浮点数会被吸附到附近的离散刻度,例如:
.
.
.
,
−
0.666
,
−
0.333
,
0
,
0.333
,
0.666
,
.
.
.
..., -0.666,-0.333,0,0.333,0.666,...
...,−0.666,−0.333,0,0.333,0.666,...
zero_point
zero_point 表示“浮点数 0 对应哪个整数”。
z
e
r
o
_
p
o
i
n
t
=
r
o
u
n
d
(
q
min
−
m
i
n
s
c
a
l
e
)
=
r
o
u
n
d
(
−
8
−
−
2.5
0.333
)
=
r
o
u
n
d
(
−
0.5
)
=
0
{zero\_point=round\left(q_{\min}-\frac{min}{scale}\right)} =round\left(-8-\frac{-2.5}{0.333}\right) =round(-0.5) =0
zero_point=round(qmin−scalemin)=round(−8−0.333−2.5)=round(−0.5)=0
量化
i
n
t
_
v
a
l
=
r
o
u
n
d
(
f
p
_
v
a
l
s
c
a
l
e
)
+
z
e
r
o
_
p
o
i
n
t
int\_val=round\left(\frac{fp\_val}{scale}\right)+zero\_point
int_val=round(scalefp_val)+zero_point
所以2.5映射到
r
o
u
n
d
(
2.5
0.333
)
+
0
=
r
o
u
n
d
(
7.5
)
=
8
round\left(\frac{2.5}{0.333}\right)+0 =round(7.5) =8
round(0.3332.5)+0=round(7.5)=8
注:
因为 INT4 的范围
[
−
8
,
7
]
[-8,7]
[−8,7] 本身并不完全对称,因此
x
=
2.5
x=2.5
x=2.5 会得到 8,必须裁剪为 7:
c
l
i
p
(
8
,
−
8
,
7
)
=
7
clip(8,-8,7)=7
clip(8,−8,7)=7
因此工程中对称 INT4 量化常使用
[
−
7
,
7
]
[-7,7]
[−7,7],空出
−
8
-8
−8,并设置:
s
c
a
l
e
=
m
a
x
−
m
i
n
q
max
−
q
min
=
2.5
−
(
−
2.5
)
7
−
(
−
7
)
≈
0.3571
scale=\frac{max-min}{q_{\max}-q_{\min}} =\frac{2.5-(-2.5)}{7-(-7)} \approx0.3571
scale=qmax−qminmax−min=7−(−7)2.5−(−2.5)≈0.3571
这样
−
2.5
-2.5
−2.5 和
2.5
2.5
2.5 都可以映射到
−
7
-7
−7 和
7
7
7。
不同算法的差别,在于怎么算 scale 和 zero_point、怎么处理 outlier(异常大的权重值)、怎么补偿量化误差。
GPTQ:基于误差补偿的逐层量化
论文:GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
核心目标
对于某一线性层
Y
=
W
X
Y=WX
Y=WX,计算量化权重
W
^
\hat W
W^,使输出误差最小:
min
W
^
∥
W
X
−
W
^
X
∥
2
2
\min_{\hat W}\|WX-\hat W X\|_2^2
W^min∥WX−W^X∥22
其中:
- W W W:原始浮点权重,形状通常为 out_features × in_features
- X X X:校准数据经过该层时的输入激活
- W ^ \hat W W^:量化后的权重
具体流程:
1. 准备数据激活
一小批校准数据(典型 128 条文本,无标签,几万 tokens)。让模型用 FP16 跑一遍校准数据,记录每层的输入激活值。
2. 计算 Hessian 矩阵
用 Hessian 矩阵估计每个权重的「重要性」(敏感度)
对每个线性层计算
H
=
2
X
X
⊤
H = 2XX^\top
H=2XX⊤
它衡量“输入各维度的变化,对该层输出误差有多敏感”。
3. 选择量化顺序
通常按输入激活的重要性来Act-order。
Act-order(Activation order)是 GPTQ 中的“按输入激活重要性决定量化顺序”。
先计算 Hessian 对角线,它表示第
i
i
i个输入特征在校准数据中有多活跃、该列权重的误差对输出的影响有多大。
importance
i
∝
H
i
i
\text{importance}_i \propto H_{ii}
importancei∝Hii
根据
H
i
i
H_{ii}
Hii 重排权重的量化顺序。
为什么重排有用:
- 高激活通道的量化误差影响更大,优先处理。
- GPTQ 量化一列后,只能把误差补偿到“尚未量化”的列。
- 因此先处理重要列,能让更多后续浮点列帮助吸收其误差。
- 不重要列留到后面量化,即使可用于补偿的空间较少,整体影响也通常较小。
4. 逐列量化
处理第
i
i
i 列权重
w
i
w_i
wi 时,把它映射到低比特整数网格,例如 4-bit:
q
i
=
clip
(
round
(
w
i
−
z
s
)
,
0
,
2
b
−
1
)
q_i = \operatorname{clip}\left( \operatorname{round}\left(\frac{w_i-z}{s}\right), 0, 2^b-1 \right)
qi=clip(round(swi−z),0,2b−1)
反量化为:
w
^
i
=
s
q
i
+
z
\hat w_i = s q_i + z
w^i=sqi+z
当前列量化误差:
e
i
=
w
i
−
w
^
i
e_i = w_i-\hat w_i
ei=wi−w^i
GPTQ 不会直接接受这部分误差,而是把它补偿给尚未量化的列:
W
:
,
i
:
←
W
:
,
i
:
−
e
i
[
H
−
1
]
i
i
[
H
−
1
]
i
,
i
:
W_{:,\,i:} \leftarrow W_{:,\,i:} - \frac{e_i}{[H^{-1}]_{ii}} [H^{-1}]_{i,\,i:}
W:,i:←W:,i:−[H−1]iiei[H−1]i,i:
一层量化完,进入下一层,重复。
举例解释
设某个线性层只有三个输入特征,只有一个输出:
y
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
y=w_1x_1+w_2x_2+w_3x_3
y=w1x1+w2x2+w3x3
原始权重是:
W
=
[
0.63
,
−
0.74
,
0.15
]
W=[0.63,\,-0.74,\,0.15]
W=[0.63,−0.74,0.15]
4-bit 对称量化使用整数
q
∈
[
−
7
,
7
]
q\in[-7,7]
q∈[−7,7]
第一步:取校准数据并计算输入激活 X
取 5 条校准样本的该层输入激活:
X
=
[
1
1
1
0
1
0
1
1
1
0
0
0
1
1
0
]
X= \begin{bmatrix} 1&1&1&0&1\\ 0&1&1&1&0\\ 0&0&1&1&0 \end{bmatrix}
X=
100110111011100
即每一列是一条输入:
x
(
1
)
=
[
1
,
0
,
0
]
x
(
2
)
=
[
1
,
1
,
0
]
x
(
3
)
=
[
1
,
1
,
1
]
x
(
4
)
=
[
0
,
1
,
1
]
x
(
5
)
=
[
1
,
0
,
0
]
\begin{aligned} x^{(1)}&=[1,0,0]\\ x^{(2)}&=[1,1,0]\\ x^{(3)}&=[1,1,1]\\ x^{(4)}&=[0,1,1]\\ x^{(5)}&=[1,0,0] \end{aligned}
x(1)x(2)x(3)x(4)x(5)=[1,0,0]=[1,1,0]=[1,1,1]=[0,1,1]=[1,0,0]
第二步:计算 H 和 H − 1 H和H^{-1} H和H−1矩阵
H
=
2
X
X
⊤
=
[
8
4
2
4
6
4
2
4
4
]
H=2XX^\top= \begin{bmatrix} 8&4&2\\ 4&6&4\\ 2&4&4 \end{bmatrix}
H=2XX⊤=
842464244
其逆矩阵为:
H
−
1
=
[
0.2
−
0.2
0.1
−
0.2
0.7
−
0.6
0.1
−
0.6
0.8
]
H^{-1}= \begin{bmatrix} 0.2&-0.2&0.1\\ -0.2&0.7&-0.6\\ 0.1&-0.6&0.8 \end{bmatrix}
H−1=
0.2−0.20.1−0.20.7−0.60.1−0.60.8
GPTQ 实现过程不直接用
H
−
1
H^{-1}
H−1 做补偿,而是会对
H
−
1
H^{-1}
H−1 做 Cholesky 分解。其 Cholesky 上三角矩阵为:
H
−
1
=
U
⊤
U
,
U
=
[
0.447214
−
0.447214
0.223607
0
0.707107
−
0.707107
0
0
0.5
]
H^{-1}=U^\top U,\quad U= \begin{bmatrix} 0.447214&-0.447214&0.223607\\ 0&0.707107&-0.707107\\ 0&0&0.5 \end{bmatrix}
H−1=U⊤U,U=
0.44721400−0.4472140.70710700.223607−0.7071070.5
第三步:排序
由于:
diag
(
H
)
=
[
8
,
6
,
4
]
\operatorname{diag}(H)=[8,6,4]
diag(H)=[8,6,4]
所以 Act-order 会按
w
1
→
w
2
→
w
3
w_1 \rightarrow w_2 \rightarrow w_3
w1→w2→w3 顺序量化:第一个输入特征最重要,第三个最不重要。
第四步:量化
量化
w
1
w_1
w1,补偿
w
2
,
w
3
w_2,w_3
w2,w3
现在先量化第一列:
s
=
max
(
∣
0.63
∣
,
∣
−
0.74
∣
,
∣
0.15
∣
)
7
=
0.74
7
=
0.105714
s=\frac{\max(|0.63|,|-0.74|,|0.15|)}{7} =\frac{0.74}{7} =0.105714
s=7max(∣0.63∣,∣−0.74∣,∣0.15∣)=70.74=0.105714
w
1
w_1
w1量化结果:
q
1
=
r
o
u
n
d
(
w
1
s
)
=
6
q_1={round}(\frac{w_1}{s})=6
q1=round(sw1)=6
反量化:
w
^
1
=
6
×
0.105714
=
0.634286
\hat w_1=6\times0.105714=0.634286
w^1=6×0.105714=0.634286
误差:
e
1
=
w
1
−
w
^
1
=
−
0.004286
e_1=w_1-\hat w_1=-0.004286
e1=w1−w^1=−0.004286
GPTQ 用
U
U
U 的第一行补偿后两列:
w
2
=
w
2
−
e
1
U
12
U
11
=
−
0.744286
w_2= w_2-e_1\frac{U_{12}}{U_{11}} =-0.744286
w2=w2−e1U11U12=−0.744286
w
3
=
w
3
−
e
1
U
13
U
11
=
0.152143
w_3=w_3-e_1\frac{U_{13}}{U_{11}}=0.152143
w3=w3−e1U11U13=0.152143
权重状态
| 权重状态 | y ( x ( 1 ) ) y(x^{(1)}) y(x(1)) | y ( x ( 2 ) ) y(x^{(2)}) y(x(2)) | y ( x ( 3 ) ) y(x^{(3)}) y(x(3)) | y ( x ( 4 ) ) y(x^{(4)}) y(x(4)) | y ( x ( 5 ) ) y(x^{(5)}) y(x(5)) | 五条校准样本的误差 |
|---|---|---|---|---|---|---|
| 原始 [ 0.63 , − 0.74 , 0.15 ] [0.63,-0.74,0.15] [0.63,−0.74,0.15] | 0.63 | -0.11 | 0.04 | -0.59 | 0.63 | — |
| 只量化第一列 [ 0.634286 , − 0.74 , 0.15 ] [0.634286,-0.74,0.15] [0.634286,−0.74,0.15] | 0.634286 | -0.105714 | 0.044286 | -0.59 | 0.634286 | [ 0.004286 , 0.004286 , 0.004286 , 0 , 0.004286 ] [0.004286,0.004286,0.004286,0,0.004286] [0.004286,0.004286,0.004286,0,0.004286] |
| GPTQ 补偿后 [ 0.634286 , − 0.744286 , 0.152143 ] [0.634286,-0.744286,0.152143] [0.634286,−0.744286,0.152143] | 0.634286 | -0.11 | 0.042143 | -0.592143 | 0.634286 | [ 0.004286 , 0 , 0.002143 , − 0.002143 , 0.004286 ] [0.004286,0,0.002143,-0.002143,0.004286] [0.004286,0,0.002143,−0.002143,0.004286] |
平方误差和从:
4
×
0.004286
2
≈
0.00007347
4\times0.004286^2\approx0.00007347
4×0.0042862≈0.00007347
降为:
2
×
0.004286
2
+
2
×
0.002143
2
≈
0.00004592
2\times0.004286^2+ 2\times0.002143^2 \approx0.00004592
2×0.0042862+2×0.0021432≈0.00004592
关键点:
GPTQ 不要求每个权重单独最接近原值,而是要让整个层在真实输入激活上的输出最接近原模型。
H
−
1
H^{-1}
H−1 告诉它“改动后续哪个权重、改多少”,最能抵消当前量化造成的输出偏差。
优缺点
优点:
支持极端低位:能做到 INT3 甚至 INT2,靠的就是误差补偿能消化大部分精度损失
缺点:
量化耗时长:7B 模型量化要几个小时(要算 Hessian、要逐层补偿)
校准数据有依赖:选错校准数据,量化效果会变差
AWQ:激活感知的权重保护
论文:AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
研究者们观察到一个现象:
模型里大约1%的权重承担了99%的输出贡献,他们把这些权重叫 Salient Weights(重要权重)。如果把这 1% 的权重保护好(保持高精度),其他 99% 激进量化到 INT4,模型效果几乎不掉。
AWQ流程
- 找 Salient Weights?
如果某些输入位置的X特别大,那么对应的权重列就是「重要权重」。 - 逐通道缩放
AWQ 让重要通道的权重在量化前“拉开距离”,使量化整数码能区分它们,而不是把它们舍入成同一个数。
(这句话不好理解,详看示例2,不必为难脑袋)
示例1
假设一个线性层有 3 个输入通道:
y
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
y=w_1x_1+w_2x_2+w_3x_3
y=w1x1+w2x2+w3x3
校准数据中,激活和权重为:
x
=
[
20
,
1
,
0.5
]
,
w
=
[
0.10
,
0.80
,
−
1.20
]
x=[20,\ 1,\ 0.5],w=[0.10,\ 0.80,\ -1.20]
x=[20, 1, 0.5],w=[0.10, 0.80, −1.20]
原始输出:
y
=
0.10
×
20
+
0.80
×
1
+
(
−
1.20
)
×
0.5
=
2
+
0.8
−
0.6
=
2.2
y=0.10\times20+0.80\times1+(-1.20)\times0.5 =2+0.8-0.6=2.2
y=0.10×20+0.80×1+(−1.20)×0.5=2+0.8−0.6=2.2
第 1 通道的激活
x
1
=
20
x_1=20
x1=20 最大,因此
w
1
=
0.1
w_1=0.1
w1=0.1 是重要权重。
4-bit 权重量化(整数范围
[
−
7
,
7
]
[-7,7]
[−7,7])时,三个权重共用一个 scale。最大绝对值是
1.2
1.2
1.2,所以:
缩放因子:
Δ
=
1.2
7
≈
0.171
\Delta=\frac{1.2}{7}\approx0.171
Δ=71.2≈0.171
线性量化
线性量化后的近似权重:
[
0.10
,
0.80
,
−
1.20
]
→
[
0.171
,
0.857
,
−
1.20
]
[0.10,\ 0.80,\ -1.20] \rightarrow [0.171,\ 0.857,\ -1.20]
[0.10, 0.80, −1.20]→[0.171, 0.857, −1.20]
量化后输出:
y
^
=
0.171
×
20
+
0.857
×
1
−
1.20
×
0.5
=
3.42
+
0.857
−
0.6
=
3.677
\hat y=0.171\times20+0.857\times1-1.20\times0.5 =3.42+0.857-0.6=3.677
y^=0.171×20+0.857×1−1.20×0.5=3.42+0.857−0.6=3.677
误差是:
3.677
−
2.2
=
1.477
3.677-2.2=1.477
3.677−2.2=1.477
可以看出误差主要来自重要的第 1 通道:
(
0.171
−
0.10
)
×
20
=
1.42
(0.171-0.10)\times20=1.42
(0.171−0.10)×20=1.42
AWQ
AWQ 发现第 1 通道重要,于是设缩放系数(s 是用一小批校准数据统计出来的):
s
=
[
4
,
1
,
1
]
s=[4,\ 1,\ 1]
s=[4, 1, 1]
把权重按通道放大,同时把激活反向缩小:
w
′
=
[
0.10
×
4
,
0.80
,
−
1.20
]
=
[
0.40
,
0.80
,
−
1.20
]
w'=[0.10\times4,\ 0.80,\ -1.20]=[0.40,\ 0.80,\ -1.20]
w′=[0.10×4, 0.80, −1.20]=[0.40, 0.80, −1.20]
x
′
=
[
20
/
4
,
1
,
0.5
]
=
[
5
,
1
,
0.5
]
x'=[20/4,\ 1,\ 0.5]=[5,\ 1,\ 0.5]
x′=[20/4, 1, 0.5]=[5, 1, 0.5]
关键等式:
w
1
x
1
=
(
4
w
1
)
(
x
1
/
4
)
w_1x_1=(4w_1)(x_1/4)
w1x1=(4w1)(x1/4)
仍然用步长
Δ
≈
0.171
\Delta\approx0.171
Δ≈0.171量化新权重:
[
0.40
,
0.80
,
−
1.20
]
→
[
0.343
,
0.857
,
−
1.20
]
[0.40,\ 0.80,\ -1.20] \rightarrow [0.343,\ 0.857,\ -1.20]
[0.40, 0.80, −1.20]→[0.343, 0.857, −1.20]
量化后的输出:
y
^
AWQ
=
0.343
×
5
+
0.857
×
1
−
1.20
×
0.5
=
1.715
+
0.857
−
0.6
=
1.972
\hat y_{\text{AWQ}} =0.343\times5+0.857\times1-1.20\times0.5 =1.715+0.857-0.6 =1.972
y^AWQ=0.343×5+0.857×1−1.20×0.5=1.715+0.857−0.6=1.972
误差减小为:
1.972
−
2.2
=
−
0.228
1.972-2.2=-0.228
1.972−2.2=−0.228
示例 2:
设线性层有 2 个输入通道、3 个输出:
y
=
W
x
y=Wx
y=Wx
权重矩阵为:
W
=
[
0.06
0.90
0.10
−
0.80
0.14
1.00
]
W= \begin{bmatrix} 0.06 & 0.90\\ 0.10 & -0.80\\ 0.14 & 1.00 \end{bmatrix}
W=
0.060.100.140.90−0.801.00
其中第一列是“通道 1”的三个权重。
校准数据表明第 1 通道激活经常很大。假设某次推理:
x
=
[
10
1
]
x= \begin{bmatrix} 10\\ 1 \end{bmatrix}
x=[101]
浮点输出:
y
=
W
x
=
[
0.06
×
10
+
0.90
×
1
0.10
×
10
−
0.80
×
1
0.14
×
10
+
1.00
×
1
]
=
[
1.50
0.20
2.40
]
y=Wx= \begin{bmatrix} 0.06\times10+0.90\times1\\ 0.10\times10-0.80\times1\\ 0.14\times10+1.00\times1 \end{bmatrix} = \begin{bmatrix} 1.50\\ 0.20\\ 2.40 \end{bmatrix}
y=Wx=
0.06×10+0.90×10.10×10−0.80×10.14×10+1.00×1
=
1.500.202.40
线性量化
Δ
=
1.00
7
≈
0.143
\Delta=\frac{1.00}{7}\approx0.143
Δ=71.00≈0.143
q
=
round
(
w
/
Δ
)
,
w
^
=
q
Δ
q=\operatorname{round}(w/\Delta),\qquad \hat w=q\Delta
q=round(w/Δ),w^=qΔ
| 原权重 | 整数码 q q q | 反量化后 w ^ \hat{w} w^ |
|---|---|---|
| 0.06 | 0 | 0 |
| 0.1 | 1 | 0.143 |
| 0.14 | 1 | 0.143 |
所以原本不同的三个值,量化完后两个完全失去区别。这就是“挤在很窄的整数范围里”。
量化后的完整矩阵近似为:
W
^
=
[
0
0.857
0.143
−
0.857
0.143
1.00
]
\hat W= \begin{bmatrix} 0 & 0.857\\ 0.143 & -0.857\\ 0.143 & 1.00 \end{bmatrix}
W^=
00.1430.1430.857−0.8571.00
输出变成:
y
1
=
W
^
x
=
[
0.857
0.571
2.429
]
y_1=\hat W x= \begin{bmatrix} 0.857\\ 0.571\\ 2.429 \end{bmatrix}
y1=W^x=
0.8570.5712.429
WQ:放大重要通道
AWQ 判定第 1 通道重要,取缩放系数:
s
1
=
4
s_1=4
s1=4
把权重按通道放大:
W
′
=
W
⋅
[
4
0
0
1
]
=
[
0.24
0.90
0.40
−
0.80
0.56
1.00
]
W' = W\cdot \begin{bmatrix} 4&0\\ 0&1 \end{bmatrix} = \begin{bmatrix} 0.24 & 0.90\\ 0.40 & -0.80\\ 0.56 & 1.00 \end{bmatrix}
W′=W⋅[4001]=
0.240.400.560.90−0.801.00
同时,运行时输入激活按通道反向缩放:
x
′
=
[
10
/
4
1
]
=
[
2.5
1
]
x'= \begin{bmatrix} 10/4\\ 1 \end{bmatrix} = \begin{bmatrix} 2.5\\ 1 \end{bmatrix}
x′=[10/41]=[2.51]
在量化前,结果严格不变。
量化新权重,仍然用步长
Δ
≈
0.143
\Delta\approx0.143
Δ≈0.143。现在重要通道的三个权重是:
| 缩放后权重 | 整数码 q q q | 反量化后 w ^ \hat{w} w^ |
|---|---|---|
| 0.24 | 2 | 0.286 |
| 0.4 | 3 | 0.429 |
| 0.56 | 4 | 0.571 |
这就是“占据更宽的整数范围”的准确含义:
- 缩放前,三个权重挤在 0、1 两个码上;
- 缩放后,它们分布在 2、3、4 三个码上;
- 整数码能分辨它们原本的大小关系和差异。
量化后的 AWQ 权重为:
W
^
′
=
[
0.286
0.857
0.429
−
0.857
0.571
1.00
]
\hat W'= \begin{bmatrix} 0.286 & 0.857\\ 0.429 & -0.857\\ 0.571 & 1.00 \end{bmatrix}
W^′=
0.2860.4290.5710.857−0.8571.00
实际推理计算:
y
2
=
W
^
′
x
′
=
[
1.571
0.214
2.429
]
y_2=\hat W'x' = \begin{bmatrix} 1.571\\ 0.214\\ 2.429 \end{bmatrix}
y2=W^′x′=
1.5710.2142.429
可以看出
y
2
y_2
y2 与
y
y
y 的误差比
y
1
y_1
y1 与
y
y
y 小。
部署阶段
| 符号 | 会不会存 | 在哪里用 |
|---|---|---|
| q q q | 会 | 4-bit 打包后的整数权重,是主要存储内容 |
| Δ \Delta Δ | 会 | 每个量化组的 scale,用于恢复该组权重的实际大小 |
| w ^ \hat{w} w^ | 通常不会 | 它只是由 q q q 和 Δ \Delta Δ 反量化后得到的概念权重 |
| s s s | 可能会,也可能被融合掉 | 用于对运行时激活做 x ′ = x / s x'=x/s x′=x/s,保持模型功能不变 |
通道缩放的两种部署方式
- 显式保留
保存一个每通道的向量 s s s,推理时计算:
y = ( q Δ ) ( x / s ) y=(q\Delta)(x/s) y=(qΔ)(x/s) - 融合掉(常见)
如果该 Linear 前面是 LayerNorm 或另一个 Linear,可以预先把 1 / s 1/s 1/s 合并进前一算子的参数。例如将前一层的输出缩放参数除以 s s s。
AWQ 优缺点
优点:
- 效果稳:在 INT4 量化下,AWQ 的精度损失比 GPTQ 略好(约 0.5-1% 的差距)
- 量化耗时短:不用算 Hessian,量化一个 7B 模型只要几十分钟
缺点:
- 极端低位(INT3)效果不如 GPTQ:GPTQ 的误差补偿在极端位数下更稳
- 需要校准数据:和GPTQ一样,量化前要跑一批校准
GPTQ 和 AWQ 在实际生产中怎么选
生产部署先看部署引擎和 GPU kernel 支持,再看精度和成本。部署量化模型前必须在自己的业务场景下做评测。
| 场景 | 更常见的选择 | 原因 |
|---|---|---|
| vLLM / SGLang 等已有成熟 AWQ 路径 | AWQ | 转换、加载、kernel 和模型生态通常更顺滑 |
| 需要快速量化很多模型版本 | AWQ | 校准和搜索相对轻,批量流水线成本低 |
| 社区已有的 GPTQ 模型 | GPTQ | 不必为了算法名称重新量化或转换 |
| 模型极敏感、INT4 精度是第一优先级 | 两者都测 | 取决于模型、group size、校准集与任务 |
更多推荐
所有评论(0)