考察点
量化题面宽但好分层:及格线是讲清"浮点映射到整数"的基本原理和训练后量化(PTQ)与量化感知训练(QAT)的区别;加分项是能把 GPTQ 和 AWQ 的技术路线差异讲明白,而不是只背名字;最高一档是能结合场景说清 int8、int4 甚至更低 bit 怎么选、掉点怎么评估。追问常落在 per-channel vs per-group、激活量化难点、W4A16 这类记号上。
参考答案
基本原理
量化就是把 fp16/bf16 的权重(和激活)映射到低 bit 整数,推理时用整数运算或低 bit 存储来省显存、提速度。最常用的是线性量化:
x_int = round(x_fp / scale + zero_point)
scale 由数值范围决定。对称量化(zero_point=0)实现简单,适合分布大致对称的权重;非对称量化能更好覆盖偏移分布,常用于激活。粒度上,per-tensor 最粗,一个张量一组 scale;per-channel 按输出通道各给一组 scale,精度好很多;per-group(如每 128 个权重一组)是目前 int4 的主流做法,在精度和额外开销间折中。
收益是实实在在的:7B 模型 fp16 约 14 GB,int8 减半到 7 GB,int4 约 3.5 GB,一张消费级 24 GB 卡就能跑。注意 W4A16 这类记号:W4 是权重 4 bit、A16 是激活仍 16 bit——激活量化难做(outlier 多、分布随输入变),所以大多数部署只压权重,计算时反量化回 fp16 再乘。这意味着 int4 主要省显存和带宽,算力上未必快,batch 大时甚至因为反量化开销而更慢。
GPTQ:基于二阶信息的逐层误差补偿
GPTQ 是 PTQ 的代表作,思路源自 OBS/OBQ 一族:逐层量化,每量化一列权重,就用该层输入的 Hessian 信息(实际用输入协方差的逆近似)去调整剩余未量化的权重,把量化误差"摊"到它们身上补偿掉。它还用了 Cholesky 分解把逐列求逆的 O(n³) 过程变成一次分解加行操作,让百亿参数模型几小时内量化完。特点:需要一小份校准数据(通常几百条)跑前向;数学上更"正统",直接最小化逐层输出误差。
AWQ:保护重要通道的激活感知路线
AWQ 的观察是:权重不是平等的,大约 1% 的"显著通道"(对应激活值大的通道)对输出影响远超其他,把它们量坏了损失最大。它不量化这些通道本身,而是给显著通道乘一个放大系数 s(等价地激活除以 s),把它们的量化相对误差压小。s 通过校准数据上搜索得到,目标是让逐层输出误差最小。特点:同样是逐层 + 校准数据,但不动权重数值本身、只调 scale,工程上更稳;vLLM、TensorRT-LLM、lmdeploy 对它的支持都很成熟。
简单对比:GPTQ 是"量化后补偿误差",AWQ 是"量化前保护关键通道"。两者精度相近,都配 group_size=128 的 per-group scale;社区惯例是 AWQ 在低 bit(4 bit 以下)略稳,GPTQ 生态历史更久。真拿不准就都量化一版跑评测集对比。
int8、int4 怎么选
- int8(W8A8 或 W8A16):几乎无感掉点,生产首选。对精度敏感的业务(金融、医疗问答)优先它。
- int4 per-group(W4A16 g128):掉点通常在可接受范围(困惑度小幅上升),显存省 4 倍,单卡部署、成本敏感场景的主力。注意小 batch 下靠带宽受益,大 batch 吞吐未必升。
- int3/int2:掉点明显,除非模型本身就大得放不下,否则不建议上生产。
- 一定用业务数据做离线评测(准确率、任务指标),别只看公开 benchmark;量化对长链推理、函数调用格式的破坏往往比闲聊更先暴露。
可能的追问
- QAT 和 PTQ 怎么选? PTQ 零训练成本、几小时出模型,是默认选项;QAT 把量化噪声引入训练让模型适应,极低 bit(如 2 bit)时才有明显优势,成本和复杂度高,业务侧很少用。
- 为什么激活比权重量化难? 权重分布静态、可在量化时统计;激活随输入变化且有 outlier 通道(某些维度幅值大几个数量级),per-tensor 的 scale 被 outlier 撑大,其他值精度全丢。SmoothQuant 的思路是把激活的 outlier 平滑到权重上。
- 量化后变慢是怎么回事? W4A16 要把 int4 反量化回 fp16 再做 GEMM,decode 阶段本来带宽受限所以赚,prefill/大 batch 算力受限,反量化开销反而拖慢——这是"量化≠一定更快"的典型例子。