大模型量化是降低LLM推理显存占用和推理延迟的关键技术。GPTQ和AWQ是两种主流的INT4权重量化方案,在精度损失、量化速度和推理性能上各有取舍。本文以Llama-3-8B为例,对比两种量化方法的实践流程,给出生产环境选型依据。
大模型量化技术原理:权重量化与激活量化的区别
量化将浮点权重映射到低位整数表示。INT4量化将FP16权重压缩到4-bit,显存占用降为原来的1/4。权重量化只量化模型权重,激活值保持FP16计算;而权重-激活联合量化(如W8A8)额外量化激活值,推理时用整型矩阵乘法替代浮点计算。
GPTQ基于二阶Hessian信息对权重列做逐层量化补偿,通过海森矩阵逆近似最小化逐层量化误差。AWQ(Activation-aware Weight Quantization)不依赖反向传播或重建数据,核心思路是识别对激活值贡献大的”显著权重”通道,对这些通道做缩放保护后再量化。
GPTQ量化部署流程与代码实现
GPTQ需要校准数据集进行逐层量化。以AutoGPTQ库为例:
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer
model_path = "meta-llama/Meta-Llama-3-8B"
quant_path = "./llama3-8b-gptq-4bit"
# 量化配置:4-bit,group_size=128
quant_config = BaseQuantizeConfig(
bits=4,
group_size=128,
desc_act=False,
)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 准备校准数据(512条文本)
calib_data = load_calibration_texts(num_samples=512)
model = AutoGPTQForCausalLM.from_pretrained(
model_path,
quant_config,
trust_remote_code=True
)
# 执行量化
model.quantize(calib_data, batch_size=1)
# 保存量化模型
model.save_quantized(quant_path, use_safetensors=True)
tokenizer.save_pretrained(quant_path)
量化完成后,推理时使用vLLM或Text Generation Inference加载GPTQ模型:
from vllm import LLM, SamplingParams
llm = LLM(
model="./llama3-8b-gptq-4bit",
quantization="gptq",
dtype="float16",
gpu_memory_utilization=0.9,
)
sampling = SamplingParams(temperature=0.7, max_tokens=512)
output = llm.generate(["解释量子计算的基本原理"], sampling)
print(output[0].outputs[0].text)
实测Llama-3-8B在A100上,FP16版本需要约16GB显存,GPTQ INT4版本降到约5.5GB,推理吞吐提升约1.8倍。group_size=128时精度损失可控,困惑度(PPL)增幅在2%以内。
AWQ量化部署流程与代码实现
AWQ不需要校准数据的反向计算,量化速度比GPTQ快3-4倍。使用autoawq库:
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Meta-Llama-3-8B"
quant_path = "./llama3-8b-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,
device_map="auto",
safetensors=True
)
# 准备校准文本
calib_data = load_calibration_texts(num_samples=128)
# 执行AWQ量化
model.quantize(
tokenizer,
quant_config=quant_config,
calib_data=calib_data,
split="train"
)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
使用vLLM加载AWQ模型:
llm = LLM(
model="./llama3-8b-awq-4bit",
quantization="awq",
dtype="float16",
gpu_memory_utilization=0.9,
enforce_eager=False,
)
GPTQ与AWQ量化效果对比分析
在Llama-3-8B上的实测对比数据:
- 量化耗时:GPTQ约45分钟(512样本校准),AWQ约12分钟(128样本校准)
- 显存占用:GPTQ约5.5GB,AWQ约5.2GB(AWQ额外保存缩放因子,但zero_point优化更紧凑)
- 困惑度PPL:FP16基线7.32,GPTQ-INT4约7.48(+2.2%),AWQ-INT4约7.41(+1.2%)
- 推理吞吐:GPTQ约1850 tokens/s,AWQ约2100 tokens/s(AWQ的GEMM kernel更优)
- 长文本生成质量:AWQ在32K上下文场景下文本连贯性优于GPTQ
AWQ的精度优势来自激活感知的权重视角——通过分析校准数据中激活值的分布,识别出对输出影响最大的权重通道并给予缩放保护,而非均匀量化所有权重。这种策略在处理长尾分布权重时尤为有效。
生产环境量化方案选型建议
选型取决于硬件环境和精度要求:
选AWQ的场景:GPU显存紧张(如24GB消费级显卡部署7B-13B模型)、推理吞吐优先于量化速度、需要长上下文(32K+)。AWQ的GEMM kernel在大多数GPU上比GPTQ快10-15%,原因在于AWQ的量化权重布局对齐更好,减少了内存访问开销。
选GPTQ的场景:吞吐差异可接受、需要兼容老旧CUDA环境(GPTQ kernel支持更老的compute capability)、已有较多GPTQ模型存量。GPTQ的兼容性覆盖更广,TGI、vLLM、llama.cpp均原生支持。
量化前需要校验目标框架是否支持对应格式。vLLM 0.4+同时支持GPTQ和AWQ,但部分较老版本的推理引擎只支持GPTQ。部署前用10-20条评测数据做MMLU/HumanEval基准测试,确认精度在可接受范围内再上线。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-liang-hua-ji-shu-shi-zhan-dui-bi-gptq-yu-awqint4/