quantization

大模型量化部署:bitsandbytes、AWQ、GPTQ 与 FP8。

补充说明

量化用更低比特表示权重或激活,降低显存、提高吞吐,但会带来精度损失和内核兼容问题。常见路线:bitsandbytes 在线 4/8 bit、AWQ/GPTQ 预量化权重、FP8 权重与 KV Cache。

显存估算先看权重:7B bf16 约 14 GB,4 bit 约 3.5 到 4 GB;剩余显存才留给 KV Cache 和并发。量化不等于能无限加长上下文。

安装与启动

pip install -U bitsandbytes transformers accelerate
python -c "import bitsandbytes as bnb; print(bnb.__version__)"

bitsandbytes 需要可用的 CUDA 环境;CPU、部分 ROCm 和 Apple MPS 支持有限,先确认平台。

常用示例

Transformers 加载 4 bit 模型:

python - <<'PY'
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

model_id = "Qwen/Qwen2.5-7B-Instruct"
bnb = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id, quantization_config=bnb, device_map="auto")
inputs = tok("用一句话解释 OOMKilled", return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=64)
print(tok.decode(out[0], skip_special_tokens=True))
PY

vLLM 直接加载预量化 AWQ 权重(通常会自动选择 Marlin 内核):

vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90

GPTQ 与 FP8 权重按模型卡指定量化方式启动:

vllm serve "${GPTQ_MODEL}" --quantization gptq_marlin --max-model-len 8192
vllm serve "${FP8_MODEL}" --max-model-len 8192

量化后用任务评测对比,而不是只看困惑度:

pip install -U lm-eval
lm_eval --model vllm \
  --model_args "pretrained=${MODEL},quantization=awq,max_model_len=8192" \
  --tasks mmlu,gsm8k \
  --batch_size auto

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 7B 模型 bf16 和 4 bit 的权重大约各占多少显存?
  2. AWQ 和 GPTQ 的主要区别是什么?
  3. 为什么量化后必须做任务评测?
答案
  1. bf16 每参数 2 字节,约 14 GB;4 bit 每参数约 0.5 字节,约 3.5 到 4 GB,另加量化元数据和运行时开销。
  2. 两者都是训练后量化。AWQ 依据激活分布保护少量重要通道;GPTQ 用二阶信息逐层最小化重建误差。实际选择看模型卡、内核支持和业务评测,不存在通用更优。
  3. 困惑度对量化不敏感,不能反映代码、数学、长上下文等能力损失。只有在下游任务上对比量化前后的指标,才能判断是否可上线。

相关条目