Skip to main content

大模型量化全景解析:历史、术语、算法体系与现代工程实践

Rainy
雨落无声,代码成诗 —— 致力于技术与艺术的极致平衡
Rainy
59 MIN READ... VIEWS

量化不是“把模型变小”这么简单。它是一套横跨数值表示、压缩算法、硬件指令、推理内核、模型结构、评测方法和部署系统的工程体系。

本文讨论的是 AI/LLM 模型量化,不是金融量化交易。

如果用一句话解释:模型量化是把原来用高精度浮点数表示的权重、激活、KV Cache 或梯度,映射到更低比特的离散表示,从而降低显存、内存带宽、存储和计算成本。

它看起来像一个“压缩模型”的技巧,但真正落地时会牵涉到:

  • 数学:舍入、缩放、零点、误差传播、率失真;
  • 模型:权重、激活、注意力、MoE、视觉塔、LoRA;
  • 算法:PTQ、QAT、GPTQ、AWQ、SmoothQuant、QLoRA、AutoRound;
  • 格式:GGUF、GPTQ、AWQ、bitsandbytes、safetensors、compressed-tensors;
  • 硬件:CPU SIMD、GPU Tensor Core、FP8、INT8、INT4、FP4、NPU;
  • 内核:GEMM、GEMV、weight packing、dequant fusion、KV Cache;
  • 服务:prefill、decode、continuous batching、PagedAttention、吞吐与延迟;
  • 评测:困惑度、MMLU、GSM8K、长上下文、领域集、安全与回归。

本文从历史讲起,再把专有名词、复杂体系、现代方法和开源生态串成一张完整地图。

LLM 量化从张量到服务的完整链路

图 1 把量化放到完整工程链路里看:先有 FP16/BF16 基座模型和校准样本,再统计权重/激活分布,选择量化粒度和算法,最后打包成 GGUF、GPTQ、AWQ、compressed-tensors 等制品,并交给 vLLM、llama.cpp、TensorRT-LLM 或 Transformers 这类 runtime 执行。任何一个环节选错,都会出现“文件很小但速度不快”“benchmark 没掉但业务格式崩了”“同样 4-bit 在不同框架结果不同”这类问题。


零、先把关键词放到坐标系里

量化文章容易读不深,常见原因是把关键词当成孤立名词背:看到 INT4GPTQAWQGGUFFP8KV Cache,好像都认识,但不知道它们之间到底是什么关系。

更好的读法是把每个词放到一张坐标系里:

坐标轴关键问题典型关键词
量化对象到底压缩谁?WAKV Cache、gradient、optimizer state、MoE expert
数值格式用什么低精度表示?INT8INT4FP8NF4FP4MXFP4NVFP4
映射参数高精度值如何映射到低精度格点?scalezero_point、clipping、rounding、codebook
粒度多少个数共享一套量化参数?per-tensor、per-channel、per-group、per-token、block-wise、G128
算法怎么让误差更小?RTN、GPTQ、AWQ、SmoothQuant、LLM.int8、QLoRA、OmniQuant、AutoRound
训练关系是训练后量化,还是训练中适应?PTQ、QAT、fake quant、STE、LoRA、FP8 training
文件格式量化后如何保存和交换?GGUF、GPTQ checkpoint、AWQ checkpoint、safetensors、compressed-tensors
执行引擎谁负责真正跑起来?llama.cpp、Ollama、vLLM、TensorRT-LLM、Transformers、TorchAO
硬件内核低比特是否真的算得快?Tensor Core、Triton、CUTLASS、Marlin、ExLlama、GGML、AMX、Metal
评测治理怎么证明它能上线?perplexity、MMLU、LongBench、needle、TTFT、tokens/s、P99、业务回归

这张表里有一个重要结论:INT4 不是一个完整方案,只是数值格式;GPTQAWQ 是算法;GGUF 是文件格式;llama.cppvLLM 是执行系统;Tensor Core、AMX、Metal 是硬件路径。

所以,当有人说“我用了 4-bit 量化”,这句话信息不够。更完整的描述应该类似:

Qwen-like 32B
W4A16
group size = 128
AWQ
zero_point = true
格式:safetensors + quant metadata
runtime:vLLM
硬件:A100 80G
评测:MMLU、GSM8K、中文领域集、64k needle、tool-call JSON 回归

这才是一个可复现、可讨论、可上线的量化描述。

一、量化到底是什么?

最抽象的定义来自信号处理:量化是把一个较大的输入集合,通常是连续实数,映射到一个较小的、可数的输出集合。

最简单的例子是四舍五入:

3.14159 -> 3
2.71828 -> 3
-0.12 -> 0

模型量化的版本通常是:

高精度权重:[-0.4321, 0.0137, 1.2842, ...]
低比特表示:[ -7, 0, 21, ...]
缩放系数:scale = 0.061
反量化:real_value ~= int_value * scale

常见线性量化公式可以写成:

q = round(x / scale) + zero_point
x_hat = (q - zero_point) * scale

其中:

  • x 是原始高精度值;
  • q 是低比特整数;
  • scale 控制每一格代表多大的实数区间;
  • zero_point 用来让整数 0 对齐到真实数值中的某个点;
  • x_hat 是反量化后用于近似计算的值。

量化一定会引入误差,因为多个原始值会落到同一个低比特值上。工程目标不是“没有误差”,而是让误差在模型可接受范围内,同时换来显著的内存和速度收益。

1. 量化误差来自哪里?

从一个实数 x 变成低比特整数 q,至少会产生三类误差。

误差来源发生位置例子工程含义
截断误差选择表示范围时极端 outlier 超出范围后被夹到边界clipping 策略会影响长尾值
舍入误差连续值落到离散格点时0.0310.034 都映射到同一个格点bit 越低,格点越稀疏
累积误差多层网络传播时某层输出误差成为下一层输入误差单层 MSE 小不代表最终行为稳定

最容易被忽略的是第三类。Transformer 不是单层函数,而是几十层到上百层的残差网络。某一层的微小误差会进入 attention、MLP、residual stream、layer norm,再影响后续 token 的概率分布。生成式模型还会把前一步输出作为下一步输入,所以误差不仅在层间传播,也会在时间步之间传播。

这就是为什么“看起来差一点点”的量化,有时会在代码生成、数学推理、JSON 格式、长上下文引用里突然变差。

2. 线性量化的四个关键选择

线性量化不是只有一个公式,真正重要的是四个选择:

选择 1:表示范围怎么定?
选择 2:范围内有多少格点?
选择 3:每个格点怎么对齐真实值?
选择 4:多少个值共享同一套 scale?

n bit 有符号整数为例,可表示格点数量通常是:

levels = 2^n
INT8 约 256 个格点
INT4 约 16 个格点
INT2 约 4 个格点

当从 INT8 下降到 INT4,不是“少一半精度”,而是从约 256 个格点下降到约 16 个格点。每个格点覆盖的实数区间显著变宽,舍入误差会急剧放大。低比特量化困难的根本原因在这里。

3. Clipping 不是小参数

假设一个权重分布大部分落在 [-1, 1],但有少量 outlier 到 [-8, 8]。如果用 min/max 覆盖完整范围,INT4 的 16 个格点要覆盖 16 个单位宽度,大部分普通权重只能挤在很少几个格点里。

另一种做法是 clipping:

原始范围:[-8, 8]
裁剪范围:[-1.5, 1.5]
outlier 被截断,但主体分布获得更密的格点

这就是校准算法要权衡的事情:保护 outlier,还是保护主体分布。不同任务、不同层、不同模型结构的答案不同。SmoothQuant、AWQ、GPTQ、OmniQuant、AutoRound 等方法,本质上都在用不同方式回答这个问题。

4. 量化不是编码压缩

量化和 gzip、zstd、图片压缩不一样。编码压缩的目标通常是文件更小,解压后尽量恢复原数据;模型量化的目标是让低精度表示直接参与计算。

这带来一个重要差异:

编码压缩:小文件 -> 解压 -> 原始计算
模型量化:低比特权重/激活 -> 低比特或混合精度计算 -> 输出

所以量化的收益不只来自文件小,还来自内存带宽下降、cache 命中改善、低精度矩阵乘内核和更高 batch 容量。但如果 runtime 只是把 INT4 解包回 FP16 再算,就会出现“文件小了,速度没有明显提升”的情况。


二、为什么大模型必须关心量化?

一个 70B 参数模型,如果用 FP16 存权重:

70B parameters * 2 bytes ~= 140 GB

这还只是权重,不包括:

  • KV Cache;
  • 激活峰值;
  • runtime workspace;
  • 多副本 serving;
  • batch 带来的缓存扩张;
  • MoE 专家加载;
  • tokenizer、embedding、adapter、调度开销。

如果把权重量化到 4-bit,理论权重存储变成:

70B parameters * 0.5 bytes ~= 35 GB

再考虑 scale、zero point、group metadata、对齐 padding 和运行时缓存,实际不会刚好是四分之一,但数量级会明显下降。

量化带来的收益主要有四类。

收益解释
显存下降更大的模型能放进单卡或消费级设备
带宽压力下降decode 阶段常被权重读取和 KV Cache 读取限制
成本下降同样请求量需要更少 GPU 或更低规格硬件
边缘部署手机、笔记本、车载、机器人、浏览器更容易跑本地模型

但量化也有代价:

  • 低比特可能损害困惑度和指令遵循;
  • 激活 outlier 会放大量化误差;
  • 不同层敏感度不同;
  • 内核不匹配时,模型变小但不一定变快;
  • 低比特格式越多,部署兼容性越复杂;
  • 安全、评测、回归和可复现更难。

所以量化不是单点算法,而是一个系统设计问题。


三、量化历史:从信号处理到 LLM

1. 信号处理时代:量化是数字世界的入口

在深度学习出现前,量化已经是数字通信、音频、图像、视频压缩的基础。

模拟信号要进入计算机,通常要经过:

连续信号 -> 采样 -> 量化 -> 编码

ADC 把连续电压映射成有限 bit 的整数;JPEG、MP3、视频编码会通过量化丢弃人类不敏感的信息;Lloyd-Max 量化讨论如何选择分割边界和重建值来最小化失真。

这套思想后来迁移到神经网络:既然权重和激活也只是数值张量,能不能用更少 bit 表示它们?

2. 深度学习早期:从二值网络到移动端 INT8

2015 到 2017 年前后,研究者尝试了非常激进的低比特网络:

  • BinaryConnect:训练时把权重约束到二值;
  • BinaryNet / XNOR-Net:权重和激活都接近二值化;
  • DoReFa-Net:把权重、激活、梯度都低比特化;
  • Integer-only inference:让移动端 CPU 用整数算子完成神经网络推理。

这个阶段的主要驱动力是移动端和嵌入式部署。典型模型是 CNN、MobileNet、检测模型,而不是今天的 LLM。

3. 工具链时代:PTQ 与 QAT 成为标准词汇

2018 到 2021 年,工业界逐渐形成两个主流范式:

  • PTQ(Post-Training Quantization):模型训练完后再量化;
  • QAT(Quantization-Aware Training):训练或微调时模拟量化误差,让模型适应低精度。

TFLite、TensorRT、ONNX Runtime、PyTorch quantization 等工具链开始成熟。INT8 推理成为很多视觉模型的常规部署方式。

4. LLM 时代:量化突然变成主战场

LLM 改变了问题规模。

CNN 量化主要是为了端侧速度和能耗;LLM 量化首先是为了能不能放进显存。175B、70B、32B 这类模型,即使只做推理,也会把普通硬件直接撑爆。

2022 年之后,几条关键路线出现:

  • LLM.int8():处理 Transformer 中的 outlier,把大部分矩阵乘法放到 INT8,同时保留少量高精度路径;
  • GPTQ:使用近似二阶信息做 one-shot 权重量化,把大模型压到 3-bit 或 4-bit;
  • SmoothQuant:把激活 outlier 的量化难度迁移到权重上,实现 W8A8;
  • QLoRA:用 4-bit NF4 冻结基座模型,只训练 LoRA adapter;
  • AWQ:根据激活分布识别重要权重通道,用等价缩放保护 salient weights;
  • GGUF / llama.cpp:把量化模型带到本地 CPU、Apple Silicon、消费级 GPU 和边缘设备。

量化从论文技巧变成了大模型普及的基础设施。

5. 历史上的几次范式切换

如果只按年份记,很容易觉得量化是一串论文名。更有价值的是看范式切换。

阶段核心问题典型对象量化关注点
信号处理量化连续世界如何进入数字系统音频、电压、图像、视频采样、编码、率失真
嵌入式定点计算小设备如何省电省算力DSP、MCU、移动端模型定点数、整数乘加、溢出
CNN INT8 推理视觉模型如何部署到手机和服务器Conv、BatchNorm、ReLUPTQ、QAT、per-channel、calibration
Transformer 低精度注意力模型如何利用 GPU Tensor CoreBERT、ViT、Encoder 模型FP16/BF16、INT8、混合精度
LLM weight-only大模型首先要放得下7B、13B、70B Decoder-only 模型INT4、GPTQ、AWQ、GGUF
LLM serving quant模型放得下之后要跑得稳、跑得快API 服务、Agent、RAG、长上下文FP8、KV Cache、batching、runtime
量化原生模型从训练开始就适配低比特BitNet、FP8 training、FP4 路线架构、训练、硬件共同设计

这几次切换背后的瓶颈不同:

信号处理:真实世界信号太连续
嵌入式:功耗和算力太有限
CNN 部署:移动端和服务器成本太高
LLM 本地运行:权重太大,显存放不下
LLM 服务:KV Cache、并发和延迟成为瓶颈
未来低比特模型:训练和硬件要一起设计

因此现代 LLM 量化不是孤立发明,而是几十年数值表示、硬件计算和模型压缩技术的连续演进。


四、核心专有名词

1. 数值格式

名词含义典型用途
FP3232-bit 浮点训练、基准、部分优化器状态
FP1616-bit 浮点GPU 训练和推理常用
BF16Brain Float 16,指数位更宽训练稳定性更好,现代 GPU/TPU 常用
INT88-bit 整数成熟推理量化,视觉和 LLM W8A8 常见
INT44-bit 整数LLM weight-only 主流低比特格式
FP88-bit 浮点,常见 E4M3/E5M2现代 GPU 训练/推理加速
NF4NormalFloat4,针对正态分布权重QLoRA 的关键格式
FP4 / MXFP4 / NVFP44-bit 浮点或 microscaling 格式新一代硬件和超低比特推理
1-bit / 1.58-bit二值、三值或 BitNet 类低比特通常需要原生训练或特殊架构

这里要区分三个经常混在一起的词。

它回答什么问题常见误解
dtype张量在计算图里以什么数值类型存在以为 float16int4 都是同一种 runtime dtype
quantization format高精度张量如何被低比特表示和反量化以为所有 4-bit 模型可以互相替换
checkpoint/file format模型权重和量化元数据如何落盘以为 GGUF、GPTQ、AWQ 只是后缀名不同

例如 INT4 只说明每个权重主体大约用 4 bit 表示,但它没有说明:

  • 是对称量化还是非对称量化;
  • group size 是 32、64、128 还是 256;
  • scale 是 FP16、BF16、FP32,还是也被二次量化;
  • zero point 是否存在;
  • 是否使用 act-order 或 desc_act;
  • 是否按列、按行或按 block 打包;
  • runtime 是否有对应 kernel;
  • 反量化是在 GEMM 前单独做,还是融合在 kernel 里。

因此两个都叫 4-bit 的模型,质量和速度可能完全不同。

dtype、storage dtype、compute dtype

在 LLM 工程里,至少要分清三种 dtype。

类型含义例子
storage dtype权重落盘或驻留显存时的存储格式INT4、NF4、FP8、GGUF Q4_K_M
compute dtype实际矩阵乘或 attention 里使用的计算精度FP16、BF16、INT8、FP8
accumulation dtype乘加结果累加时使用的精度FP32、FP16、BF16、INT32

很多低比特方案并不是“全程 4-bit 计算”。常见的 W4A16 是:

权重存储:4-bit
激活输入:FP16/BF16
计算过程:kernel 中解包/反量化后与 FP16/BF16 激活相乘
累加:通常更高精度
输出:FP16/BF16

这类方案主要解决显存和带宽,不一定等同于“用 INT4 Tensor Core 直接计算”。

2. W/A/KV 记法

量化论文和工具经常写:

W8A8
W4A16
W4A8
W4A4
KV FP8

含义是:

  • W:weights,模型权重;
  • A:activations,推理过程中的激活;
  • KV:attention 的 key/value cache;
  • W4A16:权重 4-bit,激活仍用 16-bit;
  • W8A8:权重和激活都 8-bit;
  • W4A4:权重和激活都 4-bit,难度明显更高。

LLM 中最常见的入门方案是 weight-only quantization,例如 W4A16。它主要减少权重显存和带宽,对内核要求相对低,也更容易保留模型质量。

这些记法也能直接推导出成本结构。

方案权重成本激活成本典型优势典型难点
W8A16权重减半左右激活不变稳定、易部署加速有限
W8A8权重和激活都降到 8-bit激活也下降硬件友好,服务端常见activation outlier 难处理
W4A16权重约四分之一激活不变LLM 本地/单卡部署常用需要好 kernel 才能明显提速
W4A8权重很小,激活也压缩激活下降更高压缩和潜在吞吐质量和 kernel 都更难
W4A4极限低比特激活也极低研究和特定硬件方向通常需要 QAT 或架构协同
W4A16 + KV8权重 4-bit,KV 8-bitKV Cache 降低长上下文 serving长上下文质量必须单测

W4A16 经常被误解成“模型用 4-bit 运行”。更准确地说,它是权重以低比特存储,但激活和很多中间计算仍保持高精度。这也是为什么它比较稳,但速度收益依赖内核是否能把解包、反量化和矩阵乘融合起来。

3. Scale、Zero Point、Group Size

低比特整数本身没有语义,必须配合缩放参数。

int_value -> real_value
real_value ~= (int_value - zero_point) * scale

group_size 表示多少个权重共享一组 scale/zero point。

粒度说明优点缺点
per-tensor整个张量共享 scalemetadata 少,简单精度差
per-channel每个输出通道一组 scale精度好metadata 增加
per-group每 N 个权重一组 scaleLLM INT4 常用折中kernel 更复杂
per-token每个 token 激活动态 scale适合 activation/KVruntime 开销更高
block-wise块级 scale,适配硬件 tile适合 FP8/FP4/MX 格式依赖硬件和框架

G128group_size=128q_group_size=128 这类参数,意思通常是每 128 个连续权重共享一套量化参数。它是 LLM INT4 权重量化里最常见的折中点之一。

可以这样理解:

group size 小:
每组覆盖的数更少,scale 更贴合局部分布,质量更好
但 metadata 更多,kernel 加载 scale 的压力更高

group size 大:
metadata 少,打包更简单
但不同分布的权重被迫共享 scale,误差更大

在同一个模型上,G32G64G128G256 的质量、速度和显存可能不同。它不是纯粹的“越小越好”,因为过小的 group 会增加 scale/zero point 元数据,也可能影响 kernel 的访存模式。

粒度和矩阵维度的关系

Transformer 里的大部分参数在 Linear 层中。一个线性层可以写成:

Y = X W^T + b

X: [batch * seq, in_features]
W: [out_features, in_features]
Y: [batch * seq, out_features]

量化 W 时,per-channel 通常对应 out_features 维度,每个输出通道有自己的 scale;per-group 则通常在 in_features 方向切块,让每个输出通道的若干输入权重共享 scale。不同框架的存储布局可能不同,所以同样叫 per-group,实际打包顺序也要看实现。

这也是格式兼容困难的原因:量化不仅是数学,还涉及张量布局。

4. 对称与非对称量化

对称量化

zero_point = 0
范围大致对称:[-127, 127]

优点是计算简单,硬件友好。缺点是如果数据分布偏移明显,会浪费表示范围。

非对称量化

zero_point != 0
范围可以覆盖非对称分布

优点是更灵活,缺点是计算和内核更复杂。

5. 静态、动态、权重-only

类型含义常见场景
静态量化预先校准权重和激活范围高性能 INT8 部署
动态量化运行时根据输入动态计算 scaleactivation/KV 更灵活
Weight-only只量化权重,激活保持 FP16/BF16LLM 4-bit 常用
KV Cache 量化压缩注意力缓存长上下文、多并发 serving
训练量化训练或微调过程使用低精度FP8 training、QLoRA

6. 校准集

校准集是用来估计激活分布、选择 scale、识别 outlier 或优化量化参数的一小批样本。

它不一定需要标签,但必须代表真实使用场景。

错误校准集会导致:

  • 对聊天好,对代码差;
  • 对英文好,对中文差;
  • 对短上下文好,对长上下文差;
  • 对通用问答好,对领域术语差;
  • 对 dense 模型好,对 MoE routing 差。

7. Outlier

LLM 中经常出现极端激活值或极端权重通道。它们数量很少,但对输出影响很大。

处理 outlier 的路线包括:

  • 保留高精度路径;
  • 对重要通道做缩放保护;
  • 把激活难度迁移到权重;
  • 混合精度保留敏感层;
  • 用旋转变换让分布更均匀;
  • 用 QAT 或轻量优化适配量化误差。

Outlier 是 LLM 量化区别于传统 CNN 量化的关键难点之一。

8. 读工具文档一定会遇到的关键词

下面这些词经常出现在 GPTQ、AWQ、bitsandbytes、TorchAO、vLLM、llama.cpp 的配置里。

关键词深入解释典型影响
calibration用一小批样本估计权重/激活分布,或者优化量化参数决定量化是否贴近真实业务
clipping把极端值裁剪到某个范围内保护主体分布,但可能牺牲 outlier
saturation值超出可表示范围后被压到边界saturation 过高通常意味着 scale 太小
rounding连续值落到哪个离散格点RTN、GPTQ、AutoRound 都在处理舍入问题
codebook非均匀量化的离散值表NF4、向量量化、k-means 量化会用到
packing把多个低比特值打包进一个字节或 word影响文件大小、显存布局和 kernel 读取
dequantization把低比特值恢复成近似实数是否融合到 GEMM 直接影响速度
fused kernel把解包、反量化、矩阵乘合在一个 kernel 中避免中间张量,提升吞吐
act-order / desc_actGPTQ 中按激活重要性调整量化顺序可能改善质量,但影响兼容和速度
static quant提前确定 scale 和 zero point性能稳定,但依赖校准
dynamic quant运行时按输入动态估计 scale更灵活,但有额外开销
fake quant训练中模拟量化误差,但张量仍用浮点保存QAT 常用
STEStraight-Through Estimator,反向传播时近似处理不可导的 round低比特训练和 QAT 的关键技巧
mixed precision不同层、通道或模块使用不同精度保护敏感层,但部署复杂
quantization config描述 bits、group size、scheme、axis、format 的配置没有配置就无法复现

fake quantreal quant 的区别尤其重要:

fake quant:
前向传播中模拟 round/clamp/scale 误差
张量通常仍以 FP32/FP16 保存
用来训练模型适应量化

real quant:
权重或激活真实变成低比特存储/计算格式
进入推理 runtime 和 kernel
用来获得实际部署收益

很多 QAT 流程先用 fake quant 训练,再导出 real quant 模型。如果只做 fake quant 而没有部署到真实低比特 kernel,性能收益不会自动出现。


公式补课:从一层 Linear 看量化到底改了什么

为了真正理解 GPTQ、AWQ、SmoothQuant,需要先看一层 Linear 的计算。

Y = X W^T

其中:

  • X 是输入激活;
  • W 是权重矩阵;
  • Y 是输出激活。

如果做 weight-only 量化,我们保存的不是 W,而是低比特的 Q(W) 加上一些元数据:

W_hat = dequant(Q(W), scale, zero_point)
Y_hat = X W_hat^T
error = Y_hat - Y

注意目标不是让 W_hatW 的每个元素都最接近,而是让 Y_hatY 尽量接近。因为模型下一层看到的是输出激活,不是权重本身。

这就是 GPTQ 要利用输入分布和 Hessian 近似的原因,也是 AWQ 要看激活分布的原因。

1. 元素误差不等于输出误差

两个权重产生同样大小的量化误差,对输出的影响可能不同。

如果某个输入维度经常很大:
这个维度上的权重量化误差会被放大

如果某个输入维度几乎总是接近 0:
这个维度上的权重量化误差影响可能很小

所以一个更贴近推理行为的目标是:

minimize || X W^T - X W_hat^T ||

而不是只看:

minimize || W - W_hat ||

这句话是大模型量化的核心。很多算法差异都来自“你到底用什么近似目标来衡量误差”。

2. 为什么激活比权重更难量化?

权重是固定的,离线扫一遍就知道分布。激活是运行时输入决定的:

同一个模型:
翻译任务的激活分布
代码任务的激活分布
数学任务的激活分布
64k 长上下文任务的激活分布
可能都不同

如果激活量化使用静态 scale,就需要校准集足够代表真实请求;如果使用动态 scale,就要付出运行时统计和缩放开销。

Transformer 里的 activation outlier 还会集中在少数 channel 上。它们数量少,但不能简单丢掉,因为这些维度可能承载重要语义或路由信息。LLM.int8、SmoothQuant、AWQ 都是在围绕这个问题做设计。

3. 为什么 LayerNorm 和 Residual 会影响量化?

Transformer block 里不是只有矩阵乘。典型结构包含:

LayerNorm -> Attention -> Residual
LayerNorm -> MLP -> Residual

Residual stream 会把多层信息累积起来,LayerNorm 会重新缩放分布。量化误差进入 residual 后,可能被后续层继续携带;LayerNorm 的缩放也可能改变 outlier 的表现。

因此一些实践会保留敏感模块高精度,例如:

  • embedding;
  • lm_head;
  • first/last layer;
  • attention output projection;
  • router;
  • vision projector;
  • LayerNorm 周边计算。

这叫 mixed precision 或 layer-wise exception。它牺牲一点压缩率,换取更稳的质量。

4. 量化元数据也占空间

以 INT4 为例,权重主体理论上是 FP16 的四分之一。但实际还要存:

  • scale;
  • zero point;
  • group index 或 block metadata;
  • packing padding;
  • tensor shape;
  • quantization config;
  • 有些格式还会保存额外统计量。

所以真实显存不是简单的:

FP16 size / 4

而更像:

quantized_weight
+ scale_metadata
+ zero_point_metadata
+ padding
+ runtime_workspace
+ KV Cache
+ activations

这也是为什么模型权重量化后,服务端显存峰值仍然可能被 KV Cache、batch、workspace 或 CUDA graph 占用主导。


五、量化复杂体系图

这张图说明了一个事实:你不能只问“这个模型能不能 4-bit”。更合理的问题是:

量化什么对象?
用什么算法?
以什么格式保存?
在哪种硬件上跑?
用哪个推理引擎?
用什么业务评测集判断可用?

六、主流算法路线

1. RTN:Round-to-Nearest

RTN 是最朴素的量化:

直接把每个值除以 scale,再四舍五入到最近的低比特值。

优点:

  • 简单;
  • 快;
  • 不需要训练;
  • 容易实现。

缺点:

  • 对 outlier 敏感;
  • 低比特时误差大;
  • 不理解不同权重对输出的重要性。

RTN 常被用作 baseline,也会出现在 FP8/INT8 的简单 PTQ 流程里。

RTN 的价值不是“最先进”,而是工程上非常重要的参照物。如果复杂算法相比 RTN 只提升一点质量,却让量化耗时、格式兼容和 runtime 复杂度大幅上升,那在生产中未必值得。

RTN 适合的场景:

  • 8-bit 或 FP8 这类误差相对可控的场景;
  • 快速验证某个模型是否量化友好;
  • 作为 GPTQ/AWQ/AutoRound 的 baseline;
  • 对质量要求不高的 embedding、reranker 或小模型;
  • 硬件原生支持某种 block floating 格式时。

RTN 不适合的场景:

  • 4-bit 以下的高质量 LLM;
  • activation outlier 明显的模型;
  • 数学、代码、工具调用等对小概率 token 敏感的任务;
  • 长上下文和多轮一致性要求高的场景。

2. GPTQ:用二阶信息做 one-shot 权重量化

GPTQ 的核心思想是:逐层量化权重时,不只是看权重本身的误差,而是近似考虑这层输入分布和 Hessian 信息,让量化后的层输出尽量接近原始输出。

简化理解:

普通 RTN:哪个数离最近格点近,就舍入到哪里。
GPTQ:考虑舍入这个权重后,会怎样影响该层输出,并对后续权重做补偿。

GPTQ 在 2022 年让 3-bit、4-bit LLM PTQ 变得实用,是很多后续工具和格式的基础。

适合:

  • 4-bit weight-only;
  • 显存有限但仍希望保持质量;
  • 离线量化后部署到 vLLM、ExLlama、Transformers 等生态。

风险:

  • 校准集会影响结果;
  • 量化耗时比 RTN 高;
  • 不同 kernel 和格式兼容性要检查;
  • 新模型结构可能需要适配。

更细一点看,GPTQ 的流程可以理解为:

1. 收集校准样本,跑一遍模型,记录每层输入激活 X
2. 对每个 Linear 层,估计 X^T X 或 Hessian 相关近似
3. 按列或按重要性顺序量化权重
4. 每量化一部分权重,就把误差补偿到后续未量化权重
5. 保存低比特权重、scale、zero point、group size、act-order 等元数据

GPTQ 关注的是“舍入某个权重后,如何影响这层输出”。它不是训练,不需要反向传播更新整个模型,但它比普通 RTN 更理解该层输入分布。

常见 GPTQ 参数含义:

参数含义影响
bits量化 bit 数4-bit 常见,3-bit 更激进
group_size每组共享 scale 的权重数量小 group 质量更好但 metadata 更多
damp_percentHessian 阻尼,改善数值稳定性太小可能不稳定,太大可能欠拟合
desc_act / act-order按激活重要性顺序量化可能提升质量,但影响速度和兼容
sym是否对称量化对称更简单,非对称更灵活
true_sequential是否按模块顺序逐步量化更贴近真实前向,但更慢

GPTQ 的核心风险是“校准集和实现细节绑定较深”。同样是 GPTQ,校准文本、group size、act-order、kernel 支持不同,最终模型可能不是同一个工程制品。

3. SmoothQuant:把激活难题迁移到权重

很多 LLM 层的权重相对容易量化,激活更难,因为激活会出现 outlier。

SmoothQuant 的思路是做一个数学上等价的缩放变换:

降低激活 outlier 的量化难度
把一部分难度迁移到权重上
权重更容易承受这部分变化

它主要面向 W8A8,也就是权重和激活都 8-bit。优点是硬件友好,适合服务端 INT8 推理。

SmoothQuant 的关键是一个等价变换。对矩阵乘:

Y = X W

可以插入一个按通道的缩放向量 s

Y = (X / s) (s * W)

如果某些激活 channel 特别大,就用 s 把激活压平,同时把相反的缩放迁移到权重。数学上输出不变,但量化难度从“难量化的激活”转移到“更容易离线处理的权重”。

SmoothQuant 的关键参数通常是迁移强度,可以理解为:

alpha 小:更多保护权重,激活 outlier 仍明显
alpha 大:更多平滑激活,权重分布变得更难

它适合追求 W8A8、INT8 Tensor Core 或服务端稳定吞吐的场景。它不等同于 4-bit weight-only,关注点也不一样。

4. LLM.int8():outlier 单独保留高精度

LLM.int8() 观察到大模型中存在少数非常关键的 outlier feature。它把绝大多数计算放到 INT8,同时把 outlier 维度拆出来走高精度路径。

简化理解:

99.9% 普通值:INT8
少量 outlier:FP16
结果:接近无损,显存下降明显

bitsandbytes 的 8-bit 加载和训练生态,很大程度推动了这条路线的普及。

LLM.int8 的直觉是:与其强行把 outlier 压进 INT8,不如承认少量通道确实不适合低精度,把它们拆出去保留高精度。

这是一种典型的混合精度策略:

部分处理方式原因
普通通道INT8 矩阵乘数量多,适合低精度加速和省显存
outlier 通道FP16/BF16 路径数量少但影响大,强行量化会损害质量
最终输出合并两路结果在效率和精度之间折中

它的优势是质量稳定,缺点是 kernel 和实现更复杂,且压缩率不如纯 4-bit weight-only 激进。

5. QLoRA:量化不是只为推理,也能让微调变便宜

QLoRA 不是简单“把模型量化后推理”,而是:

冻结 4-bit NF4 基座模型
反向传播穿过量化模型
只训练 LoRA adapter

它的关键创新包括:

  • NF4:更适合近似正态分布权重;
  • Double Quantization:连量化常数也再量化,进一步省显存;
  • Paged Optimizers:缓解训练时显存峰值。

QLoRA 的价值是让 33B、65B 这类模型的微调门槛大幅下降。

QLoRA 要分清两件事:

基座模型:
4-bit NF4 存储,通常冻结不训练

LoRA adapter:
小规模可训练参数,通常 FP16/BF16

反向传播会穿过量化基座,但主要更新 LoRA 参数。这让显存大幅下降,同时避免直接训练完整低比特基座的困难。

NF4 之所以重要,是因为神经网络预训练权重常接近正态分布。普通 INT4 的格点是均匀间隔,NF4 的离散值更贴近正态分布下的高概率区域。直观地说,它把有限的 16 个 4-bit 格点更多分配给“权重更常出现的位置”。

QLoRA 常见风险:

  • adapter 训练数据质量仍然是核心,不会因为 4-bit 自动变好;
  • 量化基座、LoRA target modules、rank、alpha、学习率互相影响;
  • 最终部署时,adapter 合并、继续外挂 adapter、重新量化会产生不同结果;
  • 训练能跑不等于 serving 最快,bitsandbytes 更偏训练/加载便利。

6. AWQ:根据激活识别重要权重通道

AWQ 的出发点是:不是所有权重同等重要。少量 salient weights 对输出影响很大。

它通过激活统计识别重要通道,再用等价缩放保护这些通道,同时避免硬件不友好的逐权重混合精度。

适合:

  • 4-bit weight-only;
  • 指令模型;
  • 多模态模型;
  • 端侧和本地推理;
  • 需要较好泛化而不想过度依赖校准集的场景。

AWQ 的关键观察是:保护少量重要权重,比平均保护所有权重更有效。它不是简单地把重要权重保留成 FP16,而是通过等价缩放让这些重要通道在量化后保留更多信息,同时仍保持硬件友好的整块低比特结构。

可以把 AWQ 理解成三步:

1. 用校准样本观察激活,判断哪些 channel 对输出更敏感
2. 对重要 channel 做缩放保护,让它们量化损失更小
3. 把缩放后的权重整体量化,保持 kernel 友好的 weight-only 格式

这就是 AWQ 与“逐权重混合精度”的区别:它尽量避免破坏低比特矩阵乘的规则结构。

AWQ 在多模态模型中也常被讨论,因为视觉语言模型的 projector、vision token 和语言层对误差的敏感度不一样。对这类模型,校准样本最好包含真实图文输入,而不是只喂纯文本。

7. SpQR、OmniQuant、AutoRound 与更新路线

后续方法大多围绕三个问题展开:

  1. 哪些值最敏感?

    • SpQR 隔离 outlier weights;
    • mixed precision 保留关键层或关键通道。
  2. 量化参数如何更好地优化?

    • OmniQuant 优化 clipping 和等价变换;
    • AutoRound 优化 rounding 策略;
    • SignRound 等方法进一步改善低比特舍入。
  3. 如何适配硬件?

    • Marlin、ExLlama、GGML、CUTLASS、Triton kernel 让压缩真正变成速度;
    • FP8、FP4、MXFP4、NVFP4 逐渐与硬件 Tensor Core 绑定。

这些方法可以按“主要优化对象”来理解。

方法主要想解决什么适合关注点
SpQRoutlier weight 对低比特量化破坏大near-lossless 压缩、稀疏异常值
OmniQuantclipping、scale、等价变换需要联合优化无需大规模训练的 PTQ 质量
AutoRoundround 到哪个格点不是固定规则低比特舍入优化、工程易用性
Rotation-based quantization分布不均匀,outlier 集中通过旋转让分布更平滑
Mixed precision少数层明显更敏感生产质量兜底
QATPTQ 已不足以保质量极低比特或高风险任务

现代量化已经从“把权重 round 一下”演化成多目标优化:既要让误差小,又要保持 kernel 规则;既要利用校准数据,又不能过拟合;既要压缩权重,也要考虑激活、KV Cache、MoE routing 和业务回归。

8. 主流路线横向对比

路线主要对象是否需要校准集常见目标优势风险
RTN权重/激活不一定快速 baseline简单、快、易实现低比特质量差
GPTQ权重需要W4A16 / W3A164-bit 质量好,生态成熟校准和参数敏感
AWQ权重需要少量激活统计W4A16泛化较好,适合指令/VLMruntime 支持要确认
SmoothQuant权重 + 激活需要W8A8服务端 INT8 友好主要面向 8-bit
LLM.int8权重/矩阵乘 + outlier较少8-bit 加载/推理稳,质量损失小压缩率不如 4-bit
QLoRA4-bit 基座 + LoRA训练数据低成本微调显存门槛低serving 方案需另选
FP8权重/激活/训练取决于流程新 GPU 训练/推理硬件原生支持强依赖硬件和框架
KV quantKV Cache需要长上下文验证长上下文/高并发降低 serving 显存可能损害引用和记忆
QAT权重/激活需要训练极低比特/高质量质量潜力高成本高、流程复杂

一个常见误区是把这些路线看成排名。实际上它们解决的问题不同:

要本地跑得起来:优先 GGUF / W4A16
要服务端吞吐:优先 FP8 / W8A8 / AWQ / GPTQ + runtime
要低成本微调:优先 QLoRA
要长上下文并发:必须考虑 KV Cache
要极低比特:PTQ 可能不够,需要 QAT 或架构协同

七、量化对象:不只是权重

1. 权重量化

权重量化是最常见、最容易理解的量化。

优点:

  • 权重是静态的,可以离线处理;
  • 显存收益稳定;
  • 对 decode 阶段权重带宽有帮助;
  • 可以直接发布量化 checkpoint。

典型格式:

  • GGUF;
  • GPTQ;
  • AWQ;
  • bitsandbytes 4-bit;
  • compressed-tensors;
  • TorchAO tensor subclass。

2. 激活量化

激活是运行时产生的,跟输入有关。

难点:

  • 分布动态变化;
  • outlier 更明显;
  • 长上下文和不同任务分布差异大;
  • scale 计算会引入 runtime overhead。

激活量化能让矩阵乘法更彻底地使用低精度硬件,但难度比 weight-only 高。

3. KV Cache 量化

KV Cache 是现代 LLM serving 的核心瓶颈之一。

自回归生成时,每生成一个 token,都要保留前面 token 的 key/value。上下文越长、并发越高,KV Cache 越大。

KV Cache size ~= layers * sequence_length * hidden_dim * batch * dtype

更完整地说,KV Cache 近似由下面几个变量决定:

layers
* batch_size
* sequence_length
* num_kv_heads
* head_dim
* 2 # K 和 V 两份缓存
* bytes_per_value

在 grouped-query attention 或 multi-query attention 中,num_kv_heads 会小于 num_attention_heads,这本身就是一种降低 KV Cache 成本的结构设计。量化 KV Cache 则是在结构之外进一步压缩 bytes_per_value

KV Cache 量化的价值:

  • 支持更长上下文;
  • 提高并发;
  • 降低显存;
  • 降低 attention 读取带宽。

但它也可能影响长上下文检索、细粒度引用和多轮对话稳定性,因此必须用长上下文评测单独验证。

KV Cache 量化常见策略:

策略说明风险
KV8K/V 用 8-bit 保存通常较稳,但仍需长上下文回归
KV4K/V 用 4-bit 保存压缩强,质量风险更大
per-token scale每个 token 或 block 动态 scale质量好,metadata 和计算开销更高
sliding window只保留局部窗口或压缩远端上下文可能影响远距离引用
mixed precision KV近期 token 高精度,远期 token 低精度适合长上下文,但实现更复杂

长上下文场景里,权重显存可能不是最大瓶颈。一个 7B 模型量化到 4-bit 后,权重已经很小,但当上下文拉到 128k、并发增加时,KV Cache 会迅速成为主成本。Agent、多轮对话、RAG 长文档、代码仓库问答都属于这种情况。

4. 训练量化和优化器状态

训练阶段的显存不只来自模型权重,还包括:

  • 梯度;
  • optimizer states;
  • activation checkpoints;
  • master weights;
  • LoRA adapter;
  • 数据并行通信 buffer。

QLoRA 通过 4-bit frozen base + LoRA 显著降低微调成本。FP8 training 则把训练计算本身推向低精度硬件。

5. MoE 与多模态量化

MoE 模型有额外问题:

  • 不同 expert 分布不同;
  • router 对误差敏感;
  • expert 并非每次都激活;
  • 热门 expert 和冷门 expert 校准样本不均衡。

多模态模型也类似:

  • 视觉塔、音频塔、语言塔分布不同;
  • projector 可能非常敏感;
  • 图像 token、音频 token、文本 token 的激活范围不同;
  • 只用文本校准集会误伤视觉问答。

现代量化越来越强调 architecture-awaremodality-aware,不能再把所有 Linear 层一刀切。


八、硬件与内核:为什么量化后不一定更快?

模型变小,不等于速度一定提升。

量化模型在现代推理服务中的位置

图 2 展示了量化模型进入推理服务后的真实位置:用户请求先经过调度层,再由 runtime 加载量化模型制品,最后交给低比特 kernel 和硬件执行。权重量化、激活量化、KV Cache 量化分别作用在不同瓶颈上。只有模型格式、runtime、kernel 和硬件路径都匹配,量化才会同时带来显存、吞吐和延迟收益。

1. 低比特计算需要匹配硬件

如果 GPU 没有高效 INT4/FP8/FP4 Tensor Core,或者推理框架没有对应 kernel,低比特权重可能要先解包、反量化成 FP16 再算。

这时收益主要是省显存,不一定提速。

理想:INT4 packed weights -> Tensor Core / custom kernel -> 快速输出
糟糕:INT4 unpack -> dequant to FP16 -> 普通 FP16 GEMM -> 额外开销

2. Prefill 和 Decode 的瓶颈不同

LLM 推理分两个阶段:

阶段特点常见瓶颈
Prefill处理输入 prompt,矩阵乘法大计算吞吐
Decode每次生成一个 token权重/KV 读取、调度、batching

Weight-only INT4 对 decode 很有帮助,因为 decode 经常被内存带宽限制。但 prefill 可能需要更高效的矩阵乘内核才能明显加速。

可以用一个简单判断理解:

如果瓶颈是内存带宽:
权重/KV 变小通常很有帮助

如果瓶颈是计算吞吐:
必须有硬件原生低精度算子和高效 kernel

如果瓶颈是调度:
量化本身帮不了太多,需要 batching、cache、路由和队列优化

Prefill 阶段一次处理很多 prompt token,矩阵乘规模大,容易接近 compute-bound;decode 阶段每次只生成一个 token,batch 维度小,频繁读取权重和 KV Cache,更容易 memory-bound。量化对这两个阶段的收益曲线不同,所以性能报告必须拆开测。

一个合格的性能表至少要分开记录:

指标为什么要单独看
TTFT用户感知首 token 延迟,主要受 prefill 和排队影响
decode tokens/s生成阶段速度,常受权重/KV 读取影响
request throughput服务整体吞吐,受 batching 和调度影响
P95/P99 latency量化可能改善均值但恶化尾延迟
max concurrencyKV Cache 和显存碎片会限制并发
memory peak权重、KV、activation、workspace 都要算

3. Kernel 决定上限

典型低比特内核问题包括:

  • 权重打包格式;
  • group scale 加载;
  • 反量化是否融合到 GEMM;
  • act-order 是否需要重排;
  • batch size 多大;
  • 是否支持 MoE;
  • 是否支持 tensor parallel;
  • 是否支持 CUDA graph;
  • 是否支持 attention/KV cache 低精度。

很多量化论文只证明“模型质量可接受”,真正生产还要看 kernel 是否足够成熟。

4. CPU、GPU、Apple Silicon、NPU 是不同世界

平台常见路线
x86 CPUAVX2/AVX512/VNNI/AMX,常见 INT8/INT4 优化
ARM CPUNEON、i8mm,端侧和移动设备重要
NVIDIA GPUTensor Core,FP16/BF16/INT8/FP8/FP4 路线
AMD GPUROCm/HIP,支持进展取决于框架
Apple SiliconMetal/MLX/llama.cpp,本地推理体验强
NPU/TPU/Gaudi/Ascend通常依赖厂商编译器和特定低精度格式

选择量化格式前,先看目标硬件和推理引擎支持什么。


现代方式:量化已经从脚本变成平台能力

早期量化经常是一个离线脚本:

load fp16 model
run quantize.py
save quantized checkpoint

现代 LLM 量化更像平台能力,至少有六条路线并行存在。

1. 离线 checkpoint 量化

这是最容易理解的方式:把一个 FP16/BF16 模型离线转换成低比特制品,再上传或分发。

典型路线:

  • llama.cpp 转 GGUF;
  • GPTQModel 生成 GPTQ checkpoint;
  • AWQ/LLM Compressor 生成 AWQ 或 compressed-tensors;
  • TensorRT-LLM / ModelOpt 生成面向 NVIDIA 的优化制品。

优点是部署时加载快,制品可版本化;缺点是每个 runtime 支持的格式和 kernel 不同。

2. 加载时量化

有些框架允许加载 FP16 模型时直接指定低比特配置,例如使用 bitsandbytes 4-bit/8-bit 加载。它适合实验、微调和快速验证。

优点:

  • 不需要提前保存多个量化副本;
  • 和 Transformers、PEFT、训练脚本结合方便;
  • 适合 QLoRA 这类微调流程。

缺点:

  • 加载和初始化可能更慢;
  • serving 性能不一定最优;
  • 线上制品可复现性需要额外记录配置。

3. 硬件原生低精度

FP8、FP4、MXFP4、NVFP4 代表的是另一条路线:让硬件直接提供更低精度的数据格式和计算能力。

这类方式的关键不是“文件压得多小”,而是:

  • Tensor Core 或矩阵引擎是否原生支持;
  • framework 是否能自动选择低精度 kernel;
  • scale/block metadata 是否适配硬件 tile;
  • 训练和推理是否共用一套低精度策略。

在新 GPU 上,FP8/FP4 往往比传统 INT4 checkpoint 更接近“平台默认能力”。

4. Runtime 内置压缩

现代 serving 框架越来越多地把量化当成 runtime 能力,而不是外部工具。

例如 vLLM 需要同时考虑:

  • 权重量化格式;
  • PagedAttention;
  • KV Cache dtype;
  • continuous batching;
  • tensor parallel;
  • speculative decoding;
  • LoRA serving;
  • prefix caching;
  • CUDA graph;
  • 多模型路由。

量化如果不能和这些能力一起工作,线上价值会打折。

5. 面向训练和微调的量化

QLoRA、FP8 training、QAT、低比特 optimizer 是训练侧路线。它们关注的是训练显存、通信、optimizer state 和反向传播稳定性,而不是单纯推理速度。

训练侧量化要额外关注:

  • 梯度缩放;
  • loss scale;
  • optimizer state 精度;
  • activation checkpointing;
  • distributed training 通信精度;
  • adapter 合并后的部署格式。

6. 结构感知量化

现代模型越来越复杂,不能再一刀切扫描所有 Linear 层。

结构感知量化会区分:

  • attention 的 Q/K/V/O projection;
  • MLP 的 gate/up/down projection;
  • embedding 和 lm_head;
  • MoE router 和 experts;
  • vision encoder 和 projector;
  • audio/video encoder;
  • speculative decoding draft model;
  • safety head 或 reward model。

一些层可以 4-bit,一些层更适合 8-bit,一些层应该保留 BF16。这类 mixed precision 策略往往比盲目全模型 4-bit 更可靠。


九、现代量化工作流

1. 明确目标

不同目标会导向不同方案。

目标推荐起点
本地运行聊天模型GGUF + llama.cpp / Ollama
消费级 NVIDIA GPUGPTQ/AWQ/EXL2 + ExLlama/vLLM
服务端高吞吐vLLM + FP8 / AWQ / GPTQ / compressed-tensors
NVIDIA 生产优化TensorRT-LLM / ModelOpt / FP8
低成本微调QLoRA + bitsandbytes + PEFT
CPU 或边缘设备llama.cpp GGUF / Intel Neural Compressor / TorchAO
长上下文 servingKV Cache quantization + 长上下文回归
多模态模型modality-aware calibration,不要只用文本校准

2. 建立 FP16/BF16 基线

先记录原模型:

  • 显存;
  • TTFT;
  • tokens/s;
  • 吞吐;
  • 困惑度;
  • MMLU/GSM8K/代码/领域集;
  • 长上下文;
  • 安全拒答;
  • 业务人工样例。

没有基线,量化后的“差不多”没有意义。

3. 选择校准集

校准集应该覆盖真实分布:

  • 短问答;
  • 长上下文;
  • 代码;
  • 中文;
  • 数学;
  • 工具调用;
  • 表格;
  • 领域术语;
  • 多轮对话;
  • 多模态输入。

通常几十到几百条就能做基础 PTQ,但高风险场景要扩大覆盖。

4. 先从保守方案开始

推荐路线:

FP16/BF16 baseline
-> INT8 或 FP8
-> W4A16
-> W4A8 / W4A4
-> KV Cache quantization
-> mixed precision / layer-wise exception

不要一开始就追极限 2-bit。量化的目标是可用,不是数字越低越好。

5. 用决策树选择第一版方案

这棵树的原则是:先选择最容易验证、最容易回滚、最符合目标硬件的方案,再逐步压低 bit 数。很多团队一开始直接追 3-bit 或 2-bit,最后节省的显存不如调试和质量回归成本大。

6. 量化后一定要做业务回归

通用 benchmark 不够。量化可能不会明显影响 MMLU,却会影响:

  • 输出格式稳定性;
  • 工具调用 JSON;
  • 中文专有名词;
  • 数学步骤;
  • 长上下文引用;
  • RAG 答案中的细节;
  • 安全边界;
  • 代码补全。

生产中应建立量化回归集,并在每次模型、校准集、runtime 或 kernel 变化时重新跑。


十、如何选择量化方案?

场景一:个人电脑或本地应用

优先考虑:

  • llama.cpp
  • Ollama
  • GGUF
  • Q4_K_M、Q5_K_M、Q8_0 等量化等级。

经验规则:

  • 显存/内存很紧:Q4;
  • 想要质量更稳:Q5/Q6;
  • 追求接近原始:Q8;
  • CPU-only:关注线程数、内存带宽、BLAS/Metal/Vulkan 后端。

场景二:单机多卡或服务端推理

优先考虑:

  • vLLM;
  • TensorRT-LLM;
  • FP8;
  • AWQ;
  • GPTQ;
  • compressed-tensors;
  • KV Cache FP8。

经验规则:

  • H100/H200/Blackwell 等新卡:优先评估 FP8/FP4 生态;
  • A100/A10/4090:INT4 weight-only、AWQ/GPTQ 仍然常见;
  • 高并发长上下文:重点评估 KV Cache 量化;
  • MoE:确认专家量化和 router 兼容性。

场景三:低成本微调

优先考虑:

  • QLoRA;
  • bitsandbytes 4-bit;
  • PEFT;
  • NF4;
  • LoRA adapter。

经验规则:

  • 基座模型 frozen;
  • adapter 用 FP16/BF16;
  • 优先保存 adapter 和训练配置;
  • 最终部署时再决定是否合并或继续使用量化基座。

场景四:企业生产

优先级不应该只看压缩率。

建议排序:

业务质量 > 可回滚 > runtime 稳定 > 监控可解释 > 成本下降 > 极限压缩率

企业生产还要考虑:

  • 模型许可证;
  • checkpoint 来源;
  • 格式长期可维护;
  • 硬件供应;
  • 多区域部署;
  • 灰度回滚;
  • 量化前后安全评测;
  • 量化模型是否能进入模型注册表和审计链路。

十一、高 star 开源生态梳理

下面 star 数为 GitHub 页面在 2026-06-19 检索到的近似值。Star 不是技术质量排名,只能反映生态热度、历史积累和社区关注度。

项目Star类型和量化的关系
Ollama175k本地模型运行平台让用户直接拉取和运行量化模型,底层大量受益于 llama.cpp/GGUF 生态
Transformers162k模型定义与生态中枢集成 bitsandbytes、GPTQ、AWQ、Optimum 等量化入口,是模型兼容性的中心
llama.cpp117kC/C++ 本地推理引擎GGUF、低比特量化、本地 CPU/GPU/Metal/Vulkan 推理的事实标准之一
vLLM83.3k高吞吐 LLM serving支持 FP8、MXFP8/MXFP4、NVFP4、INT8、INT4、GPTQ、AWQ、GGUF、TorchAO 等量化路径
TensorRT-LLM13.9kNVIDIA 推理优化栈面向 NVIDIA GPU 的高性能 LLM 推理与低精度优化
bitsandbytes8.3kk-bit PyTorch 量化库8-bit/4-bit 加载、QLoRA、低成本微调的重要基础库
AutoGPTQ5.1kGPTQ 量化工具GPTQ 易用封装;仓库已于 2025-04-11 archived,官方建议迁移 GPTQModel
ExLlamaV24.6k消费级 GPU 推理库GPTQ/EXL2 本地推理性能强;仓库提示开发转向 ExLlamaV3
AWQ3.6kAWQ 原始实现Activation-aware Weight Quantization,支持 INT3/4、TinyChat、VLM
LLM Compressor3.4kvLLM 量化压缩工具链支持 GPTQ、AWQ、SmoothQuant、AutoRound、KV Cache、compressed-tensors
Optimum3.4kHugging Face 硬件优化工具面向 Transformers/Diffusers 等模型的训练和推理优化入口
GPTQ-for-LLaMa3.1k早期 GPTQ LLaMA 工具4-bit LLaMA GPTQ 的早期重要项目,README 推荐转向 AutoGPTQ
TorchAO2.9kPyTorch 原生优化库支持 INT4、INT8、FP8、MXFP4/MXFP8、QAT/PTQ、稀疏等训练到服务优化
Intel Neural Compressor2.7k通用模型压缩工具面向 PyTorch/TensorFlow/ONNX/JAX 的量化、剪枝、蒸馏和稀疏
AutoAWQ2.3kAWQ 易用封装已于 2025-05-11 archived,README 提示 vLLM 项目已接手相关方向
AutoRound1.5krounding 优化量化算法支持 CPU/XPU/CUDA,兼容 vLLM、SGLang、Transformers、GGUF
GPTQModel1.2kGPTQ 后继工具链面向 NVIDIA/AMD/Intel/Apple CPU 等多硬件,兼容 HF、vLLM、SGLang

怎么读这张表?

这些项目分成四类:

  1. 生态中枢:Transformers、Optimum、TorchAO;
  2. 本地推理:llama.cpp、Ollama、ExLlama;
  3. 服务端推理:vLLM、TensorRT-LLM;
  4. 量化算法/压缩工具:bitsandbytes、GPTQModel、AWQ、LLM Compressor、AutoRound、Neural Compressor。

生产选型时不要只看 star。更应该问:

  • 是否仍维护?
  • 是否支持目标模型结构?
  • 是否支持目标硬件?
  • 是否支持目标推理引擎?
  • 是否有成熟 kernel?
  • 是否能保存到长期可读格式?
  • 是否有评测和回滚流程?

AutoGPTQ、AutoAWQ、ExLlamaV2 都有很高历史价值,但页面已经提示维护状态变化;新项目更应该看 GPTQModel、LLM Compressor、vLLM、TorchAO 等仍活跃路线。

开源项目不是同一层东西

很多人把上面这些项目放在同一个维度比较,这是不准确的。更合理的分层是:

层级你真正需要它解决什么代表项目
模型入口层下载模型、加载配置、兼容 tokenizer 和模型结构Transformers、Optimum
量化算法层把 FP16/BF16 模型变成低比特制品GPTQModel、LLM Compressor、AWQ、AutoRound、bitsandbytes
制品格式层保存低比特权重和量化元数据GGUF、GPTQ/AWQ checkpoint、compressed-tensors、safetensors
Runtime 层管理请求、batch、KV Cache、模型加载和执行vLLM、llama.cpp、Ollama、TensorRT-LLM
Kernel 层真正执行低比特矩阵乘和 attentionGGML、Marlin、ExLlama、CUTLASS、Triton、TorchAO
硬件层提供低精度指令和内存带宽NVIDIA GPU、Apple Silicon、x86 AMX、ARM NEON、NPU

因此,“Transformers 支持某个量化模型”不等于“生产 serving 最快”;“某个 GitHub 项目能量化”也不等于“目标 runtime 有高性能 kernel”。工程选型要看链路完整性。

典型组合

目标推荐组合说明
Mac 本地聊天Ollama / llama.cpp + GGUF Q4/Q5简单稳定,适合本地应用
消费级 NVIDIA GPUExLlama/GPTQModel 或 vLLM + GPTQ/AWQ关注显存和单用户 tokens/s
服务端 APIvLLM + AWQ/GPTQ/FP8/compressed-tensors关注 batching、KV Cache 和吞吐
NVIDIA 高性能部署TensorRT-LLM + FP8/INT8/FP4 路线版本、硬件和编译链绑定更强
低成本微调Transformers + PEFT + bitsandbytes/QLoRA训练方便,serving 另行评估
PyTorch 原生优化TorchAO适合跟 PyTorch 生态和新低精度类型结合
Intel/CPU/ONNX 场景Neural Compressor / OpenVINO / ONNX Runtime关注 CPU 指令集和图优化

看开源项目时要问的十个问题

  1. 最近是否仍在维护?
  2. 支持哪些模型结构,是否支持当前模型的 attention、MoE、VLM projector?
  3. 支持哪些量化对象,是只支持权重,还是也支持激活和 KV Cache?
  4. 输出格式能被哪些 runtime 直接加载?
  5. 目标硬件上是否有成熟 kernel?
  6. 是否支持 tensor parallel、pipeline parallel、LoRA、speculative decoding?
  7. 量化配置是否能完整保存并复现?
  8. 是否有官方或社区 benchmark,是否区分 prefill/decode?
  9. 是否有 archived、迁移、重命名或维护者变更风险?
  10. 许可证是否允许你的业务使用和再分发?

十二、常见格式和生态关系

格式/生态典型用途优点注意事项
GGUFllama.cpp/Ollama 本地推理自包含、跨平台、本地生态强不一定适合服务端 GPU 高吞吐
GPTQ4-bit weight-only质量好、生态广kernel 和 act-order 兼容性要看 runtime
AWQ4-bit weight-only泛化好、VLM 支持较好工具链迁移到 vLLM/LLM Compressor 等方向
bitsandbytes8-bit/4-bit 加载和 QLoRA易用、训练生态成熟生产 serving 不一定是最高性能
compressed-tensorsvLLM 压缩模型交换格式面向现代 serving生态仍在快速演进
TorchAOPyTorch 原生低精度张量训练到推理统一需要跟 PyTorch 和 runtime 版本对齐
ONNX / TensorRT工业推理部署硬件优化强LLM 动态结构和新模型支持要验证

十三、量化评测:不要只看模型能不能回答

量化评测至少分四层。

1. 数值层

  • 权重重建误差;
  • layer output MSE;
  • activation range;
  • saturation ratio;
  • outlier coverage;
  • dequant 后分布漂移。

2. 模型层

  • Perplexity;
  • MMLU;
  • GSM8K;
  • HumanEval;
  • MT-Bench;
  • code benchmark;
  • 多语言 benchmark。

3. 系统层

  • 显存峰值;
  • 模型加载时间;
  • TTFT;
  • tokens/s;
  • request throughput;
  • P50/P95/P99 latency;
  • prefill/decode 分别测速;
  • batch size 扩展曲线;
  • 长上下文 KV Cache 占用。

4. 业务层

  • RAG 引用准确率;
  • JSON/tool call 成功率;
  • 安全拒答一致性;
  • 中文术语准确性;
  • 领域问答;
  • 长文档摘要;
  • 多轮记忆;
  • 线上 A/B 质量。

一个健康的量化报告应该长这样:

model: "Qwen-like-32B"
baseline_dtype: "BF16"
quantized_dtype: "W4A16-G128-AWQ"
runtime: "vLLM"
hardware: "A100-80G"

quality:
perplexity_delta: "+1.8%"
mmlu_delta: "-0.4"
gsm8k_delta: "-0.8"
json_tool_call_success_delta: "-0.2%"
domain_qa_pass_rate: "96.5%"

performance:
memory_reduction: "58%"
ttft_delta: "-12%"
decode_tokens_per_second_delta: "+41%"
max_batch_size_delta: "+75%"

risks:
- "长上下文 64k needle recall 下降 2.1%"
- "数学链式推理对 3-bit 更敏感,当前不启用 3-bit"

十四、常见误区

1. “4-bit 一定比 8-bit 快”

不一定。

如果硬件和 kernel 不支持高效 4-bit,解包和反量化开销可能抵消收益。8-bit 反而可能更快、更稳。

2. “量化只影响模型质量,不影响系统行为”

量化会影响输出分布,进而影响:

  • sampling;
  • tool calling;
  • JSON 格式;
  • safety classifier;
  • speculative decoding acceptance rate;
  • RAG 引用细节;
  • 长上下文注意力。

3. “通用 benchmark 没掉就可以上线”

量化后 MMLU 没掉,不代表业务可用。生产必须用领域回归集。

4. “校准集越小越快越好”

校准集太小会过拟合或漏掉分布。特别是代码、中文、多模态、长上下文、工具调用都要覆盖。

5. “量化模型就是原模型的低配版”

量化模型是一个新 artifact,应该有自己的:

  • 版本;
  • 评测报告;
  • runtime 依赖;
  • checksum;
  • 许可证;
  • 发布记录;
  • 回滚策略。

6. “越低 bit 越先进”

2-bit 或 1.58-bit 很吸引人,但生产价值取决于:

  • 质量;
  • kernel;
  • 硬件;
  • 工具链;
  • 维护成本;
  • 评测覆盖。

极低比特通常需要架构、训练和硬件共同设计,不能简单套用到所有模型。


十五、未来趋势

1. 从 PTQ 走向模型-硬件协同设计

未来的模型可能从训练开始就考虑低比特部署,而不是训练完再压缩。

典型方向:

  • FP8 training;
  • FP4/NVFP4/MXFP4;
  • BitNet / ternary LLM;
  • low-bit friendly architecture;
  • quantization-aware pretraining。

2. KV Cache 量化会越来越重要

长上下文、Agent、多轮对话和高并发 serving 会让 KV Cache 成本快速上升。只量化权重已经不够。

3. MoE 与多模态量化成为核心难题

新模型越来越多使用 MoE、视觉、音频、视频、工具调用。量化必须理解结构,而不是只扫 Linear 层。

4. 量化格式会继续分裂,然后再收敛

短期内会有更多格式:

  • GGUF;
  • EXL2;
  • GPTQ;
  • AWQ;
  • FP8 block;
  • NVFP4;
  • compressed-tensors;
  • vendor-specific formats。

长期看,生产会倾向能跨框架、可审计、可复现、可部署的格式。模型仓库会越来越像软件制品仓库。

5. 评测会从“平均准确率”走向“行为稳定性”

量化后的模型可能平均分数接近原模型,但在特定行为上变得不稳定。未来评测会更关注:

  • tool call schema;
  • long-context faithfulness;
  • refusal consistency;
  • code execution correctness;
  • multi-turn drift;
  • RAG citation grounding;
  • domain-specific edge cases。

十六、选型备忘录

可以把量化选型压缩成下面这张表。

你要解决什么首选方向不建议一开始做什么
本地跑模型GGUF + llama.cpp/Ollama自己写 kernel
便宜微调QLoRA + bitsandbytes + PEFT全参数低比特训练
服务端降显存AWQ/GPTQ/FP8 + vLLM没评测直接上 3-bit
NVIDIA 极致推理TensorRT-LLM / FP8 / FP4忽略版本和硬件绑定
CPU 部署llama.cpp / Neural Compressor / TorchAO假设 GPU 方案可直接迁移
长上下文KV Cache 量化 + LongBench/needle 回归只看短文本 benchmark
多模态modality-aware calibration只用纯文本校准集
企业生产量化报告 + 灰度 + 回滚只根据 star 或榜单选工具

总结

量化的本质,是在 精度、内存、带宽、计算、硬件、格式和质量 之间做工程交易。

它的发展路径经历了:

信号处理量化
-> 神经网络低比特推理
-> 移动端 INT8
-> LLM weight-only 4-bit
-> QLoRA 低成本微调
-> FP8/FP4 与现代推理系统
-> KV Cache、MoE、多模态和端侧协同量化

现代 LLM 量化不能只看“几 bit”。真正要回答的是:

  • 量化对象是什么?
  • 算法如何控制误差?
  • 格式能否长期维护?
  • runtime 是否有高效 kernel?
  • 硬件是否真的支持?
  • 评测是否覆盖业务失败模式?
  • 线上是否能监控和回滚?

当这些问题都能回答时,量化才从“压缩技巧”变成“AI 基础设施”。


参考资料

Logo
RainLib

Exploring the frontiers of technology, design, and distributed systems. Building tools for the future developers.

Suggestions & Feedback

© 2026 RainLib. Built for the Future.
All rights reserved.
System Normal