AWQ 2023 — 让 70B 大模型住进 RTX 4090
是什么
AWQ(Activation-aware Weight Quantization)是 MIT HAN Lab 2023 年提出的训练后 4-bit 权重量化方法,目标是把超大模型塞进单卡甚至手机里跑。
日常类比:搬家时所有家具要塞进小货车,但有几件传家宝不能压。AWQ 不是按”哪件最大”挑,而是看”哪件配着最重的客人坐”——客人重才是要保护的椅子。
更精确说:AWQ 用输入激活的幅值判断哪 1% 权重通道是关键通道,对它们做数学等价的缩放,再统一量化成 INT4——全 INT4 存储、无混合精度、硬件直接读,所以又快又省。
为什么重要
- 70B 模型从 140GB 降到 35GB:消费级 GPU(RTX 4090 24GB)能跑,移动端经过裁剪也能跑
- 比 GPTQ 更快:GPTQ 要逐列反向重建 + Hessian 求逆,AWQ 只跑前向 grid search,单卡几分钟出结果
- 跨域不掉精度:GPTQ 容易过拟合校准集,AWQ 因为不重建权重所以泛化更稳,指令微调 / 视觉模型都能用
- TinyChat 推理框架:作者团队自配 INT4 GEMM kernel,端侧吞吐 1.5–3x 提升
- vLLM / TensorRT-LLM / HuggingFace 默认 4-bit 路径
如果你想理解今天为什么 Llama-2 70B 能在一台笔记本上跑出 token,AWQ 是绕不开的环节。
核心要点
AWQ 的逻辑链可以拆成 三步:
-
不是所有权重都同样重要:随机量化全部权重会掉很多点;保留 0.1%–1% 的”显著权重”用 FP16,模型几乎不掉点。但 FP16+INT4 混合存储硬件解码慢——这是 LLM.int8() 的痛点。
-
显著看激活,不看权重:哪些权重显著?答案在输入激活里——激活值大的输入通道对应的整列权重就是要保护的。直觉是
y = W·x里x[j]大就放大整列 W 的误差。 -
缩放替代混合精度:把显著列权重乘
s>1,对应激活除以s——数学等价,但量化时这些权重占据更多 INT4 表达范围,相对误差被压缩。s = s_X^α,α∈[0,1]网格搜索。最终全 INT4,硬件友好。
实践案例
案例 1:为什么”看激活而不是看权重”
设 y = W·x,输出 y_i = Σ_j W[i,j] · x[j]。
如果 x[j] 是 1000,那 W[i,j] 哪怕量化误差只有 0.01,乘上去也变成 10——直接放大输出误差。所以保护对象不是 W 自己最大的位置,而是 x 大的那一列对应的整列 W。
这是 AWQ 与 LLM.int8() 等”按权重大小选关键位置”方法的根本区别。
案例 2:缩放数学等价的把戏
原始:y = W · x
AWQ 缩放:
y = (W · diag(s)) · (diag(1/s) · x) = W · x ✓数学完全等价。但是 W·diag(s) 这个新矩阵的”显著列”被放大,量化后相对误差被压缩。激活的除法可以离线吸进前一层 LayerNorm 或线性层——运行时零开销。
案例 3:在 vLLM 里加载 AWQ 模型
from vllm import LLMllm = LLM(model="TheBloke/Llama-2-70B-AWQ", quantization="awq")out = llm.generate(["你好"])vLLM 把 INT4 权重读进来,前向时反量化(dequant)成 FP16 再做矩阵乘。显存省 4x,吞吐升 1.5–3x——这是 70B 模型能跑在单 RTX 4090 上的根据。
案例 4:α 的搜索过程
对一层线性层,AWQ 内层流程:
- 跑校准数据,记录每通道激活均值
s_X[j] - 对
α ∈ {0, 0.05, 0.1, ..., 1.0}这 21 个值各试一次 - 用候选
s = s_X^α做缩放,量化后反量化,算输出 MSE - 取 MSE 最小那个 α 作为该层的最终值
整个过程纯前向,单层不到 1 秒,70B 模型几百层全量 grid search 单卡几分钟搞定。
案例 5:移动端部署的可行性
把 70B 模型量化到 INT4 后只占 35GB,但手机内存远不够。AWQ 的真正贡献在于:激活仍然 FP16 不需要重新设计算子——配合 Llama-2 7B / 13B 这种中等模型,INT4 后 4–7GB 内存就能跑。
TinyChat(作者配套框架)在 RTX 4090 / Apple M2 / Jetson Orin 三种硬件上都给出了完整 INT4 推理路径。这意味着开发者不用自己写 kernel,直接 pip install 就能在端侧得到 1.5–3x 吞吐提升。
踩过的坑
-
校准集不是越大越好:AWQ 论文实测 16–512 条样本就够;继续加反而引入噪声。要的是”激活分布形状”,不是覆盖所有领域。
-
α 不是固定值:每层各算各的最优 α,不能全模型共享。
-
“看激活” ≠ “激活也量化”:AWQ 是 W4A16——激活仍然 FP16。如果想 W4A8 / W8A8,请看 SmoothQuant,那是另一条路线。
-
per-channel vs per-group:实践中 AWQ 用 group-wise 量化(每 128 个权重一组共享 scale),group=128 是常见 sweet spot。
-
scale 不能太大:理论上 s 越大保护越强,但 s 极大会让其他列被压扁。
α≤1是必须的硬约束。 -
校准域偏移:通用文本校准、部署跑代码生成,激活分布偏移会让 α 失准。建议用部署域小样本重新校准。
适用 vs 不适用场景
适用:
- 大模型推理部署,显存是瓶颈(7B/13B/70B)
- 需要快速量化、没有训练资源
- 跨领域 / 多模态模型(指令微调、VLM)
- W4A16 路径下要稳精度
- 端侧部署(笔记本、手机)
不适用:
- 训练阶段(AWQ 是 PTQ-only)
- 需要激活也量化(请看 SmoothQuant / LLM.int8())
- 极端 2-bit 场景——AWQ 对 INT3/INT4 设计,2-bit 误差爆炸
- 模型本身就小(<1B)——量化收益有限
历史小故事(可跳过)
- 2022.08:LLM.int8() 发现激活有”异常通道”,提出按列分两路计算(FP16 + INT8)
- 2022.10:GPTQ 用 OBS(最优脑外科)思路,Hessian 反向重建权重——精度好但只能拟合校准集
- 2023.06:AWQ arXiv 上线,提出”激活决定显著、缩放替代混合精度”两步走
- 2023 末:vLLM / TensorRT-LLM 接入 AWQ 作为默认 4-bit 路径
- 2024.05:MLSys 2024 Best Paper,正式工业落地
之后 AWQ 与 GPTQ 形成事实上的双标杆,前者偏前向 + 速度,后者偏反向重建 + 校准精度。
学到什么
- 重要性不在自己身上,在它和别人的关系里——这个思想超越量化(搜索里的 idf、推荐里的协同过滤本质都是相对量)
- 数学等价的缩放是个万能工具:训练里有 batchnorm 折叠,推理里有 AWQ scaling
- PTQ 三角:精度、速度、复杂度——AWQ 选了”前向校准 + 简单 grid search”的甜点
- 硬件友好优先于学术最优:混合精度数学上能赢,但工程上输给了”全 INT4 + 缩放”
- per-channel scaling 是工程最简形式——比 GPTQ 的 Hessian 反向重建简单一个量级,精度相当甚至更好
- 激活统计 = 语义先验:前向跑校准本身就是用模型自己告诉你”哪里重要”——比启发式都准
延伸阅读
- 论文 PDF:AWQ arXiv 2306.00978
- 官方实现:mit-han-lab/llm-awq
- TinyChat 推理框架:作者团队配套 INT4 GEMM kernel,端侧最快路径
- vLLM 量化文档:vLLM AutoAWQ
- awq —— 同主题更细的 PTQ 综合笔记
- gptq-2023 —— 反向重建路线,AWQ 的对照组
- llm-int8-2022 —— 异常通道路由的混合精度路线,AWQ 想替代的对象
关联
- vllm —— 推理引擎,AWQ 是它的默认 4-bit 路径
- paged-attention —— vLLM 显存管理,与权重压缩互补
- gptq-2023 —— 同期对手,反向重建 vs 前向 grid search 的两条路线
- llm-int8-2022 —— 异常通道路由的早期混合精度方案
- product-quantization-2011 —— 古典 PQ 思想:用查表代替全精度乘法
- ampere-architecture-2020 —— INT4 / INT8 张量核心的硬件支撑