本章介绍如何使用 GPTQ 对大模型进行 4-bit 量化,以及使用 vLLM 进行高效推理部署。
GPTQ 模型量化
量化原理
GPTQ (Gradient-based Post-training Quantization) 是一种针对大规模预训练模型的高效 后量化算法 (PTQ)。其主要目标是在不重新训练模型的情况下,将大模型权重量化到低比特(如 4-bit),同时尽可能保持模型性能。采用非对称量化,并逐层处理:

在这个逐层量化的过程中,首先将模型层的权重转换为 Hessian 矩阵的逆矩阵。Hessian 告诉我们模型输出对每个权重变化的敏感程度:

与 Hessian 矩阵中较小值相关的权重更为重要,因为这些权重的微小变化可能会对模型性能产生重大影响。对于 weight 每一列,GPTQ 量化权重、计算误差,并相应更新其中的权重,处理完后更新所有其余权重。
GPTQ 的核心思想是 通过最小化量化引入的输出误差,实现高精度低比特量化。基本步骤:
- 收集校准数据:从训练数据或相关数据集中抽取一小部分样本作为校准数据;
- 逐层处理:对模型的每一层进行独立量化,避免全局优化的复杂度;
- 最小化输出误差:对于每一层,寻找最佳量化权重,使得在校准数据上的输出误差最小;
- 更新权重:将量化后的权重替换原始权重。
量化使用要点
安装:根据 python、pytorch 和 cuda 版本下载对应的 gptqmodel 版本(下载地址:https://github.com/ModelCloud/GPTQModel/releases )。由于 gptqmodel 依赖与 LLaMA-Factory 冲突,需要重新创建虚拟环境:
conda create -n gptq_env python=3.11.14
conda activate gptq_env
pip install torch==2.8.0 torchvision torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu126
# 安装 accelerate、transformers、datasets、safetensors 等依赖
pip install gptqmodel-5.4.0+cu126torch2.8-cp311-cp311-linux_x86_64.whl
量化流程核心步骤(文件名 use_gptq.py,对 Qwen 系列大语言模型进行 GPTQ 4-bit 量化):
- 加载校准数据(如 Belle 数据集),格式化为 ChatML 文本;
- 用 tokenizer 构造 token 数据集(
input_ids); - 初始化
QuantizeConfig(bits=4,group_size=128,sym=True,true_sequential=True); - 通过
GPTQModel.from_pretrained加载模型并调用model.quantize(calib_dataset)执行量化; - 调用
model.save(quantized_model_dir)保存量化后的模型。
量化结果:

预测使用要点(文件名 test_gptq.py):通过 GPTQModel.from_quantized(quantized_model_dir, device_map="auto") 加载量化后的模型,调用 model.generate(...) 进行推理,使用方式与原模型基本一致。
输出结果:

vLLM 推理加速
vLLM 介绍
vLLM 是由加州大学伯克利分校团队开发的开源库,旨在为大型语言模型提供高速、高效和易用的推理与服务解决方案。核心优势:
缓存优化 - PagedAttention
大模型计算复杂度最高的是自注意力 QKV 计算,可以把中间阶段的 K 和 V 值存入缓存,这就是 KV Cache。传统 KV Cache 直接分配一段物理显存,随着序列变长不断增长,由于输出序列长度无法预测,导致大量显存浪费。

vLLM 的改进 - PagedAttention:在显存上分配固定大小的连续空间(默认为 16),类似于内存页。多个进程运行时,每个进程分配自己的虚拟内存,通过块表(block table)关联到内存页。只有进程内存不足时才请求增加,每次增加一个内存页。显存利用率能达到 96%。

批量任务优化
PagedAttention 提高了显存使用率,可以增加推理任务并行数量。vLLM 不再要求所有并行任务处于同一阶段,当其他推理任务进行时,只要资源充足,可以随时开始新推理任务。如果超出并行量,最后的请求会被抢占(preemption)。
加载多个 LoRA
vLLM 能够同时加载多个 LoRA,随时指定使用其中任意一个:
- 方便对比测试:同时加载多个 LoRA,无缝切换对比。
- 节约服务器资源:多个低频 LoRA 加载到少数几台服务器上。
- 方便负载均衡:多个 LoRA 统一部署可以共享所有资源。
vLLM 部署过程
安装
windows 对 vLLM 支持不好,建议选用 wsl2、docker 或 linux 系统。切换到 gptq_env 环境后安装:
conda activate gptq_env
pip install vllm==0.11.0
直接启动 LLM
vllm serve \
/root/autodl-tmp/LLaMA-Factory/models/qwen2.5-7b-gptq \
--port 8000 \
--trust-remote-code \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9 \
--max-model-len 32768 \
--enable-prefix-caching
参数说明:
--tensor-parallel-size 1:张量并行数量。1 为不做并行(单 GPU);大于 1 为多 GPU 分拆模型权重并行推理。--gpu-memory-utilization 0.9:vLLM 最多使用 90% GPU 显存(默认 0.9;可设 0.95~0.98 更激进,或调低到 0.7 给其他程序留显存)。--max-model-len 32768:最大上下文长度(tokens 数),默认 4k 或 8k,设 32768 支持 32K tokens。--enable-prefix-caching:对重复的前缀启用 KV 缓存优化。
启动成功提示:

Python 测试脚本(通过 OpenAI 兼容 API):
import time
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
MODEL_ID = "/root/autodl-tmp/LLaMA-Factory/models/qwen2.5-7b-gptq"
prompt = "请用一句话介绍一下你自己。"
start_time = time.time()
response = client.chat.completions.create(
model=MODEL_ID,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
end_time = time.time()
elapsed = end_time - start_time
output_text = response.choices[0].message.content
completion_tokens = response.usage.completion_tokens
prompt_tokens = response.usage.prompt_tokens
total_tokens = response.usage.total_tokens
tokens_per_second = completion_tokens / elapsed
print("=== 输出内容 ===")
print(output_text)
print("\n=== Token 统计 ===")
print(f"Prompt Tokens: {prompt_tokens}")
print(f"Completion Tokens: {completion_tokens}")
print(f"Total Tokens: {total_tokens}")
print("\n=== 性能 ===")
print(f"耗时: {elapsed:.3f} 秒")
print(f"生成速度: {tokens_per_second:.2f} tokens/秒")
输出结果:

使用 vLLM 部署大模型后,推理速度要提升数倍。
搭配 LoRA 模块
vLLM 也可以启动大模型并搭配 LoRA 模块进行推理。通过 --enable-lora 开启 LoRA 模块配置,通过 --lora-modules 指定 LoRA 模块路径,支持同时加载多个 LoRA(用 name=路径 方式指定):
vllm serve \
/root/autodl-tmp/LLaMA-Factory/models/Qwen2.5-7B \
--port 8000 \
--trust-remote-code \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9 \
--max-model-len 32768 \
--enable-prefix-caching \
--enable-lora \
--lora-modules module1=/root/autodl-tmp/LLaMA-Factory/saves/qwen2.5-7b/lora/sft/checkpoint-29
Python 测试代码(使用 model 参数指定加载哪个 LoRA,若 model="" 则使用基座模型):
import time
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
MODEL_ID = "module1" # 指定使用 LoRA 模块
prompt = "请用一句话介绍一下你自己。"
start_time = time.time()
response = client.chat.completions.create(
model=MODEL_ID,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
end_time = time.time()
elapsed = end_time - start_time
output_text = response.choices[0].message.content
completion_tokens = response.usage.completion_tokens
tokens_per_second = completion_tokens / elapsed
print("=== 输出内容 ===")
print(output_text)
print("\n=== 性能 ===")
print(f"耗时: {elapsed:.3f} 秒")
print(f"生成速度: {tokens_per_second:.2f} tokens/秒")
输出结果:

小结
- GPTQ 量化:基于 Hessian 矩阵的 4-bit 后量化算法,逐层处理、最小化输出误差,使用
gptqmodel库实现,显著降低显存占用。 - vLLM 推理:通过 PagedAttention 优化 KV Cache(显存利用率达 96%),支持批量任务优化和多 LoRA 加载,推理速度提升数倍。
- 部署流程:GPTQ 量化模型 → vLLM serve 启动服务 → OpenAI 兼容 API 调用,可搭配 LoRA 模块灵活切换。