Skip to content

模型量化

> 这是一份面向阅读与复习的结构化笔记,重点不是罗列论文细节,而是建立:概念框架 → 方法地图 → 影响判断 → 选型思路

相关文章


1. 量化在解决什么问题

随着 TransformerMoE 等架构推动模型规模持续增长,部署大模型时会同时遇到:

  • 显存占用高
  • 内存带宽压力大
  • 推理延迟和吞吐受限
  • 长文本场景下 KV Cache 持续膨胀

量化的核心目标是:

> 用更低比特表示模型中的数值,在尽量少损失精度的前提下,降低存储与计算成本。

常见模型压缩路线有三类:

  • 模型剪枝(Pruning)
  • 知识蒸馏(Knowledge Distillation)
  • 模型量化

2. 基本概念

2.1 什么是量化

模型量化是把权重、激活或缓存等数值,从高精度格式(如 FP32FP16BF16)转换到低精度格式(如 INT8INT4FP8FP4)。

收益主要有三点:

  • 模型更小
  • 推理内存占用更低
  • 某些硬件上推理更快

代价是:

  • 数值表示更粗糙
  • 会引入量化误差
  • 可能损失模型精度与能力

2.2 量化粒度

量化粒度描述的是:多大一块数据共享一组量化参数

  • per-tensor / per-layer:整个张量共享一组缩放因子
  • per-channel:每个通道使用不同缩放因子
  • per-token:通常用于激活,对每个 token 对应的一行单独量化
  • per-group / group-wise:把通道或元素分组,每组共享量化参数

直觉上:

  • 粒度越粗:实现更简单、开销更低,但精度通常更差
  • 粒度越细:更贴合真实分布,但实现更复杂、元数据更多、未必最硬件友好

例如:

  • GPTQAWQ 常见 group-wise,例如 g128
  • 激活常见 per-token
  • 权重常见 per-channelgroup-wise

2.3 量化对象

Weight

最常见的量化对象。

特点:

  • 训练结束后固定
  • 不随输入变化
  • 可以离线量化
  • 通常是最容易量化的一类

Activation

中间激活值通常比权重更难量化。

原因:

  • 随输入变化
  • 分布不稳定
  • 常出现离群值(outlier)

但激活又很重要,因为:

  • 它可能是推理过程中的主要内存开销之一
  • 结合权重量化,才更容易真正利用低精度算子提速

KV Cache

在自回归生成中,Key / Value 缓存会随着上下文增长持续变大。

所以:

  • 短文本下它可能不是第一问题
  • 长文本下它往往是部署瓶颈之一

Gradient

更多出现在训练场景,主要用于减少分布式训练中的通信与反向传播开销。本文重点不在这一部分。


2.4 静态量化 vs 动态量化

这组概念回答的是:量化参数是在运行前固定,还是运行时现算。

静态量化

  • 通过校准集提前估计量化参数
  • 推理时直接使用固定参数

优点:

  • 推理效率高
  • 更容易做高效 kernel

缺点:

  • 如果真实输入分布变化大,误差可能明显上升

动态量化

  • 在每次前向传播时,根据当前输入动态计算量化参数

优点:

  • 更贴合当前输入分布
  • 精度通常更稳

缺点:

  • 运行时开销更高

对于 LLM,激活分布波动通常较大,因此激活动态量化常常更有意义。


2.5 离线量化 vs 在线量化

这组概念回答的是:量化动作发生在部署前,还是运行时。

  • 离线量化:模型上线前完成量化
  • 在线量化:模型运行时实时量化

要注意,它和静态/动态不是同一个维度:

  • 静态/动态:参数怎么得到
  • 离线/在线:量化何时发生

例如:

  • 离线静态量化:部署前用校准集确定参数
  • 离线动态量化:权重预先量化,激活运行时动态量化
  • 在线动态量化:运行时实时计算量化参数并量化

2.6 线性量化 vs 非线性量化

线性量化

把浮点数按等间距刻度映射到低比特表示。

特点:

  • 简单
  • 工程实现成熟
  • 最常见

非线性量化

根据数据分布做更灵活的映射,不一定等间距。

特点:

  • 理论上更贴合分布
  • 可能带来更低误差
  • 但计算和实现复杂度更高

工业界大量方案仍以线性量化为主。


2.7 对称量化 vs 非对称量化

  • 对称量化:零点为 0
  • 非对称量化:零点不为 0

一般来说:

  • 对称量化更简单、更容易做高效推理
  • 非对称量化更贴合真实分布,精度潜力更高

2.8 常见记号

![](https://raw.githubusercontent.com/ikunycj/xiaoba.blog-images/master/note/AI/AI 模型/img/Pasted image 20260429151016.png)

量化对象记号

  • W:Weight
  • A:Activation
  • KV:KV Cache

位宽记号

  • W4A16:权重 4bit,激活 16bit
  • W8A8:权重 8bit,激活 8bit
  • W4A8:权重 4bit,激活 8bit
  • W4A4:权重 4bit,激活 4bit
  • KV8 / KV4 / KV2:KV Cache 的位宽

直觉理解:

  • W4A16:更像“只压权重”
  • W8A8:更像“权重和激活一起压”
  • W4A4:非常激进,风险通常更高

2.9 按量化阶段分类

QAT(Quantization Aware Training)

训练时就把量化误差纳入进来,让模型提前适应低比特表示。

QAF(Quantization-Aware Fine-tuning)

在微调阶段引入量化感知。

PTQ(Post Training Quantization)

训练完成后再做量化,是最常见、最易部署的路线。


3. 方法地图

可以先不要按论文顺序记,而是按“解决什么问题”来记。

3.1 基线

  • RTN

3.2 激活难量化怎么办

  • LLM.int8()
  • SmoothQuant
  • ZeroQuant
  • ZeroQuant-FP

3.3 仅权重量化怎么保精度

  • GPTQ
  • AWQ
  • SpQR
  • FP6-LLM

3.4 训练/微调时纳入量化

  • LLM-QAT
  • QLoRA

3.5 KV Cache 如何量化或修补

  • KIVI
  • IntactKV
  • KVQuant

3.6 超低比特 / 组合型方案

  • Atom
  • QuaRot
  • QoQ
  • ZeroQuant-V2

4. 主流方法精要

4.1 RTN

关键词:直接量化、四舍五入、基线方法

RTN(Round to Nearest)是最朴素的量化方法,直接把值映射到最近的低比特格点。

优点:

  • 简单
  • 实现成本低

问题:

  • 不专门处理离群值
  • 在 LLM 上往往精度下降明显

一句话:

> RTN 是基线方法,重要性在于“简单”,不足在于“对离群值不友好”。


4.2 LLM-QAT

关键词:训练时适应量化、保留异常值、W/A/KV 联合考虑

LLM-QAT 的核心是:

  • 训练阶段就引入伪量化算子
  • 让模型在训练中适应量化误差
  • 而不是训练结束后再硬压缩

文章中的关键点:

  • 权重和激活都存在异常值
  • 不建议粗暴裁剪异常值
  • 权重采用逐通道量化
  • 激活与 KV 采用逐 token 量化

一句话:

> QAT 是“提前适应量化”,不是“事后修补量化”。


4.3 QLoRA

关键词:低成本微调、4bit 底座模型、LoRA、NF4、双量化

QLoRA 的重点不是推理加速,而是:

  • 把底座模型压成 4bit
  • 冻结底座
  • 只训练少量 LoRA 参数

几个关键设计:

  • NF4:更适合权重分布的 4bit 数据类型
  • 双量化:进一步压缩量化元数据
  • 分页优化器:缓解微调时的显存峰值问题

一句话:

> QLoRA 的本质是“量化底座 + LoRA 微调”,核心目标是降低微调成本。


4.4 LLM.int8()

关键词:W8A8、混合精度、离群值分流

LLM.int8() 不是简单地把所有东西都压成 INT8,而是:

  • 大部分值走 INT8
  • 少量离群维度保留 FP16
  • 最后把两部分结果合并

它的意义在于明确指出:

> 激活中的离群值是量化难点,不能一刀切。

不足:

  • 混合精度路径较复杂
  • 不一定是最理想的高性能工程方案

4.5 GPTQ

关键词:W4A16、误差最小化、边量化边补偿

GPTQ 是最典型的 weight-only PTQ 方法之一。

核心思想:

  • 量化权重时,不只看权重值本身
  • 还关心量化后层输出会偏多少
  • 通过调整剩余未量化参数来补偿误差

特点:

  • 常见形态为 W4A16
  • 需要校准数据
  • 精度通常较稳

一句话:

> GPTQ 是把权重量化视为“输出误差最小化问题”。


4.6 SmoothQuant

关键词:W8A8、激活难度转移、硬件友好

SmoothQuant 关注的是:

  • 权重相对容易量化
  • 激活由于离群值很难量化

所以它做了一件很巧妙的事:

  • 用平滑因子对激活做逐通道缩放
  • 同时对权重做数学上等价的反向缩放
  • 把激活的量化难度部分转移给权重

结果:

  • 激活更容易量化
  • 又不至于牺牲太多硬件效率

一句话:

> SmoothQuant 不是分流离群值,而是通过等价变换把激活的难题转移给权重。


4.7 AWQ

关键词:W4A16、激活感知、保护关键权重

AWQ 的起点是:

> 不是所有权重都同样重要。

它虽然做的是权重量化,但判断权重是否重要时,会利用激活分布信息。

核心做法:

  • 识别对输出更关键的通道
  • 通过缩放优先保护这些通道
  • 在低比特下减少关键权重的相对误差

一句话:

> AWQ 是“用激活信息识别重要权重,并优先保护它们”。


4.8 SpQR

关键词:仅权重量化、隔离异常权重、双层量化

SpQR 的核心思路是:

  • 把量化后误差特别大的异常权重隔离出来,保留高精度
  • 其余大部分权重用极低比特存储
  • 甚至继续压缩量化元数据本身

一句话:

> SpQR 是把少量高敏感异常权重稀疏保存,其余部分低比特编码。


4.9 ZeroQuant

关键词:W8A8、分组权重量化、逐 token 动态激活量化、kernel 融合

ZeroQuant 更偏工程系统路线。

特点:

  • 权重做分组量化
  • 激活做逐 token 动态量化
  • 用 kernel 融合降低量化/反量化的数据搬运开销

一句话:

> ZeroQuant 是把 W8A8 做成更工程可落地的动态激活量化方案。


4.10 ZeroQuant-V2

关键词:低秩补偿、外挂误差修复层

ZeroQuant-V2ZeroQuant 的基础上引入 LoRC

  • 用两个低秩矩阵近似量化误差
  • 拿少量新增参数换更好的精度恢复

代价:

  • 额外参数会拖累推理性能

一句话:

> ZeroQuant-V2 是给量化模型外挂一个轻量误差补偿模块。


4.11 ZeroQuant-FP

关键词:W4A8、FP4、FP8、面向新硬件

它的关键判断是:

  • 对 LLM 而言,FP8 激活往往优于 INT8
  • FP4 权重与 INT4 竞争力相近
  • 在支持低精度浮点的新硬件上,走 FP4/FP8 路线更自然

一句话:

> ZeroQuant-FP 是从 INT 路线转向 FP 路线的工程化方案。


4.12 FP6-LLM(W6A16)

关键词:W6A16、不规则位宽、系统实现

FP6-LLM 不是单纯强调“6bit 更好”,而是在解决:

  • FP6 这类不规则位宽如何高效在 GPU 上跑起来

它的贡献主要在系统侧:

  • 数据排布
  • 反量化执行
  • Tensor Core / SIMT 协同
  • 流水线调度

一句话:

> FP6-LLM 的重点是“把 W6A16 真正做成可高效部署的系统方案”。


4.13 KIVI

关键词:KV2、K/V 分开处理、流式场景

KIVI 最重要的发现是:

  • Key 更适合逐通道量化
  • Value 更适合逐 token 量化

它还考虑了流式生成中的实现问题:

  • V 可以很自然地 token-by-token 追加
  • K 的逐通道量化需要跨 token 统计,因此更麻烦

所以它采用:

  • 分组部分量化
  • 余留部分暂时保留全精度

一句话:

> KIVI 的贡献是告诉我们:KV 不该默认用同一种量化策略。


4.14 IntactKV

关键词:关键前缀 KV 无损、公共前缀复用

IntactKV 的思路不是继续压缩所有 KV,而是:

  • 先用全精度模型生成公共前缀或关键词元对应的高质量 KV
  • 再让量化模型直接复用这段无损缓存

这相当于:

  • 保住最敏感的前缀部分
  • 减少量化误差向后扩散

一句话:

> IntactKV 是“保住关键前缀 KV 不量化”,而不是继续硬压所有 KV。


4.15 KVQuant

关键词:系统化 KV 量化工程、RoPE 前量化、Attention Sink

KVQuant 可以看作比 KIVI 更系统的 KV Cache 量化路线。

它综合做了:

  • Key 的逐通道量化
  • RoPE 前量化
  • 非均匀量化
  • 异常值隔离
  • Attention Sink 感知保护
  • 离线 / 在线缩放因子的联合设计

一句话:

> KVQuant 是把 KV Cache 量化从单点技巧推进到系统工程方案。


4.16 Atom

关键词:W4A4KV4、组合拳、异常值单独照顾

Atom 的目标非常激进:

  • W4A4KV4

为了保精度,它叠加了多种技巧:

  • 混合精度
  • 通道重排序
  • 细粒度分组量化
  • 动态量化
  • GPTQ 风格的离线权重量化
  • 对异常值使用 INT8
  • KV 侧低比特量化

一句话:

> Atom 是在超低比特目标下,用多种工程手段联合兜底的方案。


4.17 QuaRot

关键词:W4A4KV4、旋转变换、重塑分布

QuaRot 的思路很有代表性:

  • 与其追着异常值修补
  • 不如先通过旋转变换把异常值打散
  • 把表示分布重塑成更容易量化的形式

然后再结合现有权重量化 / 激活量化方案完成低比特部署。

一句话:

> QuaRot 是“先改变表示分布,再做低比特量化”。


4.18 QoQ

关键词:W4A8KV4、组合型方案、渐进量化

QoQ 的目标是:

  • W4A8KV4

它不是依赖单一技巧,而是组合了多种思路:

  • 渐进式分组量化
  • SmoothAttention
  • 模块旋转
  • 输出平滑
  • 激活感知通道重排序
  • 权重裁剪

一句话:

> QoQ 是在 W4A8KV4 目标下,把多种量化优化组合起来的工程化方案。


5. 关键对比

5.1 LLM.int8() vs SmoothQuant

  • LLM.int8():把离群值分流出来,用高精度单独处理
  • SmoothQuant:不单独分流,而是把激活的量化难度转移给权重

5.2 GPTQ vs AWQ

  • GPTQ:把量化视作误差最小化问题,边量化边补偿
  • AWQ:利用激活分布识别关键权重,并优先保护它们

5.3 QAT vs PTQ

  • QAT:训练时就适应量化
  • PTQ:训练后再量化

5.4 QAT vs QLoRA

  • QAT:让模型整体适应低比特表示
  • QLoRA:把底座模型量化后,只训练少量 LoRA 参数做低成本微调

5.5 KIVI vs KVQuant

  • KIVI:强调 K / V 不同粒度与流式可实现性
  • KVQuant:更系统地处理 KV 量化中的分布、RoPE、Attention Sink 与在线/离线问题

5.6 Atom vs QuaRot

  • Atom:不改底层表示,靠多种技巧联合保精度
  • QuaRot:先通过旋转变换重塑分布,再量化

6. 量化对模型的影响

6.1 对精度的影响

几个重要结论:

  • 大模型对 weight-onlyKV Cache 量化通常更耐受
  • 但大模型不一定更耐受 W + A 联合量化
  • 小模型更怕激进低比特,尤其是 W4 / W3 / W2
  • W4A8 往往还能接受,W4A4 风险明显更高
  • W2KV2 通常已经属于很激进的研究区间

6.2 对不同能力的影响

基础 NLP 能力

多数普通语言任务对中等量化相对耐受:

  • W4
  • W4A8
  • KV4
  • W8KV4

通常仍可保持不错性能。

涌现能力

量化容忍度从高到低大致是:

  • 上下文学习 ≈ 指令跟随
  • 多步推理 ≈ 自我校准

尤其:

  • 数学推理通常比常识推理更怕量化

对话能力

过激进量化常见症状:

  • 重复输出
  • 无意义符号
  • 随机词语
  • 逻辑不连贯

长文本能力

长文本下通常更怕 KV Cache 量化过狠,因为:

  • KV 占用更大
  • 误差会沿上下文累积
  • 注意力历史依赖更强

6.3 对推理性能的影响

Weight-only 量化

优点:

  • 常能显著改善 decoding 阶段延迟

局限:

  • prefill 阶段不一定更快,甚至可能更慢
  • 随着 batch 增大、输入变长,其优势会下降

适用趋势

  • 小 batch:weight-only 往往很有效
  • 大 batch:更需要考虑 W + A 联合量化与低精度 kernel
  • 大模型:更容易从 weight-only 中受益

7. 选型思路

7.1 小 batch、低延迟场景

特点:

  • 通常更受内存带宽限制
  • 权重读取成本高

优先考虑:

  • W4A16
  • AWQ
  • GPTQ
  • FP6-LLM

一句话:

> 小 batch 先看权重量化。


7.2 大 batch、高吞吐场景

特点:

  • 不只是内存带宽,计算密度也很关键

优先考虑:

  • FP8
  • W8A8
  • SmoothQuant
  • INT4-FP8 AWQ

一句话:

> 大 batch 更适合权重 + 激活联合量化。


7.3 长文本场景

特点:

  • KV Cache 很可能成为主要瓶颈

优先考虑:

  • 谨慎选择 KV4 / KV2
  • 长文本里常需要比短文本更保守的 KV 位宽
  • 可关注 KIVIKVQuantIntactKV

一句话:

> 长文本场景里,KV Cache 是一等公民。


7.4 强推理 / 数学 / 自校准场景

特点:

  • 更依赖中间推理过程稳定性

建议:

  • 避免过激进位宽
  • 尤其谨慎 W4A4W2KV2

一句话:

> 越依赖复杂推理,越要保守量化。


8. 一页版总结

8.1 核心概念

  • 量化对象:W / A / KV
  • 量化粒度:per-tensor / per-channel / per-token / group-wise
  • 阶段分类:QAT / QAF / PTQ
  • 常见记号:W4A16W8A8KV4

8.2 方法主线

  • RTN:直接量化基线
  • LLM.int8():分流离群值
  • SmoothQuant:激活难度转移到权重
  • GPTQ:误差补偿
  • AWQ:保护关键权重
  • QAT:训练时适应量化
  • QLoRA:低成本量化微调
  • KIVI / KVQuant / IntactKV:KV Cache 量化与修补
  • Atom / QuaRot / QoQ:更激进低比特的组合路线

8.3 选型口诀

text
小 batch 看权重,
大 batch 看 W+A,
长文本盯 KV,
强推理要保守。

9. 参考资料

评论区

欢迎留言、补充或勘误。

xiaoba.blog