一个 70B 参数的 dense 模型,BF16 权重是 140 GB,一张 80 GB 的卡放不下;就算放下了,batch 1 逐个生成 token 时,每一步也要把全部权重从显存读一遍。量化(quantization)就是用更少的位数存这些数,可以压权重,可以压激活,也可以压 KV cache,三者换来的东西不一样。先判断瓶颈:放不下、或者 decode 被读显存卡住,压权重;prefill 和大 batch 被算力卡住,要连激活一起压,才能用上更低精度的 Tensor Core;长上下文时 KV cache 占了大头,就压 KV。不管压哪样,都要拿同一批题逐题对照,并且专门看最先坏的那几类任务,才能知道丢了多少。
待审核草稿。 这一篇还没有经过站主审阅,事实、取舍和措辞都可能修改;引用前请回到文中链接的一手资料核对。
先记一笔账:70B 模型和一张 80 GB 的卡
下面是教学假设:70B dense 模型,80 层、8 个 KV head、head dim 128,于是每个 token 的 BF16 KV 是 $2\times80\times8\times128\times2=327{,}680$ 字节(320 KiB);GPU 取 H100 SXM5 的 80 GB 显存和 3,352 GB/s 带宽(H100 架构白皮书 V1.04);给运行时留 4 GB;假设所有权重都按同一格式存,不单独算 embedding、输出层和 scale 以外的元数据。
| 权重格式 | 每个参数 | 权重 | 剩给 KV | KV 能放多少 token(BF16 / FP8 KV) | batch 1 每个 token 至少 |
|---|---|---|---|---|---|
| BF16 | 16 bit | 140 GB | 放不下 | — | 单卡不成立 |
| FP8 | 8 bit | 70 GB | 6 GB | 约 1.8 万 / 3.7 万 | 20.9 ms |
| INT4,每 128 个权重一组 | 4.125 bit | 36.1 GB | 39.9 GB | 约 12.2 万 / 24.4 万 | 10.8 ms |
4.125 bit 是 4 位整数,加上每 128 个权重共用一个 16 位 scale($16/128=0.125$)。最后一列是“权重字节 ÷ 带宽”,带宽按 100% 用满算,真实 kernel 达不到;BF16 用两张卡时的下限也是 20.9 ms,见 NVIDIA 各代 GPU。这张表只回答放不放得下、最快多快,完全没说质量,质量是这个系列后半部分的事。
三样东西可以压,换来的不一样
名字的读法:W4A16 是权重 4 bit、激活 16 bit;W8A8 是两者都 8 bit;g128 是每 128 个值共用一个 scale;KV8 或 FP8 KV 指 KV cache 存成 8 位。
| 压什么 | 常见写法 | 换来什么 | 需要什么 | 通常先坏在哪里 |
|---|---|---|---|---|
| 只压权重 | W4A16、W8A16(GPTQ、AWQ) | 权重显存;decode 每步读的字节 | 边读边反量化(dequantize)的 kernel;GPTQ、AWQ 还要一小份校准(calibration)数据 | batch 一大优势就没了;3 bit 及以下误差急剧变大 |
| 权重和激活 | W8A8(INT8、FP8),W4A4(NVFP4、MXFP4) | 上面两样,加上低精度 Tensor Core 的算力 | 硬件支持这种格式;激活的 scale 怎么定 | 激活里的离群值(outlier);INT8 往往要 SmoothQuant 这类预处理 |
| KV cache | FP8 KV,INT4 / INT2 KV | 长上下文时 KV 的显存和每步读的字节 | attention kernel 支持;K 和 V 各自的 scale | 长上下文任务;key 里固定的离群通道 |
选哪一种,取决于你落在 roofline 的哪一边(性能)。batch 1 的 decode 每读 1 字节只做约 1 次运算,远在 H100 BF16 的 ridge point(约 295 FLOP/字节)左边,少读字节就直接变快;batch 大到算力受限以后,W4A16 仍用 BF16 Tensor Core 算,优势消失,而 W8A8 的 FP8 能把 dense 峰值从 989.4 提到 1,978.9 TFLOPS(同一份白皮书)。
本系列的教学例子
后面几篇用同一个教学模型:8B dense,32 层、32 个 query head、8 个 KV head、head dim 128,与 KV cache 和性能两篇的假设配置相同;GPU 仍按 H100 SXM5 的公开规格手算。每篇讲什么,见文末的阅读顺序。
时间线
| 日期 | 工作 | 一句话 |
|---|---|---|
| 2017-12 | Jacob 等(Google) | 整数推理的 scale 加 zero-point 映射,zero-point 保证实数 0 能被精确表示 |
| 2021-06 | Nagel 等的量化白皮书 | 训练后量化(PTQ)和量化感知训练(QAT)的流程;多数情况下 PTQ 就能做到接近浮点的 8 bit |
| 2022-08 | LLM.int8()(NeurIPS 2022) | 6.7B 左右开始出现系统性的离群特征;约 0.1% 的维度改用 16 位乘 |
| 2022-09 | FP8 Formats for Deep Learning | 提出 E4M3 和 E5M2 两种 FP8 编码 |
| 2022-10 | GPTQ(ICLR 2023) | 用二阶信息把量化误差推给还没量化的权重;175B 模型约 4 个 GPU 小时压到 3–4 bit |
| 2022-11 | SmoothQuant(ICML 2023) | 把激活的离群值等价地“挪”到权重上,做 W8A8 |
| 2023-06 | AWQ(MLSys 2024 最佳论文) | 按激活大小找出重要通道,放大以后再量化 |
| 2023-09 | OCP MX 规范 v1.0 | AMD、Arm、Intel、Meta、Microsoft、NVIDIA、Qualcomm 的作者共同定义:每 32 个值共享一个 2 的幂 scale |
| 2024-02 | KIVI(ICML 2024) | key 按通道、value 按 token 量化,KV cache 压到 2 bit |
| 2024-03 | QuaRot | 先旋转再量化,权重、激活、KV cache 都用 4 bit |
| 2024-07 | Accuracy is Not All You Need(NeurIPS 2024) | 准确率几乎不变,逐题看却有不少题对错翻转 |
| 2024-08 | Marlin | 4 bit 权重乘 FP16 激活的 kernel,batch 16–32 以内接近理想的 4 倍 |
| 2024-11 | “Give Me BF16 or Give Me Death”?(ACL 2025) | Llama-3.1 上 50 多万次评测:FP8 近似无损,INT8 掉 1–3%,W4A16 与 8 bit 相当 |
| 2024-12 | DeepSeek-V3 | 671B 参数的 MoE 用细粒度 FP8 训练 |
| 2025-05 | MXFP8 训练配方(NVIDIA) | 最大 8B 模型、15T token,在 Hopper 上模拟 MXFP8 计算,自报验证困惑度(perplexity)与 BF16 相差不到 0.5% |
| 2025-05 | 长上下文任务上的量化(EMNLP 2025) | 8 bit 平均最多掉约 0.8 个点;4 bit 在长输入任务上最多掉 59 个点 |
| 2025-06 | NVFP4 | 每 16 个值一个 E4M3 scale,再乘一个张量级 FP32 scale |
| 2025-09 | NVFP4 预训练 | 12B 模型、10T token,自报 loss 和下游准确率与 FP8 基线(baseline)相当 |
哪些已经比较确定,哪些还在变
每格都对应一条带日期的公开记录;第三列写的是什么样的结果会改变判断,不是预测。
| 比较确定 | 还在变 | 接下来看什么信号 |
|---|---|---|
| 8 bit 权重在大模型上基本无损:Kurtic 等(2024-11)在 Llama-3.1 8B 到 405B 上测 FP8 W8A8 近似无损;Dutta 等在 MMLU 上测 GPTQ W8A16,只有 0.26%–1.40% 的题翻转 | 4 bit 及以下怎么做:GPTQ、AWQ 之外,有旋转(QuaRot),也有 NVFP4、MXFP4 这类硬件块格式 | 在长上下文、多语言和推理任务上逐题对照的 4 bit 结果 |
| 小 batch 时 W4A16 主要换来 decode 速度,batch 一大优势就消失:Marlin(2024-08)、Kurtic 等的部署建议 | W4A4 的推理质量:NVIDIA 自报 DeepSeek-R1-0528 从 FP8 转 NVFP4 后,所列 7 项评测掉 1% 以内 | 第三方按切片(slice)报告的 W4A4 评测 |
| 平均准确率看不出逐题变化(Dutta 等,2024-07);长上下文、非英语和数学这类难任务最先坏(Mekala 等 2025-05,Marchisio 等 2024-07) | 低精度训练:FP8 已用到 671B(DeepSeek-V3),MXFP8 到 8B / 15T(模拟量化),NVFP4 到 12B / 10T | 更大规模、公开完整配方的 FP4 训练 |
| 硬件决定能不能真的加速:FP8 Tensor Core 需要 compute capability 8.9 以上,9.0(Hopper)没有 INT4 Tensor Core(CUDA 编程指南) | 新硬件的取舍:截至 2026 年 10 月的 HGX 页面(8 卡,稀疏口径,dense 减半),HGX B300 的 INT8 只有 3 POPS、FP8 是 72 PFLOPS,HGX B200 两者都是 72;AMD 的 MI350 系列加入 MX 格式 | 下一代数据表里 INT8、FP8、FP4 各自的吞吐 |
这一组怎么读
先读这些会更顺:精度与显存(FP16 和 BF16 的取舍),GPU 架构(各代 Tensor Core 支持的数据类型,NVFP4 的手算例子),性能(roofline、decode 的 batch 账),KV cache(KV 显存预算)。相邻的几篇:NVIDIA 各代 GPU讲 70B 模型在哪代卡上要几张;vLLM 与 SGLang讲量化在生成引擎里处于哪一层;LoRA 与 QLoRA讲 NF4 和在 4 bit 基座上训练;分数涨了,究竟能说明什么讲配对比较的统计。
- 格式与误差:scale 和 zero-point,per-tensor、per-channel、per-group,INT 与 FP 的格子,块缩放的 MXFP4 与 NVFP4,离群值为什么伤害大,哪代硬件能算哪种格式
- 只压权重,与训练后量化:W4A16 为什么让 decode 变快、batch 多大时失效,GPTQ 的误差补偿,AWQ 的通道放大,SmoothQuant 的 W8A8
- FP8 推理与 KV cache 量化:FP8 的 scale 怎么定,FP8 / MXFP8 / NVFP4 训练要处理什么,128K 上下文时 KV 量化省下多少,KIVI 为什么选择按通道量化 key
- 怎样测出丢了多少:困惑度(perplexity)、KL 散度、任务准确率和逐题翻转,配对比较,长上下文和多语言切片,每次量化要记下什么,常见故障
- 复习题:面试题和自检
本页术语 4
- 校准 calibration
- 模型给出的置信度是否等于真实正确率
- 困惑度 perplexity
- exp(交叉熵),语言模型的常用指标
- 基线 baseline
- 用来比较新方法的参考方法或配置
- 切片 slice
- 按内容或用户属性划分的子群体,用来检查平均值掩盖了什么