- 引言 — 为什么要减少比特,为何还能撑住
- 先说记法 — W4A16 是什么意思
- INT 系列的经典 — 离群值外交史
- 本地阵营 — GGUF 与 k-quant,以及 QLoRA 的 NF4
- 2026 年的核心轴 — FP8 与微缩放 FP4
- 下一个瓶颈 — KV 缓存量化
- 亲自测了一遍 — 在 RTX 5090 上对比 fp16 vs int8 vs nf4
- 选型指南 — 硬件 × 目的矩阵
- 结语 — 一部对抗离群值的战争史
- 参考资料
引言 — 为什么要减少比特,为何还能撑住
把 70B 模型以 fp16 加载,仅权重就要 140GB — 需要两张 H100。将同一个模型量化到 4 比特,约为 35GB — 一张卡装得下,还绰绰有余。量化(quantization) 是通过减少表示参数所需的比特数来削减内存、带宽与成本的技术,是模型开发生命周期一文服务节所说的"比训练更持久的战斗"的第一件武器。
令人意外的是,质量撑住的程度超出预期。原因有两个。第一,神经网络权重的分布大多聚集在 0 附近,少量比特也能密集地表示。第二,真正的问题在于少数离群值(outlier) — 异常大的数值 — 而最新的技术全都是对"该如何对待离群值"这一问题给出的不同答案。抓住这一个视角,下面的技法就会读成一条清晰的脉络。
先讲两个术语:把训练完的模型原样转换叫 PTQ(Post-Training Quantization);为了适应低精度而连带重新训练叫 QAT(Quantization-Aware Training)。这篇文章的大部分内容都属于实务主流 PTQ。
先说记法 — W4A16 是什么意思
量化讨论中会不断出现 W{比特}A{比特} 这样的记法。
W4A16 = 权重(Weight) 4 比特,激活值(Activation) 16 比特
→ 存储、加载为 4 比特,计算前先还原为 16 比特再运算
W8A8 = 权重与激活值都是 8 比特 → 运算本身即为 8 比特(需要硬件加速)
W4A4KV4 = 权重、激活值、KV 缓存全部为 4 比特
只压缩权重的 W4A16 系列能节省内存与带宽(小批量推理的速度也会提升 — 因为 decode 是 memory-bound),连激活值也一并压缩的 W8A8/W4A4 系列则能进一步提高运算吞吐量。但激活值的离群值要严重得多,处理起来也困难得多 — 这正是下文 SmoothQuant 要解决的问题。
INT 系列的经典 — 离群值外交史
LLM.int8()(2022) — 用"离群值通道单独以 fp16 计算,其余用 INT8"这样的混合分解,首次证明了大模型的 8 比特推理可以在不损失质量的前提下实现。它是把离群值问题正式提出来的起点。
GPTQ(2022) — 开启 4 比特时代的 PTQ。它按列逐一量化权重,同时把该列产生的误差补偿到尚未量化的其余权重上,从而抑制误差累积(基于二阶近似、Hessian)。仅用少量校准数据就把 W4 推向了实用水平。
AWQ(2023) — 把视角反过来。并非所有权重都平等 — 出发点是与激活值较大的通道相乘的极少数(约 1%)权重才真正左右质量这一观察,因此用缩放来保护那些"重要"通道,把其余的大胆降到 4 比特。无需重新训练、速度快,又与 GPU 推理内核相性极佳,使它成为 vLLM 一类服务中 INT4 的事实标准。
SmoothQuant(2022) — 通往 W8A8 的桥梁。它在数学上把激活值的离群值尺度转移到权重一侧(让激活值变得平滑,权重稍微变得粗糙一些),从而让两者都能以 8 比特计算。
本地阵营 — GGUF 与 k-quant,以及 QLoRA 的 NF4
GGUF(llama.cpp) 是本地推理生态(Ollama、LM Studio)的通用格式。它的特点是k-quant 混合精度:在同一个模型内部,按层、按张量根据重要度混用不同的比特数。文件名本身就是规格说明。
Q4_K_M = 4 比特 k-quant,Medium 混合 — 质量/体积平衡的代表选择
Q5_K_M = 5 比特 — 有余量时选这个
Q8_0 = 8 比特 — 几乎无损,体积节省只有一半左右
Q2_K = 2 比特 — 极限压缩,质量妥协很大
(近来还新增了基于重要度矩阵的 i-quant 系列,如 IQ4_XS)
它以 CPU+GPU 混合推理为前提设计,是"在游戏 PC 上跑 70B"这类场景的主角。
NF4(QLoRA,2023) — 微调一侧的量化。它用对服从正态分布的权重而言信息论最优的 4 比特网格(NormalFloat4)把基础模型冻结起来,只在其上训练 LoRA 适配器。它开启了"一张 48GB GPU 微调 65B"的先河,记住时可以把它和模型开发一文中讲过的 LoRA 配成一组。
2026 年的核心轴 — FP8 与微缩放 FP4
最近版图上最大的变化,是从整数(INT)转向低精度浮点数(FP)。浮点数得益于指数部分,同时表示大数值与小数值的能力更强,对离群值也比整数更宽容。
FP8 — 从 Hopper(H100)开始获得硬件加速的 8 比特浮点数(偏范围的 E5M2 与偏精度的 E4M3)。相比 fp16 内存减半,而质量几乎不下降,因此已成为数据中心服务栈(vLLM、TensorRT-LLM)的事实标准默认值。"硬件若是 Hopper/Blackwell,先上 FP8"已是当下的常识。
微缩放 FP4 — MXFP4 与 NVFP4 — 让 4 比特浮点数变得实用的关键是按区块设置缩放。每约 32 个数值组成的区块各自持有独立的共享缩放因子,把 4 比特那狭窄的表示范围按区块"挪动"到最优位置。OCP 标准的 MXFP4 已经开始用于公开模型的发布(OpenAI 的 gpt-oss 以 MXFP4 发布就是象征性的一例),NVIDIA 的 NVFP4 则瞄准 Blackwell 世代的硬件加速,配合 W4A4、甚至把 KV 缓存也压到 4 比特的方案(W4A4KV4)。"FP4 是 Blackwell 时代的 FP8"是业界的共识总结。
下一个瓶颈 — KV 缓存量化
把权重都压缩完之后,剩下的最大内存消耗者是 KV 缓存 — 正如LLM 缓存篇中所见,长上下文场景下缓存可能比权重还大。因此最近的服务引擎纷纷提供把 KV 缓存本身以 FP8(甚至 INT4/FP4)存储的选项。效果是双重的:同一张 GPU 能容纳更长的上下文、更多的并发用户,而且由于 decode 是 memory-bound,token 生成速度本身也会变快。如果是长上下文服务,这是继权重之后必须检视的一项。
亲自测了一遍 — 在 RTX 5090 上对比 fp16 vs int8 vs nf4
以上都是理论。上面"4 比特就是 1/4 内存"这个算术是否真的成立,我亲自测了一遍。在一张 RTX 5090(32GB) 上,用三种精度加载 8B 模型(DeepSeek-R1-Qwen3-8B),测量了加载后的 VRAM 与解码速度(128 token,贪心解码)(bitsandbytes 0.49.2,每种精度单独起一个进程运行,以便干净地测量 VRAM)。
精度 VRAM 解码速度 备注
────── ───────── ──────────── ─────────────────────────────
fp16 16.41 GB 54.8 tok/s 基准线
int8 9.60 GB 21.1 tok/s LLM.int8() — 三者中最慢 (!)
nf4 7.57 GB 52.0 tok/s 4 比特,速度与 fp16 相当
结果与算术给出的答案有三处不同。第一,4 比特把内存降到的不是 1/4,而是约 1/2(16.4 → 7.6GB,2.2 倍)。原因是只有权重变成了 4 比特,激活值、KV 缓存、未量化的层都原样保留 — "4 比特=1/4"说的只是权重,不是整体 VRAM。第二,最令人意外的是,int8 在三者中反而最慢(21 tok/s,不到 fp16 的一半)。这与"比特越少越快"的直觉正好相反 — LLM.int8() 用的是把离群值单独以 fp16 处理的混合精度分解,这份开销会在小批量解码时侵蚀速度。第三,nf4 是甜蜜点 — 内存最少,速度却与 fp16 相当(52 tok/s)。三种精度的输出都是通顺的推理句子。
教训与本文的结论一致:"比特越少越好"必须在自己的硬件上亲自测过才算数。 尤其要记住,bitsandbytes 的 int8 "省内存,但可能更慢"。下面的选型指南,放在这份实测之上来读会更清晰。
选型指南 — 硬件 × 目的矩阵
情况 推荐起点
───────────────────────────────── ─────────────────────────────
数据中心,配备 H100/Blackwell FP8(服务引擎的默认路径)
Blackwell + 最大吞吐量 考虑 NVFP4/MXFP4(W4A4 系列)
VRAM 紧张的 GPU 服务(A100/4090) AWQ INT4(W4A16),GPTQ 为备选
本地 PC / CPU 混合 / Ollama 从 GGUF Q4_K_M 起步,有余量上 Q5_K_M
低成本微调 QLoRA(NF4 + LoRA)
长上下文是瓶颈 追加 KV 缓存量化(从 FP8 开始)
质量优先,内存有余量 只到 W8A8(FP8/INT8)为止
无论选哪一条路,最后一步都是一样的 — 请用自己任务的评估集去验证。困惑度(perplexity)指标只是参考,量化造成的损伤在各任务间的表现并不均衡(尤其是数学、代码、长推理会最先崩溃)。模型开发一文中的 eval-first 原则在这里同样适用。校准数据(GPTQ/AWQ 所用的少量样本)也应尽量接近真实使用分布,才算安全。
结语 — 一部对抗离群值的战争史
回过头看,量化技术的历史可以浓缩成一句话:"该如何对待离群值。" LLM.int8() 把它另设一间"房间"单独伺候,GPTQ 把误差补偿给邻居,AWQ 给重要通道配了护卫,SmoothQuant 把粗糙从一侧转移到平滑的一侧,FP8 用指数部把它包容进去,MXFP4/NVFP4 按区块对齐缩放正面强攻。下一个战场是 KV 缓存与 4 比特激活值。比特还会继续减少 — 只要保持验证的习惯,这份节省几乎接近免费。
参考资料
- Dettmers et al. (2022), "LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale"
- Frantar et al. (2022), "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers"
- Lin et al. (2023), "AWQ: Activation-aware Weight Quantization"
- Xiao et al. (2022), "SmoothQuant: Accurate and Efficient Post-Training Quantization"
- Dettmers et al. (2023), "QLoRA: Efficient Finetuning of Quantized LLMs" (NF4)
- OCP Microscaling(MX) Formats 规范
- llama.cpp (GGUF/k-quants) · vLLM 量化文档
- LLM Quantization in 2026: GGUF, AWQ, GPTQ, FP8(VRLA Tech)
현재 단락 (1/52)
把 70B 模型以 fp16 加载,仅权重就要 140GB — 需要两张 H100。将同一个模型量化到 4 比特,约为 35GB — 一张卡装得下,还绰绰有余。**量化(quantization)**...