4.1 量化基础:用精度换性能的底层逻辑
从数学定义到工程直觉,一次讲清对称/非对称量化、Per-tensor/Per-channel/Per-group 粒度、W8A8 vs W4A16,以及 PTQ 与 QAT 的取舍
这一节是整章的地基。前面第 1 章讲过,LLM 推理的 Decode 阶段是 Memory Bound——GPU 每生成一个 Token,都要把整个模型的权重从头到尾读一遍,读取权重消耗的时间决定了生成速度的上限。量化做的事,简单说就是一句话:把权重(以及激活、KV Cache)从 16 位存成 8 位、4 位甚至 2 位,让同样大小的显存能装下更多东西,让同样大小的带宽能搬动更多数据。
但”用更少的位表示数字”这件事远没有听起来那么轻松:位少了,表示误差必然变大,模型可能”变笨”。这一节先把量化的数学定义、工程参数和两种工作模式讲透——它们是理解后面 SmoothQuant、GPTQ、AWQ、KV Cache 量化所有技术的前提。
📑 目录
- 1. 为什么需要量化:算力、显存与带宽的三重动机
- 2. 量化是什么:一个数学映射
- 3. 对称量化与非对称量化
- 4. 量化粒度:Tensor、Channel 还是 Group
- 5. 两种工作模式:W8A8 与 W4A16
- 6. 量化误差从哪里来
- 7. PTQ 与 QAT:两种量化路线
- 8. 量化能省多少:算一笔显存与带宽账
- 总结
- 自我检验清单
- 参考资料
1. 为什么需要量化:算力、显存与带宽的三重动机
1.1 显存装不下
先算一笔最简单的账:一个 7B 参数的模型,如果用 FP16(每个参数 2 字节)存储,权重就要占 。而 70B 模型是 140GB——单张 H100(80GB)根本装不下,必须拆到多张卡上。如果量化成 INT4(每个参数 0.5 字节),同样的模型只需 3.5GB / 35GB。量化是”模型能不能塞进一张卡”的决定性因素。
1.2 带宽读不动
Decode 阶段每生成一个 Token,模型权重要被完整读一遍(KV Cache 读 N 次,权重读 1 次)。H100 的 HBM 带宽约 3.35TB/s,FP16 的 70B 模型每步要搬 140GB,理论极限是每秒 个 Token;而 INT4 之后每步只需搬 35GB,极限提升到约 95 Token/s。权重减半/减四分之一,Decode 吞吐几乎等比提升——这正是推理场景里量化收益最直接、最性感的地方。
1.3 算力吃不饱
第 1 章用 Roofline 模型解释过:Decode 是 Memory Bound,大量算力闲置。量化为计算带来的另一个收益是降低每个操作的成本:INT8 张量核的吞吐是 FP16 的两倍,FP8 又是 INT8/FP16 的两倍,FP4 再翻一倍。对 Prefill 这类 Compute Bound 的阶段,更低的位宽直接意味着更快的矩阵乘法。
📌 关键点:量化在推理优化里的角色是”一个动作,三份收益”——省显存(装得下)、省带宽(跑得快)、用满算力(更快)。但收益不是白拿的,代价就是精度,而精度损失的大小,取决于我们接下来讲的所有设计选择。
2. 量化是什么:一个数学映射
量化的本质,是把一个高精度数字映射到一个低精度数字的”格子”上。以最常用的 INT8 为例:FP16 的权重范围大约是 ,而 INT8 只有 256 个格子()。量化就是找到一种映射,让每个 FP16 数字落到离它最近的格子上。
数学上,量化通常写作:
其中:
- 是原始 FP16/BF16 数值
- 是缩放因子(Scale),决定一个格子代表多大的数值范围
- 是零点(Zero Point),决定格子的偏移,让实数 能精确映射到整数 (或其它整数)
- 是量化后的整数
反量化(Dequantization)就是逆向操作:
和原始 之间会有一个量化误差。显然, 越小(格子越密),误差越小;但要覆盖同样的数值范围, 越小需要格子越多——位宽固定时,范围和精度是一对矛盾。
💡 提示:大多数硬件上的高效推理并不做”反量化回 FP16 再计算”,而是直接做低精度矩阵乘法: 用 INT8 张量核一次性算完,最后用 scale 组合出结果。所以量化不是”存的时候省,算的时候还原”,而是存和算都在低位宽上进行,这才是收益的来源。
3. 对称量化与非对称量化
按零点 的处理方式,量化分两类:
3.1 对称量化(Symmetric)
对称量化强制零点为 0(),且数值范围关于原点对称:
优点:
- 计算最简单:反量化只剩一次乘法,INT8 GEMM 的累加器语义最干净
- 无需存储零点,省一点存储和带宽
- 硬件实现(特别是 Tensor Core 的 W8A8 路径)几乎都默认对称量化
缺点:如果数据分布本身不对称(比如激活全为正),对称量化会浪费一半的格子(负半轴全空)。
3.2 非对称量化(Asymmetric)
零点不再为 0,让数值范围贴合数据真实分布:
优点:数据分布不对称时(如 ReLU 后的激活全为正),用满全部格子,同样的位宽下量化误差更小。
缺点:计算时多一个零点项,累加时要额外处理 项,算子实现更复杂。
| 📊 维度 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点 | ,不需存储 | ,需要存储 |
| 计算开销 | 低(单次乘法) | 高(乘法+零点修正) |
| 对不对称分布的适配 | 差(浪费一半格子) | 好 |
| 使用场景 | 权重、W8A8 的主流选择 | 激活、部分 KV Cache 量化 |
📌 关键点:工业界有一条默认经验——权重量化几乎总是用对称量化,激活量化按需选择非对称。因为权重训练后分布通常关于 0 近似对称,而激活(尤其经过 ReLU/GELU 的)经常是偏置的。
4. 量化粒度:Tensor、Channel 还是 Group
“缩放因子 按什么粒度计算”决定了量化精度与开销的平衡。粒度越细,每个 服务的元素越少,越能贴合局部数值范围,误差越小;但 本身要占存储和计算,粒度越细开销越大。
4.1 Per-tensor(整体一个 scale)
整个张量共用一个 。实现最简,但假如张量里某个通道数值特别大,一个 会让其它所有通道的格子变得极粗(有效位宽被 outlier 稀释)。
4.2 Per-channel(按行/列分 scale)
权重矩阵按输出通道(或输入通道)各算一个 。张量核要求权重按 channel 分 scale 才能高效:INT8/FP8 GEMM 里,per-channel 的权重 scale 可以和激活的 per-token scale 一起”免费”融合进累加器,这正是当前主流 W8A8 方案的标准配置。
4.3 Per-group(group size 128)
把通道维度再切块,例如每 128 个元素一组,每组一个 。这是 INT4 weight-only 量化(GPTQ/AWQ)的标配:INT4 只有 16 个格子,per-channel 粒度太粗、误差不可接受,必须靠更细的分组来兜精度。group size 越小精度越好,但 scale 的存储开销线性增加。
| 粒度 | 精度 | 存储开销(scale) | 硬件友好度 |
|---|---|---|---|
| Per-tensor | 低 | 可忽略 | 高 |
| Per-channel | 中 | 低(每通道 1 个) | 高(张量核原生支持) |
| Per-group | 高 | 中(每 128 元素 1 个) | 中(需要特化 Kernel) |
💡 提示:group size 128 是 INT4 量化的”事实标准”,几乎所有工具链(GPTQ、AWQ、AutoAWQ、llm-compressor)默认都是
g128。它是在精度与 scale 存储之间长期博弈出来的平衡点。
5. 两种工作模式:W8A8 与 W4A16
量化可以只针对权重,也可以同时覆盖权重和激活。这是理解整个量化生态的第一分界线:
5.1 W8A8:权重和激活都量化
- 含义:Weight 8-bit,Activation 8-bit,两个操作数都是低精度,矩阵乘法全部在 INT8/FP8 张量核上完成
- 收益:计算和存储全面受益,Preflight 阶段加速最明显(Compute Bound),Decode 阶段因权重变瘦也受益
- 代价:激活量化是难点(下一节 SmoothQuant 就是解决这个的)
- 代表:SmoothQuant(INT8)、FP8 W8A8(Hopper 起的主流)
5.2 W4A16(Weight-only):只量化权重
- 含义:Weight 4-bit,Activation 保持 FP16/BF16,GEMM 时把 4-bit 权重解包出来算
- 收益:权重显存减少约 4 倍(±scale 开销),Decode 的带宽压力直接减 4 倍——Decode 是 Memory Bound,所以 W4A16 对 Decode 延迟的提升非常显著
- 代价:激活仍是 16 位,GEMM 的算力吞吐没法翻倍,Preflight 的加速有限
- 代表:GPTQ、AWQ(当前开源生态里最流行的格式)
📌 关键点:选 W8A8 还是 W4A16,本质是回答”瓶颈在哪”——权重带宽是瓶颈就选 weight-only 砍权重,算力是瓶颈就选 W8A8 把两个操作数都降下来。对 Decode 主导的在线服务,W4A16 往往性价比最高;对 Prefill 重或纯批处理,W8A8 的算力收益更香。
6. 量化误差从哪里来
量化的精度损失来自两个源头,理解它们才能看懂后面所有算法的动机:
6.1 舍入误差(Rounding Error)
原始值落到最近格子时的误差,均匀分布在 个格子之间,平均约 0.25 个格子。位宽越低、格子越少,同样的相对范围下误差占比越大。这是任何量化都绕不开的”地板”。
6.2 截断误差(Clipping Error)
超出可表示范围的值被”压”到边界格子上。极端情况下(比如激活里的 outlier 是正常值的 100 倍),为了让 outlier 装得下,scale 被迫拉大,其余 99% 的值的格子被稀释到只剩 2-3 个有效档位——这是激活量化最致命的误差来源,也是 SmoothQuant、AWQ 这些算法要解决的核心问题。
💡 提示:所以量化算法优化的本质只有两件事——要么把误差从”被 outlier 支配”变成”按分布均匀分配”(改 scale/粒度),要么干脆用误差补偿的方式降低期望误差(如 GPTQ 的 Hessian 重建)。
7. PTQ 与 QAT:两种量化路线
7.1 PTQ(训练后量化)
拿训练好的模型直接量化:跑一小段校准数据统计数值范围,算出 scale,把权重/激活映射到低精度。不需要重新训练,通常几分钟到几小时。
- 优点:成本低、无需训练数据权限、迭代快
- 缺点:精度有上限,位宽低到 INT4 以下(如 INT2)时可能撑不住
SmoothQuant、GPTQ、AWQ 都属于 PTQ 路线(其中 GPTQ/AWQ 需要一小段校准集做”一次性优化”)。
7.2 QAT(量化感知训练)
把量化误差模拟进训练过程(前向用量化后的权重,反向仍走高精度),让模型在训练时就”适应”量化噪声,最后再真量化。
- 优点:精度上限最高,是极低位宽(INT2/INT1)几乎唯一可行路线
- 缺点:成本高(要重新训练)、门槛高(需要原始训练数据与算力)
| 📊 维度 | PTQ | QAT |
|---|---|---|
| 训练成本 | 无(只需校准集) | 高(完整训练流程) |
| 精度上限 | 中高(依赖算法) | 最高 |
| 适用位宽 | 8bit/4bit 主流 | 4bit 以下、精度敏感场景 |
| 代表性方法 | SmoothQuant / GPTQ / AWQ | LLM-QAT、QLoRA 类训练 |
8. 量化能省多少:算一笔显存与带宽账
把前面几节的知识串起来,算一笔完整的账。以 Llama-2-70B 为例(约 700 亿参数,FP16 权重占 140GB,H100 80GB 单卡放不下):
| 方案 | 权重显存 | KV Cache(8K 上下文,单请求) | 结论 |
|---|---|---|---|
| FP16 | 140GB | 约 2GB | 需 2 张 H100,且装不下多少请求 |
| INT8(W8A8) | 70GB | 约 2GB | 勉强单卡,并发受限 |
| INT4(W4A16) | 约 35GB + scale 开销 ≈ 37GB | 约 2GB | 单卡可装,KV Cache 开始成为主要显存开销 |
| INT4 + FP8 KV Cache | 约 37GB | 约 1GB | 单卡并发能力翻倍 |
注意最后一行:当权重被 INT4 压到 37GB 后,KV Cache 取代权重成为显存大头——这就是为什么第 4.4 节要专门讲 KV Cache 量化:量化是逐层递进的,压完权重这头,下一头就是 KV Cache。
Decode 带宽侧:FP16 的 70B 每步搬 140GB,INT4 只搬约 37GB,理论上 TPOT 可以提升近 4 倍(实际受算子开销和批次影响,通常 2-3 倍)。
📝 总结
- 量化 = 用精度换性能:位宽减半,显存减半、Decode 带宽压力减半、算力吞吐翻倍
- 三个核心参数:位宽(b)、缩放因子(s)、零点(z),以及 scale 的粒度(per-tensor / per-channel / per-group)
- 两条工作模式:W8A8(权重激活双量化,算力收益大)和 W4A16 weight-only(只压权重,Decode 带宽收益大)
- 两类误差:舍入误差(地板)和截断误差(outlier 稀释格子,主战场)
- 两条路线:PTQ(低成本,工业界主流)与 QAT(高成本,极限精度)
- 量化是递进的:权重压完压 KV Cache,KV Cache 压完还有别的(投机解码、PD 解耦)
🎯 自我检验清单
- 能不能口算出 7B 模型 FP16/INT8/INT4 的权重显存?
- 为什么 Decode 阶段量化权重的收益近乎”等比放大”?
- 对称量化和非对称量化各自的适用场景?
- 为什么 INT4 需要 per-group 而 INT8 用 per-channel 就够?
- W8A8 和 W4A16 分别适合什么瓶颈的场景?
- 激活量化误差大主要是舍入误差还是截断误差?为什么?
📚 参考资料
- vLLM 官方文档:Quantization(https://docs.vllm.ai/en/latest/features/quantization/)
- Jacob et al., Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference(https://arxiv.org/abs/1712.05877)
- Nagel et al., A White Paper on Neural Network Quantization(https://arxiv.org/abs/2106.08295)
- Gholami et al., A Survey of Quantization Methods for Efficient Neural Network Inference(https://arxiv.org/abs/2103.13630)