大模型量化实战(上):从显存焦虑到算法本质

大模型量化实战(上):从显存焦虑到算法本质

想在本地跑个 70B 的大模型?FP16 精度下光权重就得吃掉 140G 显存,连加载都报错。这时候你肯定盯上了量化:换成 INT4,35G 显存搞定,一张 RTX 4090 就能起飞。

但真用起来,坑就来了:

  • 明明体积缩小了 4 倍,生成速度怎么没快 4 倍?
  • 评测分数看着没掉,怎么让它写个复杂代码就开始胡言乱语了?
  • 网上满天飞的 GPTQ、AWQ、W8A8,到底该下哪个包?

很多人以为量化就是“把文件压缩一下”,其实根本不是。它更像是在给大桥换便宜的钢材 ——有些钢缆是主承重墙,换差了桥就塌了;有些只是栏杆,随便换。

而且别被 PPL(困惑度)这种评测指标骗了。很多时候分数没变,但模型的长尾知识召回下降、多步推理链断裂、格式化输出不稳定 ——这些才是量化最常见的“隐形退化”。这就是为什么不能闭着眼睛无脑转 INT4。

为了搞懂这些,我把大模型里需要量化的东西分成了三块,它们的脾气完全不一样:

要量化的东西 通常压到多少 难在哪 实际影响
权重 (Weights) INT4/INT8 存在少量 outlier 通道(通常占 <1%,但绝对数量随模型增大可达几十至上百个) 省显存的绝对主力,离线弄好就行
激活值 (Activations) INT8/FP8 经常冒出极大值(Outlier),动态变化 决定推理能不能真正提速,必须在线处理
KV Cache INT4/INT8/FP8 聊得越久占得越多 长文本场景下的救命稻草

这篇文章不打算给你背公式。我们直接从这几个实际问题出发,用大白话盘一盘主流算法到底是怎么解决这些“刺头”的,最后给你一张直接能用的选型决策表。

💡 提前交个底
这篇主要讲“原理直觉”和“工程选型”。如果你跟我一样,不仅想知道“怎么用”,还想深究背后的数学推导、Hessian 矩阵到底怎么算,或者想拿评估脚本自己跑一遍测试,这部分硬核内容我会整理到下篇《量化实战(下):评估与调优手册》里,咱们分步吃透。

算法本质:一场关于“误差甩锅”的游戏

搞懂了量化不是无损压缩,接下来就要面对一个灵魂拷问:既然压缩必然带来误差,那这些误差该让谁来扛?

最朴素的做法(RTN)是“平均主义”:所有权重一视同仁地四舍五入(现代实现虽会配合 per-channel 缩放,但仍未考虑权重敏感度差异)。结果就是,那些对输出至关重要的“承重墙”权重被压坏了,模型直接变傻。

主流量化算法的本质,其实都是一场精心设计的“误差甩锅游戏” ——它们都在想办法把量化带来的破坏,转移到模型最能承受的地方去。只是甩锅的姿势和对象不同:

SmoothQuant:激活值太难搞?重新平衡分布!

前面表格里说过,激活值里经常冒出极端大值(Outlier),硬量化会崩。SmoothQuant 不是随便给个常数做缩放,而是逐通道(per-channel)计算缩放因子 $s$,这个 $s$ 是根据激活值和权重的统计分布联合算出来的。

它的核心作用是平滑激活值的分布(把 Outlier 的幅值压下来),让激活值能用更小的量化步长;同时权重因缩放后分布更集中,量化损失也可控。这才是“误差转移”的真正含义——不是简单甩锅,而是通过重新平衡两者的分布,让双方都变得“好量化”。这也是 W8A8 能跑起来的关键。

AWQ:找出“承重墙”,重点保护

AWQ 换了个思路:不甩锅,而是识别出谁不能碰。它发现模型里只有不到 1% 的权重(通常是注意力头和 FFN 的特定通道)对输出影响极大,称为“显著权重”(Salient Weights)。

AWQ 的做法是:只对这些显著权重保持高精度(或单独缩放保护),其余权重放心大胆地压到 INT4。这就像装修时,承重墙用钢筋混凝土,隔断墙用轻质砖——把钱花在刀刃上。这也是为什么 AWQ 在代码生成、数学推理等复杂任务上常常反超 GPTQ:它保住了模型的“知识承重墙”。

GPTQ:用数学精确计算“谁该多扛一点”

GPTQ 是最“精打细算”的。它不像 AWQ 那样粗暴保护,也不像 SmoothQuant 那样整体平滑,而是逐列量化权重,并用已量化列的误差去动态修正未量化列

背后靠的是二阶信息(Hessian 矩阵):它能精确算出每个权重被扰动后,对最终输出的影响有多大。影响大的,就多补偿一点;影响小的,就少管一点。这是一种全局最优的误差分配,所以 GPTQ 在通用 PPL 上通常是 W4A16 的精度标杆。量化耗时可通过 OBS 优化或缩减校准集(128 条)压缩到 30 分钟内(A100),并非不可接受。

💡 一句话总结三者的区别

  • SmoothQuant:重新平衡激活值与权重的分布(解决 W8A8 难题)
  • AWQ:保护关键权重不被压坏(复杂推理任务更稳)
  • GPTQ:用数学精确分配每个人的锅(通用 PPL 精度标杆)

它们没有绝对优劣,只有适合的场景。下一节我们就把这些理解转化为一张可直接用的选型决策表。

别忘了 KV Cache:长文本的救命稻草

前面聊的都是权重和激活值,但如果你要跑长上下文(比如读一本书、分析长代码),还有一个隐形显存杀手:KV Cache

它是自回归推理时缓存的历史 Key/Value 张量,序列越长占得越多。70B 模型在 4K 上下文下,KV Cache 可能比权重还吃显存;到 32K 时直接翻倍。

KV Cache 量化(INT4/INT8/FP8)就是为这个场景而生的。当前主流方案已支持 INT4(如 KIVI、KVQuant),在长上下文下比 INT8 再省一半显存,且精度损失可接受。它和权重量化有两个关键区别:

  1. 在线进行:每生成一个 token 都要更新,不能离线预处理;
  2. 对精度更敏感:Cache 里的微小误差会在后续注意力计算中被反复放大。

好消息是,KV Cache 的分布相对平稳,INT8/INT4 量化几乎无损。如果你的应用场景涉及 >8K 的上下文,KV Cache 量化不是可选项,而是必选项。主流框架(vLLM、TensorRT-LLM)都已原生支持,开箱即用。

别背参数了,直接查这张表

理解了原理,最后落到实操:你到底该选哪个? 别再对着论文纠结了,直接按场景对号入座:

你的场景 推荐方案 为什么选它 要注意的坑
消费级显卡跑 70B+ AWQ-W4A16 优先;若使用 HuggingFace 原生 pipeline 且不愿换框架,选 GPTQ AWQ 在 vLLM/TensorRT-LLM 中推理更快;GPTQ 胜在 Transformers 原生支持、零迁移成本 AWQ 量化需校准集;GPTQ 量化耗时可通过优化压缩到 30 分钟内
服务端高吞吐部署 SmoothQuant-W8A8 / FP8 激活值也量化了,真正利用 INT8 Tensor Core,吞吐翻倍 对小模型(<13B)收益不明显:因其激活值 Outlier 不严重,W8A8 加速抵不过精度下降
长文本 / RAG 应用 任意权重量化 + KV Cache INT4/INT8 解决长上下文显存瓶颈,INT4 比 INT8 再省一半显存 KV Cache 量化需框架支持,老版本可能不兼容
代码 / 数学等敏感任务 AWQ-W4A16 优先 保护显著权重,复杂推理任务常反超 GPTQ 若 AWQ 不可用,退而求其次选 GPTQ
只是试玩 / 不在意精度 GGUF-Q4_K_M (llama.cpp) CPU/Apple Silicon 友好,生态最全 速度不如 GPU 方案,不适合生产

⚠️ 两个通用避坑提醒

  1. 校准集质量 > 数量:128~512 条是常见范围,但关键是覆盖你的目标分布。多语言、多轮对话等多样场景可能需要更多样本来捕捉分布特征,盲目堆数量不如提升样本多样性。
  2. 别信单一指标:PPL 低 ≠ 好用。上线前务必用真实业务 case 跑一轮,重点测长尾知识召回和多步推理稳定性。

结语与下篇预告

量化不是银弹,而是一个需要根据场景精心调参的系统工程。理解了“误差甩锅”的本质,你就不会再被各种缩写迷惑,也能看懂为什么没有万能方案。

💡 下篇预告
这篇讲了“怎么选”,下篇《量化实战(下):评估与调优手册》会讲“怎么验”:包括 Hessian 矩阵的直觉推导、评估脚本实操、以及如何定位量化导致的神经元级损伤。想从“会用”进阶到“真懂”,咱们下篇见。