GPTQ vs AWQ vs GGUF:模型量化工具横向测评
把70B模型塞进单卡4090,这种"变魔术"的事你干过没?
我之前一直觉得量化是玄学。直到把公司推理成本从月均5万降到8千,才彻底服了。
这篇聊聊当前最主流的三个量化方案:GPTQ、AWQ、GGUF------哪个适合谁、怎么选。
量化到底在做什么
先说人话:量化就是把模型参数的精度降低。
原本一个参数用16位浮点数存(FP16),量化后用4位甚至3位整数存。显存占用直接砍掉3/4。
代价是精度损失。但好消息是------对于7B以上的模型,量化后的精度损失常常不到1%。
GPTQ:开源界的元老
GPTQ是2023年出来的,算是量化工具里的战斗机。
核心原理:基于一个校准数据集,逐层做量化。Layer-by-layer的贪心搜索,把每个权重分成小块,找最优量化方案。不是简单的四舍五入,而是考虑了量化误差对整个层的影响。
python
# GPTQ的使用方式(通过AutoGPTQ库)
from auto_gptq import AutoGPTQForCausalLM
model = AutoGPTQForCausalLM.from_pretrained(
"model_name",
quantize_config=BaseQuantizeConfig(
bits=4, # 量化位数
group_size=128, # 分组大小
damp_percent=0.01 # 阻尼系数
)
)
model.quantize(calibration_dataset)
model.save_pretrained("/path/to/quantized-model")
优点:
- 生态成熟,HuggingFace上大量已量化好的模型
- 支持4bit和3bit,压缩比高
- exllama内核推理速度快
缺点:
- 量化过程需要GPU(校准数据要在GPU上跑)
- 校准数据集的选择会影响量化质量
- 不适用于CPU推理
最适合:GPU推理场景,追求高压缩比+高速度。
踩坑记录
我刚开始用GPTQ量化Qwen-7B,出来的模型效果特别差。找了两天原因------校准数据用的是英文通用语料,但我的场景全是中文。
换成中文校准数据后,效果直接翻倍。
校准数据需要跟你的实际使用场景匹配,这个坑希望大家别踩。
AWQ:更聪明的量化
AWQ(Activation-aware Weight Quantization)是2024年的新方案,跟GPTQ最大的区别是:它考虑了激活值分布。
核心思想:不是所有权重对输出一样重要。那些对应大激活值的权重,更"关键",需要保留更多精度。
python
# AWQ的使用方式(通过AutoAWQ)
from awq import AutoAWQForCausalLM
model = AutoAWQForCausalLM.from_pretrained(
"model_name",
)
model.quantize(
tokenizer,
quant_config={
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM"
},
calib_dataset=calibration_data
)
model.save_pretrained("/path/to/awq-model")
优点:
- 量化速度快(比GPTQ快3-5倍)
- 精度保持更好(尤其在小模型上)
- 权重+激活联合优化
缺点:
- 社区支持不如GPTQ成熟
- 部分模型兼容性有问题
- CPU推理支持有限
最适合:需要频繁量化不同模型、对精度要求较高的场景。
实测对比
同一个Qwen2-7B,我用GPTQ和AWQ分别量化到4bit:
| 指标 | FP16 | GPTQ 4bit | AWQ 4bit |
|---|---|---|---|
| 显存占用 | 14GB | 4.2GB | 4.1GB |
| MMLU | 71.3% | 70.1% | 70.5% |
| 生成速度 | 45 t/s | 82 t/s | 79 t/s |
| 量化耗时 | - | 45min | 12min |
AWQ精度略胜,量化速度快4倍。GPTQ生成速度稍快。
GGUF:CPU玩家的救星
GGUF是llama.cpp生态下的量化格式。跟上面两个完全不同------它专为CPU/混合推理设计。
bash
# 下载模型后用llama.cpp量化
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make
# 转成GGUF格式
python convert.py /path/to/model --outfile model.gguf
# 量化
./quantize model.gguf model-Q4_K_M.gguf q4_K_M
GGUF支持从Q2_K到Q8_0共十几种量化级别。
优点:
- 支持CPU推理,没GPU也能跑
- 量化级别丰富(2bit到8bit任选)
- 与llama.cpp生态完美集成
缺点:
- GPU推理速度不如GPTQ/AWQ
- 量化工具链相对复杂
- 转换过程需要完整模型
最适合:苹果M系列芯片、CPU推理、低配服务器。
我的经验
如果让我选的话:
有GPU的场景:选AWQ。量化快、精度高、推理速度不差。GPTQ作为备选。
无GPU / Mac用户:选GGUF。Q4_K_M级别性价比最高,Q5_K_M稍微大点但精度更好。
高并发生产环境:先用AWQ量化,再用vLLM或TGI部署。同时配置GGUF版本作为降级方案。
全面对比表
| 维度 | GPTQ | AWQ | GGUF |
|---|---|---|---|
| 量化目标 | GPU | GPU | CPU/GPU |
| 量化速度 | 慢 | 中等 | 快 |
| 推理速度 | 快 | 快 | 一般 |
| 精度保持 | 良好 | 优秀 | 良好 |
| 社区生态 | 最成熟 | 发展快 | 很好 |
| CPU支持 | ❌ | ❌ | ✅ |
| Mac支持 | ❌ | ❌ | ✅ |
| 量化级别 | 3/4/8bit | 3/4bit | 2~8bit |
写在最后
量化不是什么玄学。理解原理、选对工具,其实就是层窗户纸。
对于大多数做推理部署的团队,我建议:
- GPU部署首选AWQ 4bit
- Mac或无GPU选GGUF Q4_K_M
- 先量化基准版本,不要一次性大量量化全部模型
量化这件事,核心就是:用最小的精度换最大的速度。搞清楚自己的瓶颈到底在哪儿(显存?带宽?计算?),再选方案。
希望对你有帮助,有问题评论区见。