模型量化详解:INT8、INT4、GGUF 对大模型效果和速度的影响
一个参数规模不大的开源模型,以原始的 16 位精度存储,也可能需要十几 GB 的显存,这已经超出了很多消费级显卡的容量。量化(Quantization)通过用更少的比特数表示模型参数,把模型体积和显存需求压缩到原来的一半甚至四分之一,让大模型能够在普通电脑、甚至手机上运行。它是开源模型能够普及的关键技术之一。
量化的基本原理
模型的参数本质上是大量的浮点数。训练时通常使用 32 位或 16 位浮点数,精度高但占用空间大。量化就是把这些数值映射到更低精度的表示,例如 8 位整数或 4 位整数。
打个比方:原本用精确到小数点后很多位的数字记录每个参数,量化后只用有限的几个“刻度”来近似。刻度越少,存储越省,但近似误差越大。
好的量化方法会尽量减少这种误差的影响,例如按小组分别计算缩放比例、对特别重要的参数保留更高精度、利用少量校准数据来确定最佳的映射方式。
常见精度级别
- 16 位(FP16/BF16):通常视为“原始精度”的基准,效果最好,资源需求最高;
- 8 位(INT8 或 FP8):体积约为 16 位的一半,对大多数任务效果损失很小,是服务端部署的常见选择;
- 4 位(INT4):体积约为 16 位的四分之一,效果有一定损失,但对日常对话等任务通常仍可接受,是本地部署最常用的级别;
- 更低比特:3 位、2 位等极端量化,体积更小,但效果下降明显,一般只在资源极度受限时使用。
常见量化格式
GGUF
主要用于基于 llama.cpp 生态的推理工具,例如 Ollama 和多种本地运行软件。它支持 CPU 推理以及 CPU 与 GPU 混合推理,提供多种量化级别,命名中通常带有比特数和量化方法的标识。适合个人电脑和本地部署,使用方法可参考用 Ollama 在本地运行大模型。
GPTQ 与 AWQ
两种常用于 GPU 推理的权重量化方法,通常需要少量校准数据来确定量化参数。AWQ 的思路是识别对效果影响较大的权重并加以保护。它们在服务端 GPU 推理框架中有较好的支持。
推理框架内置量化
许多推理引擎支持加载时动态量化或内置的 8 位浮点量化,部署更加方便,具体可参考 vLLM 推理服务入门。
量化对效果的影响
量化带来的效果损失并不是均匀的:
- 模型越大,越能承受量化:参数量大的模型冗余度高,量化到 4 位后损失相对较小;小模型对量化更敏感;
- 任务类型有差异:日常对话、摘要、分类等任务受影响较小;数学推理、代码生成、长文本中的精确信息提取等任务更容易受到影响;
- 中文等非英语任务:部分量化方法的校准数据以英文为主,可能对其他语言的效果影响更大。
因此,不要只看通用排行榜上的分数,而应该在自己的任务上测试。
如何选择量化方案
1. 明确硬件约束
先确定可用的显存或内存,留出上下文缓存和系统运行所需的空间,再反推能容纳的模型规模和量化级别。KV Cache 的显存占用见 KV Cache 详解。
2. 优先“大模型低精度”还是“小模型高精度”
在相同显存下,常见的经验是:较大模型的 4 位量化版本,往往优于较小模型的 16 位版本。但这需要针对具体任务验证。
3. 在自己的数据上评测
准备一组代表实际业务的测试问题,比较不同量化版本的输出质量,重点关注对你最重要的任务类型。
4. 考虑推理速度
量化通常能提升推理速度,因为需要从显存读取的数据量减少了。但在某些硬件和框架组合下,低比特计算缺乏优化,速度提升有限。
小结
量化是用少量精度换取大幅资源节省的技术,让大模型能够在更便宜的硬件上运行。8 位量化几乎无损,4 位量化在本地部署中最为常用,更低比特需谨慎使用。根据硬件条件和任务类型选择合适的格式与精度,并在自己的数据上验证效果,是用好量化模型的关键。