文章

LLM 推理量化部署

LLM 推理量化部署

“70B 模型怎么塞进一张卡?“——答案是量化。量化把 FP16/BF16 权重压成 INT8/INT4/FP8,显存随位数线性下降,是推理侧降本的最直接手段。本文讲清主流 PTQ 方案原理、精度权衡、以及落地工作流。


一、为什么推理侧量化收益大

回顾 ../llm-training/显存计算详解:推理显存 ≈ 权重(无梯度/优化器/激活)。所以:

LLaMA-70B 权重:
  FP16:  140 GB  ← 单张 H100 80GB 放不下
  INT8:   70 GB  ← H100 刚好
  INT4:   35 GB  ← 单张 A100 40GB 也行
  GGUF Q4: ~38 GB ← 多卡/大显存消费卡即可

量化直接决定”哪档硬件能跑哪个模型”,是成本控制的第一杠杆。


二、量化精度谱系

精度dtype每参数字节相对 FP16 显存典型质量
FP16half2基准
BF16bfloat162基准(训练友好)
FP8e4m3/e5m210.5×近无损(H100+)
INT8int810.5×近无损(W8A8)
INT4int40.50.25×轻微损失(AWQ/GPTQ 可补)
INT2int20.250.125×明显损失(研究)

“W8A8” 指权重 INT8 + 激活 INT8;“W4A16” 指权重 INT4 + 激活 FP16(最常见,因激活量化难、收益小)。


三、主流训练后量化(PTQ)方案

3.1 GPTQ(2022)

  • 原理:逐层量化,用二阶信息(Hessian)补偿量化误差;一次校准少量数据即可
  • 特点:成熟稳定,生态广(AutoGPTQ),INT3/INT4 质量好
  • 缺点:校准慢、对校准数据敏感

3.2 AWQ(Activation-aware Weight Quantization, 2023)

  • 原理:观察到”少量权重(channel)对激活影响极大”,只保护这些重要权重不量化,其余均匀量化
  • 特点:INT4 下质量常优于 GPTQ;不依赖反向;支持混合精度保护
  • 现状:vLLM/SGLang/LMDeploy 都优先支持 AWQ

3.3 GGUF / llama.cpp 量化

  • 原理:llama.cpp 自研格式,支持 Q2_K ~ Q8_0 多档 + K-quant(按张量级重要性分配比特)
  • 特点CPU/Apple Silicon/端侧友好,无 GPU 也能跑;格式自包含(含 tokenizer)
  • 工作流:原始模型 → convert.pyquantizexxx-Q4_K_M.gguf

3.4 FP8 量化(H100/H200 原生)

  • 原理:硬件原生 FP8 张量核心,权重/激活以 FP8 存算
  • 特点:近无损 + 2× 算力/带宽收益;需 Hopper+ 架构
  • 适用:追求极致吞吐且硬件够新的场景

3.5 SmoothQuant(W8A8 激活也量化)

  • 原理:把激活的离群值”平滑”到权重上,使激活可被 INT8 量化而不崩
  • 适用:想做 W8A8(连激活也 INT8)以省显存带宽

四、方案选型速查

目标 → 推荐
─────────────────────────────────────────
NVIDIA 在线服务、要质量   → AWQ (INT4) 或 FP8
老模型/社区权重           → GPTQ
本地/CPU/Apple Silicon    → GGUF (llama.cpp / Ollama)
极致吞吐 + Hopper 硬件    → FP8
Mobile/端侧              → GGUF Q4/Q5 + llama.cpp

五、实操:AWQ 量化 7B 并部署

# 1) 量化(AutoAWQ)
from awq import AutoAWQForCausalLM
model = AutoAWQForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
model.quantize(tokenizer, quant_config={"w_bit":4,"q_group_size":128})
model.save_quantized("Qwen2.5-7B-AWQ")   # 输出 ~4.5GB

# 2) vLLM 直接加载量化模型
python -m vllm.entrypoints.openai.api_server \
  --model ./Qwen2.5-7B-AWQ \
  --quantization awq \
  --tensor-parallel-size 1

六、实操:GGUF 量化并本地跑

# 转 GGUF + 量化(llama.cpp 工具链)
python convert_hf_to_gguf.py Qwen2.5-7B-Instruct --outfile qwen.gguf
./llama-quantize qwen.gguf qwen-Q4_K_M.gguf Q4_K_M

# Ollama 一键(自动选量化)
ollama run qwen2.5:7b
# 或自定义 Modelfile 指向本地 GGUF

七、量化质量与风险

风险说明缓解
精度下降INT4 下复杂推理/数学可能退化用 AWQ(保护重要权重)、必要时回退 INT8
校准数据偏差GPTQ 校准集不代表真实分布 → 某类任务崩校准集覆盖真实场景
推理速度反降不当量化引入反量化开销用引擎原生支持(vLLM AWQ 有融合 kernel)
长上下文退化极低位宽对长 context 更敏感关键任务用 Q5/Q6 或 FP8

经验法则:对外服务默认 AWQ INT4(质量/成本甜点);对质量敏感任务(代码/数学/长文档)用 INT8 或 FP8;端侧用 GGUF Q4_K_M。


八、量化与 KV Cache 量化的区别

别混淆:

  • 权重量化(本文):压小模型文件/权重显存 → 省显存、可能提速
  • KV Cache 量化(见 KV Cache 原理与 PagedAttention):压运行中缓存的 K/V → 省动态显存、降 decode 访存带宽

两者正交,可同时开:权重 INT4 + KV FP8 是长上下文高并发的常见组合。


关联知识

参考资源

学习时间

阶段时间备注
内容创建2026-07-20PTQ 方案对比(GPTQ/AWQ/GGUF/FP8/SmoothQuant)、选型、实操、风险

状态标记

📖 已掌握 — 精度谱系、AWQ/GPTQ/GGUF 原理、选型、权重 vs KV 量化区别 📝 待补充 — 具体模型量化 recipe 实测、激活量化 W8A8 实操、量化后评测方法