外观
量化经典:LLM.int8 / GPTQ / AWQ
大语言模型的量化是一条「2022-2023 两年走完一个时代」的陡峭曲线:LLM.int8() 先让 175B 模型在单卡上跑起来(只是「不崩」),GPTQ 把 3/4-bit 量化做到接近 FP16 精度(「能用」),AWQ 再用激活感知让 4-bit 更稳、更硬件友好(「好用」)。本文逐一精读这三篇里程碑,再简要补充 SmoothQuant(W8A8 路线),最后给出工程选择建议。
读这篇之前,建议先掌握 量化 的概念页——对称/非对称量化、scale/zero-point、weight-only 与 W8A8 的区别,这里不再重复。
三篇对比总表
| 方法 | 位宽 | 精度损失 | 速度收益 | 显存收益 | 年份/会议 |
|---|---|---|---|---|---|
| LLM.int8() | 权重 INT8(激活 FP16) | 175B 零性能退化 | 与 FP16 相当(INT8 矩阵乘 + FP16 离群部分) | 权重显存减半 | 2022 / NeurIPS 2022 |
| GPTQ | 权重 3/4-bit(weight-only) | 3/4-bit 接近 FP16 | 端到端 A100 上约 3.25x、A6000 上约 4.5x(vs FP16) | 权重压缩 3-4x | 2023 / ICLR 2023 |
| AWQ | 权重 4-bit(weight-only) | 稳健、泛化好(不依赖校准集分布) | TinyChat 4-bit 比 FP16 快 3x+ | 权重压缩约 4x | 2023 / MLSys 2024(Best Paper) |
| SmoothQuant(简要) | 权重+激活 8-bit(W8A8) | 可忽略 | 1.56x 加速 | 2x 显存降低 | 2023 / ICML 2023 |
三者的本质区别
LLM.int8 解决的是「INT8 为什么崩」,GPTQ/AWQ 解决的是「怎么把权重压到 4-bit 还不掉精度」,SmoothQuant 解决的是「激活也要量化才能吃到硬件加速」。它们的优化对象、量化位宽、适用场景完全不同——选型不是「谁更好」,而是「你的瓶颈在哪」。
一、LLM.int8():让 175B 模型跑进单卡(Dettmers et al., NeurIPS 2022)
一句话贡献
大模型激活里的「离群值」是 INT8 量化崩坏的元凶;把离群特征维度拆出来走 FP16、其余 99.9% 的值走 INT8(混合精度分解),175B 模型可以单卡 INT8 推理且零性能退化。
背景与动机
小模型(≤1B)做 INT8 量化通常只掉一点点精度,工程师早就这么干了。但把同一套方法搬到 ≥6.7B 的大模型上,精度剧烈崩坏。论文发现原因不在权重,而在激活:
- 大模型里会出现系统性「离群特征」(emergent features):少数 hidden dimension 上的激活值远大于其他维度(可以超过 6 个标准差),且每个 transformer 层都有。
- 这些离群值对 attention 和预测起主导作用,INT8 的量化范围被它们拉爆,导致其余 99% 的正常值精度被严重牺牲。
方法核心:混合精度分解(Mixed-Precision Decomposition)
思路一句话:别让离群值毁掉所有人,把少数「刺头」单独拎出来按 FP16 算,其余大部分按 INT8 算。
text
每个线性层(如 attention 的 Q/K/V 投影、MLP):
激活 X (行) × 权重 W (列)
│
▼
检测离群维度:某列激活最大值 |X_i| > 阈值(如 6.0)
│
┌─────┴──────────────┐
▼ ▼
非离群列(>99.9%) 离群列(通常 ≤ 几十个维度)
按行/列独立 scale 保持 FP16
INT8 矩阵乘 FP16 矩阵乘
└─────┬──────────────┘
▼
反量化到 FP16,相加 = 最终输出- 向量级量化(vector-wise):对每行激活、每列权重分别求 scale,而不是整张矩阵一个 scale——这是它比朴素 INT8 稳的基础。
- 离群检测 + 拆分:找出激活幅值超阈值的列,把权重对应列和激活对应列一起拆走,用 FP16 精确相乘;其余列走 INT8。实测超过 99.9% 的值仍在 INT8 路径,FP16 部分占比极小,所以不会拖慢太多。
关键结果
| 指标 | 数字 |
|---|---|
| 模型规模 | OPT-175B / BLOOM-176B,单卡(如 A6000/RTX 3090 等消费级 GPU)INT8 推理 |
| 精度 | 与 FP16 零性能退化(困惑度、下游任务完全一致) |
| 显存 | 权重显存减半(FP16 → INT8),175B 权重从约 350GB 降到约 175GB |
| 速度 | 与 FP16 基本持平(A100 上 INT8 矩阵乘 + 少量 FP16 混合) |
| 落地 | 集成进 bitsandbytes / Hugging Face Transformers,一行开关启用 |
局限与后续
- 只量化了权重,激活仍是 FP16——吃不到 INT8 算子的完整加速(省显存,不省计算带宽)。
- 离群现象主要在 ≥6.7B 模型上显著,对小模型收益有限甚至无收益。
- 后续:同一团队的 QLoRA(arXiv 2305.14314)把 4-bit 量化与 LoRA 微调结合;SmoothQuant 则在「激活也要 8-bit」这条路上补齐了答案。
对今天的启示
load_in_8bit=True 的默认配置就是这篇文章的直接产物。当你遇到「175B 模型怎么在一张卡上跑起来做验证」时,LLM.int8 仍然是最快的那条路。它的方法论(观察异常 → 定位到具体维度 → 局部精确处理)也值得复制到其他数值敏感的工程问题上。
二、GPTQ:把 175B 量化到 3/4-bit 还接近无损(Frantar et al., ICLR 2023)
一句话贡献
用 Hessian(二阶信息)指导逐层权重量化 + 贪心 + 误差补偿,175B 模型在单 GPU 上约 4 GPU-hours 完成 3/4-bit 量化,精度接近 FP16——首次让 175B 模型单卡跑起生成推理。
背景与动机
LLM.int8 之后的下一个问题自然浮现:能不能压到 4-bit 甚至更低? 4-bit 意味着 175B 权重只要约 88GB,一张 A100(80GB)配合一点激活显存就够了;而且权重越小,解码时从显存搬权重的带宽压力越小,生成越快。
但低位宽量化对「一次性(one-shot)量化」的要求极高:逐层最小化量化误差,不能靠反向传播重训(大模型没法重训)。前作 OBQ 框架(optimal brain quantization)按「逐权重贪心」的思路误差小,但复杂度太高,跑不动大模型。
方法核心:基于 Hessian 的逐层量化
把「量化第 i 层的权重矩阵 W」建模为一个逐层优化问题:找量化后的 Ŵ,让 ||W·x - Ŵ·x|| 尽量小(用激活的二阶统计量,即 Hessian,衡量「动哪个权重最伤输出」)。
text
对每一层:
1. 收集一小批校准数据的激活,估计该层权重对输出误差的 Hessian
2. 贪心:先量化「对输出误差影响最小」的权重(按 Hessian 排序)
3. 误差补偿:每量化一个权重,把量化引入的误差「反传」到剩余未量化权重上,
让它们吸收误差(数学上保证整体误差不累积)
4. 规模化技巧:不逐权重更新,而是「延迟批量更新」
—— 每处理 K 列才做一次权重修正,把复杂度从 O(逐权重) 降到可跑 175B
输出:3-bit 或 4-bit 权重 + 每列 scale(+ 少量 FP16 留存的敏感列)本质上 GPTQ 是 OBQ 的大规模重写版:同样的二阶信息思想,通过批量更新把复杂度从 O(d_row × d_col²) 级别的逐元素迭代压到可执行。
关键结果
| 指标 | 数字 |
|---|---|
| 量化速度 | 175B 模型单 GPU(A100)约 4 GPU-hours 完成 |
| 精度 | 3-bit / 4-bit 接近 FP16(GPT-175B 等,困惑度差距极小);2-bit 仍有可用精度 |
| 端到端加速 | vs FP16:A100 上约 3.25x,A6000 上约 4.5x(权重变小的带宽收益) |
| 首次 | 175B 模型量化后可在单张 GPU 内做生成推理 |
局限与后续
- weight-only:激活仍 FP16,只压缩权重存储,推理时激活路径不变。
- 依赖校准集:需要几百条校准数据估计 Hessian;校准集分布与真实分布偏差大时精度下降。
- 后续衍生:GPTQ 的模型格式成为
llama.cpp、vLLM、HF Transformers 的事实标准之一;其「逐层 + 二阶信息 + 批量更新」的框架也被后续方法沿用。
对今天的启示
GPTQ 是当前 4-bit 部署的主流后端之一:AutoGPTQ 导出的 .safetensors 模型在 vLLM/Triton/llama.cpp 里开箱即用。选型时记住它的甜蜜点:显存是硬约束、且你有靠谱校准集。当你的场景想要「更不挑数据」时,就该看 AWQ。
三、AWQ:用激活感知保护重要权重(Lin et al., MLSys 2024 Best Paper)
一句话贡献
权重的重要程度不看权重本身、要看激活幅度——按激活统计识别并保护约 1% 的重要通道,且不用混合精度(对重要通道做等效缩放),4-bit 量化更稳、更硬件友好、不依赖反向传播。
背景与动机
GPTQ 依赖校准集 + 二阶信息,有个工程痛点:校准数据分布一变,效果就抖;而且它没有解释「哪些权重真的不能碰」。AWQ 想回答一个更本质的问题:有没有一种不依赖重建/优化的保护方式,可以只认准最重要的 1% 权重?
论文观察:真正「动不得」的权重通道,由激活幅度识别——激活值大的通道,对应权重被量化后误差伤害最大(因为实际使用时这些权重被激活放大了)。而权重本身的数值大小与重要程度几乎无关。
方法核心:等效缩放(Equivalent Scaling)
关键工程洞察:「保护重要通道」不等于「把它留成 FP16」——混合精度在硬件上很贵(需要算子支持)。论文证明:对重要通道的权重做放大(scale up),量化误差会按比例缩小;因为量化误差是相对的,放大的权重对应更小的相对量化步长。这在数学上等价于「保护」,在实现上却只是统一量化前的缩放变换。
text
1. 校准:收集少量样本的激活统计,按通道求激活幅度
2. 识别:激活幅度 top-1% 的通道 = 重要通道(salient)
3. 缩放:重要通道的权重乘以 s>1,对应激活列除以 s
(XW = X' W' 数学恒等,推理输出不变)
s 通过小范围搜索(或解析近似)确定
4. 统一 INT4/INT8 量化全部权重(没有混合精度算子)关键结果
| 指标 | 数字 |
|---|---|
| 保护范围 | 仅 ~1% 重要权重通道,却消除了大部分量化误差 |
| 校准成本 | 只需激活统计,无反向传播、无重建循环,泛化到代码/数学/多模态不退化 |
| 精度 | 4-bit 在指令微调模型(instruction-tuned)上首次表现稳定,优于同期 GPTQ |
| 端到端 | TinyChat 推理框架:4-bit 在桌面/移动 GPU 上比 HF FP16 快 3x+;70B Llama-2 可在移动端 GPU 部署 |
局限与后续
- 仍是 weight-only 4-bit 路线,激活保持 FP16。
- 缩放参数需按模型搜索(论文给了解析近似,成本很低),但超参数仍有一点点调参空间。
- 后续:AWQ 成为 vLLM 内置的 INT4 量化后端、并带动了 2-bit/3-bit 与 KV Cache 量化(
KVQuant)等探索;同团队后续还有 SmoothQuant 的 W8A8 配套。
对今天的启示
AWQ 的「基于激活分布保护少数通道」是被工程验证最彻底的思想之一。如果你要端侧/边缘部署(手机、笔记本、Jetson),AWQ + TinyChat 是最成熟的 4-bit 方案;如果你在服务器上做 LLM 服务,vLLM 里 --quantization awq 一行就能用。
四、SmoothQuant(简要):让激活也变成 8-bit
LLM.int8 只量化权重,为什么不能量化激活?因为激活的离群值比权重更严重(权重分布相对均匀,激活有系统性尖峰)。SmoothQuant 的思路很巧妙:既然激活难量化、权重好量化,就把激活的量化难度「迁移」到权重上——对激活按通道除以一个 scale s,同时把权重对应列乘以 s。这是数学恒等变换(XW 不变),但激活的分布被压平了,可以整张矩阵 INT8 计算。
text
量化前:激活 X 离群严重 → W8A8 崩
变换后:X' = X / s,W' = W × s
X'W' ≡ XW(恒等)
量化后:X' 和 W' 都能放进 INT8 → 全部矩阵乘走 INT8 算子结果:W8A8 首次对 LLM 可行,约 1.56x 加速、2x 显存降低,530B 模型可在一个节点内服务(ICML 2023)。
三条路线怎么选
- 想最快跑起 175B 验证 → LLM.int8(零准备,一行开关);
- 想压到 4-bit 省显存 → GPTQ(数据靠谱时)或 AWQ(想更稳/更端侧);
- 想吃到 INT8 算子加速(TensorRT/Triton 的 INT8 后端)→ SmoothQuant W8A8。 完整选型矩阵见 量化。
五、工程选择建议
| 你的场景 | 推荐 | 理由 |
|---|---|---|
| 单卡跑 70B-175B,显存是唯一瓶颈 | GPTQ 4-bit / AWQ 4-bit | 权重压缩 4x,端到端更快 |
| 服务端已用 INT8 硬件算子(TensorRT、Triton) | SmoothQuant(W8A8) | 权重+激活都 8-bit,吃满硬件 |
| 快速实验、不想准备校准集 | LLM.int8(bitsandbytes) | 免校准、开箱即用 |
| 手机/边缘/消费级 GPU | AWQ(TinyChat 生态) | 硬件友好、4-bit 核融合 |
| 模型 <1B | 谨慎量化或优先蒸馏 | LLM 量化方法在小模型上收益小(见下) |
六、共同局限
- 校准集依赖:GPTQ/AWQ/SmoothQuant 都要一小批校准数据(通常几百条)。校准集分布和线上真实分布偏差大时,精度会明显下降——上线前务必用真实流量样本做校准与验证。
- 小模型效果差:LLM.int8 的离群规律主要在 6.7B+ 模型上才显著;GPTQ/AWQ 在 1B 以下模型上收益小、甚至可能比 FP16 还差。小模型优先考虑蒸馏,见蒸馏经典。
- weight-only 不解决计算加速:GPTQ/AWQ 压缩的是存储/带宽,解码阶段的矩阵乘仍是 FP16 激活——想加速计算要 W8A8 或结构化稀疏。
- 数值安全:INT8/INT4 推理要验证输出分布、监控异常 token;生产建议保留一个 FP16 影子路由做对比,见监控与可观测性。
延伸阅读
- 量化 —— 量化概念底座:scale、weight-only、W8A8、校准
- 蒸馏经典:KD 与蒸馏家族 —— 「先蒸馏后量化」的组合拳
- PagedAttention:vLLM 系统论文 —— 量化 + KV Cache 优化叠加使用
- GPU 与硬件选型 —— 显存带宽如何决定量化收益
- 框架与平台怎么选 —— 各框架对 GPTQ/AWQ 的支持情况
参考资料
- LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale(arXiv 2208.07339)
- GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers(arXiv 2210.17323)
- AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration(arXiv 2306.00978)
- SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models(arXiv 2211.10438)
- QLoRA: Efficient Finetuning of Quantized LLMs(arXiv 2305.14314)