跳到正文
动手理解 · CONCEPT LAB

把一组浮点数塞进更少刻度

量化先选择 scale 和粒度,再把连续值 round / clamp 到有限格子。位数越低,容量和带宽越省,但离群值、误差与 kernel 支持更关键。

已经发生 正在观察 接下来
01 / 04

状态传导图

FLOAT 原始浮点值
RANGE 确定范围
GRID 较密刻度
STORE 16-bit 存储
KERNEL 高精度计算

这里比较概念位宽,不把 INT、FP 的编码结构混为一谈。

观察点 01

刻度密,数值近似误差小,但搬运量大

BF16 / FP16 常作为训练或推理基线。每个参数约占 2 字节,硬件支持成熟,但大模型权重与 KV Cache 会吃掉大量显存带宽。

容量 / 带宽占用约 2B / 值
量化近似误差很低
此刻要记住

高位宽的主要优势是动态范围或精度余量,不代表所有算子必须一直用它。

算法工程 · Quantization / Low Precision

量化算法:把大模型从“放不下”压到“跑得起”

量化不是简单把小数四舍五入成整数。真正难的是:哪些值能低精度、哪些通道有 outlier、scale 怎么选、误差会不会在长上下文里放大、硬件到底支不支持。这篇把 INT8/INT4/FP8/FP4 和 GPTQ/AWQ/SmoothQuant 串起来。

量化要沿着完整系统链路判断:先确定量化对象,再选 PTQ/QAT 或运行时策略、scale 粒度与格式,最后确认硬件 kernel 是否真的低精度执行。文件变小只是其中一环,不自动等于端到端变快。
00 · 先抓住

量化像把高清照片压缩,但不能把关键字压糊

生活类比
FP16 像用很细的刻度尺记录每个数字;INT4 像只允许 16 个刻度。文件小了、搬得快了,但刻度太粗就会把关键差异抹掉。
小例子
同一个聊天模型做 4-bit 权重量化后,通用 perplexity 可能变化很小,但数学、代码、长上下文召回或结构化输出仍可能发生更明显变化;也可能在某套方法与任务上几乎不变。不能只凭“4 bit”预测质量,量化算法、校准数据、scale 粒度、解码设置和 kernel 都会影响结果。
先分对象权重量化省模型大小;激活量化只有在中间结果确实低比特存储/通信时才省相应容量;KV 量化面向上下文与并发缓存。
先分方法PTQ 是训练后压缩,QAT 是训练时就模拟低精度,QLoRA 是微调时压基座权重。
核心问题scale 怎么选、outlier 怎么处理、group size 多大、硬件是否真支持低精度。
01 · 为什么量化

量化省的不是一个东西:容量、带宽、算力要分开看

大模型落地时,权重容量、decode 阶段的权重/KV 读取带宽经常成为瓶颈;但在大 batch、prefill 或计算密集 kernel 中也可能是算力受限。量化把高精度数字换成低比特表示,首先减少容量与数据搬运;能否同时省计算,要看硬件和 kernel 是否真正执行低精度运算。

权重 weights

模型参数从 FP16/BF16 压到 INT8/INT4/FP8/FP4。最直接省显存,也能减少 decode 每步搬权重的带宽。

激活 activations

若激活以低比特存储或通信,可省相应容量与流量;若只在 GEMM 输入处临时量化、输出仍保留高精度,则不能把全部激活显存都按位宽等比例缩小。输入相关的 outlier 也让它通常更难量化。

KV Cache long context

长上下文推理时 KV 随序列长度线性增长。低比特存储会省容量;只有 attention kernel 直接读取/反量化该格式时,才会同步减少有效读取带宽并可能提速。

粗略压缩率

storage ratio
格式每个数相对 FP16 容量常见位置
FP16 / BF1616 bit训练/推理默认高精度基线。
FP8 / INT88 bit约 1/2FP8 训练/推理,INT8 权重/激活推理。
INT4 / FP44 bit约 1/4权重量化、部分后训练/推理低比特。
2-bit / 3-bit更低更小已有研究原型和部分可部署格式,但质量、打包与 kernel 覆盖通常比 4/8-bit 更受约束。

真实压缩率会被 scale、zero-point、group metadata、对齐 padding、kernel layout 吃掉一部分,所以“INT4 = 精确 4 倍省显存”只是理想上限。

02 · 数值格式

INT 和 FP 不是一回事:一个像刻度尺,一个像科学计数法

低比特常见两大家族。INT8/INT4 用均匀整数格子配合 scale;FP8/FP4 则保留符号、指数和尾数位,并常配合张量级或块级 scale。浮点格式能用指数换动态范围,但位数很低时仍必须精心缩放;它并不天然比整数更准确。

格式直觉优势风险
INT8256 个均匀刻度成熟、部署广、权重/激活都能做。激活 outlier 会让 scale 变大,普通值精度被挤压。
INT416 个均匀刻度权重容量大降,本地推理常见。误差更大,需要 group-wise、校准、重排序或补偿。
FP88 bit 浮点,常见 E4M3/E5M2E4M3 精度较细、E5M2 动态范围较大;NVIDIA Ada(SM89)、Hopper(SM90)和 Blackwell 都有受支持的 FP8 Tensor Core 路径。架构支持不等于每个算子、shape 和框架路径都覆盖;通常仍配合更高精度累加、缩放与敏感算子。
NVFP4E2M1 值 + 两级 scaleBlackwell 原生路径;基础格式每 16 个连续值共享 E4M3 scale,再叠加每张量 FP32 scale。Transformer Engine 当前训练 recipe 默认让权重用 16×16 二维 scale,激活/梯度用 16 元素一维 scale。二维/一维布局、转置副本、随机舍入与 Hadamard 变换属于具体 recipe,不能只写“FP4”就假定兼容。
MXFP4E2M1 值 + OCP MX scaleOCP 规范规定 32 个值共享一个 8-bit E8M0(2 的幂)scale;Blackwell 等平台提供相应 kernel。其 block=32、scale 编码和 NVFP4 不同,二者 checkpoint 不能仅凭位宽互换。
NF4非均匀 4 bit,适配近似正态分布权重QLoRA 常用,微调时把基座权重压得很小。主要面向微调存储,不等同于所有场景最快推理格式。
kernel 把容量收益变成速度收益
量化格式必须有匹配的 kernel,才可能把更少的数据搬运转成速度收益;原生低比特矩阵单元还能进一步降低计算成本。即使权重边读边反量化为 FP16/BF16,融合的 packed-read + dequant kernel 在访存受限场景仍可能提速,实际收益取决于 batch、shape、反量化开销与硬件。
可手算:4 bit 还要加 scale
只算一维块 metadata:NVFP4 的 16 个 E2M1 值占 16×4=64 bit,再加一个 8-bit E4M3 block scale,共 72/16=4.5 bit/值;MXFP4 是 (32×4+8)/32=4.25 bit/值。两者还没计全局 scale(NVFP4)、padding、对齐与训练时可能保留的转置/高精度副本;所以“4 bit”不是最终内存账。
03 · 映射公式

量化的核心是 scale:把连续数值塞进有限格子

最基础的线性量化,就是用 scale 和 zero-point 把浮点数映射到整数,再用同一套参数反量化回来。误差来自“格子太少”和“范围被 outlier 拉得太大”。

q=clip(round(xs)+z, qmin,qmax),x^=s(qz)q=\mathrm{clip}\left(\mathrm{round}\left(\frac{x}{s}\right)+z,\ q_{\min},q_{\max}\right),\quad \hat{x}=s(q-z)

s 是 scale,z 是 zero-point;对称量化常令 z=0,非对称量化允许范围偏移。

s=max(x)2b11s=\frac{\max(|x|)}{2^{b-1}-1}

这里采用 signed symmetric 的窄范围约定:整数范围是 [-(2^(b-1)-1), +(2^(b-1)-1)],因此 INT4 用 -7…7 并留空 -8,让正负刻度严格对称。也有 checkpoint/kernel 使用完整的 -8…7 范围,scale 与边界必须跟格式约定一致。

Scale 粒度怎么选

  • per-tensor:整块张量一个 scale,最简单,但遇到跨通道范围差异时通常误差更大。
  • per-channel:例如常见线性层权重可按输出通道设 scale;实际量化轴取决于算子、权重布局和 kernel 约定。
  • per-group:每组权重一个 scale,是 INT4 权重量化常见折中。
  • per-token / per-block:激活或 KV 场景常用,适配动态分布。

Group size 的取舍

  • group 越小,scale 通常更贴合局部分布、量化误差更低,但不是任务质量单调改善的保证。
  • group 越小,scale metadata 越多,存储和访问更复杂。
  • 常见 INT4 权重量化会在 32/64/128 等 group size 之间权衡。
memoryNweights×b/8+Ngroups×(scale bytes+optional zero-point bytes)\text{memory} \approx N_\text{weights}\times b/8 + N_\text{groups}\times (\text{scale bytes}+\text{optional zero-point bytes})
低比特权重不是只有 N × bit。每个 group 的 scale/zero-point 也要存;这就是为什么同样 INT4,不同 group size 的模型文件大小和速度会不同。
可手算案例:INT4 的误差从哪里来
用对称 signed INT4 表示 x=[-1.0,-0.3,0,0.2,0.9]。取可用整数 -7…7,则 s=max|x|/7=1/7≈0.1429。量化后 q=round(x/s)=[-7,-2,0,1,6],反量化得到 [-1.0,-0.2857,0,0.1429,0.8571]。其中 0.2 变成 0.1429,绝对误差约 0.0571。若同一组出现最大值 10,scale 会变成约 1.4286,-0.30.2 等普通值会被舍入为 0——这正是细分 group 和处理 outlier 的动机。
04 · 算法家族

GPTQ、AWQ、SmoothQuant:它们解决的不是同一个痛点

很多人把量化方法当成名字背。更好的理解方式是:先问它量化什么,是训练后量化还是量化感知训练,主要处理权重误差还是激活 outlier。

方法对象核心思想适合记法
LLM.int8()权重/激活 INT8 矩阵乘对大多数特征做 vector-wise INT8;把 outlier 特征维度分离到 FP16 矩阵乘。原论文称其分解中超过 99.9% 的被乘值走 8-bit 路径,这不是所有模型/实现的固定比例。“把系统性 outlier 维度拆到高精度旁路”。
SmoothQuant权重 + 激活 INT8在全精度下做数学等价的逐通道缩放,把激活 outlier 的量化难度迁移到相对易量化的权重,再执行 W8A8 PTQ。“把激活的尖峰迁到权重”。
GPTQ权重 PTQ,论文主打 3/4-bit逐层做 one-shot 量化,用近似二阶信息更新尚未量化的权重,以补偿层输出误差。“量一个,再调剩下的来补误差”。
AWQweight-only PTQ,常见 4-bit用离线激活统计识别显著权重通道,再做等价的 per-channel 缩放以降低量化误差;不是把那 1% 单独存成高精度。“由激活识别重要性,用缩放保护”。
QLoRA4-bit 基座 + LoRA 微调冻结的基座用 NF4 存储,计算时反量化到计算 dtype,梯度只更新 LoRA;论文还用 double quantization 压 scale、用 paged optimizer 管显存峰值。“压住冻结底座,只训练小适配器”。
QAT训练/微调阶段prepare 阶段插入 fake quant:数值仍以高精度保存/运算,但模拟量化→反量化误差;训练后 convert 才生成真正低比特模型。“先模拟部署误差,再转换格式”。
outlier

为什么激活量化更难

Activation outliers
Y=XW,outlier channels in X can dominate quantization errorY=XW,\quad \text{outlier channels in }X\text{ can dominate quantization error}
权重是固定的,可以离线慢慢校准;激活跟输入有关,会动态变化。LLM 里少数通道可能特别大,如果用一个 scale 覆盖所有值,普通值会被压到很粗的刻度里,误差迅速变大。
PTQ Post-training quantization

训练完成后量化,不更新原始模型训练流程。简单 round-to-nearest 可不使用数据;GPTQ/AWQ/SmoothQuant 等 data-aware PTQ 通常用小规模代表性校准数据。

QAT Quantization-aware training

训练或微调时插入 fake quantization(伪量化)来模拟低精度误差;fake-quant 张量仍是高精度,convert 后才成为部署格式。它不等同于“直接用 FP4 做完整预训练”;后者还涉及混合精度、缩放、累加与优化器配方。

05 · 部署契约

部署时要匹配 W/A/KV × checkpoint × kernel × GPU

“INT4 模型”信息不够。工程上必须同时说清权重(W)、激活(A)与 KV Cache 的位宽和 scale 粒度,再确认序列化格式、packing/layout、运行时 kernel 与目标 GPU 能否对上。dtype 名称存在,也不代表算子已经有高效实现。

速记实际含义不能顺手推断什么
W4A16权重低比特存储/读取,激活通常为 FP16 或 BF16;kernel 可边读边反量化或直接走混合低比特矩阵乘。不代表激活、KV、累加器和输出都变成 4/16 bit,也不保证比 W8A8 快。
W8A8 / FP8 W8A8矩阵乘两侧输入都量化到 8 bit;scale 可静态或按 token/row 动态计算,累加与输出通常更高精度。不代表 LayerNorm、Softmax、路由器等所有算子都用 8 bit。
W4A84-bit 权重配 8-bit 激活,是独立于 W4A16 的 kernel/格式组合。不能拿只有 W4A16 kernel 的 checkpoint/runtime 直接等价执行。
KV8 / KV4描述 KV Cache 的存储格式与 attention 读取路径,可独立于 W/A 配置。不代表模型权重或普通激活也被量化。

四层必须同时对齐

  1. 算法与校准:对称/非对称、粒度、group size、outlier 处理。
  2. checkpoint 语义:张量、scale、zero-point 以及排除层如何命名和保存。
  3. packing/layout:两个 INT4 是否装入一个 byte,scale 是否 swizzle,转置如何表示。
  4. kernel 与硬件:GPU 架构、矩阵 shape、MoE/并行路径是否真正覆盖。

生产验收不能只看模型大小

  • 质量:通用 PPL + 数学/代码/长上下文/结构化输出的目标任务集。
  • 系统:不同 batch、输入/输出长度下的 TTFT、TPOT、吞吐与峰值显存。
  • 实现:冷启动、加载时间、fallback 算子、kernel trace 与多卡/MoE 兼容性。
  • 回滚:保留高精度基线、量化 recipe 和可复现的校准集版本。
截至 2026-07-14 的官方文档能说明什么边界
vLLM列出 AWQ、GPTQModel、LLM Compressor 的 W8A8/W4A16/W4A8、ModelOpt、在线量化、TorchAO 与量化 KV Cache 等路径;硬件矩阵把 Ada(SM89)与 Hopper(SM90)分开。官方明确提示兼容表会变化;方法名受支持,不等于每个模型层、MoE 实现或 shape 都覆盖。
TensorRT-LLM文档列出 FP4、多种 FP8、FP8/NVFP4 KV,以及 W4A16/W4A8 的 GPTQ/AWQ recipe。当前 NVFP4 KV 需先用 ModelOpt 离线量化,并要求 FP8 W/A;不是任意 checkpoint 加一个参数即可。
torchao 0.17稳定/近稳定路径含 FP8、INT8 与 INT4 weight-only;NVFP4/MXFP4 工作流仍标为 prototype,其 NVIDIA 动态 W/A 路径要求 Blackwell(SM100+),MX 路径另列 AMD MI350+。API 有 dtype/config 只代表工作流入口;设备、算子、布局和 kernel 要逐项核对。
06 · KV Cache 量化

长上下文时代,KV 量化和权重量化一样关键

权重量化解决“模型本体放不下”;KV 量化解决“上下文和并发一上来,缓存撑爆显存”。这和 KV Cache 专题 是同一条线。

KV bytesB×L×S×Hkv×D×2×byteskv\text{KV bytes} \approx B \times L \times S \times H_{kv} \times D \times 2 \times \text{bytes}_{kv}

bytes_kv 从 2 bytes(FP16/BF16)降到 1 byte 或更低,理想张量容量按位宽下降;实际还要加 scale、zero-point、未量化残留窗口、padding 和 allocator 开销。

Decode 阶段经常是带宽受限。KV 低比特不仅省容量,还能减少每步读取历史 K/V 的带宽。代价是注意力分数可能更敏感,尤其长上下文、检索、代码精确复制场景要重点评测。
可手算案例:32K 上下文的 KV 账
以简化的 GQA 模型为例:L=80 层、S=32,768Hkv=8D=128、batch 1。FP16 KV 为 80×32768×8×128×2(K/V)×2 bytes = 10 GiB;若 K/V 都用理想 8-bit 存储则是 5 GiB,4-bit 则是 2.5 GiB,尚未计 metadata。上下文升到 128K 时这三者各乘 4,所以 KV 量化的价值会随长度与并发线性放大。
量化对象收益风险
K cache减少注意力 score 计算读取量。K 误差会影响 softmax 分布,可能放大选择错误。
V cache减少加权求和读取量。V 误差直接进入输出表示。
per-token scale适配 token 间动态范围;KIVI 观察到它适合其 value cache 分布。结论来自特定模型研究,不代表所有架构的 V 都应固定使用该粒度。
per-channel scale适配通道 outlier;KIVI 观察到它适合其 key cache 分布。访问模式与在线量化更复杂,端到端速度需要 kernel 实测。
论文数据要保留实验口径
KIVI(2024)的原始实现采用 2-bit 非对称 KV 量化、K 按 channel、V 按 token,并保留近期高精度 residual window。论文在 Llama/Llama-2、Falcon、Mistral 上评估了质量;系统效率数字则来自单张 A100 80GB 上的 Llama-2-7B、ShareGPT 合成 workload:包含权重在内的峰值显存最多降低 2.6×、batch 最多扩大 、吞吐提高 2.35–3.47×。这些是特定模型、长度、batch 与 kernel 下的结果,不是任意引擎开启 KV4/2-bit 后的固定倍率。
07 · 训练低精度

FP8/FP4 不只是推理压缩,也在进入训练系统

推理量化常关心“模型能不能更小地跑起来”;训练低精度关心矩阵乘输入、通信、保存的激活与状态分别用什么精度。Transformer Engine 当前在 Ada、Hopper、Blackwell 提供 FP8 路径,并在 Blackwell 支持 MXFP8 与 NVFP4。低精度 GEMM 不意味着所有张量和算子都按同一位宽保存或计算,训练仍是混合精度系统。

场景怎么用关键点
FP8 训练把适合的 GEMM 输入转为 E4M3/E5M2 或块缩放 FP8,累加与敏感算子保留更高精度。需要 amax/scale 配方、溢出控制、逐算子精度选择和硬件支持;不能把整个训练状态简单除以 2。
DeepSeek-V3技术报告采用细粒度块缩放 FP8 混合精度框架,并让部分敏感组件保持原精度。这是特定系统配方,不等于任意模型打开“FP8”开关都能复现其稳定性或成本。
NVFP4Transformer Engine 已提供 Blackwell 的 NVFP4 训练 recipe;MLCommons 的 MLPerf Training v6.0(2026-06)资料也记录了包含 NVFP4 的 NVIDIA 提交。recipe 还包含权重二维缩放、梯度随机舍入、输入/梯度随机 Hadamard 变换与高精度保留;“4-bit 训练”仍是混合精度。
MoE + low-bit专家权重低比特,减少专家权重容量和读取带宽。专家并行的主要跨卡流量常是 token 激活而非权重;能否降低通信要看激活是否量化与并行实现。
和 MoE 怎么叠加
MoE 通过每 token 只激活部分专家来减少计算;量化减少已部署权重与中间数据的容量/带宽。二者可叠加,但所有专家权重通常仍需驻留或分布在设备上。不同专家的数值分布、跨卡通信与低比特 kernel 会增加工程复杂度;量化任意上游层都可能通过隐藏状态间接改变后续路由,若 router 权重或输入也量化,还应单独检查 top-k 边界与路由 margin 是否稳定。
08 · 常见误区

量化不是“位数越低越强”,也不是“文件越小越快”

误区 1:INT4 一定比 INT8 快

不一定。要看 kernel、反量化成本、batch size、内存带宽和硬件是否有原生支持。

误区 2:只看 perplexity 就够

不够。代码、数学、长上下文检索、函数调用格式都可能比通用 PPL 更敏感。

误区 3:权重量化等于全链路量化

权重、激活、KV Cache、optimizer state 是不同对象,难度和收益不同。

误区 4:scale 越细越好

细粒度 scale 精度好,但 metadata、访存和 kernel 复杂度会上升。

误区 5:量化只影响 perplexity

量化改变 logits 后,某些边界 token 可能翻转,进而改变拒答、JSON、工具调用或长链输出;是否显著必须用目标任务和解码配置实测。

误区 6:所有模型同一套参数

模型架构、激活分布、MoE 专家分布、上下文长度都会改变最佳量化策略。

速查

一句话总结

Cheat sheet
量化是什么用更少 bit 表示权重/激活/KV Cache,并常用 scale、zero-point 或 codebook 保持数值近似。
最常见收益省显存、省带宽,并可能让模型以更低成本或更高并发运行;速度仍由 kernel 与瓶颈决定。
动态对象激活和 KV Cache 随输入变化,离线校准更难覆盖;但究竟哪一项最难取决于模型和目标位宽。
PTQ vs QATPTQ 通常成本较低;QAT 增加训练成本,但在不少激进低比特设置中能更好适应部署误差,仍需实测。
方法速记SmoothQuant 处理激活 outlier,GPTQ 做误差补偿,AWQ 保护重要权重通道,QLoRA 用 NF4 微调。
下一层专题分布式训练会继续讲 FP8/FP4、ZeRO/FSDP、通信压缩和混合精度如何一起工作。
资料来源

主要参考

核查日期:2026-07-14。硬件支持、kernel 覆盖与端到端速度会随 GPU、库版本、张量 shape、batch 和模型架构变化;论文或厂商报告中的质量/速度不能直接外推到你的部署。