模型量化
模型量化(Quantization)是一种模型压缩和推理加速方法。它把模型中的高精度数值,例如 FP16、BF16 或 FP32,转换成更低精度的表示,例如 INT8、INT4、FP8 或 NF4,从而降低显存占用、存储体积和内存带宽压力。
在大语言模型场景中,量化常用于:
- 在更小显存的 GPU 上加载更大的模型。
- 降低模型权重存储成本和分发成本。
- 提升推理吞吐,尤其是访存瓶颈明显时。
- 支持本地部署、边缘部署和消费级显卡部署。
- 配合 LoRA、蒸馏、剪枝和推理引擎优化,构建低成本模型服务。
量化的核心取舍是:用更低的数值精度换取更低的资源消耗,同时尽量保留模型效果。
1. 核心思想
神经网络中的权重和激活本质上是大量数字。默认训练和推理通常使用 FP16、BF16 或 FP32 这类浮点格式。它们表达范围大、精度高,但占用显存也更高。
量化会把这些数字映射到更低 bit 的表示。一个简化的线性量化公式可以写作:
反量化时再近似还原为:
其中:
- 是原始浮点值。
- 是量化后的整数值。
- 是 scale,用来控制缩放比例。
- 是 zero point,用来处理非对称分布。
- 是反量化后的近似值。
量化不是无损压缩。低精度表示无法完全保留原始浮点数,因此会引入量化误差。好的量化方法会尽量让误差落在对模型输出影响较小的位置。
2. 为什么量化能省显存
模型权重显存可以粗略估算为:
不同精度下,每个参数的大致占用如下:
| 精度 | 每参数字节数 | 7B 权重体积估算 | 说明 |
|---|---|---|---|
| FP32 | 4 bytes | 约 28 GB | 训练和部分高精度计算常用 |
| FP16 / BF16 | 2 bytes | 约 14 GB | LLM 推理和训练常见 |
| INT8 / FP8 | 1 byte | 约 7 GB | 常见推理压缩精度 |
| INT4 / 4-bit | 0.5 byte | 约 3.5 GB | 本地部署和低显存推理常见 |
实际显存还会包含量化 scale、zero point、KV Cache、CUDA workspace、框架运行时开销和显存碎片,因此不能只看权重体积。
对长上下文和高并发服务来说,KV Cache 也可能成为主要显存来源。权重量化能降低模型加载成本,但不一定解决所有显存问题。
3. 常见量化对象
量化可以作用在不同对象上。
| 量化对象 | 含义 | 影响 |
|---|---|---|
| 权重量化 | 只压缩模型权重 | 最常见,主要降低模型体积和权重显存 |
| 激活量化 | 压缩中间激活值 | 可进一步加速,但更容易影响效果 |
| KV Cache 量化 | 压缩推理时保存的 key/value cache | 长上下文和高并发场景收益明显 |
| 梯度量化 | 压缩训练中的梯度 | 常见于分布式训练通信优化 |
| 优化器状态量化 | 压缩 Adam 等优化器状态 | 主要用于训练或微调省显存 |
LLM 推理部署中,最常见的是权重量化。生产服务中,如果上下文很长或并发很高,也会关注 KV Cache 量化。
4. 常见精度格式
4.1 FP16 与 BF16
FP16 和 BF16 都是 16-bit 浮点格式。
| 格式 | 特点 | 常见用途 |
|---|---|---|
| FP16 | 精度较高,但动态范围较小 | 推理、训练、消费级 GPU |
| BF16 | 动态范围接近 FP32,训练更稳定 | 训练、微调、数据中心 GPU |
严格来说,FP16 / BF16 不是通常意义上的“低 bit 量化”,但它们也是从 FP32 降低精度的常见方式。
4.2 INT8
INT8 使用 8-bit 整数表示权重或激活。
优点:
- 精度损失通常较小。
- 工程支持成熟。
- 适合对质量要求较高的推理场景。
缺点:
- 显存节省不如 4-bit。
- 如果硬件或推理引擎没有高效 INT8 kernel,速度收益可能不明显。
4.3 INT4 与 4-bit
4-bit 量化使用更低精度保存权重,是本地大模型部署中非常常见的选择。
优点:
- 显存占用大幅降低。
- 让消费级显卡运行更大模型成为可能。
- 适合个人实验、边缘部署和低成本服务。
缺点:
- 量化误差更大。
- 对数学、代码、长链路推理等任务可能更敏感。
- 不同量化算法和 group size 会显著影响效果。
4.4 FP8
FP8 是 8-bit 浮点格式,常见于新一代数据中心 GPU 的训练和推理优化。
它相比 INT8 更保留浮点表达特性,但需要硬件和框架支持。FP8 更常出现在高性能训练、推理引擎和数据中心部署场景中。
4.5 NF4
NF4(NormalFloat 4-bit)常见于 QLoRA。它针对近似正态分布的权重设计,比普通 4-bit 整数量化更适合保留模型权重信息。
在 QLoRA 中,基础模型通常以 4-bit NF4 形式加载,LoRA 适配器参数保持可训练,从而在较低显存下完成微调。
5. 量化粒度
量化粒度决定 scale 和 zero point 的共享范围。
| 粒度 | 含义 | 特点 |
|---|---|---|
| Per-tensor | 整个张量共享一组量化参数 | 简单、开销小,但精度较差 |
| Per-channel | 每个通道使用独立量化参数 | 精度更好,工程支持常见 |
| Per-group | 每组权重使用独立量化参数 | LLM 4-bit 量化常见 |
| Per-token | 每个 token 动态计算量化参数 | 激活量化中常见,开销更高 |
对 LLM 权重量化来说,group-wise 量化很常见。group size 越小,量化越细,误差通常越低,但 scale 开销和计算复杂度也会增加。
6. 对称量化与非对称量化
6.1 对称量化
对称量化把数值范围映射到以 0 为中心的整数区间。
简化形式:
优点:
- 计算简单。
- 硬件实现友好。
- 适合权重分布大致对称的场景。
缺点:
- 如果数据分布明显偏移,可能浪费可表示范围。
6.2 非对称量化
非对称量化引入 zero point,用来处理不以 0 为中心的数据分布。
优点:
- 能更好覆盖偏移分布。
- 对某些激活值更友好。
缺点:
- 计算和实现更复杂。
- 某些硬件或 kernel 支持不如对称量化直接。
7. 训练后量化与量化感知训练
7.1 训练后量化
训练后量化(Post-Training Quantization, PTQ)是在模型训练完成后直接量化权重或激活。
优点:
- 不需要重新训练。
- 成本低,流程快。
- 适合已有模型的部署压缩。
缺点:
- 极低 bit 下可能损失明显。
- 对校准数据和算法选择比较敏感。
常见 LLM 权重量化方法大多属于 PTQ 范畴。
7.2 量化感知训练
量化感知训练(Quantization-Aware Training, QAT)在训练过程中模拟量化误差,让模型提前适应低精度表示。
优点:
- 通常能获得更好的低 bit 效果。
- 适合质量要求高、部署精度很低的场景。
缺点:
- 需要训练成本。
- 工程复杂度更高。
- 对训练稳定性和数据质量有要求。
在 LLM 场景中,QAT 成本较高,通常只有在 PTQ 无法满足质量要求时才考虑。
8. LLM 常见量化方法
8.1 GPTQ
GPTQ 是一种训练后权重量化方法,核心思想是逐层量化,并用近似二阶信息减少量化误差。
特点:
- 常用于 4-bit 权重量化。
- 模型体积小,推理部署生态成熟。
- 需要校准数据。
适合场景:
- 本地推理。
- 单模型离线量化。
- 对显存压缩要求较高的部署。
8.2 AWQ
AWQ(Activation-aware Weight Quantization)会考虑激活分布,尽量保护对输出影响更大的权重通道。
特点:
- 常用于 4-bit 权重量化。
- 对 LLM 推理效果保留较好。
- 在 vLLM、TensorRT-LLM 等部署生态中较常见。
适合场景:
- 服务端推理。
- 需要较好质量和推理性能的 4-bit 部署。
8.3 SmoothQuant
SmoothQuant 主要面向权重和激活同时量化。它通过在权重和激活之间迁移缩放难度,让激活分布更容易量化。
特点:
- 常用于 W8A8 场景。
- 更关注高吞吐推理部署。
- 对推理引擎和硬件支持有要求。
8.4 bitsandbytes
bitsandbytes 常用于 8-bit / 4-bit 加载和 QLoRA 微调。
特点:
- 使用门槛低。
- 与 Hugging Face 生态结合紧密。
- 适合实验、微调和单机开发。
8.5 GGUF
GGUF 是 llama.cpp 生态中常见的模型文件格式,支持多种量化类型,例如 Q4、Q5、Q8 等。
特点:
- 适合 CPU、Metal、CUDA 等多种本地推理场景。
- 文件分发方便。
- 在个人电脑和边缘设备上很常见。
GGUF 更像是本地推理生态中的模型格式和量化承载方式,不是单一量化算法。
9. 量化对效果的影响
量化可能影响模型的不同能力。
常见敏感场景包括:
- 数学推理。
- 代码生成。
- 长上下文理解。
- 多轮对话一致性。
- 函数调用和严格 JSON 输出。
- 小概率 token 决策。
- 多语言和低资源语言任务。
一般来说:
- INT8 通常较稳,质量损失较小。
- 4-bit 收益更大,但需要认真评估。
- 模型越小,量化后相对损失可能越明显。
- 任务越依赖精细推理,越需要谨慎。
不要只凭通用 benchmark 判断量化模型是否可用。最好用自己的真实任务集评估。
10. 量化对速度的影响
量化不一定必然加速。
它可能带来速度收益的原因包括:
- 权重更小,显存带宽压力更低。
- 更大的模型可以放进单卡,减少跨设备通信。
- 推理引擎提供了高效低精度 kernel。
它也可能没有明显加速,甚至变慢:
- 量化和反量化本身有额外开销。
- 当前硬件不擅长对应精度计算。
- 推理框架没有优化对应量化格式。
- batch、上下文长度和并发设置不匹配。
评估量化速度时,需要同时看:
- TTFT。
- ITL。
- tokens/s。
- 并发吞吐。
- GPU 利用率。
- 显存占用。
- 输出质量。
只看单次生成耗时容易误判。
11. 量化流程
一个较稳妥的 LLM 量化流程通常包括:
- 明确目标:是为了省显存、降低成本、提高吞吐,还是支持本地部署。
- 选择基座模型:确认模型许可证、结构、上下文长度和推理框架兼容性。
- 准备校准数据:选择能代表真实输入分布的小规模高质量样本。
- 选择量化方法:根据部署框架选择 GPTQ、AWQ、GGUF、bitsandbytes 或 FP8。
- 执行量化:记录算法、精度、group size、校准集和工具版本。
- 离线评估:比较原始模型和量化模型的任务指标。
- 性能压测:在目标硬件和目标并发下测试延迟、吞吐和显存。
- 人工抽检:重点检查推理、格式、拒答、安全和边界样本。
- 灰度部署:小流量观察稳定性,再扩大使用范围。
量化结果和硬件、框架、kernel、模型结构强相关。不要假设一个模型上的量化配置可以无成本迁移到另一个模型。
12. 校准数据
校准数据用于帮助量化算法估计权重或激活分布。
好的校准数据应该:
- 覆盖真实业务输入。
- 包含典型长度和格式。
- 覆盖常见任务类型。
- 避免只有短句或单一模板。
- 不混入敏感信息和测试集答案。
校准数据不一定要很多,但要有代表性。几十到几百条高质量样本通常比大量无关文本更有价值。
13. 工具与框架
| 工具 / 框架 | 常见量化方式 | 适合场景 |
|---|---|---|
| llama.cpp | GGUF、Q4、Q5、Q8 等 | 本地推理、CPU / Mac / 消费级 GPU |
| AutoGPTQ | GPTQ | 离线 4-bit 权重量化 |
| AutoAWQ | AWQ | 4-bit 推理部署 |
| bitsandbytes | 8-bit、4-bit、NF4 | Hugging Face 加载、QLoRA 微调 |
| vLLM | AWQ、GPTQ、FP8 等 | 高吞吐服务端推理 |
| TensorRT-LLM | INT8、FP8、W4A16 等 | NVIDIA GPU 高性能部署 |
| Hugging Face Optimum | 多后端量化和导出 | 与 Transformers 生态集成 |
工具选择应跟部署路径一起考虑。量化格式能生成出来,不代表目标推理引擎能高效运行。
14. 与微调、蒸馏的关系
量化、微调和蒸馏经常组合使用。
| 方法 | 主要目标 | 和量化的关系 |
|---|---|---|
| 微调 | 让模型适配任务和风格 | 可先微调再量化,也可用 QLoRA 在量化模型上训练适配器 |
| 蒸馏 | 把大模型能力迁移到小模型 | 常先蒸馏得到小模型,再量化部署 |
| 剪枝 | 删除不重要参数或结构 | 可和量化一起压缩,但工程复杂度更高 |
| RAG | 提供外部知识 | 可降低对超大参数模型的依赖,再配合量化降成本 |
常见顺序是:
基座模型 -> 微调 / 蒸馏 -> 量化 -> 评估 -> 部署
如果量化后效果下降明显,可以尝试:
- 改用更高 bit,例如从 4-bit 改为 8-bit。
- 更换量化算法。
- 调整 group size。
- 更换校准数据。
- 对量化模型做少量恢复训练或 QAT。
15. 常见误区
15.1 量化后一定更快
不一定。速度收益取决于硬件、kernel、推理框架和负载形态。某些 4-bit 模型只是更省显存,并不一定更快。
15.2 只要能加载就能生产使用
能加载只说明显存够了,不代表质量、延迟、吞吐和稳定性达标。生产部署必须做任务评估和压测。
15.3 bit 越低越好
bit 越低,资源占用越低,但量化误差通常越大。对关键业务,INT8 可能比 INT4 更合适。
15.4 通用评测好就代表业务可用
通用评测只能提供参考。业务里的格式约束、术语、边界条件和安全要求往往更重要。
16. 实践建议
如果目标是本地实验:
- 优先尝试 GGUF 或 bitsandbytes 4-bit。
- 先确认模型能稳定加载和生成。
- 再比较不同 Q4 / Q5 / Q8 版本的质量和速度。
如果目标是服务端部署:
- 先明确推理框架支持哪些量化格式。
- 优先测试 AWQ、GPTQ、INT8 或 FP8 等部署生态成熟的方案。
- 在目标并发、上下文长度和输出长度下压测。
- 同时评估质量和性能,不只看显存。
如果目标是微调:
- 优先考虑 QLoRA。
- 基础模型量化加载,LoRA 参数保持可训练。
- 微调后仍需单独评估合并权重、适配器加载和最终部署格式。
17. 总结
模型量化的本质是:用更低精度表示模型中的数值,减少显存、存储和带宽压力,同时尽量保留模型效果。
实际使用时,需要重点关注四件事:
- 目标硬件是否支持对应精度和 kernel。
- 量化格式是否被推理框架高效支持。
- 业务任务是否对量化误差敏感。
- 量化后的质量和性能是否经过真实评估。
对 LLM 来说,量化通常不是孤立优化。它会和显存估算、推理框架、KV Cache、微调、蒸馏、RAG 和压测一起决定最终部署效果。好的量化方案不是 bit 越低越好,而是在质量、速度、显存和工程复杂度之间取得合适平衡。
参考
- LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale
- GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
- SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models
- AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
- ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers
- QLoRA: Efficient Finetuning of Quantized LLMs
- SpQR: A Sparse-Quantized Representation for Near-Lossless LLM Weight Compression
- Atom: Low-bit Quantization for Efficient and Accurate LLM Serving