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 显存 | 典型质量 |
|---|---|---|---|---|
| FP16 | half | 2 | 1× | 基准 |
| BF16 | bfloat16 | 2 | 1× | 基准(训练友好) |
| FP8 | e4m3/e5m2 | 1 | 0.5× | 近无损(H100+) |
| INT8 | int8 | 1 | 0.5× | 近无损(W8A8) |
| INT4 | int4 | 0.5 | 0.25× | 轻微损失(AWQ/GPTQ 可补) |
| INT2 | int2 | 0.25 | 0.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.py→quantize出xxx-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 是长上下文高并发的常见组合。
关联知识
- LLM 推理服务化知识总览 — 量化是降本第一杠杆
- KV Cache 原理与 PagedAttention — 另一类量化(KV),与权重量化正交
- ../llm-training/混合精度训练 — FP8/BF16 在训练侧的原理
- ../llm-training/大模型架构对比 — 架构影响量化后质量
- 高并发调度与吞吐优化 — 量化后吞吐/延迟的变化
参考资源
学习时间
| 阶段 | 时间 | 备注 |
|---|---|---|
| 内容创建 | 2026-07-20 | PTQ 方案对比(GPTQ/AWQ/GGUF/FP8/SmoothQuant)、选型、实操、风险 |
状态标记
📖 已掌握 — 精度谱系、AWQ/GPTQ/GGUF 原理、选型、权重 vs KV 量化区别 📝 待补充 — 具体模型量化 recipe 实测、激活量化 W8A8 实操、量化后评测方法