大模型量化部署: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
libcudart 或内核缺失时先对齐三者版本。bnb_4bit_compute_dtype 用 float16 在旧卡上可能溢出或不支持 bf16;Ampere 之前要实测。device_map="auto" 会把层拆到多卡并引入跨卡传输,吞吐通常不如 vLLM 的张量并行;多卡优先用 vLLM。--quantization 可能与实际格式冲突;先让 vLLM 自动识别。合上页面,先回答,再展开对照。