SuperAPI AI 工具集

gptq

智能体与模型

查看项目

更新于 10-30 06:47

技能介绍

GPTQ(Generative Pre-trained Transformer Quantization)是一种训练后量化方法,使用分组量化将大语言模型压缩到 4-bit,在精度损失极小的前提下降低显存占用并提升推理速度。

用途

GPTQ 适用于以下场景:需要在有限 GPU 显存中容纳大模型(70B 及以上);希望获得约 4 倍显存降低且精度损失小于 2%;在消费级 GPU(RTX 4090、3090)上部署模型;需要比 FP16 快 3-4 倍的推理速度。

如果更看重精度(损失小于 1%)、使用较新 GPU(Ampere、Ada)或需要 Marlin 内核支持,可考虑 AWQ;如果需要与 transformers 简单集成、使用 8-bit 量化或不需要预量化模型文件,可考虑 bitsandbytes。

主要能力

GPTQ 采用分组量化:将每个权重矩阵划分为若干组(通常每组 128 个元素),每组拥有独立的 scale 和 zero-point,并利用 Hessian 信息最小化量化误差,从而在 4-bit 权重下接近 FP16 精度。

分组大小存在权衡:group_size 为 -1(按列)时模型最小、精度最好但最慢,仅适合研究;32 时更小、精度更好但较慢,适合高精度需求;128 为推荐默认值,模型大小中等、精度良好、速度快;256 更大、精度较低但更快,适合速度优先;1024 最大、精度最低、最快,不推荐。

量化配置方面,标准 4-bit 配置(bits=4、group_size=128、desc_act=False、damp_percent=0.01)可实现约 4 倍显存降低、困惑度增加约 1.5%、速度比 FP16 快 3-4 倍。高精度配置可使用 3-bit 配合较大分组(bits=3、group_size=128、desc_act=True),实现约 5 倍显存降低、困惑度增加约 3%、速度约 5 倍。最大精度配置使用 4-bit 配合小分组(bits=4、group_size=32、desc_act=True、damp_percent=0.005),实现约 3.5 倍显存降低、困惑度增加约 0.8%、速度约 2-3 倍。

内核后端支持 ExLlamaV2(默认,最快,比 Triton 快 1.5-2 倍)、Marlin(需要 NVIDIA Ampere 或更新架构,计算能力 ≥ 8.0,在 A100/H100 上约快 2 倍)以及 Triton(仅 Linux,比 CUDA 后端快 1.2-1.5 倍)。

使用方式

安装 AutoGPTQ:pip install auto-gptq;带 Triton(仅 Linux,更快):pip install auto-gptq[triton];带 CUDA 扩展(更快):pip install auto-gptq --no-build-isolation;完整安装:pip install auto-gptq transformers accelerate。

加载预量化模型时,使用 AutoGPTQForCausalLM.from_quantized 指定模型名称与设备,再配合 AutoTokenizer 进行生成。也可以自行量化模型:加载原始模型与 BaseQuantizeConfig,准备校准数据(如从 c4 数据集取 128 条、每条截取 512 个 token),调用 model.quantize(calibration_data),然后 save_quantized 保存或 push_to_hub 推送。

与 transformers 集成时,可直接用 AutoModelForCausalLM.from_pretrained 加载 GPTQ 模型(transformers 会自动识别),并设置 device_map="auto"。结合 PEFT 可进行 QLoRA 微调:先 prepare_model_for_kbit_training,再配置 LoraConfig 并 get_peft_model,从而在单张 A100 80GB 上微调 70B 模型。

常见部署模式包括多 GPU 部署(device_map="auto" 或手动映射层到不同 GPU)、CPU offloading(将溢出层卸载到 CPU)以及批量推理(对多个 prompt 进行 padding 后统一生成)。

适用场景与限制

显存降低效果:Llama 2-7B 从 14 GB 降至 3.5 GB,13B 从 26 GB 降至 6.5 GB,70B 从 140 GB 降至 35 GB,Llama 3-405B 从 810 GB 降至 203 GB,均为约 4 倍。这使得 70B 可运行在单张 A100 80GB 上,405B 可运行在 3 张 A100 80GB 上,13B 可运行在 RTX 4090 24GB 上。

推理速度(Llama 2-7B,A100):FP16 为 25 tok/s,GPTQ 4-bit(CUDA)为 85 tok/s(3.4 倍),GPTQ 4-bit(ExLlama)为 105 tok/s(4.2 倍),GPTQ 4-bit(Marlin)为 120 tok/s(4.8 倍)。

精度(WikiText-2 困惑度):Llama 2-7B 从 5.47 升至 5.55(+1.5%),13B 从 4.88 升至 4.95(+1.4%),70B 从 3.32 升至 3.38(+1.8%),整体退化小于 2%。

支持的模型包括 LLaMA 系列(Llama 2、Llama 3、Code Llama)、Mistral(7B、Mixtral 8x7B、8x22B)、Qwen(Qwen、Qwen2、QwQ)、DeepSeek(V2、V3)、Phi(Phi-2、Phi-3)以及 Yi、Falcon、BLOOM、OPT 等,HuggingFace 上有 100 多个模型。可在 HuggingFace 的 TheBloke 主页或通过 library=gptq 筛选查找预量化模型。

限制方面:Marlin 需要 NVIDIA Ampere 或更新架构(计算能力 ≥ 8.0);Triton 仅支持 Linux;desc_act=True 会降低速度;更小的分组会带来内核开销;3-bit 量化精度损失更大。具体硬件兼容性与性能表现可能因环境而异。