跳到主要内容

模型量化

模型量化(Quantization)是一种模型压缩和推理加速方法。它把模型中的高精度数值,例如 FP16、BF16 或 FP32,转换成更低精度的表示,例如 INT8、INT4、FP8 或 NF4,从而降低显存占用、存储体积和内存带宽压力。

在大语言模型场景中,量化常用于:

  • 在更小显存的 GPU 上加载更大的模型。
  • 降低模型权重存储成本和分发成本。
  • 提升推理吞吐,尤其是访存瓶颈明显时。
  • 支持本地部署、边缘部署和消费级显卡部署。
  • 配合 LoRA、蒸馏、剪枝和推理引擎优化,构建低成本模型服务。

量化的核心取舍是:用更低的数值精度换取更低的资源消耗,同时尽量保留模型效果。

1. 核心思想

神经网络中的权重和激活本质上是大量数字。默认训练和推理通常使用 FP16、BF16 或 FP32 这类浮点格式。它们表达范围大、精度高,但占用显存也更高。

量化会把这些数字映射到更低 bit 的表示。一个简化的线性量化公式可以写作:

q=round(xs)+zq = \operatorname{round}\left(\frac{x}{s}\right) + z

反量化时再近似还原为:

x^=s(qz)\hat{x} = s(q - z)

其中:

  • xx 是原始浮点值。
  • qq 是量化后的整数值。
  • ss 是 scale,用来控制缩放比例。
  • zz 是 zero point,用来处理非对称分布。
  • x^\hat{x} 是反量化后的近似值。

量化不是无损压缩。低精度表示无法完全保留原始浮点数,因此会引入量化误差。好的量化方法会尽量让误差落在对模型输出影响较小的位置。

2. 为什么量化能省显存

模型权重显存可以粗略估算为:

权重显存参数量×每个参数占用字节数\text{权重显存} \approx \text{参数量} \times \text{每个参数占用字节数}

不同精度下,每个参数的大致占用如下:

精度每参数字节数7B 权重体积估算说明
FP324 bytes约 28 GB训练和部分高精度计算常用
FP16 / BF162 bytes约 14 GBLLM 推理和训练常见
INT8 / FP81 byte约 7 GB常见推理压缩精度
INT4 / 4-bit0.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 为中心的整数区间。

简化形式:

q=round(xs)q = \operatorname{round}\left(\frac{x}{s}\right)

优点:

  • 计算简单。
  • 硬件实现友好。
  • 适合权重分布大致对称的场景。

缺点:

  • 如果数据分布明显偏移,可能浪费可表示范围。

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 量化流程通常包括:

  1. 明确目标:是为了省显存、降低成本、提高吞吐,还是支持本地部署。
  2. 选择基座模型:确认模型许可证、结构、上下文长度和推理框架兼容性。
  3. 准备校准数据:选择能代表真实输入分布的小规模高质量样本。
  4. 选择量化方法:根据部署框架选择 GPTQ、AWQ、GGUF、bitsandbytes 或 FP8。
  5. 执行量化:记录算法、精度、group size、校准集和工具版本。
  6. 离线评估:比较原始模型和量化模型的任务指标。
  7. 性能压测:在目标硬件和目标并发下测试延迟、吞吐和显存。
  8. 人工抽检:重点检查推理、格式、拒答、安全和边界样本。
  9. 灰度部署:小流量观察稳定性,再扩大使用范围。

量化结果和硬件、框架、kernel、模型结构强相关。不要假设一个模型上的量化配置可以无成本迁移到另一个模型。

12. 校准数据

校准数据用于帮助量化算法估计权重或激活分布。

好的校准数据应该:

  • 覆盖真实业务输入。
  • 包含典型长度和格式。
  • 覆盖常见任务类型。
  • 避免只有短句或单一模板。
  • 不混入敏感信息和测试集答案。

校准数据不一定要很多,但要有代表性。几十到几百条高质量样本通常比大量无关文本更有价值。

13. 工具与框架

工具 / 框架常见量化方式适合场景
llama.cppGGUF、Q4、Q5、Q8 等本地推理、CPU / Mac / 消费级 GPU
AutoGPTQGPTQ离线 4-bit 权重量化
AutoAWQAWQ4-bit 推理部署
bitsandbytes8-bit、4-bit、NF4Hugging Face 加载、QLoRA 微调
vLLMAWQ、GPTQ、FP8 等高吞吐服务端推理
TensorRT-LLMINT8、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 越低越好,而是在质量、速度、显存和工程复杂度之间取得合适平衡。

参考