目录
一个模型的权重原本可能用 FP16 或 BF16 保存。若改为 INT8、INT4,每个权重占用的比特更少,模型也更容易装进有限的显存。但原来那些细密的数值,必须落到数量有限的“格点”上。
量化首先损失的是数值表示的精细程度;模型回答是否明显变差、推理是否更快,需要另外验证。
先看一个数字怎样变形
假设某个权重是 0.37,我们暂时只允许保存 $[-1,1]$ 范围内的数。为讲清原理,使用一种简单的对称均匀量化:整数格点从 $-Q$ 到 $Q$,其中 INT8 取 $Q=127$,INT4 取 $Q=7$。这里刻意不用 INT4 可能存在的 $-8$ 档,方便正负范围对称;真实方案可采用不同范围、零点和舍入规则。
\[s=\frac{1}{Q},\qquad q=\operatorname{clip}\!\left(\operatorname{round}\!\left(\frac{x}{s}\right),-Q,Q\right),\qquad \hat{x}=q\,s\]$s$ 是每格的宽度;$q$ 是存下来的整数;$\hat{x}$ 是计算时还原出的近似值。把 $x=0.37$ 代进去:
| 表示方式 | 格点宽度 | 存下的整数 | 还原的近似值 | 绝对误差 |
|---|---|---|---|---|
| INT8(示意) | $1/127$ | 47 | 约 0.37008 | 约 0.00008 |
| INT4(示意) | $1/7$ | 3 | 约 0.42857 | 约 0.05857 |
INT4 格点更疏,所以这个例子的舍入误差更大。但这是一个数的一次演示,不能据此断言任何 INT4 模型都会比 INT8 模型差多少。实际方法会选择不同的缩放范围,也会按通道或分组量化,并用校准数据减小重要误差。GPTQ 和 AWQ 就是两种有代表性的训练后权重量化方法。[1][2]
量化真正丢掉的是什么
第一种损失是舍入:原来的数落在两个格点之间,只能选一个近似值。第二种是截断:如果规定范围是 $[-1,1]$,却来了 $1.30$,它会被夹到边界附近,误差可能更大。把范围放宽能减少截断,却会让格点变宽,范围内较小的数又更难表示。这就是 Scale 不好选的原因。
这些误差经过许多层计算,可能改变后续激活和最终 Token 概率;但某些误差也可能被模型容忍。数值不完全相同,不等于每个问题都会答错。要看任务质量,必须用真实样本测,而不能只看单个权重误差。
自己试试格点和范围
教学模拟:对称均匀量化;INT8 用 -127 到 127,INT4 用 -7 到 7。这里展示单个权重,不代表整层误差或实际模型质量。
为什么不是每个权重都同样容易压
一整张矩阵共用一个 Scale 很省事,但各部分的取值范围未必相同。按通道或按较小分组分别设置 Scale,常能让局部格点更贴合数据;代价是要保存更多 Scale,并处理更复杂的计算与打包。分组更细也不是无条件更好:元数据、内核效率和实际误差都要一起看。
模型中的某些权重或通道对输出更敏感。GPTQ 借助近似二阶信息,量化时补偿造成的输出误差;AWQ 依据激活统计识别需要保护的权重通道,并用缩放降低其量化误差。这些方法不是让 INT4 “无损”,而是在有限比特下尽量保住重要的模型行为。[1][2]
INT4 模型是不是处处都用 4 位
未必。Weight-only(仅权重量化)可将权重压到 INT4,同时让激活保持 FP16/BF16;计算内核可能边读边反量化,再参与乘法。W8A8 则把权重和激活都量化为 8 位,但激活里的异常值更难处理。SmoothQuant 的思路是通过等价缩放,把一部分激活量化难度转移到权重上,帮助实现 W8A8。[3]
所以看到“4-bit 模型”,要问:量化的是权重、激活,还是 KV Cache?哪些层仍保留高精度?Scale 和零点怎样保存?量化格式名称不能替代这些答案。
| 方案 | 权重 | 激活 | 读这个名称时要注意 |
|---|---|---|---|
| FP16/BF16 基线 | 16 位浮点 | 通常 16 位浮点 | 用作比较基准 |
| 仅权重量化 INT4 | 约 4 位/权重 | 可仍用 FP16/BF16 | 不代表全部计算都在 INT4 进行 |
| W8A8 | 8 位权重 | 8 位激活 | 需要处理激活分布与内核支持 |
文件变小,为什么不一定更快
只看权重原始比特数,INT8 约是 FP16 的一半,INT4 约是四分之一。但实际文件还要保存 Scale、索引或其他未量化参数;推理显存也包含激活、KV Cache 和运行时缓冲。权重读取得少,可能降低带宽压力;反量化、格式转换、低效内核或硬件不匹配,又可能吃掉这部分收益。
因此评估时至少分开看三项:模型文件/显存占用、任务质量、端到端速度。同一个 4-bit 格式在不同 GPU、批量、上下文长度下,速度结论可能不同。低比特方法的论文报告了有条件的速度收益,但不能把某个基准的倍数当作所有部署的保证。[1][2]
把本课收束成一句话:量化先让数值落到更少的格点;质量损失是可能的后果,速度提升是实现与硬件共同决定的结果。
约 90 秒讲解视频
参考文献(References)
- Frantar, E., Ashkboos, S., Hoefler, T., and Alistarh, D. “GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers.” ICLR, 2023. arXiv:2210.17323.↩
- Lin, J., Tang, J., Tang, H., et al. “AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration.” MLSys, 2024. arXiv:2306.00978.↩
- Xiao, G., Lin, J., Seznec, M., et al. “SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models.” ICML, 2023. arXiv:2211.10438.↩
第二十课复习总图
下一阶段进入后训练:SFT 怎样把只会续写的基础模型变成聊天助手?