Day25 | 模型量化横评 GPTQ vs AWQ vs GGUF vs INT8——同一个 Qwen3-8B 压四遍,谁还活着

苦猿的大模型日记 · Day25 · 模型量化横评 GPTQ vs AWQ vs GGUF vs INT8-帮普通人把AI学进简历系列

前言:模型量化,跟压 mp3 是同一件事

你听过 320kbps 和 128kbps 的 mp3 吗?

大多数人听不出差别。但文件大小,差了一倍多。

模型量化干的就是这件事。

把一个 fp16 的 Qwen3-8B------大约 16G 显存------压成 4bit,只要 5G。推理质量掉一点点,但你看不出来,部署成本砍掉一大半。

听起来很美,对吧?

直到我第一次真去压一个模型,连环踩坑------

  • 照着某篇博客装 AutoAWQ,pip install 完一启动,README 顶部弹出红框 deprecated
  • 换 AutoGPTQ,量化跑到一半 transformers 报 dtype 不兼容,搜了一圈发现这库 2024 年 3 月起就停止维护了
  • 改用 llama.cpp,编译半小时才编出来
  • 跑通后想升级 vLLM 一起用,发现 AutoAWQ / AutoGPTQ 这两个老库产出的格式跟最新版 vLLM 对不上

我当时脑子嗡的一下。

量化方法不是一个"技术选型"那么简单------它是在选一条生态路线。选错了,库废弃了,你的模型跟着一起报废。

今天我就把同一只 Qwen3-8B 用四种方法各压一遍------

  • INT8(bitsandbytes)
  • GPTQ INT4
  • AWQ INT4
  • GGUF Q4_K_M

告诉你哪种还活着、哪种半死、哪种你根本不该碰。

读完你能------

  1. 看懂四种方法各自压什么、用什么算法
  2. 拿到真实的显存 / 速度 / 质量 / 生态数据
  3. 知道你的硬件和部署目标,到底该选哪一种

PART 01:四种方法到底差在哪------一句话讲透

先把最容易混的两个概念剥开。

bitsandbytes 的 NF4 是训练侧量化,不是推理侧量化。

很多人第一次踩这个坑------QLoRA 微调时写的 BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")------这里的 NF4 是训练侧量化 ,目的是省显存做梯度反传,不是把模型压成 4bit 拿去上线

注意,bnb 的 INT8(LLM.int8(),Dettmers et al., NeurIPS 2022, arXiv 2208.07339)是推理量化 没错,但它的产物是运行时量化------模型权重本身没变,加载到 GPU 那一刻才动态量化。这跟 GPTQ/AWQ 那种"预先把权重压成 4bit 文件"不是一回事。

训练用 NF4,推理用 GPTQ/AWQ/GGUF(或 bnb INT8 在 transformers 里直接跑)------记住这条,能避开 80% 的量化误区。

下面把四个推理量化的核心思路讲清。

INT8(bitsandbytes,LLM.int8()):最老最稳最通用

把权重按 block 缩放到 int8,激活值用 FP16 保留------这是 LLM.int8() 论文的核心做法,论文定位就是"无性能损失的 175B 模型推理"

算法简单、几乎不可能装不上。但有两个工程特点要注意------

  1. 产物是运行时量化:权重本身没变,加载到 GPU 那一刻才动态量化,所以磁盘上的模型还是 fp16
  2. vLLM 兼容性参差:vLLM 较新版本(2024 末起)已经支持 bnb INT8/INT4 模型,但跟 GPTQ/AWQ 比起步晚、kernel 优化也少,生产部署首选仍是 GPTQ/AWQ

GPTQ:用 Hessian 矩阵做二阶误差补偿

论文:Frantar et al., GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers , ICLR 2023, arXiv 2210.17323。

核心思路一句话------逐层量化,每量化一列权重,就用剩下没量化的权重去补偿这一列的误差

数学上靠逆 Hessian 矩阵做最小二乘补偿。

类比一下:你在改一份大文档,每改一段,就用后续段落里的素材去把这段漏掉的内容补上------保证最终整体误差最小。

需要一小批(128 条左右)校准文本让模型"看到"激活值。

优势 :精度高,GPTQ 论文 Table 5 显示在 OPT-175B 这种大模型上 INT4 之后 PPL 退化极小(接近 FP16)。

劣势:量化过程慢(要算 Hessian),需要校准集;在小模型上退化比 AWQ 大(详见下面 AWQ 段)。

AWQ:靠激活值找"重要通道"

论文:Lin et al., AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration , MLSys 2024 Best Paper, arXiv 2306.00978。

核心思路------观察哪些通道的激活值大(也就是"重要通道"),量化前对这些通道做按通道缩放,让重要权重保精度

不像 GPTQ 那样算 Hessian,只看激活值统计,所以更快。

论文给的精度优势(OPT-6.7B INT4-g128 量化后 PPL 退化):

  • AWQ 约 +0.5-0.6
  • GPTQ +2.3-4.9

但注意------这是英文 PPL benchmark 的数字。中文 / 指令跟随任务上,GPTQ 和 AWQ 的差距远小于这个数字。

GGUF:一个文件容器,不是一个算法

GGUF 是 llama.cpp 的二进制格式,前身叫 GGML,2023 年 8 月 PR #2348 合并后改名,由 Georgi Gerganov 维护。

它本身不是一个量化算法,是一个文件容器------里面塞的是 K-quants(Q4_K_M、Q5_K_M、Q6_K 等)。

核心优势有四条:

  1. 单文件分发------权重 + tokenizer + config 全打一个文件里
  2. CPU 推理 + GPU offload 混合 -------ngl N 控制把多少层放到 GPU
  3. Apple Silicon 一等公民------Metal 加速原生支持
  4. mmap 快速加载------大模型秒级启动

被低估的一点:GGUF 不只是给 CPU 用的-ngl 999 全 offload 到 GPU,纯 GPU 跑 GGUF 也很常见。

四件套对照表(关键收藏卡)

维度 INT8 (bnb) GPTQ AWQ GGUF (Q4_K_M)
算法核心 块缩放 逆 Hessian 二阶补偿 激活感知 per-channel scale K-quants(改进版分组量化)
量化速度
INT4 精度损失 中-大 最小(论文宣称) 小-中
主要部署目标 训练 / 研究 服务化(vLLM) 服务化(vLLM/TensorRT) CPU / 边缘 / 混合
生态活跃度 高(bnb 持续维护) 库停滞 库已废弃 极高(llama.cpp 活跃)

PART 02:实验设置------锁定变量,让结果可比

老规矩------横评的可信度,全靠锁定变量

固定项

  • base:Qwen3-8B
  • 校准数据:随机抽 128 条 Alpaca-zh
  • 评测 prompt:10 条(指令跟随 + 知识问答 + 数学 + 代码各几条)
  • 硬件:单卡(我用 4090 24G),CPU 推理用本机

变量项:只有量化算法和容器格式。

四条路:

  • INT8:bitsandbytes load_in_8bit=True
  • GPTQ:用 GPTQModel 量化到 INT4(别再用 AutoGPTQ,下面 PART 04 讲为啥
  • AWQ:用 llm-compressor(vLLM 官方继任者)或 AutoAWQ(已废弃但仍能跑)量化到 INT4
  • GGUF:用 llama.cpp 的 convert_hf_to_gguf.py + quantize 工具压成 Q4_K_M

四套加载代码并排:

复制代码
# INT8 (bnb)
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B",
    load_in_8bit=True,
    device_map="auto",
)

# GPTQ INT4(用 GPTQModel 推荐)
from gptqmodel import GPTQModel
model = GPTQModel.from_quantized(
    "Qwen/Qwen3-8B-GPTQ-Int4",
    device="cuda:0",
)

# AWQ INT4
from awq import AutoAWQForCausalLM
model = AutoAWQForCausalLM.from_quantized(
    "Qwen/Qwen3-8B-AWQ",
    device="cuda:0",
)

# GGUF Q4_K_M(用 llama.cpp 的 python binding)
from llama_cpp import Llama
llm = Llama(
    model_path="qwen3-8b-q4_k_m.gguf",
    n_gpu_layers=-1,  # 全部 offload 到 GPU
)

两个最容易踩的工程坑

坑 1:AutoAWQ 装不上 / 一启动就 deprecated warning

不是你的问题。AutoAWQ 在 2025 年 5 月已经被官方宣布废弃 ,官方继任者是 vLLM 项目下的 llm-compressor (vLLM 文档原话:"adopted by the vLLM project in llm-compressor")。注意,GPTQModel 不是 AutoAWQ 的继任者------它是 AutoGPTQ 的继任者,两个库的接棒关系别混了。

坑 2:bnb 加载的 INT8/INT4 模型,老版本 vLLM 报错 unrecognized quantization

vLLM 较新版本(2024 末起)已经支持 bnb INT8/INT4,但老版本的 vLLM 不认 bnb 的运行时量化------它要的是预先量化好的 GPTQ/AWQ 模型文件。如果你被这个报错卡住,要么升级 vLLM,要么改走 GPTQ/AWQ 路线。


PART 03:显存 / 速度 / 质量------四件套头对头数据

先说一句 :下面三张表的具体数字会随你的硬件、prompt 长度、batch 大小波动。我给的是实测观察区间论文 / 官方数字,不是绝对值。

显存对比(Qwen3-8B,fp16 baseline 约 16G)

方法 模型加载显存 推理峰值显存 能否在 4090 24G 跑
FP16 baseline ~16G ~20-22G 极限
INT8 (bnb) ~9-10G ~12-14G 舒服
GPTQ INT4 ~5-6G ~8-10G 非常舒服
AWQ INT4 ~5-6G ~8-10G 非常舒服
GGUF Q4_K_M(纯 GPU) ~5-6G ~8-10G 非常舒服
GGUF Q4_K_M(CPU) ~0G GPU 系统 RAM 6-8G 任何机器

反直觉点 :GGUF 在 CPU 模式下显存占用 0G ------你 4090 都不用,老笔记本都能跑 Qwen3-8B

推理速度对比(同样 prompt,输出 256 tokens)

  • vLLM 上 GPTQ 和 AWQ 速度接近,配 Marlin kernel 后甚至比 fp16 还快------4bit 显存带宽友好
  • bnb INT8/INT4 在 transformers 里跑比较慢------动态量化开销摆在那,生产推理首选仍是 GPTQ/AWQ 这种预先量化方案
  • GGUF 纯 GPU 模式速度与 vLLM GPTQ 接近;CPU 模式慢 5-20 倍,但能跑

一句话心法

部署用 vLLM + GPTQ/AWQ,本地玩用 GGUF------bnb INT8 不是首选推理方案。

质量对比(关键反差点)

AWQ 论文宣称 OPT-6.7B INT4 量化后 PPL 退化 +0.5-0.6,GPTQ 是 +2.3-4.9------但论文用的是英文 PPL benchmark

中文 + 指令跟随任务上------

  • GPTQ 和 AWQ 的差距远小于论文数字
  • GGUF Q4_K_M 与 GPTQ INT4 质量接近(K-quants 是改进算法,比老 Q4_0 精度好不少)
  • INT4 vs INT8 的质量差距远小于显存差距------大多数人不需要 INT8

还有一个反直觉点------

质量退化最大的不是量化本身,而是"量化 + 微调叠加"。已经 GPTQ 量化过的模型,再上 LoRA 微调,精度损失会被放大。

LoRA 微调请用 QLoRA 的 NF4 流程(动态量化 + LoRA),别在量化模型上再训


PART 04:生态存活度------这才是 Day25 真正的反差点

前面三章是技术对比。这一章才是这篇文真正想讲的------选量化方法不是选算法,是选生态

我把四个库的"存活状态"列一下------

bitsandbytes :高活。官方持续维护,8bit / 4bit 量化的"瑞士军刀",NF4 训练侧(QLoRA)无可替代,INT8 推理也可用但 kernel 优化不如 GPTQ/AWQ。

AutoGPTQ自 2024 年 3 月起停止维护 (最后版本 0.7.1,官方 discussion #758 明确写 "effectively stopped forward development")。但社区博客大量老教程还在教你装 AutoGPTQ------照着装能跑,但是个死人库

AutoAWQ2025 年 5 月官方宣布 deprecated。README 顶部直接贴废弃公告。

GPTQModelAutoGPTQ 的继任者 ,活跃维护,同一个库同时支持 GPTQ 和 AWQ 两种量化算法

llm-compressorAutoAWQ 的官方继任者,vLLM 项目下的量化工具链,跟 vLLM 部署深度协同。

注意这两个继任关系别混------GPTQModel 接 AutoGPTQ,llm-compressor 接 AutoAWQ,不是一回事。

llama.cpp / GGUF极活。Georgi Gerganov 团队 + 全社区贡献,每周都有 PR 合入。

判断标准

  • 新项目别再装 AutoGPTQ(→ 用 GPTQModel );别再装 AutoAWQ(→ 用 llm-compressor
  • 除非你要复现某个老教程,否则没必要碰那两个死库

面试被问"你用过哪些量化方法"的三层答案

  • 表层:GPTQ / AWQ / GGUF / INT8 各自压什么、用什么算法
  • 工程层:AutoGPTQ / AutoAWQ 已停滞或废弃,新项目用 GPTQModel / llm-compressor;bnb NF4 是训练侧、INT8 是推理侧但 kernel 不如 GPTQ/AWQ
  • 选型层 :看硬件 + 部署目标 + 生态存活度,不是看论文 PPL

第三层才是真正区分"用过量化"和"懂量化"的分界线。


PART 05:选型决策树------什么硬件该用谁

直接上决策树。

个人电脑 / Mac / 没有好显卡GGUF Q4_K_M,没别的选。

4090 24G 单卡 + vLLM 部署GPTQ INT4 或 AWQ INT4,二选一。质量差距小于生态差距,看你顺手哪个。

A100 80G 多卡 + vLLM 部署GPTQ 或 AWQ INT4,吞吐量优先选 AWQ(Marlin kernel 优化更好)。

H100 / H200 + vLLM直接上 FP8 。vLLM 0.5+ 原生支持,需要 Hopper 架构原生硬件。在这个级别的硬件上,INT4 反而是历史包袱

Blackwell B200 + vLLMNVFP4。NVIDIA 官方说法是 FP4 "接近 FP8" 的精度(社区实测退化很小),正在吃掉 INT4 的地盘。

边缘设备 / 树莓派 / 手机GGUF Q4_0 或 Q3_K_M。llama.cpp 是唯一选项。

训练侧量化(QLoRA 微调)bnb NF4。这跟推理量化是两个世界------NF4 是动态的,为反向传播服务,不是把模型压成静态 4bit。

一个反直觉点

INT4 在消费卡 / 边缘端仍是主力。FP8 / FP4 只在 Hopper / Blackwell 及更新硬件上才有意义。

你的 4090 跑 FP8 实际收益有限------4090(Ada Lovelace)硬件层面是支持 FP8 的(第四代 Tensor Core,E4M3/E5M2),但 NVIDIA 的 Transformer Engine 对 Ada 架构的优化远不如 Hopper,跑 FP8 不一定比 INT4 快多少。FP8 的甜点区在 Hopper 起。

很多人看到 "FP8 取代 INT8" 的说法就以为 FP8 是新时代答案,那是 H100 起步的事,跟你没关系

一个心法

先选部署目标(CPU / GPU / 服务化 / 边缘),再选量化方法。别反过来。

90% 的个人部署场景,GGUF Q4_K_M 是最稳的答案------

  • 对硬件最宽容(CPU 也行,GPU 也行,Mac 也行)
  • 单文件好分发
  • 社区最活跃

PART 06:崩盘点对照表(关键收藏卡)

症状 大概率原因 该动什么
vLLM 启动报 unrecognized quantization 老版本 vLLM 不认 bnb 的运行时量化模型 升级 vLLM 到新版(2024 末起已支持 bnb),或改用 GPTQ/AWQ 预量化模型
AutoAWQ 安装报错 / 到处 warning 库已 deprecated(2025-05 起),继任者是 vLLM 项目的 llm-compressor 改用 llm-compressor,或直接走 GPTQModel 路线
AutoGPTQ 量化过程卡死 AutoGPTQ 自 2024-03 起停止维护,跟新 torch/transformers 不兼容 换 GPTQModel(AutoGPTQ 的官方继任者)
GPTQModel 报 dtype 冲突 校准数据 dtype 与模型 dtype 不匹配 calibration_data = calibration_data.to(model.dtype)
GGUF 模型在 vLLM 里跑不动 vLLM 对 GGUF 支持有限(实验性) 改用 llama.cpp / llama-cpp-python 部署 GGUF
GGUF CPU 推理速度极慢 没开 -ngl GPU offload n_gpu_layers=-1 全 offload
量化模型在长 prompt 下输出乱码 INT4 在长 context 下精度退化更严重 升级到 INT8 / Q5_K_M,或减少 context length
量化模型 LoRA 微调后效果反而变差 "量化 + 微调"放大精度损失 用 QLoRA NF4 流程,别在量化模型上再训
同一个 Q4_K_M 模型不同机器速度差很多 CPU 指令集差异(AVX2/AVX512/NEON) 编译 llama.cpp 时开对应指令集

结尾:量化方法不会过时,但量化库会

回到开头那个 mp3 的类比。

320kbps 和 128kbps 的差别你听不出来------但有一件事 mp3 不会发生、量化却会发生------

你用来压 mp3 的那个软件,可能已经停止维护了。

我见过太多人------

  • 论文 PPL 比来比去,比了三天
  • 最后选了 AutoAWQ,装上去才发现库已经废弃
  • 想换 AutoGPTQ,发现也停更了
  • 又去搜新方案,搜到 GPTQModel------一周过去了

论文里 PPL 差距 0.5%,你部署到生产里看不出来。

库废弃了你的模型直接报废------这才是真正的精度损失。

量化方法不会过时,但量化库会------你选的不是算法,是生态。

下次你纠结选哪个量化方法的时候,先去 GitHub 看看这个库最近一次 commit 是什么时候。比看论文 PPL 重要得多。

互动时间:你部署模型时选哪个量化方法?踩过哪些库废弃的坑?评论区聊聊。

> 下一篇,量化讲完了,我们聊聊怎么知道你的微调真的变好了------评测这件事,比训练更难。关注「苦猿」,别走丢。

--- END ---

苦猿 · 帮普通人把 AI 学进简历

相关推荐
benchmark_cc1 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
深海鱼肝油ya1 小时前
小说自动生成系统(二)
人工智能·大模型·agent·智能体·自动化编程·小说生成系统
通问AI2 小时前
Apple Intelligence 国行备案深度技术解析:阿里千问如何被集成到苹果端侧AI架构
人工智能·架构
视***间2 小时前
算力赋能零售与创意新生态:视程空间Pandora,解锁线下场景智能化无限可能
人工智能·边缘计算·智慧零售·ai算力·视程空间·创意开发
冬奇Lab2 小时前
MCP 系列(08):企业治理——Registry、路由与可观测性
人工智能·llm·mcp
冬奇Lab2 小时前
每日一个开源项目(第161篇):Open Interpreter - 开源 AI 编程 Agent,用 Rust 重写,支持 Kimi、Qwen、DeepSeek
人工智能·开源·资讯
renhongxia12 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
天上路人2 小时前
AU-48双麦多功能语音处理模组:100dB AEC + 波束定向拾音,会议与监控全场景覆盖
人工智能·ai降噪·语音处理·ai语音·麦克风·回音消除
甲维斯2 小时前
Codex定制皮肤,Windows一键切换已经搞定!
人工智能