大模型量化技术是降低AI模型部署门槛的关键手段。GPTQ和AWQ作为当前主流的权重量化方案,在保持模型精度的前提下大幅压缩模型体积、提升推理速度。本文围绕GPTQ与AWQ两种量化方法的原理差异、部署流程和性能表现展开实战分析。
大模型量化技术的基本原理
量化是将模型中高精度浮点数(FP16/BF16)转换为低精度整数(INT8/INT4)的过程。权重量化只对模型权重进行量化,激活值保持浮点计算;权重-激活联合量化则同时处理两者。大模型参数量动辄数十亿,FP16存储需要数十GB显存,而INT4量化后仅需原来的1/4到1/3,使得70亿参数模型在单张消费级显卡上即可运行。
量化核心挑战在于精度损失控制。简单将权重舍入到低精度会导致显著输出偏差,尤其对模型中少数关键权重通道的扰动极为敏感。GPTQ和AWQ分别从不同角度解决这一问题。
GPTQ量化方案:基于二阶信息的逐列量化
GPTQ(Generalized Post-Training Quantization)是一种训练后量化方法,灵感来源于OBQ(Optimal Brain Quantization)。其核心思想是逐列对权重矩阵进行量化,每量化一列后立即更新尚未量化列的权重,补偿量化误差。整个过程利用Hessian矩阵的逆矩阵来指导补偿方向,使得量化误差最小化。
使用AutoGPTQ库对大语言模型执行GPTQ量化的完整流程:
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-2-7b-hf"
quant_path = "./llama-2-7b-gptq-4bit"
# 量化配置:4bit量化,group_size=128
quant_config = BaseQuantizeConfig(
bits=4,
group_size=128,
desc_act=False,
)
# 准备校准数据集
tokenizer = AutoTokenizer.from_pretrained(model_path)
calib_data = [
tokenizer("人工智能技术在服务贸易领域加速落地应用"),
tokenizer("大模型量化部署需要平衡精度与推理速度"),
]
# 执行量化
model = AutoGPTQForCausalLM.from_pretrained(model_path, quant_config)
model.quantize(calib_data)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
GPTQ的关键参数包括group_size(分组大小,128是常用值,越小精度越高但量化越慢)和desc_act(是否按激活值降序排列列,对某些模型有精度提升)。量化过程需要提供校准数据集,建议使用512条以上与目标任务分布相近的文本。
AWQ量化方案:激活感知的权重保护
AWQ(Activation-aware Weight Quantization)的核心发现是:并非所有权重对量化误差同等敏感,只有少数关键通道(约0.1%-1%)的权重需要保护。AWQ通过分析激活值分布识别这些关键通道,对关键通道的权重施加缩放因子,使其在量化时误差更小。
使用AutoAWQ执行量化:
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-2-7b-hf"
quant_path = "./llama-2-7b-awq-4bit"
tokenizer = AutoTokenizer.from_pretrained(model_path)
# AWQ量化配置
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM"
}
model = AutoAWQForCausalLM.from_pretrained(model_path)
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
AWQ的优势在于无需反向传播和Hessian矩阵计算,量化速度快于GPTQ。其缩放因子搜索过程基于前向推理,校准数据集需求量较小,通常128条文本即可获得稳定结果。
GPTQ与AWQ性能对比
在Llama-2-7B模型上的实测数据(INT4量化,NVIDIA A100 80GB):
- 量化时间:GPTQ约45分钟(含Hessian计算),AWQ约15分钟
- 模型体积:GPTQ约3.5GB,AWQ约3.8GB
- 推理速度:GPTQ约65 tokens/s,AWQ约72 tokens/s(AWQ的GEMM实现更高效)
- 困惑度:GPTQ 5.83(WikiText2),AWQ 5.78(略优于GPTQ)
- 显存占用:GPTQ约4.2GB,AWQ约4.5GB
AWQ在多数指标上略优于GPTQ,尤其在推理速度和精度保持方面。但GPTQ生态更成熟,vLLM、Text-Generation-Inference等推理框架对GPTQ的支持更完善。
推理框架部署实践
使用vLLM加载量化模型进行推理服务部署:
from vllm import LLM, SamplingParams
# 加载GPTQ量化模型
llm = LLM(
model="./llama-2-7b-gptq-4bit",
quantization="gptq",
dtype="float16",
gpu_memory_utilization=0.9,
max_model_len=4096,
)
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512,
)
outputs = llm.generate(["请解释大模型量化的基本原理"], sampling_params)
for output in outputs:
print(output.outputs[0].text)
vLLM对GPTQ模型支持PagedAttention和连续批处理,单卡A100可达到超过2000 tokens/s的吞吐量。AWQ模型在vLLM中同样可用,需指定quantization=”awq”参数。
量化方案选型建议
选择量化方案时需考虑实际场景需求。追求推理速度和精度平衡时,AWQ是更优选择,量化过程快且精度损失小。需要与vLLM等推理框架深度集成时,GPTQ的兼容性更好,社区文档和案例更丰富。资源极度受限的边缘设备场景,可结合GGUF格式(llama.cpp支持),将量化模型转换为GGUF后在CPU上运行。
量化后务必进行任务级评估。困惑度指标只反映语言建模能力,具体下游任务(如问答、代码生成、数学推理)的准确率变化更值得关注。建议在量化前后用相同的评测数据集做对比,确保精度损失在可接受范围内。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-liang-hua-bu-shu-shi-zhan-gptq-yu-awq-liang-hua/