本文是《高效推理与压缩(算法侧):解码、投机、量化与 KV》系列的第 4 篇(共六篇)。上一篇:训练后量化:误差模型、GPTQ、AWQ 与旋转;下一篇:KV cache 压缩:量化、驱逐与稀疏 attention

上一篇的 PTQ 在 4 bit 权重上把困惑度损失压到 0.1–0.3,在 W8A8 上接近无损。再往下——3 bit、2 bit、三值权重,或者激活也到 4 bit、KV 也到 4 bit——逐层最小化输出误差的代理目标不够了:误差太大,后面的层”消化”不掉,最终 loss 的退化不再与逐层误差成比例。这时需要训练参与:让模型在知道自己会被量化的前提下学习,把量化误差学回去一部分。这是量化感知训练(QAT)。

QAT 的核心技术问题只有一个:量化的 round 函数梯度处处为零(或无定义),怎么反向传播?答案是直通估计器(STE)——一个数学上”错”但实践上有效的技巧。围绕它有一族方法:让 scale 可学习(LSQ)、只在训练末段做 QAT、用全精度的自己做教师(QAT + 蒸馏)、从头就用低比特训练(BitNet)。

这一篇的另一半讲怎么评一个量化模型。困惑度是所有量化论文的主指标,但它掩盖了任务级的退化:一个困惑度只升 0.1 的 4-bit 模型,在长上下文检索上可能掉 10 个点,在低资源语言上掉更多。评测方法是 L5 第八篇的直接应用,但量化有它特有的陷阱。

本篇要回答的核心问题是:

困惑度只升 0.1 的 4-bit 模型,在什么任务上会掉 5 个点?怎么在部署前发现?

一、总览:训练怎么参与,评测看什么

1. 训练参与的几种深度

方式 训练什么 成本 到几 bit
PTQ(上一篇) 不训练;逐层最小化输出误差 小时级 W4A16 舒适;W8A8 / FP8 无损;W4A4 需旋转
PTQ + 少量微调(如 QLoRA 恢复) 量化底座冻结,训 LoRA 恢复 几十 GPU 小时 W4A16 更稳;用于 Llama 3.2 的一种方案
QAT(末段) 全模型在假量化下继续训练最后 5–10% 的 token 几百到几千 GPU 小时 W4A8 / W4A4 / KV4 接近无损;MXFP4(gpt-oss)
QAT + 蒸馏 同上,教师是全精度的自己 同上 + 教师前向 Gemma 3 QAT、Llama 3.2 QAT
从头低比特训练 整个预训练在低比特下 全部训练成本 三值(BitNet b1.58)、FP8 训练(DeepSeek-V3)

深度越深,能到的 bit 越低,成本越高。PTQ 在小时级解决 4 bit;QAT 在几百 GPU 小时内解决 W4A4;从头低比特训练解决三值,但要付全部训练成本。

2. 先说答案

困惑度对量化误差最不敏感,因为它是所有 token 上的平均:量化让多数”容易”的 token 的概率略降(贡献很小),让少数”关键”的 token 的概率大降(被平均掩盖)。而任务准确率由关键 token 决定——一道数学题的答案是几个 token,一次检索是长上下文里的一个位置。会先掉的任务:(1)长上下文检索与推理(KV 量化的误差在长序列上累积;权重误差让 attention 的精确匹配变模糊);(2)多步推理(每步的小错误在链上级联,GSM8K / MATH 比 MMLU 敏感);(3)低资源语言与代码(这些 token 在预训练里少见,模型对它们的表示”边缘”、更容易被量化误差推过决策边界);(4)指令遵循的细节(格式、长度约束)。发现的办法:在部署前跑一组覆盖这四类的任务,并计算量化模型对全精度模型的逐 token KL——它比困惑度差更能预测任务退化,且不需要 benchmark。第六、七章展开。

3. 本文的章节安排

主题 内容
STE round 的梯度问题;STE 的定义与它为什么”能用”;假量化的前向与反向
可学习的量化参数 LSQ 的 scale 梯度推导;PACT 的裁剪阈值;range 学习的稳定性
QAT 的配方 末段 QAT;QAT + 蒸馏;Gemma 3 与 Llama 3.2 的公开配方;QLoRA 的 NF4 与双重量化
极低比特 2 bit 的码本方法(QuIP#、AQLM);BitNet b1.58 的三值训练;它兑现了什么、没兑现什么
困惑度掩盖了什么 平均 vs 关键 token;四类敏感任务的机制;公开报告里的例子
量化模型的评测方法 逐 token KL;任务组合;协议一致性;采样的影响;官方量化报告怎么读
成本 QAT 的算力账;假量化的开销
动手(建议) KL vs 困惑度 vs 任务退化的相关性
本文小结  

二、STE:让 round 有梯度

1. 问题

假量化(fake quantization)在训练时模拟量化:前向把权重 \(w\) 变成 \(\hat{w} = \Delta \cdot \text{round}(w / \Delta)\)(保持浮点存储,但取值只在格点上),用 \(\hat{w}\) 计算 loss。反向要对 \(w\) 求梯度:

\[\frac{\partial \mathcal{L}}{\partial w} = \frac{\partial \mathcal{L}}{\partial \hat{w}} \cdot \frac{\partial \hat{w}}{\partial w}\]

而 \(\text{round}\) 是阶梯函数,\(\partial \hat{w} / \partial w\) 几乎处处为零、在格点边界无定义。梯度为零,训练不动。

2. 直通估计器

STE(Bengio 等 2013;Hinton 的课程里更早提到)的做法:反向时把 round 当作恒等函数,\(\partial \hat{w} / \partial w := 1\)(在裁剪范围内;范围外为 0)。于是 \(\partial \mathcal{L} / \partial w = \partial \mathcal{L} / \partial \hat{w}\)——用量化后权重的梯度更新量化前的权重。实现上是一行:

\[\hat{w} = w + \text{stop\_gradient}\big(Q(w) - w\big)\]

前向等于 \(Q(w)\),反向梯度直接流到 \(w\)。

3. 为什么”错”的梯度能用

STE 的梯度不是任何函数的真梯度(round 的真梯度是零),它是一个有偏估计。但它有效,有几种解释:

  • 期望意义:如果把 round 看成加了一个 \([-\Delta/2, \Delta/2]\) 均匀噪声(上一篇的误差模型),\(\hat{w} = w + e\),\(\partial \hat{w} / \partial w = 1\) 在期望上是对的。STE 是”把量化当作噪声”的梯度。
  • 优化的视角:全精度权重 \(w\) 是一个连续的”潜变量”,它累积梯度;当累积到跨过格点边界时 \(Q(w)\) 跳到下一个格点。STE 让 \(w\) 沿 loss 下降的方向持续移动,即使 \(Q(w)\) 暂时不变——像一个”投票”机制,多次一致方向的小梯度最终让量化值翻转。这解释了为什么 QAT 需要保持全精度的主权重(不能只存量化值)。
  • 有理论支持的特例:Yin 等 2019 证明了对某些简单网络,STE 的期望方向与真实 loss 的下降方向正相关。

STE 的已知问题:(1)梯度不匹配——在格点边界附近,真实的 loss 变化是跳跃的,STE 给的是平滑的梯度,可能推着权重在边界来回振荡;(2)低比特下振荡更严重(格点稀),需要更小的 lr 或对权重加”冻结”策略(Nagel 等 2022 的振荡抑制);(3)对激活的 STE 比对权重更难——激活每次前向都不同,”累积投票”的机制不成立。

4. 假量化的前向细节

QAT 前向要与部署时的推理精确匹配:同样的 group size、同样的对称 / 非对称、同样的 scale 计算方式(max 还是搜索的 α)、同样的激活量化粒度(per-token 动态还是静态)。任何不匹配都让 QAT 学到的东西在部署时失效。这是工程上最常见的 QAT 失败原因——训练用 per-channel 假量化,部署用 per-group 128,精度对不上。

三、可学习的量化参数

1. LSQ:让 scale 有梯度

上一篇的 scale 由权重范围决定(\(\max\) 或搜索)。QAT 里可以让它可学习,让训练自己决定裁剪多少。LSQ(Esser 等 2020)推导了 scale 的梯度。量化函数(对称,\(b\) bit,\(Q_N = 2^{b-1} - 1\)):

\[\hat{w} = \Delta \cdot \text{round}\Big(\text{clip}\big(\tfrac{w}{\Delta}, -Q_N, Q_N\big)\Big)\]

对 \(\Delta\) 求导(round 用 STE):

\[\frac{\partial \hat{w}}{\partial \Delta} = \begin{cases} -\frac{w}{\Delta} + \text{round}\big(\frac{w}{\Delta}\big) & \lvert w / \Delta \rvert < Q_N \\ -Q_N & w / \Delta \le -Q_N \\ Q_N & w / \Delta \ge Q_N \end{cases}\]

范围内的权重对 \(\Delta\) 的梯度是它的舍入误差(以 \(\Delta\) 为单位):舍入向上的权重希望 \(\Delta\) 变大、向下的希望变小,平均下来接近零——它们不怎么推 scale;被裁剪的权重梯度是 \(\pm Q_N\),它们持续推 scale 变大以减少裁剪。这两种力的平衡决定了学到的 scale。LSQ 还发现 scale 的梯度量级与权重数成正比,需要一个 \(1 / \sqrt{N \cdot Q_N}\) 的梯度缩放让它与权重的 lr 匹配。

PACT(Choi 等 2018)对激活做了类似的事:可学习的裁剪上界 \(\alpha\),激活 \(\text{clip}(x, 0, \alpha)\) 再量化,\(\partial / \partial \alpha = \mathbb{1}[x \ge \alpha]\)。

2. 稳定性

可学习的 scale 在低比特下可能不稳定——scale 变大让所有权重的舍入误差变大、变小让更多权重被裁剪,两者的梯度都是间接的(经过 loss),噪声大。实践:scale 的 lr 比权重小一个量级;初始化用 PTQ 搜索到的最优 α(不要用 max);对每个 group 单独学 scale 时(per-group QAT),参数量增加但每个 scale 的梯度信号更少,有时不如共享。

Llama 3.2 与 Gemma 3 的 QAT 都没有报告用可学习 scale——它们用的是”固定 scale 计算规则 + STE 训权重”的简单形式,靠训练数据量取胜。可学习 scale 在 CNN 的 INT4 / INT2 上收益明显,在 LLM 上收益不清楚,可能因为 LLM 的权重分布更接近高斯、固定规则的 α 已经接近最优。

四、QAT 的配方

1. 末段 QAT

从头做 QAT(整个预训练在假量化下)成本太高且不必要——量化误差是一种”细节”,模型的主要能力在全精度下学会即可,最后一段让它适应量化。公开配方的做法是用预训练最后 5–10% 的 token 做 QAT,或者在 SFT 阶段做:

  • Gemma 3 QAT(Google 2025):在预训练之后、用约 5000 步继续训练,教师是全精度的 Gemma 3(蒸馏目标),目标是 INT4 per-channel 权重 / INT4 per-block 32 权重 / SFP8 三种格式各出一个 checkpoint。报告的结果是 INT4 QAT 的困惑度损失比 PTQ 低一半以上,且 27B 在 INT4 下从 54 GB 降到 14.1 GB、”精度与 BF16 接近”(他们的 Elo 数字:BF16 1338 vs INT4 QAT 1330 左右)。
  • Llama 3.2 1B / 3B(Meta 2024):两种量化版本。QLoRA 方案(基座 PTQ 到 INT4,LoRA 全精度,SFT + DPO 只训 LoRA);QAT + LoRA 方案(基座在 SFT 阶段做 QAT——INT4 per-group 32 权重、INT8 per-token 激活、INT8 KV——然后冻结、加 LoRA 做 DPO)。目标硬件是移动端的 ARM CPU 与 NPU(ExecuTorch),INT4 × INT8 的 GEMM。报告 QAT + LoRA 版本比 SpinQuant PTQ 版本在多数 benchmark 上好 1–3 个点,接近 BF16。
  • gpt-oss(OpenAI 2025):MoE 专家权重(占参数 90% 以上)在后训练阶段用 MXFP4 做 QAT,其余保持 BF16;120B 模型的权重降到 60 GB 左右,单张 80 GB 卡装下。报告”精度几乎无损”,但只公开了最终数字,没有 PTQ 对照。

三个配方的共同点:(1)都在训练的末段而不是全程;(2)都保持 KV / 激活的处理与部署硬件一致;(3)都有全精度的教师(Gemma 3 显式蒸馏;Llama 3.2 用全精度的 SFT 模型初始化;gpt-oss 未详述)。

2. QAT + 蒸馏

QAT 的训练目标可以是普通的交叉熵(next-token 预测),也可以是对全精度模型的蒸馏L5 第七篇的 logits 级 KL)。后者几乎总是更好,原因是:(1)目标更”稠密”——每个位置有完整的分布而不只是一个正确 token,量化模型要恢复的正是这个分布;(2)目标就是量化前的自己,”恢复到原样”比”继续学习新东西”是更合适的任务;(3)不需要新数据——任何文本经全精度模型前向就是标签,甚至不需要高质量数据。成本是每步多一次教师前向(约 1/3 的额外算力)。

Gemma 3 QAT 明确用了这个配方。这也是 TernaryLLM、BitDistiller 等极低比特工作的标准做法。

3. QLoRA:NF4 与双重量化

QLoRA(Dettmers 等 2023)不是 QAT——底座被 PTQ 到 4 bit 并冻结,只训 LoRA。但它引入的两个技术属于这一篇:

NF4(NormalFloat 4)。假设权重是零均值高斯,最优的 4 bit 格点(在”每个格点等概率”的意义上)是标准正态分布的 16 个分位点:把 \([0, 1]\) 等分成 16 段,取每段中点的正态分位数 \(\Phi^{-1}(\cdot)\),再归一化到 \([-1, 1]\)。实际的格点是 \(\{-1, -0.696, -0.525, -0.395, -0.284, -0.185, -0.091, 0, 0.080, 0.161, 0.246, 0.338, 0.441, 0.563, 0.723, 1\}\)(非对称——为了让 0 精确可表示,正负各取 8 个再合并去重)。量化时按 group(64)取 absmax 归一化到 \([-1, 1]\),找最近的格点。对高斯权重,NF4 比均匀 INT4 的 MSE 低约 30%。

双重量化。每 64 个权重一个 FP32 scale,元数据是 \(32 / 64 = 0.5\) bit/权重——不小。QLoRA 把这些 scale 再量化到 FP8(每 256 个 scale 一个 FP32 二级 scale),元数据降到 \(8/64 + 32/(64 \times 256) \approx 0.127\) bit/权重。总的 \(4.127\) bit/权重。

QLoRA 的意义是训练时的内存:65B 模型的 4-bit 底座 33 GB + LoRA 与优化器状态几 GB + 激活,一张 48 GB 的卡能微调 65B。推理时 NF4 需要查表 dequant,比 INT4 慢;部署通常把 LoRA 合并回全精度权重再用 GPTQ / AWQ 重新量化——或者像 Llama 3.2 那样保持”INT4 底座 + BF16 LoRA”的形态直接服务。

4. 对 PTQ 崩掉的模型

上一篇提到 Llama 3 比 Llama 2 更难量化——过训练的模型每个权重的低位也承载信息。对这类模型,PTQ 到 W4 的困惑度损失可能是 0.3–0.5 而不是 0.1,任务退化更明显。QAT 是解药:几千步的末段 QAT(对 8B 约 100–300 GPU 小时)可以把损失压回 PTQ 在 Llama 2 上的水平。Meta 为 Llama 3.2 发布 QAT 版本、Google 为 Gemma 3 发布 QAT 版本,部分就是这个原因——模型厂商比第三方更有条件做 QAT(有训练数据、有全精度教师、有算力)。

五、极低比特

1. 2 bit:码本与向量量化

4 bit 是标量量化(每个权重独立映射到 16 个格点)的舒适区。到 2 bit(4 个格点),标量量化的误差太大——即使 GPTQ 也把困惑度推高 1–3。出路是向量量化:把 \(d\) 个连续权重(\(d = 8\))看成一个向量,用一个共享的码本(\(2^{16}\) 个 8 维向量 = 每权重 2 bit)里最近的码字表示。向量量化利用了权重之间的相关性与高维空间的几何(8 维空间里 65536 个码字比 1 维空间里 4 个格点的覆盖效率高得多)。

  • QuIP#(Tseng 等 2024):先 Hadamard 旋转(让权重接近球形高斯——上一篇的 incoherence),再用 E8 lattice 的码本(8 维空间里最密的球堆积)做向量量化,最后微调。Llama-2 70B 的 2 bit 困惑度约 +0.6–0.8。
  • AQLM(Egiazarian 等 2024):加性量化——每个向量用多个码本的码字之和表示,码本通过在校准集上的优化学习(不是固定的 lattice),加上逐层与端到端的微调。2 bit 与 QuIP# 相当或略好,2.5–3 bit 接近无损。

代价:dequant 需要查表(码本 \(2^{16} \times 8\) 个 FP16 = 1 MB,放 shared memory 勉强),kernel 比标量量化复杂、慢,且不能利用 Tensor Core 的低比特整数乘法。2 bit 的实用价值是把 70B 放进一张 24 GB 的消费卡(70B × 2.x bit ≈ 20 GB),代价是速度与精度。

2. BitNet b1.58:三值权重

BitNet b1.58(Ma 等 2024)走另一条路:从头在三值权重 \(\{-1, 0, 1\}\) 下训练(1.58 bit = \(\log_2 3\))。前向:权重按 absmean 缩放后 round 到三值;激活量化到 INT8(per-token absmax);STE 反向;主权重保持 BF16。

三值权重的乘法退化为加法与符号翻转——GEMM 不需要乘法器,这是它的硬件愿景(专用芯片上能耗降一个量级)。论文的 scaling 结果:3B 的 BitNet b1.58 与 3B 的 FP16 Llama 在困惑度与零样本任务上相当(同样的 100B token),并声称在更大规模上差距进一步缩小。后续(BitNet b1.58 2B4T,2025)在 4T token 上训了一个 2B 模型,结果与同规模的全精度开源模型相近。

它兑现了什么:训练时用 STE 从头训三值权重是可行的、不崩;推理内存是 FP16 的 1/10。没兑现的:(1)需要从头训——不能把现有模型转成三值(PTQ 到三值崩掉,QAT 也难恢复),所以它是一种新模型而不是一种压缩方法;(2)硬件上没有原生支持三值的 Tensor Core,现有 GPU 上的加速靠定制 kernel(bitnet.cpp 在 CPU 上有不错的结果),GPU 上收益有限;(3)在 7B 以上的规模、与同算力的全精度模型(不是同参数量)的比较,公开证据仍然有限——参数量相同时三值模型每参数的信息量更少,公平的比较应该是同字节或同算力。

3. 低比特训练的另一面:FP8 训练

DeepSeek-V3 用 FP8 做训练(前向与反向的 GEMM 在 FP8 上,主权重与优化器状态保持高精度)——这不是 QAT(目标不是部署时的低比特),而是训练本身的加速,属于 04 系列第六篇与 Infra 地图的范畴。但它与 QAT 有一个共同点:模型在低比特噪声下训练,天然对推理时的 FP8 量化鲁棒——DeepSeek-V3 的 FP8 推理几乎不需要额外处理。

六、困惑度掩盖了什么

1. 平均与关键 token

困惑度 \(\exp(\frac{1}{T} \sum_t -\log p(x_t))\) 是所有 token 的平均对数损失的指数。一段文本里多数 token 是”容易”的(功能词、可预测的延续),少数是”关键”的(一个数字、一个实体名、一个逻辑连接词)。量化误差对两类的影响不同:容易的 token 概率已经很高(0.9),误差让它降到 0.88,对数损失变化 0.02;关键的 token 概率可能是 0.4,误差让它降到 0.3——或者更糟,让另一个错误选项超过它。困惑度把这些平均,看到的是 +0.1;任务准确率只看关键 token 的 argmax 是否翻转,看到的是几个点的下降。

一个具体的例子(Li 等 2024 的评测研究、以及多个社区报告的一致观察):Llama-3-8B 的 GPTQ W4 g128,WikiText-2 困惑度从 6.14 升到约 6.5(+0.36,Llama 3 比 Llama 2 的 +0.15 差),MMLU 掉 1–2 个点,GSM8K 掉 3–6 个点,长上下文的 needle 任务在 32K 以上掉 10 个点以上。三个任务的退化相差一个量级,而困惑度只给了一个数。

2. 四类敏感任务的机制

长上下文。两个来源:KV 量化的误差在长序列上累积(下一篇);权重量化让 attention 的 Q、K 投影有误差,长距离的精确匹配(needle 与 query 的点积要在几万个位置里胜出)被模糊。困惑度是在 2K–4K 的窗口上测的,看不到这个。

多步推理。GSM8K 一道题 100–300 个 token 的推理链,每步的错误概率被量化略微提高,链越长累积越多;且推理链上的关键 token(中间结果的数字)恰好是概率分布最”尖”、对误差最敏感的位置。RLVR 训练的推理模型(DeepSeek-R1 系列的蒸馏模型)对量化尤其敏感——社区报告 R1-Distill 的 4-bit 在 AIME 上掉 5–10 个点,比非推理模型的同类 benchmark 掉得多。

低资源语言与代码。这些 token 在预训练里出现少,模型对它们的表示在”边缘”——logits 差距小、离决策边界近,误差更容易翻转 argmax。校准集通常是英文网页,进一步偏向英文。多语言 benchmark(如 MGSM)上量化的退化通常是英文的 2–3 倍。

指令遵循的细节。格式要求、长度约束、否定指令(”不要提到 X”)——这些依赖模型对 prompt 中少数 token 的精确处理。IFEval 上 4-bit 的退化常在 2–4 个点,且对话式的 judge 评测(MT-Bench、Arena-Hard)能看到全精度模型看不到的”风格漂移”。

3. 不均匀的另一个维度:题目难度

同一个 benchmark 内,量化的退化集中在难题上——容易的题模型的 logits 差距大,量化推不动;难题的差距小,一推就翻。所以 benchmark 越难(或子集越难),量化的退化越明显。这意味着用 MMLU 平均分评量化是最宽松的评测——它的多数题目对强模型来说是容易的。

七、量化模型的评测方法

1. 逐 token KL:最直接的度量

量化模型 \(q\) 对全精度模型 \(p\) 的逐 token KL 散度

\[\overline{\text{KL}} = \frac{1}{T} \sum_t \text{KL}\big(p(\cdot \mid x_{<t}) \,\|\, q(\cdot \mid x_{<t})\big)\]

在同一批文本上计算(不需要标签、不需要 benchmark),直接度量”量化改变了多少分布”——这正是本系列的核心问题。它比困惑度差好在:(1)困惑度只看正确 token 的概率,KL 看整个分布——一个把概率从正确 token 挪到另一个合理 token 上的误差,困惑度看到一点变化,KL 看到全部;(2)它不依赖文本的”正确性”,模型自己生成的文本上也能算,可以在目标负载的 prompt 上测;(3)它的分布(按 token、按位置、按 token 类型)可以拆开看——KL 集中在哪些 token 上,就是退化会出现在哪类任务上。

llama.cpp 社区(以及 Turboderp 的 exllama 评测)已经把 KL 作为量化格式的标准比较指标;学术论文里用得还少。经验上 4-bit 的均值 KL 在 0.01–0.05 nat 之间,超过 0.1 时任务退化明显。KL 的分位数比均值更有信息:P99 的 KL 告诉你最坏的那 1% token 被改变了多少——它们就是关键 token。

2. 任务组合

在部署前跑一组覆盖第六章四类的任务,而不只是困惑度 + MMLU:

建议任务 看什么
知识(基线) MMLU 或 MMLU-Pro 通常退化最小;作为”没崩”的确认
多步推理 GSM8K、MATH-500 4-bit 通常掉 2–6 个点
长上下文 RULER(needle、多跳)在 16K / 32K / 64K KV 量化与 W4 在长序列上的退化
代码 HumanEval+、MBPP+ 精确语法对误差敏感
多语言 MGSM 或 目标语言的任务 非英文的退化是英文的几倍
指令遵循 IFEval 格式与约束
对话质量 MT-Bench 或 Arena-Hard(judge) 风格漂移;judge 的偏差见 L5 第八篇
分布 逐 token KL(均值与 P99) 不需要 benchmark 的直接度量

推理模型再加 AIME / GPQA 的多次采样。领域部署加领域任务。

3. 协议一致性

比较量化前后必须用完全相同的协议:同样的采样参数(第一篇——温度对结果的影响可能大于量化的影响)、同样的 few-shot、同样的抽取方式、同样的引擎(不同引擎的 kernel 数值差异也在 KL 0.001 的量级,但对 argmax 翻转有影响)。且要多次采样:量化引起的 1–2 个点的差异,在单次采样的噪声范围内(L5 第八篇的方差表),需要 \(n \ge 4\) 的采样均值或配对检验才能判断。

一个常见的错误:量化模型用 vLLM 评、全精度模型用 transformers 评,两者的数值实现不同(attention kernel、RMSNorm 的精度),差异被归到量化头上。

4. 读官方量化报告

模型厂商与量化工具的报告要看四点:(1)用了什么指标——只有困惑度的报告信息量最低;(2)benchmark 的难度——MMLU 与 HellaSwag 是最不敏感的组合;(3)有没有推理与长上下文任务;(4)与什么比——与 BF16 比还是与另一个量化格式比,后者可能两个都退化了。Llama 3.2 的量化模型卡是一个好例子:列了 MMLU、GSM8K、ARC、HellaSwag、IFEval、BFCL 等十几个 benchmark 的 BF16 / SpinQuant / QLoRA 三列对比,能看到退化在哪。Gemma 3 QAT 只公开了 Elo 与困惑度,信息少一些。

八、成本

1. QAT 的算力

末段 QAT 用预训练 5–10% 的 token,或 SFT 阶段的全部 token。8B 模型用 100B token 做 QAT:\(6 \times 8 \times 10^9 \times 10^{11} = 4.8 \times 10^{21}\) FLOPs,加蒸馏的教师前向(\(2 \times 8 \times 10^9 \times 10^{11}\),+33%),约 \(6.4 \times 10^{21}\),在 64 张 H100 上以 40% MFU 约 3 天。Gemma 3 的 5000 步(假设 batch 4M token)是 20B token,成本约上述的 1/5。相比 PTQ 的几小时,QAT 是几百到几千 GPU 小时——只有模型厂商或有明确端侧需求的团队会做。

2. 假量化的开销

假量化的前向多了 quant → dequant 两个逐元素操作(每个线性层),反向多了 STE 的 mask;内存多了全精度主权重(本来就有)与量化后的副本(可以不存,即时计算)。开销约 10–20% 的训练时间,主要是逐元素 kernel 没有融合进 GEMM。激活的假量化(per-token 动态)还要每步算 max,再加几个百分点。

3. 与 PTQ 的收益对比

以 Llama 3.2 3B 的公开数字为例(Meta 模型卡):SpinQuant(PTQ)在 MMLU 上比 BF16 掉约 2 个点、GSM8K 掉约 4 个点;QAT + LoRA 分别掉约 1 与 2 个点。QAT 用几百 GPU 小时换回了一半的退化。对一个要部署到千万台手机上的模型,这个交换显然值;对一个内部工具的 7B 模型,PTQ 到 W4 加一次评测就够了。

九、动手(建议)

上一篇动手里的四组量化模型(BF16、RTN、GPTQ、AWQ 的 W4)可以直接复用,加两件事:

  • 逐 token KL:在 500 条混合文本(网页、代码、中文、对话,各 125 条)上,用 transformers 逐条前向 BF16 与量化模型,计算每个位置的 KL,记录均值、P50、P90、P99,并按 token 类型(数字、代码符号、中文字符、英文词)分组。
  • 相关性:对每个量化配置,把(困惑度差、KL 均值、KL P99)与(GSM8K、RULER 32K、MGSM 中文、IFEval 的退化)放在一张表里,看哪个度量与哪个任务的退化相关性最高。

如果有一张 40 GB 以上的卡与几十 GPU 小时:用 torchao 的 QAT API(Int4WeightOnlyQATQuantizer 一类)对 Qwen2.5-1.5B 做 2000 步的末段 QAT(教师为 BF16 自己,KL 目标),与 PTQ 的 W4 比 KL 与 GSM8K。

该看的:KL P99 是否比困惑度差更好地预测 GSM8K 与 RULER 的退化;KL 在数字与代码符号上是否显著高于英文词;QAT 后 KL 降了多少。不引用任何未跑过的数字。

十、本文小结

规则 / 公式 备注
STE 前向 \(Q(w)\),反向 \(\partial Q / \partial w := 1\);\(\hat{w} = w + \text{sg}(Q(w) - w)\) 有偏但有效:噪声视角、累积投票;需保持全精度主权重
LSQ \(\partial \hat{w} / \partial \Delta\) = 范围内舍入误差、范围外 \(\pm Q_N\) 裁剪的权重推 scale 变大;LLM 上收益不明
末段 QAT 最后 5–10% token 或 SFT 阶段;教师是全精度自己 Gemma 3(5000 步蒸馏)、Llama 3.2(QAT + LoRA)、gpt-oss(MXFP4 后训练)
QLoRA NF4 = 正态 16 分位点;双重量化 4.127 bit 训练内存:65B 进 48 GB;推理需查表
2 bit 向量量化 + 码本(QuIP# E8 lattice、AQLM 加性) 70B 进 24 GB;查表 kernel 慢
BitNet 三值 \(\{-1, 0, 1\}\),从头训,STE 乘法变加法;需从头训;GPU 上收益有限;同算力比较证据少
困惑度 平均掩盖关键 token;Llama-3-8B W4:PPL +0.36,MMLU −1–2,GSM8K −3–6,needle −10+ 难题、长上下文、推理、多语言、指令细节先掉
KL \(\overline{\text{KL}}(p | q)\) 逐 token;4-bit 0.01–0.05 nat;P99 更有信息 不需 benchmark;可在目标负载上测
协议 同引擎、同采样、多次采样、配对检验 1–2 点差异在单次噪声内
成本 QAT 几百到几千 GPU 小时 vs PTQ 几小时 Llama 3.2 3B:QAT 比 PTQ 少掉一半

核心问题的答案:困惑度只升 0.1 的 4-bit 模型,会在多步推理(GSM8K / MATH 掉 2–6 个点)、长上下文检索(32K 以上 needle 掉 10 个点以上)、低资源语言(退化是英文的 2–3 倍)与指令遵循细节上先掉——因为困惑度是所有 token 的平均,被容易的 token 稀释,而这些任务由少数关键 token 的 argmax 决定,量化误差恰好推翻的是 logits 差距小的那些位置。部署前发现它的办法:(1)在目标负载的文本上算量化模型对全精度模型的逐 token KL,看均值与 P99,看它集中在哪类 token 上;(2)跑一组覆盖推理、长上下文、代码、多语言、指令遵循的任务,而不只是困惑度 + MMLU;(3)协议一致、多次采样、配对检验。如果退化不可接受,出路是 QAT——末段几千步、以全精度的自己为教师,几百 GPU 小时换回一半的退化——或者换 W8A8 / FP8。

下一篇

KV cache 压缩:量化、驱逐与稀疏 attention

本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/quantization-aware-training-low-bit-and-evaluating-quantized-models.html)的前提下,欢迎各种形式的转载、翻译或商业引用。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×