摘要: 通义千问 (Qwen) 官方目前公开维护 4 种低比特量化路径:Bits & Bytes Int4/Int8、GPTQ、AWQ 以及 GGUF (llama.cpp)。它们分别覆盖推理直量化、权重量化、激活感知量化和端侧推理场景,可在不同硬件上把显存占用降到 FP16 的 25 %–50 %,同时维持接近原精度。下文首先列出目录,然后逐一对比实现原理、硬件要求、性能差异,并给出最小可运行代码片段与输出目录组织示例。
目录
-
量化方案一览
-
GPTQ — 二阶信息权重量化
-
AWQ — 激活感知权重量化
-
Bits & Bytes (Int4 / Int8) — 推理时低比特线性层
-
GGUF (llama.cpp) — 端侧 CPU / GPU 混合量化
-
综合对比与选型建议
1 量化方案一览
方法 | 比特数 | 典型模型仓库 | 核心库 | 主要硬件 | 备注 |
---|---|---|---|---|---|
Bits & Bytes | 8 / 4 bit | Qwen-7B-Chat-Int4 (HF) | bitsandbytes | 10 GB+ GPU | 无需校准,推理时按块量化 |
GPTQ | 8 / 4 bit | Qwen2.5-32B-Instruct-GPTQ-Int4 | AutoGPTQ / transformers | ≥ 24 GB GPU | 一次校准,二阶 Hessian 近似 |
AWQ | 4 bit | Qwen2.5-72B-Instruct-AWQ | AutoAWQ | ≥ 16 GB GPU | 激活感知;兼容 vLLM / CTranslate2 |
GGUF | 2–8 bit | llama.cpp 转换产物 | llama.cpp | CPU / GPU / Apple Silicon | 端侧部署友好,引擎轻量 |
2 GPTQ:二阶信息权重量化
-
原理:利用近似 Hessian 信息一次性为每层权重寻找最小误差的量化边界。
-
官方支持:Qwen2.5 全系列均提供 Int4 / Int8 权重量化模型。
-
加载示例
from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4" model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_id)
-
自定义量化:使用
AutoGPTQ
在少量校准文本上完成一键量化,生成safetensors
权重与quant_config.json
。
3 AWQ:激活感知权重量化
-
原理:校准时同时考虑激活直方图与权重分布,获得更小量化误差;推理阶段不改动网络结构。
-
加载示例
from transformers import AutoTokenizer, AutoModelForCausalLM model_id = "Qwen/Qwen2.5-7B-Instruct-AWQ" model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto") tok = AutoTokenizer.from_pretrained(model_id)
-
自定义量化
from awq import AutoAWQForCausalLM model = AutoAWQForCausalLM.from_pretrained( src_path, quant_config={"w_bit": 4, "q_group_size": 128, "zero_point": True} ) model.quantize(dataset=calib_texts, quant_path=dst_path)
4 Bits & Bytes (Int4 / Int8):推理时按需量化
-
原理:加载权重时用块稀疏 + NF4 / FP4 格式将线性层压缩到 4 bit,或使用 8 bit 整数量化;不需要校准数据。
-
加载示例
from transformers import AutoModelForCausalLM, BitsAndBytesConfig cfg = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True ) model = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen-7B-Chat", quantization_config=cfg, device_map="auto" )
-
优缺点:部署最快且兼容微调,但推理吞吐略低于 GPTQ / AWQ;量化误差由库内部自适应处理。
5 GGUF (llama.cpp):端侧 CPU / GPU 混合
-
原理:将权重编码为静态块格式 (GGUF) 后,由
llama.cpp
在 CPU 或 Apple Silicon GPU 上做低比特矩阵乘。 -
流程:先用
convert.py
将 Hugging Face 格式 Qwen 权重导出为 GGUF;然后通过./main -m model.gguf -p "Your prompt"
运行离线推理。
-
适用场景:显存 ≤ 8 GB 或需离线私有部署;吞吐低于 GPU 方案,但无需 CUDA 依赖。
6 综合对比与选型建议
维度 | GPTQ | AWQ | Bits & Bytes (4/8b) | GGUF |
---|---|---|---|---|
校准数据 | 必需 | 必需 | 不需要 | 不需要 |
加载速度 | 中 | 中 | 快 | 快 |
推理吞吐 | ★★★★ | ★★★★ | ★★★ | ★★ |
显存占用 | 25 %–50 % FP16 | 25 % FP16 | 25 %–50 % FP16 | 12 %–50 % FP16 |
vLLM 兼容 | ✔ | ✔ | 部分 (8 bit) | ✖ |
LoRA 再微调 | 不支持 | 支持 | 支持 | 不支持 |
-
GPU 服务器:优先 GPTQ (推理) 或 AWQ (推理 + LoRA),结合 vLLM 多路并发。
-
消费级显卡:Bits & Bytes 4 bit 可在 10 GB 显存上运行 Qwen‑7B。
-
CPU / Apple M‑系列:转换 GGUF,用 llama.cpp 实现离线推理。
-
高并发 API:AWQ + vLLM 0.6+ 提供最佳 QPS。
输出目录示例
qwen_quantization_demo/
├── gptq_demo.py
├── awq_demo.py
├── bnb_int4_demo.py
├── convert_to_gguf.py
├── calib_texts.jsonl
└── README.md
该目录下包含各量化方案的最小可运行脚本与使用说明,便于快速比较加载速度、显存占用与推理性能。