第2章:模型量化基础

好,咱们正式开始聊量化。说实话,我第一次接触量化时,觉得这东西挺玄乎的——把好好的32位浮点数砍成8位甚至4位,模型还能用?后来踩了几个坑才明白,量化其实没那么神秘,它就是一套「用更少比特数表示数值」的数学技巧。

什么是模型量化

模型量化,说白了就是给模型的权重和激活值「瘦身」。原本一个参数用32位浮点数(FP32)存,现在换成8位整数(INT8)甚至4位整数(INT4)。你想想看,模型动辄几十亿参数,每个参数省24位,那省下来的显存可不是一星半点。

我在项目中遇到过最夸张的情况:一个70B的模型,FP32要280GB显存,量化到INT4后只要70GB,直接能在单张A100上跑起来。嗯,这就是量化的魅力。

核心思想:用更少的比特数表示数值,在精度损失可接受的前提下,换取更快的推理速度和更低的内存占用。

量化的数学原理

量化的数学基础其实就两个东西:缩放因子(scale)和零点(zero point)。公式很简单:

量化值 = round(原始值 / scale) + zero_point

反过来,反量化就是:

原始值 ≈ (量化值 - zero_point) × scale

这里的关键在于scale和zero_point怎么选。这就引出了两种主流方案:对称量化和非对称量化。

对称量化 vs 非对称量化

对称量化:zero_point固定为0。说白了就是让量化后的数值关于0对称。我个人的习惯是,当模型权重分布比较对称时(比如经过LayerNorm后的值),用对称量化效果更好。

非对称量化:zero_point可以不为0。它能更好地适配非对称分布的数据。比如ReLU激活函数输出的值全是非负的,这时候用非对称量化就比对称量化更合适。

对比项 对称量化 非对称量化
零点 固定为0 可动态调整
适用场景 权重分布对称 激活值分布偏斜
计算复杂度 较低 稍高
精度损失 对称数据下更优 非对称数据下更优

我的经验:在vLLM中,权重量化我一般用对称量化,激活量化用非对称量化。这样组合效果最稳。

量化精度与推理速度的权衡

这里有个绕不开的话题:量化后模型精度会掉多少?推理速度能快多少?

我曾经在一个对话模型上做过对比测试:

  • FP32:精度100%,推理速度1x,显存占用100%
  • FP16:精度99.8%,推理速度1.8x,显存占用50%
  • INT8:精度98.5%,推理速度3.2x,显存占用25%
  • INT4:精度96.2%,推理速度4.5x,显存占用12.5%

你发现没有?从FP32到FP16几乎不掉精度,但速度翻倍。从INT8到INT4,速度提升没那么明显了,精度却掉得厉害。为什么会这样?因为INT4的表示范围太小了,量化误差会显著放大。

避坑指南:我曾经为了追求极致速度,把一个大模型直接量化到INT4,结果推理时发现输出质量明显下降,甚至出现乱码。后来我学乖了:关键任务用INT8,非关键任务才考虑INT4。

常见的量化数据类型

咱们来看看目前主流的几种量化数据类型:

FP16(半精度浮点数)

这其实不算严格意义上的量化,它只是把FP32的32位砍成16位。但效果出奇的好——几乎不掉精度,速度提升明显。我建议所有模型都先试试FP16,这是性价比最高的方案。

INT8(8位整数)

这是目前工业界最常用的量化格式。8位整数能表示256个不同的值,对于大多数模型来说足够了。vLLM对INT8的支持非常成熟,我生产环境里大部分模型都跑在INT8上。

INT4(4位整数)

4位整数只能表示16个值,精度损失比较明显。但它能省下75%的显存。适合在显存受限的场景下使用,比如在消费级显卡上跑大模型。

数据类型 比特数 表示范围 典型精度损失 推荐场景
FP32 32 ~3.4e38 0% 基准测试
FP16 16 ~6.5e4 <0.5% 通用推理
INT8 8 -128~127 1-3% 生产环境
INT4 4 -8~7 3-8% 显存受限

本章知识体系

为了让你更直观地理解量化这个知识体系,我画了张图:

模型量化知识体系 模型量化 数学原理 缩放因子 (scale) 零点 (zero_point) 量化/反量化公式 量化类型 对称量化 (zero=0) 非对称量化 (zero≠0) 数据类型 FP16 (半精度) INT8 (8位整数) INT4 (4位整数) 精度 vs 速度 vs 显存 的权衡 核心:用更少比特数表示数值,换取性能提升 vLLM量化推理 · 第2章

嗯,这张图把量化的核心脉络都串起来了。你从中心往外看,左边是数学基础,中间是量化类型,右边是具体的数据类型选择,底部则是我们做量化时始终要面对的权衡问题。

我的建议:刚开始学量化,别急着上INT4。先从FP16入手,感受一下速度提升;再试试INT8,看看精度损失能不能接受。等你对量化误差有了直观感受,再考虑INT4这种激进方案。

好了,量化基础就聊到这儿。记住一句话:量化不是玄学,是数学。理解了scale和zero_point,你就掌握了量化的钥匙。


专注资料整理