第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% | 显存受限 |
本章知识体系
为了让你更直观地理解量化这个知识体系,我画了张图:
嗯,这张图把量化的核心脉络都串起来了。你从中心往外看,左边是数学基础,中间是量化类型,右边是具体的数据类型选择,底部则是我们做量化时始终要面对的权衡问题。
我的建议:刚开始学量化,别急着上INT4。先从FP16入手,感受一下速度提升;再试试INT8,看看精度损失能不能接受。等你对量化误差有了直观感受,再考虑INT4这种激进方案。
好了,量化基础就聊到这儿。记住一句话:量化不是玄学,是数学。理解了scale和zero_point,你就掌握了量化的钥匙。