📑 本页目录(点开跳转)
18 · 量化
⏱ 32 分钟 | ⭐ 推理侧性价比最高的优化
🎯 一句话
推理是带宽瓶颈(第 15 章),而量化直接把要搬的数据减半。 所以它不只是"省显存" —— 它直接让解码速度翻倍。 这就是为什么量化在推理侧的地位远高于训练侧。
📉 一、为什么推理侧收益特别大
回忆第 4 章的心算公式:
解码速度 = 显存带宽 ÷ 模型大小
7B BF16(14GB)在 A100:2000/14 ≈ 143 tok/s
7B INT8(7GB): 2000/7 ≈ 286 tok/s ⭐ 直接翻倍
7B INT4(3.5GB): 2000/3.5 ≈ 571 tok/s ⭐ 再翻倍
⭐ 三重收益:
① 解码速度翻倍(带宽瓶颈直接受益)
② 省下的显存能开更大 batch → 吞吐再涨
③ 更小的模型能塞进更便宜的卡
🔑 对比训练侧:训练是算力瓶颈,量化省下的带宽收益有限, 而且低精度会影响梯度和收敛。所以训练最多用到 BF16/FP8,推理能到 INT4。
🔢 二、量化的基本原理
$$q = \text{round}\left(\frac{x}{s}\right) + z, \qquad x \approx s\,(q - z)$$
(s = scale 缩放因子,z = zero point 零点)
把 FP16 的一组数映射到 INT8 的 [-128, 127]
例:一组权重范围 [-0.5, 0.5]
s = 1.0/255 ≈ 0.0039
→ 0.3 → round(0.3/0.0039) = 77 → 还原 0.3003 ✅
两个关键选择:
| 选择 | 选项 | 说明 |
|---|---|---|
| 对称 vs 非对称 | z=0 / z≠0 | 对称更快,非对称更准(分布不对称时) |
| 粒度 | per-tensor / per-channel / per-group ⭐ | 粒度越细越准,元数据越多 |
⭐ per-group(如每 128 个权重一组一个 scale)是现在的主流:
精度接近 per-channel,开销可接受
😖 三、离群值:LLM 量化的核心难题
⭐ 关键发现:LLM 的激活值里有【极少数】维度的值特别大
(比其他维度大 100 倍以上)
→ 如果用一个 scale 覆盖整个张量,
为了容纳离群值,scale 必须很大
→ 正常的值全被压到很少的几个量化格子里 → 精度崩溃 💀
激活值分布示意:
维度: 0 1 2 3 ... 1024 ... 4096
值: 0.3 0.2 -0.4 0.5 【87.2】 0.1
↑ 离群值
→ scale 必须按 87.2 定 → 0.3 和 0.2 量化后可能变成同一个数
三种主流解法:
| 方法 | 思路 |
|---|---|
| LLM.int8() | 把离群维度单独用 FP16 算,其余 INT8 |
| SmoothQuant ⭐ | 把激活的难度"转移"给权重:激活除以 s、权重乘以 s,数学等价但两边都好量化 |
| AWQ ⭐ | 发现只有 1% 的权重重要,按激活幅度找出它们并保护 |
🧰 四、主流方法怎么选
先分清两条路:PTQ 和 QAT
上面讲的 LLM.int8()、SmoothQuant、AWQ、GPTQ 全都是 PTQ(训练后量化)。 还有一条路叫 QAT(量化感知训练)—— 先说结论:LLM 时代 PTQ 是绝对主流,你大概率不会用到 QAT。
| PTQ(训练后量化) | QAT(量化感知训练) | |
|---|---|---|
| 什么时候量化 | 模型训完之后,直接压 | 训练过程中就模拟量化误差,让模型自己适应 |
| 要什么 | 一个校准集(几百条样本)⭐ | 完整的训练管线 + 数据 + 算力 |
| 代价 | 几分钟到几小时,一张卡就行 | 一次(微调级别甚至预训练级别的)重训 💀 |
| 精度 | 到 INT4 已经够用 | 更低比特(INT2/INT3)时优势明显 |
| 谁在用 | ⭐ 几乎所有 LLM 部署 | 端侧小模型、CV、语音 |
⭐ 为什么大模型时代 PTQ 一边倒:QAT 要重训。 一个 70B 模型重训一遍的成本,和"量化后掉的那 1 分"完全不成比例 —— 而且你多半根本拿不到它的训练数据。 反过来,PTQ 只要几百条校准样本、一张卡、几十分钟,效果已经能到 INT4 几乎无损。 正是因为 PTQ 在 LLM 上够用了,这几年的研究才全都堆在 PTQ 这一侧(AWQ、GPTQ、SmoothQuant 都是)。
⚠️ PTQ 的代价藏在"校准集"里:
校准集是用来【统计激活值的分布范围】的(定 scale 用)
⚠️ 如果校准集的分布和你的线上流量对不上:
比如用英文维基校准,线上跑的是中文客服对话
→ scale 定错了 → 离群值的位置也判错了
→ 量化后在【你的场景】上掉得比公开榜单严重得多 💀
⭐ 做法:校准集直接从【自己的线上日志】里抽,几百条就够
💡 这也解释了一个常见困惑:为什么别人测的"AWQ 几乎无损",到我这里就掉了? 很可能不是方法的问题,是校准集不是你的分布。
权重量化(最常用)
| 方法 | 精度 | 特点 |
|---|---|---|
| GPTQ | INT4/INT3 | 逐层用二阶信息校准,需要校准集,质量好 |
| AWQ ⭐ | INT4 | 激活感知,保护重要权重,快且质量好 |
| GGUF / llama.cpp | INT2~8 | CPU/边缘部署的事实标准 |
| bitsandbytes NF4 | 4bit | QLoRA 用的,适合微调场景 |
量化类型对比
| 类型 | 权重 | 激活 | 收益 | 说明 |
|---|---|---|---|---|
| W8A16 | INT8 | FP16 | 带宽减半 ⭐ | 最稳,几乎无损 |
| W4A16 ⭐ | INT4 | FP16 | 带宽 1/4 | 当前性价比最高 |
| W8A8 | INT8 | INT8 | 带宽+算力 | 需要 SmoothQuant 类方法 |
| FP8(W8A8) ⭐ | FP8 | FP8 | 带宽+算力 | H100 上首选,硬件原生支持 |
⭐ 实践建议: - 有 H100 → 用 FP8(硬件支持,几乎无损,算力也翻倍) - A100 及以下 → 用 AWQ / GPTQ 的 W4A16 - 要极致压缩 / CPU 部署 → GGUF
# vLLM 加载量化模型:通常不用改代码
llm = LLM(model="TheBloke/Llama-2-7B-AWQ", quantization="awq")
llm = LLM(model="...", quantization="fp8") # ⭐ H100
llm = LLM(model="...", kv_cache_dtype="fp8") # ⭐ KV 也量化
⚠️ 五、质量评估:这一步不能省
⚠️ 量化最危险的地方:【它不会报错】
模型照常输出,看起来也通顺 —— 但某些能力悄悄退化了
⭐ 必须测这三层:
① 困惑度(PPL)—— 最快的 sanity check,但【不敏感】
② 下游任务基准 —— MMLU、GSM8K、HumanEval
③ ⭐ 你自己的业务数据 —— 最重要
💥 一个真实的现象:量化对不同能力的伤害是不均匀的。 常见的观察是:闲聊质量几乎不变,但数学推理和代码生成明显下降 —— 因为后者需要精确的多步计算,误差会累积。
所以"PPL 只涨了 0.1"不能作为通过的依据。 必须测你真正在用的能力。
# ⭐ 最小可行的质量对照
for name, model in [("fp16", base), ("awq", quant)]:
print(name, evaluate(model, my_business_testset))
# 至少 200 条真实样本,人工看 20 条
🧊 六、别忘了 KV Cache 量化
⭐ 权重量化省的是【固定】的那部分显存
KV Cache 量化省的是【随 batch 增长】的那部分
→ 高并发场景下,KV Cache 才是显存大头(第 16 章)
→ 两者都要做
7B 模型,A100 80G,seq=2048:
FP16 权重 + FP16 KV:14GB + 每请求 1.07GB → 约 60 并发
INT4 权重 + FP8 KV: 3.5GB + 每请求 0.53GB → 约 144 并发 ⭐ 2.4 倍
🔗 和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 4 章 带宽÷模型大小 | 量化提速的直接依据 ⭐ |
| 第 15 章 推理是带宽瓶颈 | 为什么推理侧收益大 |
| 第 6 章 混合精度 | 同一思路的温和版 |
| 第 16 章 KV Cache | KV 量化 |
| 第 9 章 QLoRA | 训练侧的量化应用 |
| 《大模型全景导论》06 推理优化 量化的三个真实代价 | 那边给部署视角的取舍清单,本章给"离群值"这个根因 ⭐ |
| 《模型上线之后》17 版本回溯与可复现 黄金样本 | 量化完就是一个新版本;本章第五节说的质量评估,最省事的做法就是那套黄金样本 ⭐ |
| 《推荐算法》10 向量检索与 ANN PQ / OPQ | 同一个思想的另一个战场:float32 压成码本、内存降 32 倍,换的也是精度 |
✅ 检查点
- 为什么量化在推理侧的收益远大于训练侧?
- 7B 模型从 BF16 量化到 INT4,解码速度理论上变多少?
- 量化的三重收益是什么?
- 什么是离群值问题?为什么它对 LLM 特别严重?
- SmoothQuant 和 AWQ 的思路分别是什么?
- PTQ 和 QAT 的区别是什么?为什么大模型时代 PTQ 一边倒?PTQ 的代价藏在哪里?
- W4A16 和 W8A8 的区别?有 H100 该用什么?
- 为什么说"量化最危险的地方是它不会报错"?
- 量化对哪类能力伤害更大?这对评估有什么要求?
- 权重量化和 KV Cache 量化各省什么?
👀 答案
- 因为推理是带宽瓶颈,量化直接减少要搬的数据 → 解码速度直接翻倍;而训练是算力瓶颈,带宽收益有限,且低精度影响梯度和收敛。所以训练最多 BF16/FP8,推理能到 INT4。
- 解码速度 = 带宽÷模型大小。14GB → 3.5GB,速度约 4 倍(143 → 571 tok/s)。
- ①解码速度翻倍 ②省下的显存能开更大 batch,吞吐再涨 ③更小的模型能塞进更便宜的卡。
- LLM 的激活值里极少数维度的值比其他大 100 倍以上。用一个 scale 覆盖整个张量时,为了容纳离群值 scale 必须很大,正常值全被压到很少的格子里,精度崩溃。
- SmoothQuant:把激活的难度转移给权重——激活除以 s、权重乘以 s,数学等价但两边都好量化。AWQ:发现只有 1% 的权重重要,按激活幅度找出并保护它们。
- PTQ 是模型训完之后直接压(只要几百条校准样本、一张卡、几十分钟);QAT 是在训练过程中就模拟量化误差让模型自己适应(要完整训练管线 + 数据 + 算力,等于重训一次)。大模型时代 PTQ 一边倒是因为 QAT 要重训——70B 重训一遍的成本和"掉的那 1 分"完全不成比例,而且多半拿不到训练数据;而 PTQ 到 INT4 已经够用。PTQ 的代价藏在校准集里:⚠️如果校准集分布和线上流量对不上(用英文维基校准、线上跑中文客服),scale 和离群值位置都会判错,在你的场景上掉得比公开榜单严重得多——⭐ 校准集要从自己的线上日志里抽。
- W4A16 权重 INT4、激活 FP16(只省带宽);W8A8 两者都 INT8(省带宽也省算力,但需要 SmoothQuant 类方法)。有 H100 该用 FP8——硬件原生支持,几乎无损,算力也翻倍。
- 因为模型照常输出、看起来也通顺,但某些能力悄悄退化了——没有任何报错提示你。
- 数学推理和代码生成伤害更大(需要精确的多步计算,误差会累积),闲聊质量几乎不变。要求:"PPL 只涨 0.1"不能作为通过依据,必须测你真正在用的能力和自己的业务数据。
- 权重量化省固定的那部分显存;KV Cache 量化省随 batch 增长的那部分。高并发下 KV Cache 是大头,两者都要做。
🛑 可以停在这里
⚡ 走神救援
⭐推理是带宽瓶颈,量化直接把要搬的数据减半 → 不只是省显存,是让解码速度翻倍(这就是它在推理侧地位远高于训练侧的原因;训练是算力瓶颈且低精度影响收敛,所以训练最多 BF16/FP8、推理能到 INT4)。7B:BF16 143 tok/s → INT4 571 tok/s。⭐三重收益:解码翻倍 + 省下的显存开更大 batch + 能塞进更便宜的卡。原理 q=round(x/s)+z;两个选择是对称/非对称和粒度(⭐per-group 如每 128 个权重一组是主流)。😖⭐核心难题是离群值:LLM 激活里极少数维度的值比其他大 100 倍,一个 scale 要容纳它就必须很大 → 正常值全被压到很少的格子里,精度崩溃。三解法:LLM.int8()(离群维度单独 FP16)、⭐SmoothQuant(把激活的难度转移给权重:激活÷s、权重×s,数学等价但两边都好量化)、⭐AWQ(只有 1% 的权重重要,按激活幅度保护)。⭐两条路要分清:PTQ(训完之后压,几百条校准样本 + 一张卡 + 几十分钟)和 QAT(训练时就模拟量化误差,等于重训一次)——上面那些方法全是 PTQ;⭐大模型时代 PTQ 一边倒,因为 QAT 要重训,70B 重训一遍的代价和"掉的那 1 分"完全不成比例,而且你多半拿不到训练数据,而 PTQ 到 INT4 已经够用。⚠️PTQ 的代价藏在校准集里:校准集分布和线上流量对不上(英文维基校准、线上跑中文客服),scale 和离群值位置就都判错,在你的场景上掉得比榜单严重得多 → ⭐校准集直接从自己的线上日志里抽,几百条就够("别人说几乎无损、到我这里就掉"多半是这个原因)。选型:⭐有 H100 用 FP8(硬件原生、几乎无损、算力也翻倍)、A100 及以下用 AWQ/GPTQ 的 W4A16(当前性价比最高)、CPU 用 GGUF。⚠️⭐质量评估不能省——量化最危险的是它不会报错(模型照常输出且通顺,但能力悄悄退化);💥伤害不均匀:闲聊几乎不变,但数学推理和代码生成明显下降(多步计算误差累积)→ ⭐"PPL 只涨 0.1"不能作为通过依据,必须测自己的业务数据。⭐别忘了 KV Cache 量化:权重量化省固定部分,KV 量化省随 batch 增长的部分,高并发下后者才是大头——两者都做能让并发从 60 提到 144。
下一节 👉 18b-知识蒸馏.md