大模型量化压缩是降低推理成本的关键技术路径。GPTQ和AWQ作为两种主流的后训练权重量化方法,在4bit精度下能将模型体积压缩75%,同时保持接近FP16的推理质量。以下对比两种量化方法的原理差异,给出从量化处理到推理部署的完整操作流程。
GPTQ量化原理与计算流程
GPTQ基于二阶Hessian信息对权重矩阵进行逐层量化。核心是在量化每一列权重时,利用Hessian矩阵的逆来补偿已量化权重引入的误差,使误差对后续权重的影响最小化。具体过程:对权重矩阵W按列量化,每量化一列w_i后,根据Hessian逆矩阵H^{-1}计算补偿值,更新剩余未量化权重。
GPTQ依赖校准数据集(通常使用Wikitext或C4的128-1024个样本)来估计Hessian矩阵。量化过程需要GPU计算Hessian的逆,7B级别模型在A100上约需30-60分钟。在4bit精度下,GPTQ的精度损失通常控制在1%以内。
适用场景:对精度要求较高、部署后模型版本相对固定的推理服务。
AWQ量化原理与显著权重保护
AWQ的核心发现是:并非所有权重对量化误差同等敏感。与较大激活值交互的权重通道(称为”显著权重”)在量化后对输出影响更大。AWQ通过分析前向传播中的激活值分布,识别显著权重通道,对这些通道的权重进行缩放保护,而非直接量化。
AWQ同样需要校准数据,但不需要计算Hessian逆,量化速度显著快于GPTQ。7B模型在A100上约10-20分钟完成量化。4bit精度下精度表现与GPTQ接近,在部分模型上甚至略优。
适用场景:需要快速量化、频繁更新模型版本的部署环境,以及对batch size灵活性有要求的推理服务。
GPTQ量化实操:以Llama-2-7B为例
使用AutoGPTQ库对Llama-2-7B进行4bit量化:
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-2-7b-hf"
quant_path = "./llama2-7b-gptq-4bit"
quant_config = BaseQuantizeConfig(
bits=4,
group_size=128,
desc_act=True
)
tokenizer = AutoTokenizer.from_pretrained(model_path)
def load_calibration_data(tokenizer, n_samples=128, max_len=512):
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
samples = []
for i in range(min(n_samples, len(dataset))):
text = dataset[i]["text"].strip()
if len(text) > 50:
ids = tokenizer(text, return_tensors="pt",
max_length=max_len, truncation=True)
samples.append({"input_ids": ids["input_ids"]})
return samples
calibration_data = load_calibration_data(tokenizer)
model = AutoGPTQForCausalLM.from_pretrained(model_path, quant_config)
model.quantize(calibration_data)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
AWQ量化实操:以Llama-2-7B为例
使用AutoAWQ库进行4bit量化:
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-2-7b-hf"
quant_path = "./llama2-7b-awq-4bit"
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM"
}
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoAWQForCausalLM.from_pretrained(model_path)
calib_data = [
"The quick brown fox jumps over the lazy dog.",
"Machine learning models require careful hyperparameter tuning.",
]
model.quantize(tokenizer, quant_config=quant_config, calib_data=calib_data)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
vLLM部署量化模型推理服务
量化后的模型可通过vLLM加载并提供高并发推理服务:
# 加载GPTQ量化模型
python -m vllm.entrypoints.openai.api_server \
--model ./llama2-7b-gptq-4bit \
--quantization gptq \
--dtype half \
--gpu-memory-utilization 0.9 \
--max-model-len 4096 \
--port 8000
# 加载AWQ量化模型
python -m vllm.entrypoints.openai.api_server \
--model ./llama2-7b-awq-4bit \
--quantization awq \
--dtype half \
--gpu-memory-utilization 0.9 \
--max-model-len 4096 \
--port 8000
调用推理接口:
import requests
response = requests.post("http://localhost:8000/v1/completions", json={
"model": "./llama2-7b-gptq-4bit",
"prompt": "解释量子计算的基本原理",
"max_tokens": 512,
"temperature": 0.7
})
print(response.json()["choices"][0]["text"])
GPTQ与AWQ性能对比与选型建议
在Llama-2-7B上的实际测试对比:
对比维度 GPTQ 4bit AWQ 4bit
模型体积 ~3.5GB ~3.8GB
量化耗时(A100) 30-60分钟 10-20分钟
推理速度(tokens/s) ~120 ~135
精度损失(PPL) <1% <1%
Batch灵活性 一般 较好
内存峰值 较低 略高
选型建议:模型版本固定、追求极致压缩比选GPTQ;需要频繁迭代、对推理吞吐量敏感选AWQ。两者在4bit精度下的输出质量差异很小,实践中可根据部署环境的GPU类型和batch需求决定。desc_act参数在GPTQ中设为True可提升精度但降低量化速度,group_size设为128是精度与效率的平衡点,128以下精度提升不明显但量化文件增大。
量化部署常见问题排查
OOM during quantization:7B模型量化需至少16GB显存。降低max_len到256,减少calibration samples到64,或使用CPU offloading。
推理输出质量下降明显:检查校准数据是否与实际使用场景匹配。通用模型用Wikitext,代码模型用CodeSearchNet,中文模型用CLUE数据集。group_size从128降到64可部分恢复精度。
vLLM加载报错unsupported quantization format:确认vLLM版本支持对应量化格式。GPTQ需vLLM 0.2.0+,AWQ需vLLM 0.3.0+。检查量化模型目录下的quantize_config.json是否完整。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-liang-hua-ya-suo-shi-zhan-gptq-yu-awq-liang-hua/