跳转到内容

GPTQ — 把 175B 大模型压成 4-bit 还几乎不掉点

是什么

GPTQ 是一种让一个 175B 参数的大模型从 16-bit 浮点压到 4-bit 整数、还几乎不掉精度的训练后量化方法。

日常类比:你要把一柜子的瓷器装进只有 1/4 体积的小箱子,每件都要变小。粗暴办法是统一砍——结果碎一地。GPTQ 的办法是一件一件来:每塞一件进小箱子,看一下变形多少,剩下还没塞的瓷器就微调一下姿势补偿这个变形,让整体看起来还像原来那柜子。

更精确说:GPTQ 逐列量化权重矩阵,每量化一列就用二阶信息(Hessian 逆)调整后面所有未量化的列,把这一列的量化误差吸收掉。

为什么重要

  • 第一次让 175B 级别 LLM(OPT-175B / BLOOM-176B)的 4-bit 量化在 4 个 GPU 小时内完成
  • INT4 后困惑度(perplexity)几乎不变,INT3 还能用,跟 16-bit 拼推理质量不分上下
  • 是 2023 年开源 LLM 部署的事实标准:LLaMA / Falcon / Mistral 大量发布 GPTQ 版本
  • 一张 24GB 消费级 GPU(如 4090)能跑下原本要 4 张 A100 的模型
  • AutoGPTQ / ExLlama / vLLM / TGI 都内置 GPTQ 加载路径

如果你想理解 2023 年开源 LLM 怎么从”机房才能跑”沉到”个人电脑能跑”,GPTQ 是关键的一环。

核心要点

GPTQ 三个核心想法:

  1. 逐列量化 + 误差补偿:把权重矩阵一列一列量化。每量化完第 i 列,就用 Hessian 逆 H^{-1} 把这列产生的误差重分配到后面 i+1, i+2, … 列上。后面的列还没动,可以”提前知道前面的伤口”,把自己的值微调来补偿。

  2. Cholesky 分解替代反复求逆:朴素 OBS 算法每量化一列就要更新 H^{-1},复杂度爆炸。GPTQ 发现一个数学事实:H^{-1} 的 Cholesky 上三角分解 U 的第 i 行,就是第 i 列量化时需要的补偿系数。一次分解,全程复用。

  3. Lazy batch 更新:每量化一列就更新一次剩余权重,会被内存带宽卡住。GPTQ 攒够 128 列再批量更新一次——计算密度上去了,GPU 利用率拉满。

最终:比前作 OBQ 快 3 个数量级,从”只能搞 100M 模型”跨到”能搞 175B 模型”。

实践案例

案例 1:目标函数到底在最小化什么

GPTQ 的目标:让量化后那一层的输出尽量贴近原输出。

min_W̃ || W X - W̃ X ||²

W 是原 FP16 权重, 是量化后权重,X 是校准集激活。注意它不是W̃ ≈ W(直接量化每个数那种),而是让”乘 X 后看不出区别”。这就是为什么需要 Hessian——目标函数对权重的二阶导数。

案例 2:Hessian 怎么来

对单层线性层,目标 ||WX - W̃X||² 求二阶导,得到 H = 2 X X^T

H 的形状是 [列数, 列数],描述”每对列之间的相关性”。校准集前向跑一遍就能算出 H不需要反向传播。这是 GPTQ 能在 4 小时搞 175B 的关键之一。

案例 3:补偿公式直觉

量化第 i 列时,误差为 e_i = w_i - quant(w_i)。GPTQ 把所有未量化列 j > i 这样调整:

w_j ← w_j - e_i · (H^{-1})[i,j] / (H^{-1})[i,i]

直觉:第 i 列偏了 e_i,凡是和第 i 列相关性高的列,就替它扛一部分。相关性低的列不受影响。

案例 4:在 vLLM 里加载 GPTQ 模型

from vllm import LLM
llm = LLM(
model="TheBloke/Llama-2-13B-GPTQ",
quantization="gptq",
)
out = llm.generate(["你好"])

vLLM 把 INT4 权重读进显存,前向时 dequant 成 FP16 算矩阵乘。13B 模型显存从 26GB 降到 7GB,单张 4090 直接跑。

踩过的坑

  1. 校准集偏移会显著掉点:GPTQ 拟合的是校准集每层输出。如果你拿 C4 校准、部署去做代码生成,激活分布对不上,掉点比 AWQ 严重。建议用部署域的小样本(128–512 条)重新校准。

  2. INT3 以下不稳:4-bit 是 sweet spot,3-bit 还能勉强用,2-bit 困惑度爆炸。开源社区基本只认 4-bit GPTQ。

  3. act-order(重排)模式精度更高但 kernel 兼容差:GPTQ 有个改进版按激活方差降序量化列,能进一步提精度。但很多推理 kernel(特别是 ExLlama V1)不支持 act-order,部署前要查清楚。

  4. group_size 是默认 128:每 128 个权重共享一个 scale。groupsize 越小精度越高、文件越大。128 是社区共识 sweet spot。

  5. Hessian 病态:校准样本太少时 H 接近奇异,Cholesky 分解失败。GPTQ 加了”阻尼”项 H + λI(λ 取对角均值的 1%),保数值稳定。

  6. 量化顺序选错代价大:默认按列序量化已经够好,但如果先量化”敏感列”再补偿,敏感列误差被放大。act-order 反过来——先量化激活方差大的列(误差好补偿),再量化方差小的(敏感)。

适用 vs 不适用场景

适用

  • 大模型(7B 以上)推理部署,显存是瓶颈
  • 没有训练资源、只能做训练后量化(PTQ)
  • 推理引擎已经支持 GPTQ(vLLM / TGI / TensorRT-LLM / ExLlama)
  • 部署域和校准域接近的稳定场景

不适用

  • 训练阶段(GPTQ 是 PTQ,不能边训边量化)
  • 需要激活也量化的 W4A8 / W8A8 路线(请看 SmoothQuant)
  • 跨多个差异大的领域部署同一个量化版本(请看 AWQ,更鲁棒)
  • 极小模型(<1B)——量化收益少、复杂度不划算

历史小故事(可跳过)

  • 1989 年:LeCun 的 Optimal Brain Damage(OBD)用二阶导数选哪些权重最不重要、能直接剪掉。这是”二阶信息引导剪枝”的源头。
  • 1993 年:Hassibi-Stork Optimal Brain Surgeon(OBS)—— OBD 不止剪、还用 Hessian 逆调整剩下的权重补偿。理论完整但只能跑小模型。
  • 2022 年:Frantar-Alistarh OBQ —— 把 OBS 从剪枝搬到量化,能搞 100M 级模型,但 175B 跑不动。
  • 2022.10:同作者 GPTQ —— OBQ + Cholesky + lazy batch,3 个数量级加速,4 小时搞定 175B。
  • 2023.06:AWQ 提出激活感知缩放路线,跟 GPTQ 形成两条主流量化路径。

之后 GPTQ 成了开源 LLM 量化的事实工业标准。

学到什么

  1. 逐列 + 误差补偿 的思路远比”统一压缩”鲁棒——前 i 列的伤口让后 i+1, …, n 列分担。这个模式在很多工程场景都能复用。
  2. 二阶信息(Hessian)不是只用在训练——推理时也能用它做精细调整。校准集前向一遍就能算出。
  3. Cholesky 分解 = 一次预计算,永久复用——把”反复求逆”变成”读一行系数表”,3 个数量级的加速来自这里。
  4. lazy batch 是 GPU 时代的通用技巧:积攒到一定量再批量做,把内存带宽用满。
  5. PTQ 三角(精度、速度、复杂度)GPTQ 选了”反向重建 + 二阶补偿”的甜点;AWQ 选了”前向 grid search”的甜点——两条路线各有所长。
  6. 30 年前的剪枝理论(OBS)在大模型时代复活——研究的延续性比想象更长,老论文值得读。
  7. 算法瓶颈常在数据搬运而非计算——朴素 OBQ 算的次数没多多少,慢在反复求逆和带宽。换 Cholesky + lazy batch 后计算量同阶,但带宽顺了,速度跨了三个数量级。

延伸阅读

  • 论文 PDF:GPTQ arXiv 2210.17323
  • 官方实现:作者所在的奥地利科技学院 DASLab 仓库下 gptq 项目(GitHub 搜索 gptq frantar 第一条)
  • 工程化版:AutoGPTQ
  • 推理 kernel:turboderp/exllamav2(针对 GPTQ 优化的高速 4-bit kernel)
  • vLLM 量化文档:vLLM Quantization
  • awq —— 同期对手,前向激活感知路线
  • sparsegpt-2023 —— 同作者同框架的剪枝版本

关联

反向链接

  • awq —— AWQ — 看激活脸色给权重打折
  • awq-2023 —— AWQ 2023 — 让 70B 大模型住进 RTX 4090
  • llm-int8-2022 —— LLM.int8() — 大模型激活值里藏着几个超大异常通道
  • product-quantization-2011 —— Product Quantization — 把向量切碎再压成几个字节
  • smoothquant-2023 —— SmoothQuant 2023 — 把激活的烫手山芋扔给权重
  • sparsegpt-2023 —— SparseGPT — 175B 大模型一次过剪 50%,不重训
  • vllm —— vLLM — 高吞吐 LLM 推理引擎