推理精度基础:量化基础概念与精度评估

聊到vLLM推理,量化是个绕不开的话题。我个人习惯把量化比作「给模型减肥」——体重轻了跑得快,但会不会跑偏?这就是我们今天要聊的核心。

量化基础概念:FP16、INT8、INT4

先说说最常见的几种精度格式。你想想看,模型参数本质上就是一串数字,数字的表示方式决定了它占多少内存、算得有多快。

精度格式 位宽 内存占用(相对FP32) 典型场景
FP32 32位 1x 训练、高精度推理
FP16 16位 0.5x 混合精度训练、推理
INT8 8位 0.25x 边缘部署、高吞吐推理
INT4 4位 0.125x 极致压缩、移动端

FP16 是半精度浮点数。它和FP32的区别在于指数位和尾数位都砍了一半。我在项目中遇到过,FP16推理时偶尔会出现梯度溢出——尤其是模型中间层的激活值特别大时。不过vLLM对FP16的支持已经很成熟了,大部分场景直接用就行。

INT8 是8位整数。说白了,就是把浮点数映射到-128到127这个范围。映射方式有两种:对称量化和非对称量化。对称量化简单粗暴,适合权重分布比较对称的场景;非对称量化更灵活,适合激活值分布偏斜的情况。

INT4 就更激进了。每个参数只占4个bit,一个字节能塞两个参数。嗯,这里要注意——INT4的精度损失肉眼可见,我建议只在带宽极度受限的场景下使用,比如手机端或者IoT设备。

核心观点:量化不是简单的「砍位数」,而是要在精度和速度之间找到平衡点。我个人经验是:FP16几乎无感,INT8需要仔细调校,INT4则要做好心理准备接受一定程度的精度下降。

精度损失的原因分析

为什么会损失精度?我拆成三个层面来讲。

1. 数值表示范围的压缩

FP32能表示约10^38到10^-38的范围,INT8只有256个离散值。你想想看,把一个大范围映射到小范围,必然会有信息丢失。我在调一个70B模型时发现,某些层的权重分布特别宽,INT8量化后尾部的小数值直接被截断,导致生成结果出现奇怪的重复。

2. 舍入误差的累积

每次量化都要做舍入操作。单个舍入误差很小,但模型动辄几十层,误差会逐层放大。我曾经调试过一个案例,INT8量化后前几层输出还正常,到第20层时误差已经大到让注意力分布完全错位。

3. 异常值的影响

模型参数里偶尔会有一些特别大或特别小的值,我们叫它「异常值」。这些异常值会拉大量化范围,导致正常数值的量化精度被压缩。举个例子,某个权重是127.5,其他权重都在±1之间,那量化后大部分权重只能用到几个离散值,精度损失可想而知。

避坑指南:我曾经在量化一个对话模型时,忽略了attention层的softmax输出分布。softmax输出集中在0和1附近,用INT8量化后很多值被截断成0,导致模型完全失去区分能力。后来我改用per-token量化才解决。

精度评估指标:PPL、BLEU、ROUGE

量化后效果好不好,不能光靠感觉。我们需要客观指标来评估。我常用的三个指标是PPL、BLEU和ROUGE。

PPL(困惑度)

PPL衡量模型对下一个token的预测能力。值越低越好。公式很简单:

PPL = exp( -1/N * Σ log P(token_i | context) )

说白了,就是模型对每个token预测概率的几何平均的倒数。我在项目中习惯用PPL做快速筛选——如果量化后PPL上升超过5%,基本可以判定量化方案有问题。

小技巧:PPL对长文本更敏感。我建议用至少1000个token的测试集来评估,短文本的PPL波动太大,参考价值有限。

BLEU(双语评估替补)

BLEU最初用于机器翻译,现在也广泛用于文本生成任务。它通过比较生成文本和参考文本的n-gram重合度来打分。范围0-100,越高越好。

不过BLEU有个坑——它只关注精确率,不关注召回率。也就是说,生成文本如果只输出几个高频词,BLEU可能很高,但内容质量很差。我建议配合其他指标一起看。

ROUGE(面向召回率的评估)

ROUGE正好和BLEU互补,它关注召回率。常用的是ROUGE-L,基于最长公共子序列(LCS)计算。公式如下:

ROUGE-L = ( (1+β²) * R_lcs * P_lcs ) / ( R_lcs + β² * P_lcs )

其中R_lcs是召回率,P_lcs是精确率,β是权重系数。我一般设β=1,也就是F1分数。

知识体系总览

下面这张图总结了量化与精度评估的核心逻辑,我画出来方便你理解整体脉络:

量化与精度评估知识体系 量化基础 • FP16:半精度浮点 • INT8:8位整数 • INT4:4位整数 内存占用:FP32 > FP16 > INT8 > INT4 精度损失原因 • 数值范围压缩 • 舍入误差累积 • 异常值影响 逐层放大,不可忽视 评估指标 • PPL:困惑度 • BLEU:n-gram精确率 • ROUGE:召回率 多指标联合评估 核心目标:在精度与速度之间找到最佳平衡点 FP16适合高精度场景,INT8适合高吞吐场景,INT4适合极致压缩场景 实践建议 先做PPL快速筛选 → 再用BLEU/ROUGE细粒度评估 → 最后人工校验

量化前后的对比实验

我拿一个实际项目的数据给你看看。这是一个7B对话模型,在500条测试样本上的结果:

精度格式 PPL BLEU-4 ROUGE-L 推理速度(tokens/s) 显存占用(GB)
FP16 8.32 42.1 56.8 45 14.2
INT8(对称) 8.89 39.5 53.2 78 7.3
INT8(非对称) 8.51 41.0 55.1 76 7.3
INT4 10.24 33.7 47.5 112 3.9

你看,INT8非对称量化在PPL上只涨了2.3%,BLEU和ROUGE下降也不明显,但速度提升了近70%,显存砍了一半。这就是我常说的「甜点区间」。而INT4虽然速度翻倍,但PPL涨了23%,BLEU掉了20%——这个代价在很多场景下是不可接受的。

我的建议:如果你在做生产部署,优先考虑INT8非对称量化。如果对精度要求极高,FP16是安全牌。INT4嘛,除非你实在缺显存,否则慎用。

量化不是玄学,是工程。理解每个精度格式的数学本质,掌握评估指标的正确用法,你就能在精度和速度之间找到那个最优解。嗯,今天就聊到这儿,下次我们聊聊vLLM里具体的量化实现细节。


公众号:蓝海资料掘金营,微信deep3321