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 三个核心想法:
-
逐列量化 + 误差补偿:把权重矩阵一列一列量化。每量化完第 i 列,就用 Hessian 逆
H^{-1}把这列产生的误差重分配到后面 i+1, i+2, … 列上。后面的列还没动,可以”提前知道前面的伤口”,把自己的值微调来补偿。 -
Cholesky 分解替代反复求逆:朴素 OBS 算法每量化一列就要更新
H^{-1},复杂度爆炸。GPTQ 发现一个数学事实:H^{-1}的 Cholesky 上三角分解U的第 i 行,就是第 i 列量化时需要的补偿系数。一次分解,全程复用。 -
Lazy batch 更新:每量化一列就更新一次剩余权重,会被内存带宽卡住。GPTQ 攒够 128 列再批量更新一次——计算密度上去了,GPU 利用率拉满。
最终:比前作 OBQ 快 3 个数量级,从”只能搞 100M 模型”跨到”能搞 175B 模型”。
实践案例
案例 1:目标函数到底在最小化什么
GPTQ 的目标:让量化后那一层的输出尽量贴近原输出。
min_W̃ || W X - W̃ X ||²W 是原 FP16 权重,W̃ 是量化后权重,X 是校准集激活。注意它不是让 W̃ ≈ W(直接量化每个数那种),而是让”乘 X 后看不出区别”。这就是为什么需要 Hessian——目标函数对权重的二阶导数。
案例 2:Hessian 怎么来
对单层线性层,目标 ||WX - W̃X||² 对 W̃ 求二阶导,得到 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 LLMllm = LLM( model="TheBloke/Llama-2-13B-GPTQ", quantization="gptq",)out = llm.generate(["你好"])vLLM 把 INT4 权重读进显存,前向时 dequant 成 FP16 算矩阵乘。13B 模型显存从 26GB 降到 7GB,单张 4090 直接跑。
踩过的坑
-
校准集偏移会显著掉点:GPTQ 拟合的是校准集每层输出。如果你拿 C4 校准、部署去做代码生成,激活分布对不上,掉点比 AWQ 严重。建议用部署域的小样本(128–512 条)重新校准。
-
INT3 以下不稳:4-bit 是 sweet spot,3-bit 还能勉强用,2-bit 困惑度爆炸。开源社区基本只认 4-bit GPTQ。
-
act-order(重排)模式精度更高但 kernel 兼容差:GPTQ 有个改进版按激活方差降序量化列,能进一步提精度。但很多推理 kernel(特别是 ExLlama V1)不支持 act-order,部署前要查清楚。
-
group_size 是默认 128:每 128 个权重共享一个 scale。groupsize 越小精度越高、文件越大。128 是社区共识 sweet spot。
-
Hessian 病态:校准样本太少时
H接近奇异,Cholesky 分解失败。GPTQ 加了”阻尼”项H + λI(λ 取对角均值的 1%),保数值稳定。 -
量化顺序选错代价大:默认按列序量化已经够好,但如果先量化”敏感列”再补偿,敏感列误差被放大。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 量化的事实工业标准。
学到什么
- 逐列 + 误差补偿 的思路远比”统一压缩”鲁棒——前 i 列的伤口让后 i+1, …, n 列分担。这个模式在很多工程场景都能复用。
- 二阶信息(Hessian)不是只用在训练——推理时也能用它做精细调整。校准集前向一遍就能算出。
- Cholesky 分解 = 一次预计算,永久复用——把”反复求逆”变成”读一行系数表”,3 个数量级的加速来自这里。
- lazy batch 是 GPU 时代的通用技巧:积攒到一定量再批量做,把内存带宽用满。
- PTQ 三角(精度、速度、复杂度)GPTQ 选了”反向重建 + 二阶补偿”的甜点;AWQ 选了”前向 grid search”的甜点——两条路线各有所长。
- 30 年前的剪枝理论(OBS)在大模型时代复活——研究的延续性比想象更长,老论文值得读。
- 算法瓶颈常在数据搬运而非计算——朴素 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 —— 反向重建 vs 前向 grid search 的两条路线对比
- sparsegpt-2023 —— 同作者把 GPTQ 框架挪到剪枝
- llm-int8-2022 —— 更早的 8-bit 异常通道路线
- product-quantization-2011 —— 古典向量量化思想
- vllm —— 推理引擎默认支持 GPTQ 加载
反向链接
- 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 推理引擎