70B参数的模型全精度加载需要140GB显存,4张A100都不一定够。但经过4-bit量化后,显存需求降到大约35GB,一张A100就能跑。这就是量化的威力;

量化是把模型权重从高精度转成低精度的技术。FP16占2字节,INT4只占0.5字节,压缩比4倍。实测下来,4-bit量化的精度损失在大多数任务上不超过1%——这个买卖太划算了;

量化方案对比

在动手之前先搞清楚几个主流方案的区别;

GGUF是llama.cpp的量化格式,主要用于CPU推理和Ollama。格式紧凑,加载方便,但GPU推理性能不如AWQ;

AWQ(Activation-aware Weight Quantization)基于激活值分布来决定量化策略,精度保持最好,主要用于GPU推理。vLLM和TGI都原生支持AWQ;

GPTQ是较早的GPU量化方案,兼容性好,社区模型多,但精度略逊于AWQ;

bitsandbytes是HuggingFace生态内的量化方案,集成最方便(一行代码就能用),但推理速度不如AWQ/GPTQ;

实话说,如果你用GPU推理,选AWQ就对了。如果用Ollama(CPU+GPU混合),选GGUF;

AWQ量化实战

安装

pip install autoawq transformers torch

执行量化

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
import torch

model_path = "Qwen/Qwen2.5-7B-Instruct"
quant_path = "./Qwen2.5-7B-AWQ"

# 加载模型
model = AutoAWQForCausalLM.from_pretrained(
    model_path, torch_dtype=torch.float16, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 量化配置
quant_config = {
    "zero_point": True,       # 零点量化,精度更好
    "q_group_size": 128,      # 分组大小,128是常用值
    "w_bit": 4,               # 4-bit量化
    "version": "GEMM"         # GEMM版本,GPU推理最快
}

# 执行量化——这一步需要几分钟到十几分钟
model.quantize(tokenizer, quant_config=quant_config)

# 保存
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)

q_group_size=128是精度和速度的平衡点。设成64精度更好但推理稍慢,设成256推理更快但精度下降。

自定义校准数据集

AWQ用一小批数据来确定量化参数。默认用Pile数据集的子集。如果你的目标领域比较特殊(比如医疗、金融),用领域数据做校准效果会更好:

from datasets import load_dataset

# 用领域相关的数据
calib_data = load_dataset("your_dataset", split="train[:128]")
model.quantize(tokenizer, quant_config=quant_config, calib_data=calib_data)

GGUF量化(用于Ollama)

如果用Ollama运行,GGUF格式更合适。先用llama.cpp的转换脚本:

# 安装llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j

# 转换HuggingFace模型到GGUF
python convert_hf_to_gguf.py /path/to/Qwen2.5-7B --outtype f16

# 量化
./llama-quantize model-f16.gguf model-q4_k_m.gguf Q4_K_M

常用量化等级:Q8_0精度最高压缩比约2倍;Q4_K_M精度良好压缩比约4倍,是推荐值;Q3_K_M压缩比约5.3倍,精度有明显下降。

创建Ollama Modelfile引用量化后的模型:

FROM ./model-q4_k_m.gguf
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
ollama create my-q4-model -f Modelfile

量化效果评估

量化后做三件事:显存对比,记录量化前后的显存占用(nvidia-smi);速度对比,用相同的prompt测tokens/s;精度评估,在你的测试集上对比量化前后的输出质量;

我实际测试的数据:Qwen2.5-7B从FP16到AWQ-4bit,显存从14GB降到5.2GB,推理速度从45 tokens/s提升到62 tokens/s,在代码生成任务上准确率从92.3%降到91.7%——几乎可以忽略。

写在最后

量化是让大模型"走进寻常百姓家"的关键技术。4-bit量化后的7B模型只需要约5GB显存,RTX 3060 12GB都能流畅跑。如果你的显卡跑不动想要的模型,先试试量化,大概率能解决。