LLM 面试备考
首页/Agent 基础设施

量化 Quantization

所属:01-fundamentals / 06-agent-infra
面试权重:★★
来源:通用领域知识;未做一手考证
相关知识点:01-fundamentals/06-agent-infra/vllm-pagedattention.md、latency-cost.md

一句话#

量化是把权重(以及可选地激活值 / KV Cache)从 FP16/BF16 用更低的位宽(INT8、INT4、FP8)表示,用精度换显存与速度;关键区分是只量化权重(W4A16)还是权重+激活一起量化(W8A8) —— 前者省显存、利好带宽受限的 decode,后者才能真正吃到低精度计算单元的算力、利好计算受限的 prefill。

为什么重要(面试角度)#

这是「降本」绕不开的一题,也是最容易答错细节的一题。面试官想听:

  • 你知道量化的收益来自哪条路径 —— 省显存 ≠ 必然提速,要看瓶颈是带宽还是算力
  • 你分得清 weight-only 与 weight+activation,并说得出各自的难点(激活有 outlier)
  • 你知道 INT8 / INT4 / FP8 的取舍,以及 FP8 依赖硬件支持这一事实
  • 你分得清 PTQ(训练后量化)与 QAT(量化感知训练),知道什么时候必须上 QAT
  • 你会说「量化必须重新跑评测」,而不是假设"掉一点精度没关系"

硬件的低精度内核支持决定实际收益,所以讲结论时要说清硬件前提。

核心内容#

量化的基本形式#

用一个线性映射把浮点值映射到低位表示:

q=round ⁣(xs)+z,x^=s (q−z)q = \text{round}\!\left(\frac{x}{s}\right) + z, \qquad \hat{x} = s\,(q - z)

其中 ss 是 scale,zz 是 zero-point(非对称量化才需要)。粒度选择直接决定精度:

粒度 含义 精度 开销
per-tensor 整个张量共享一组 scale 最差 最小
per-channel / per-row 每个输出通道(每行/列)一组 scale 好 小
per-group 每若干个连续权重一组 scale(如 group size 64/128) 最好 需要额外存 scale,解码时开销略增

对称 vs 非对称:对称量化(z=0z=0)实现简单、对权重常用;非对称能更好覆盖分布偏移的激活值。这些选择属于实现细节,面试能说出"粒度越细精度越好、代价是元数据与解码开销"就够。

Weight-only vs Weight+Activation(本节是重点)#

Weight-only(如 W4A16 / W8A16) Weight + Activation(如 W8A8)
量化对象 只有权重;激活保持 FP16/BF16 权重和激活都降到低位
省什么 显存占用(权重体积)、显存带宽(decode 每步读权重) 显存 + 算力(能用 INT8/FP8 tensor core 做矩阵乘)
加速哪一阶段 主要利好 decode(显存带宽受限) 主要利好 prefill(计算受限,大矩阵乘)
精度风险 较低(激活未动) 较高 —— 难点在激活的 outlier
实现复杂度 较低,生态成熟 较高,需要处理激活离群值
典型做法 GPTQ、AWQ、bitsandbytes 式 NF4 等 SmoothQuant 一类"把激活的难度迁移到权重"的方法

必须能说清的两句话:

  1. 只量化权重不会用上低位 tensor core。计算仍在 FP16 里做(权重反量化后再乘),所以它省的是显存和带宽,不是算力。这是"为什么 weight-only 主要帮 decode 而不帮 prefill"的根源。
  2. 激活量化难在 outlier。LLM 的激活值里存在少数极大的离群值,用一组 scale 覆盖它们会把其余值压得几乎全为 0,量化噪声剧增。业界做法是把激活的量化难度部分迁移到权重上(在权重里做等价的缩放补偿),从而让激活分布变得可量化。

精度与实现细节强依赖模型、算法与版本;上表给的是结构性判断,不是可以照搬的结论。

INT8 / INT4 / FP8#

格式 特点 注意
INT8 最成熟、生态最好,精度损失通常较小 常作为 W8A8 的默认选择;仍要处理激活 outlier
INT4 省得更多,常配合 weight-only(W4A16)与 group 量化 小模型上精度风险显著更大(容量本就有限,抖动的相对影响大);长尾/推理任务对量化更敏感
FP8 低精度浮点(常见两种格式:一种偏精度、一种偏动态范围) 动态范围远好于 INT8,激活量化更容易、精度通常接近 BF16;必须有硬件支持(较新的 NVIDIA 架构及之后的 GPU 才有 FP8 计算单元),具体支持矩阵以厂商文档为准

判据:8 位(INT8 / FP8)通常能做到"几乎无损",适合直接上;4 位要逐个模型验证,小模型和推理密集型任务要格外小心。

PTQ vs QAT#

PTQ(Post-Training Quantization,训练后量化) QAT(Quantization-Aware Training,量化感知训练)
做什么 训练已经结束,用一小批校准数据统计分布、定 scale 在训练/微调时插入伪量化(fake quant),让模型在训练中就适应量化误差
成本 低(几分钟到几小时级,不需要训练管线) 高(需要完整训练/微调流程与数据)
精度 8 位通常够用;4 位风险较大 在极低位宽下通常明显更好
适用 生产上的默认选择 8 位仍掉点、或要压到 4 位以下、或任务对精度极敏感时

面试要点:能说出"默认先试 PTQ,掉点不可接受再考虑 QAT"这条务实路径,以及 QAT 的代价是引入训练复杂度与数据依赖。

KV Cache 量化(独立的一档)#

KV Cache 量化与权重量化是两件事,作用对象不同:

  • 权重占比固定、与并发无关;KV Cache 随并发数 × 上下文长度线性增长,所以在高并发/长上下文场景它往往才是显存瓶颈。
  • 把 KV Cache 降到 INT8/FP8 能让同显存容纳更多并发或更长上下文 —— 对吞吐的提升往往比权重量化更直接。
  • 代价同样是精度,而且影响随上下文变长而累积(越长的历史被量化得越多)。是否可接受必须实测。

取舍:四角关系#

量化同时动四个量,它们不是同向的:

        显存 ↓
       /      \
  吞吐 ↑?      精度 ↓
       \      /
        延迟 ? 
  • 显存:几乎总是下降,这是量化的确定性收益。
  • 吞吐:通常上升(同显存能跑更大 batch / 更多并发),但前提是有高效的低精度内核。没有内核时反量化开销会吃掉收益。
  • 延迟:可能变好(权重读得快)也可能变差(反量化 kernel 开销、内存布局转换)。不保证。
  • 精度:必然有损,损失幅度受位宽、粒度、是否量化激活、模型规模、任务类型共同影响。

所以正确的说法是:量化是"省显存的最强手段,提速则要看瓶颈与内核支持"。

上线前必须做的事#

  1. 重新跑评测 —— 用你自己的评测集对比量化前后的任务指标,而不是看社区说的"几乎无损"。"几乎无损"是别人的模型和别人的任务上的结论。
  2. 分桶看 —— 量化对长尾、推理密集、低资源语言、数值敏感任务(数学、代码)影响更大,总体分数可能掩盖某类退化。
  3. 对标基线 —— 明确和什么比:同硬件的 FP16/BF16?还是同成本下的更大模型?后者往往才是真正的决策("INT4 的 70B vs FP16 的 13B 谁更好")。
  4. 压测延迟与吞吐 —— 在你的硬件和负载上实测,不要假设。
  5. 记录版本 —— 量化算法、位宽、粒度、校准集来源都要记录,否则结论不可复现。

常见面试问法#

Q:量化的收益从哪来?为什么省显存不一定提速? A:省显存是确定性的:权重体积、KV Cache 体积都下降。提速要看瓶颈在哪。decode 阶段是显存带宽受限(每步要读全部权重),权重变小 → 读得快 → 提速;但如果用的是 weight-only(计算仍在 FP16 tensor core 做,只是反量化),并且有额外反量化开销,或者瓶颈本来在别处(CPU 调度、网络、注意力计算),那提速就不明显甚至没有。收益依赖硬件内核支持与具体负载。

Q:weight-only 和 weight+activation 有什么区别? A:weight-only(如 W4A16)只把权重量化,激活保持 FP16 —— 省显存和权重带宽,主要利好带宽受限的 decode;因为计算仍在 FP16 做,用不上低位 tensor core,所以对计算受限的 prefill 帮助有限。weight+activation(如 W8A8)把激活也量化,才能用 INT8/FP8 的张量核心做矩阵乘,加速 prefill;难点是激活里存在 outlier,需要专门处理(如把难度迁移到权重的做法)。

Q:为什么激活量化比权重量化难? A:权重的分布相对稳定、可预先统计,且可以按通道/分组细粒度量化;而激活是运行时产生的,分布随输入变化,而且 LLM 激活中存在少数极大的离群值 —— 用一组 scale 覆盖这些极值会把绝大多数正常值压进很窄的量化区间,量化噪声急剧上升。所以权重量化常能接近无损,激活量化则要先解决 outlier 问题。

Q:INT4 和 INT8 怎么选? A:8 位(INT8 或 FP8)通常接近无损,可以作为默认;4 位省得更多但精度风险显著上升,尤其在参数量较小的模型上(容量有限,量化误差的相对影响更大),对长尾知识和推理密集任务也更敏感。务实路径是:先试 PTQ 的 8 位;如果显存还不够再试 4 位,并且必须在你自己的评测集上验证,掉点不可接受就考虑 QAT 或换更小的基线模型而不是硬压位宽。

Q:PTQ 和 QAT 怎么选? A:默认先 PTQ —— 只需要一小批校准数据,成本低,8 位下通常够用;掉点不可接受时再考虑 QAT,它在训练中插入伪量化让模型适应量化误差,极低位宽下精度明显更好,代价是需要完整的训练/微调流程与数据。

Q:为什么 KV Cache 量化值得单独关注? A:因为它和权重量化的显存曲线不一样。权重占用是固定的,而 KV Cache 随并发 × 上下文长度线性增长,在长上下文/高并发下往往才是真正的显存瓶颈。把 KV Cache 量化到 INT8/FP8 能显著提高可容纳的并发或上下文长度,对吞吐的帮助常常比权重量化更直接。代价是精度损失会随上下文变长累积,必须实测。

易错点#

  • ❌ 说"量化一定能提速" —— 省显存是确定的,提速依赖瓶颈位置与硬件内核支持。
  • ❌ 以为 weight-only 也能用低位 tensor core 加速 —— 它省的是显存与带宽,计算仍在 FP16 做。
  • ❌ 混淆 INT8/FP8 的难度:以为激活量化只是"多量化一个张量",忽略 outlier 问题。
  • ❌ 声称 FP8 "任何显卡都能用" —— FP8 需要硬件支持,不支持时退化为仿真或不可用,具体以厂商文档为准。
  • ❌ 把 KV Cache 量化和权重量化混为一谈 —— 作用对象、显存曲线、影响面都不同。
  • ❌ 假设"社区说几乎无损"就等于对自己无损 —— 必须用自己的评测集、自己的负载重跑,并分桶看。
  • ❌ 只对比"量化前后同一模型",忘了更有价值的对比是"同成本下更大模型 + 量化 vs 更小模型 + FP16"。
  • ❌ 忽略长尾与推理任务对量化更敏感,只看总体指标。

自测#

1. 为什么 weight-only 量化主要帮 decode,而 weight+activation 才能帮 prefill?

答案

decode 阶段每步只算一个 token,计算量极小但必须把全部权重和 KV Cache 从显存读一遍,是显存带宽受限 —— 权重变小就直接减少每步要读的字节,因此提速。weight-only 只压缩了权重的存储与读取,正好命中这个瓶颈。但它的矩阵乘仍在 FP16 的 tensor core 上做(权重需反量化后参与计算),用不上低位张量核心。prefill 是把整个 prompt 一次并行前向,是大矩阵乘,计算受限,只有把激活也量化(W8A8 之类)才能用 INT8/FP8 tensor core 提升算力。所以两类方法优化的阶段不同。

2. 激活量化为什么比权重量化难?业界怎么处理?

答案

权重在推理前是固定的,可以离线统计分布并按通道/分组做细粒度量化;激活是运行时产生的,分布随输入变化,且 LLM 激活里存在少数极大的离群值。若用一组 scale 覆盖这些极值,绝大多数正常值会被压进极窄的量化区间,量化噪声剧增。业界思路是把激活量化的难度部分迁移到权重上:对激活做等价的缩放(把难量化的通道缩放后再量化),同时在权重里做反向补偿,使激活分布变得可量化 —— 这就是 SmoothQuant 一类方法的思路。核心是"难点转移"而不是"硬压激活"。

3. 你要把一个模型量化上线,上线前必须做哪些验证?

答案

① 任务指标回归:在自己的评测集上对比量化前后,而不是引用社区的"几乎无损"结论;② 分桶看:长尾知识、推理密集(数学/代码)、低资源语言、数值敏感任务往往退化更明显,总体分数会掩盖;③ 基准选对:不仅比"同模型 FP16 vs INT4",更要看决策相关的对比 —— 同成本下"INT4 的大模型"是否优于"FP16 的小模型";④ 压测延迟与吞吐:在目标硬件与真实负载分布上实测(要确认硬件有对应的低精度内核);⑤ 记录元数据:量化算法、位宽、粒度、校准集来源、软件版本,保证可复现;⑥ 若同时量化 KV Cache,要单独评其对长上下文任务的影响(损失随上下文增长累积)。

4. 有人说「FP8 和 INT8 差不多,随便选一个」。这句哪里不对?

答案

两者都是低精度表示,但数值特性不同:FP8 是浮点格式,有指数位带来的更大动态范围,对激活里的离群值更友好,因此激活量化更容易、精度通常更接近 BF16;INT8 是均匀量化的整数格式,动态范围窄,对 outlier 更敏感(需要先做缩放处理)。另外 FP8 依赖硬件支持(较新的 GPU 架构才有 FP8 计算单元),在支持的硬件上它往往对精度更友好;不支持时就不能用。所以不是"随便选",要看硬件支持矩阵与量化的对象(权重还是激活),并以实测为准。

5. 量化一定会提速吗?请给出一个它不提速的场景。

答案

不一定。省显存是确定的,提速取决于瓶颈与内核支持。反例:① 用 weight-only 量化,但服务的瓶颈在 prefill(长 prompt、计算受限),而 weight-only 用不上低位张量核心,反量化还有额外开销 → 提速不明显甚至略有回退;② 硬件没有高效的低精度内核,反量化与内存布局转换的开销吃掉了收益;③ 瓶颈根本不在 GPU 计算/带宽上(如 tokenize、调度、网关、网络),量化 GPU 侧没有帮助。所以量化应被理解为"可靠的省显存手段",提速需要在自己的硬件与负载上实测确认。