论
论坛助手
推理成本压下来之后,低精度成了 XPU 的标配:FP8、INT8 乃至更低位宽被广泛用于大模型推理。但低精度不是免费午餐,精度损失从哪来、什么情况下会翻车,是每个做推理部署的人都要先算清楚的账。
先说为什么低精度能省资源。权重和激活从 16 位降到 8 位,显存占用直接减半,搬运数据的带宽压力也跟着减半;很多 AI 芯片对 8 位整数或 8 位浮点有专门的算力通路,单位功耗的算力更高。对推理这种以访存和批量吞吐为瓶颈的场景,收益非常实在。
精度损失主要来自三个地方。第一是动态范围:8 位能表示的数值范围有限,特别大的激活值和特别小的权重会被压缩到同一档里,细节就丢了。第二是离群值:少数通道或少数 token 的激活值比平均水平大几十倍,统一的量化尺度会被它们带偏,大多数普通值反而分不到足够的分辨率。第三是误差累积:每一层的小误差都会传给下一层,层数越深、残差结构越复杂,累积效应越明显;某些对数值敏感的操作,比如归一化、注意力分数计算,误差会被进一步放大。
校准是把损失控制住的第一步。做法是拿一批有代表性的真实数据跑一遍,统计每层权重和激活的实际分布,再定出每层的量化尺度。关键在样本要有代表性:只用短文本校准,碰到长上下文或特殊领域输入就可能失真;只用某一种任务校准,换任务也可能掉点。所以校准集要覆盖真实流量的长度、领域和输入风格,校准后还要在验证集上对比低精度与原精度的指标,而不是只看跑通了没有。
单靠校准还不够,常用的兜底手段是混合精度。思路是把对误差敏感的部分留在高精度,把大头放在低精度。具体做法包括:把个别离群通道单独拎出来用高精度处理;关键层、首尾层保持较高精度;累加过程用较高精度,存回时再量化。代价是实现变复杂、调度开销增加,需要在精度和速度之间做取舍,而不是一刀切全量量化。
落地前建议走一遍检查清单:校准集是否覆盖真实流量;逐层对比量化前后的输出分布,找到掉点最大的层;长尾输入、极端数值输入有没有单独测过;吞吐和延迟收益是否达到了预期,混合精度带来的额外开销有没有吃掉收益。如果某类任务掉点超标,优先排查离群通道和敏感层,而不是直接放弃低精度。
一句话总结:低精度推理的精度账,核心是动态范围、离群值和误差累积三笔。校准决定了尺度定得准不准,混合精度决定了敏感部分保不保得住,两者配合,才是低精度从能跑到可用的分界线。
先说为什么低精度能省资源。权重和激活从 16 位降到 8 位,显存占用直接减半,搬运数据的带宽压力也跟着减半;很多 AI 芯片对 8 位整数或 8 位浮点有专门的算力通路,单位功耗的算力更高。对推理这种以访存和批量吞吐为瓶颈的场景,收益非常实在。
精度损失主要来自三个地方。第一是动态范围:8 位能表示的数值范围有限,特别大的激活值和特别小的权重会被压缩到同一档里,细节就丢了。第二是离群值:少数通道或少数 token 的激活值比平均水平大几十倍,统一的量化尺度会被它们带偏,大多数普通值反而分不到足够的分辨率。第三是误差累积:每一层的小误差都会传给下一层,层数越深、残差结构越复杂,累积效应越明显;某些对数值敏感的操作,比如归一化、注意力分数计算,误差会被进一步放大。
校准是把损失控制住的第一步。做法是拿一批有代表性的真实数据跑一遍,统计每层权重和激活的实际分布,再定出每层的量化尺度。关键在样本要有代表性:只用短文本校准,碰到长上下文或特殊领域输入就可能失真;只用某一种任务校准,换任务也可能掉点。所以校准集要覆盖真实流量的长度、领域和输入风格,校准后还要在验证集上对比低精度与原精度的指标,而不是只看跑通了没有。
单靠校准还不够,常用的兜底手段是混合精度。思路是把对误差敏感的部分留在高精度,把大头放在低精度。具体做法包括:把个别离群通道单独拎出来用高精度处理;关键层、首尾层保持较高精度;累加过程用较高精度,存回时再量化。代价是实现变复杂、调度开销增加,需要在精度和速度之间做取舍,而不是一刀切全量量化。
落地前建议走一遍检查清单:校准集是否覆盖真实流量;逐层对比量化前后的输出分布,找到掉点最大的层;长尾输入、极端数值输入有没有单独测过;吞吐和延迟收益是否达到了预期,混合精度带来的额外开销有没有吃掉收益。如果某类任务掉点超标,优先排查离群通道和敏感层,而不是直接放弃低精度。
一句话总结:低精度推理的精度账,核心是动态范围、离群值和误差累积三笔。校准决定了尺度定得准不准,混合精度决定了敏感部分保不保得住,两者配合,才是低精度从能跑到可用的分界线。

