模型量化深度解析
引言
量化使大模型在有限硬件上运行成为可能,是 LLM 部署的必备技能。本文从原理、方法对比、工具使用到与推理框架的集成,系统解析模型量化技术体系。
量化原理简述
为什么低精度可行
神经网络权重通常分布在一个相对狭窄的范围内,用较少的比特(如 4-bit)表示,在大多数情况下对输出影响有限。通过缩放(scale)和零点(zero-point) 将浮点映射到整型,可实现有损但可接受的压缩。
量化公式(对称量化示例)
quantized = round(weight / scale)
dequantized = quantized * scale
非对称量化还会引入 zero-point 以更好地表示非对称分布。
主流量化方法
1. GPTQ (GPT Quantization)
原理:基于 Hessian 的二阶信息,逐层优化权重量化误差,尽量保持输出分布。需少量校准数据(通常 128–512 条样本)。
特点:
- 显存减半以上(FP16 → 4-bit)
- 需要校准,离线量化
- 与 AutoGPTQ、vLLM、ExLlama 等兼容
适用:生产 GPU 推理,追求质量与显存平衡。
2. AWQ (Activation-aware Weight Quantization)
原理:认为并非所有权重对激活的影响相同,对「重要权重」保持更高精度,对次要权重激进量化,从而在相同比特下获得更好效果。
特点:
- 通常略优于同比特 GPTQ
- 推理实现需专用 kernel(vLLM、TGI 等已支持)
- 校准较 GPTQ 简单
适用:生产部署,对质量要求高。
3. GGUF(llama.cpp 生态)
原理:为 llama.cpp 设计的容器格式,支持 2-bit 到 8-bit 多种量化档位(Q2_K、Q4_K_M、Q5_K_M、Q8_0 等),可存 储元数据(如 RoPE 参数)。
特点:
- 与 Ollama、llama.cpp 深度集成
- CPU 推理友好
- 工具链成熟(llama.cpp、llama-quantize)
适用:本地、边缘、CPU 推理,模型分发与兼容性。
4. BitsAndBytes(动态量化)
原理:运行时动态量化,无需预先转换模型文件。支持 8-bit、4-bit(NF4),可与 Hugging Face Transformers 直接集成。
特点:
- 零配置,适合快速实验
- 支持加载时量化,节省磁盘
- 多用于训练/微调(QLoRA)及轻量推理
适用:开发、实验、QLoRA 微调。
格式与工具对比
| 格式/工具 | 量化方法 | 推理框架支持 | 典型用途 |
|---|---|---|---|
| GGUF | 多档混合 | llama.cpp, Ollama | 本地、CPU、边缘 |
| GPTQ | 4-bit 逐层 | vLLM, ExLlama, AutoGPTQ | GPU 生产 |
| AWQ | 4-bit 感知激活 | vLLM, TGI | GPU 生产、高质量 |
| BitsAndBytes | 8/4-bit 动态 | Transformers | 开发、QLoRA |