大模型推理中 Weight-only、W8A8 和 FP8 量化有什么区别?如何选型?
简化版
三种方案侧重不同:Weight-only(如 W4A16) 只压权重,由融合内核边解包/缩放边计算,主要节省权重容量和带宽,常适合带宽受限的 Decode;W8A8 同时量化权重与激活,可命中整数矩阵乘路径,但要处理激活离群值;FP8 用指数换取更宽动态范围,也必须有相应硬件与内核。最终选择取决于硬件、运行时、batch、质量与端到端实测,不存在脱离环境的固定赢家。
详细版
常见方案:W8A16、W4A16、W8A8、FP8(权重+激活)、以及独立的 KV Cache 量化。配套算法:GPTQ(近似二阶逐层量化权重)、AWQ(按激活保护重要权重通道)、SmoothQuant(把激活离群值离线迁移一部分到权重,让 W8A8 更易落地)。
关键认知:精度格式只是第一步。若设备没有对应 Tensor Core 或高效 kernel,反量化、格式转换、变小的算子反而会抵消收益。必须用最终推理引擎 + 目标硬件 + 真实长度分布实测 TTFT、TPOT、吞吐和任务质量,不能只比模型文件大小。
完整版教学
记忆钩子:Weight-only 主要省“读权重”,W8A8 争取“整数矩阵算”,FP8 用指数位换“动态范围”;三者都只有命中目标硬件的高效 kernel 才能兑现收益。
一、先分清「量化对象」有哪些
不同方案量化的东西不同,收益也不同:
| 对象 | 特点 | 量化收益 | 难点 |
|---|---|---|---|
| 权重 | 静态、长期驻留显存 | 直接减存储和带宽 | 校准容易,相对好量化 |
| 激活 | 每层动态产生 | 能用整数矩阵乘加速 | 有离群值,难量化 |
| KV Cache | 随并发/上下文增长 | 扩大缓存容量、提并发 | 长上下文更受益 |
| 部分算子 | Embedding/归一化/输出头 | —— | 敏感,常保留高精度 |
易错点:「4-bit 模型」通常只指部分张量(权重),不代表所有计算都用 INT4——激活、注意力、输出头往往还是高精度。
二、Weight-only(W4A16):省权重带宽,利于 Decode
Weight-only 把权重以低位(如 4 位)存储,计算前在寄存器/共享内存里解包、反量化回 FP16/BF16,再和高精度激活相乘:
存储:权重 INT4(裸数据相对 FP16 理想缩小到 1/4,实际另有 scale/元数据)
计算:读 INT4 → 在融合内核内解包与缩放 → 和高精度激活完成矩阵运算
它显著降低权重的带宽和容量,最适合Decode 阶段和小 batch——因为那时瓶颈正是「反复读大权重只算一个 token」(访存受限)。
但有个关键边界:当 batch 很大、瓶颈从”权重带宽”转成”算力”(compute-bound)时,每次都要反量化的开销会凸显,加速会缩水。所以 Weight-only 的收益高度依赖负载——低并发单请求收益大,高并发大 batch 收益小。
三、W8A8 与 SmoothQuant:让整数矩阵乘用起来
W8A8 让矩阵乘两侧都是 8 位,从而能调用 GPU 的INT8 Tensor Core(高吞吐整数内核),比 Weight-only 更彻底地省算力。难点在激活:
激活里存在少数"离群通道",幅值比其他通道大几十上百倍:
正常通道:|值| ≈ 1
离群通道:|值| ≈ 100
若整体用一个 scale 量化 → 离群值撑大 scale → 正常值被压成几个格子 → 精度崩
SmoothQuant 用数学等价的逐通道缩放,把激活的量化难度迁移一部分到权重侧——(X/s)·(s·W) = X·W 的浮点结果不变,但 X/s 更平滑、更容易量化:
原始: Y = X · W (X 有离群,难量化)
平滑: Y = (X/s) · (s·W) (X/s 平滑好量化,s·W 权重吸收难度)
于是 W8A8 才能在大模型上落地。缩放系数和校准样本影响误差,换领域数据要重新验证。
四、FP8:用浮点的动态范围换低精度
FP8 是 8 位浮点(常见 E4M3 / E5M2 两种格式,分别偏精度/偏范围)。相比 INT8 的均匀格子,FP8 有指数位,动态范围更大——对「值域跨度大、有离群」的激活更友好,往往比 INT8 更容易保持质量:
INT8:16→256 个均匀格子,范围固定,离群值撑大步长
FP8(E4M3):4 位指数 → 范围宽,能同时表达很大和很小的值
代价:FP8 仍需缩放和溢出管理,且依赖支持 FP8 的硬件与内核(如 H100)。它也不是天然无损——注意力、输出层、长上下文任务仍要做回归测试。
五、精度格式只是第一步:硬件和负载决定成败
这是选型最核心、也最反直觉的一点:「模型变小」不等于「一定变快」。真正决定收益的是「格式 + kernel + 硬件 + 负载」四者匹配:
- 没有对应的高效 kernel/Tensor Core → 反量化和格式转换开销可能吃掉全部收益,甚至更慢;
- 量化后单个算子变小 → 可能反而降低 GPU 利用率;
- 负载不同收益不同 → Weight-only 利于小 batch/Decode,W8A8 利于大 batch/compute-bound。
所以务必用目标推理引擎 + 目标硬件 + 真实流量端到端实测,别拿别人的数字或纸面倍数下结论。
六、怎样做端到端选型
先用同一模型与业务验证集确定允许的质量损失,再筛掉目标硬件没有成熟 kernel 的候选格式。随后覆盖真实输入/输出长度、batch 和并发,分别报告 TTFT、TPOT、吞吐、峰值显存与单位成功请求成本。量化校准集与验收集要分开,KV Cache 精度也要单独记录,避免把权重量化和缓存量化的退化混在一起。
例如同一 8B 模型在 batch=1 Decode 时可能由权重带宽主导,W4A16 能明显降 TPOT;并发提高后矩阵变大,瓶颈可能转向算力,此时 W8A8/FP8 的硬件矩阵路径才更占优势。这是容量分析的假设,最终仍以目标卡型 Profile 为准。
七、常见误区与追问
- 误区:量化后模型更小,所以一定更快。 不一定,缺高效 kernel 时反量化开销会抵消甚至变慢。
- 误区:W8A8 一定比 Weight-only 快。 大 batch 下 W8A8 用整数内核更优,但小 batch/Decode 下 Weight-only 省带宽更划算。
- 误区:FP8 无损。 也有精度损失,需对注意力/输出层/长上下文做回归。
- 追问:Weight-only 什么时候收益缩水? 大 batch、compute-bound 时,反量化开销凸显。
- 追问:W8A8 的最大难点? 激活离群值;SmoothQuant 用等价缩放把离群难度迁移到权重解决。
- 追问:FP8 相比 INT8 的优势? 有指数位、动态范围更宽,对离群激活更友好,但需 FP8 硬件。
- 追问:怎么评估量化质量? 除困惑度,还要测生成一致性、数学、代码、长上下文、工具参数、领域任务;校准集要覆盖真实 prompt 长度和内容。
八、加强记忆
沿“量化什么—命中什么内核—在哪个负载获益”来记:Weight-only 压权重、主要缓解 Decode 带宽;W8A8 压权重和激活、争取整数矩阵吞吐;FP8 保留指数、兼顾低精度和动态范围。SmoothQuant 处理的是激活离群值迁移,不是万能无损开关。最终红线是质量门槛与目标硬件实测,因为模型文件变小、理论位宽下降都不自动等于服务更快。