首页 > 教程攻略 > ai资讯 >5 混合量化

5 混合量化

来源:互联网 时间:2026-08-04 14:22:21

模型量化,说白了就是一种模型压缩技术。在LLM这个领域里,量化主要是把FP32、FP16或者BF16的权重、激活值乃至KV Cache,统统塞进INT8、FP8、INT4、FP4这些更紧凑的数值格式里。如果按不同的维度来划分,LLM推理量化可以分成好几类,具体分类可以参考下面的图。这篇文章的核心关注点是LLM的PTQ(训练后量化),搞明白这一点,量化带来的收益主要就三个方面:

  • 显存收益

    :LLM的权重可不是一般的“占地方”,比传统AI模型的权重大得多,甚至直接决定了某些GPU能不能跑得动。对权重做量化,显存占用能大幅缩减,这账大家都会算。

  • 吞吐收益

    :LLM推理过程中KV Cache的显存消耗同样不容小觑。如果把KV Cache量化后再存起来,意味着同样的显存能塞下更多的请求,吞吐量自然就上去了,推理成本也能降下来。

  • 延迟收益

    :LLM推理的Decoding阶段主要是访存受限,权重或激活值量化后,算子从显存里搬数据的时间就少了。再加上现在大部分Nvidia GPU的低精度硬件单元算力都比高精度单元高,所以延迟也能跟着降一截。

1 背景

(同上,此处为章节标题,内容已整合进上文)

2 FP8格式

LLM推理里,常见的量化格式有INT8和FP8两种。FP8是Nvidia在Hopper和Ada Lovelace架构GPU上推出的数据类型,它有两大“变体”:

  • E4M3

    :4个指数位、3个尾数位,再加1个符号位

  • E5M2

    :5个指数位、2个尾数位,再加1个符号位

简单来说,

E4M3的动态范围小一些,但精度更高;E5M2则动态范围更大,精度稍低

。LLM推理对精度比较敏感,对数值范围的要求反倒没那么苛刻,所以FP8-E4M3更对胃口。

因为浮点数本身的特性,FP8表示的数值分布是不均匀的。Yijia Zhang在《Integer or Floating Point? New Outlooks for Low-Bit Quantization on Large Language Models》里给出了一个很直观的对比图——FP8与INT8的数值分布示意。FP8越靠近0,数值越稠密;越远离0,数值越稀疏。换句话说,FP8对大值的精度不太行,但对小值倒是很擅长。

3 量化精度

FP8多了几个尾数位,那它比INT8在精度上真有优势吗?

3.1 数值分布

针对不同的数值分布,Mart van Baalen在《FP8 versus INT8 for efficient deep learning inference》中给出了INT8和FP8量化后的精度对比(纵坐标越大越好)。对于均匀分布,INT8明显最优,FP8-E4和FP8-E5都不太行。对于正态分布,FP8-E2(2个指数位、5个尾数位)拔得头筹,INT8紧随其后,FP8-E4和FP8-E5表现依旧不佳。而

对于带有异常值的t-分布,所有量化方式的精度普遍下降,但FP8-E4稍好一些

3.2 权重量化

那实际的大模型权重里,哪种量化更厉害呢?Yijia Zhang统计了LLaMA-65B每一层权重做Per Channel量化后的偏差,并排了个序。结果很清楚:INT8在所有层上的权重量化精度都明显胜过FP8-E4。

3.3 激活值量化

Yijia Zhang同时也统计了LLaMA-65B各层激活值做Per Tensor量化后的偏差。有意思的是,FP8-E4在大多数层的激活值量化精度上居然比INT8好。他对此的解释是:

激活值本身是动态的,随着每个输入的不同而变化,所以需要用校准集来确定量化Scale;校准过程是取所有Batch的最大值来计算Scale,这会导致非最大值的Batch量化后的数值普遍偏小,而FP8-E4对小值的精度恰好更好

这就引出一个问题:在校准过程中,如果对激活值采用Per Token或者Per Group的量化粒度,能否削弱Scale选取带来的影响?那样的话精度结果又会怎样?

3.4 小结

综合Mart van Baalen和Yijia Zhang的实验结果,FP8-E4相对INT8并没有精度的全面优势。

INT8更适合量化权重,FP8-E4更适合大多数层的激活值。

4 量化性能

既然精度没优势,那FP8在性能上是不是能扳回一局?毕竟Nvidia在Hopper和Ada Lovelace架构GPU里专门加了FP8 Tensor Core,可以直接加速FP8运算。

4.1 硬件参数

以Nvidia L40 GPU为例看硬件参数:FP8 Tensor Core和INT8 Tensor Core在各自数据类型上的计算能力是相同的。这一点在H800、L20和L40S上也是一样的。

4.2 计算效率

再来看看计算效率。Mart van Baalen从累加器硬件的角度分析发现,

以FP32累加器为例,FP8-E4的效率比INT8低了183%

。Bita Rouhani在《With Shared Microexponents, A Little Shifting Goes a Long Way》中对两种格式都使用浮点累加器,预估FP8的性能比INT8下降40%。根据这些分析,Mart van Baalen认为FP8的计算成本明显高于INT8,这意味着对于计算瓶颈型的网络,FP8量化后会拖累性能。

这里留一个TODO:需要在Hopper或Ada Lovelace架构GPU上,实际测试计算瓶颈算子(比如GEMM)在INT8和FP8-E4下的具体性能。

4.3 小结

总的来说,根据Mart van Baalen和Bita Rouhani的结论,FP8-E4在量化性能上也没有优势。

5 混合量化

注意到FP8-E4的优势主要体现在多数层的激活值量化精度上。于是Yijia Zhang对LLaMA和OPT模型采用了MoFQ8(混合格式量化)方案,实现W8A8。

核心思路是逐层选择量化方法,每层内部保持格式一致

。MoFQ8在WikiText-2、LAMBADA、PIQA和HellaSwag四个数据集上的表现,都明显优于单一的FP8-E4或INT8量化,精度基本追平了FP16。

6 总结

对于LLM PTQ推理量化,从工程视角来看:

FP8 vs INT8

:即便Nvidia在Hopper和Ada Lovelace架构上推出了FP8 Tensor Core,但FP8-E4在精度和性能上跟INT8比都没占到便宜,所以当前工程上仍然以INT8量化为主。当然,FP8的适用场景还得继续探索。如果某个模型用INT8量化后精度掉得厉害,那可以试试Yijia Zhang的MoFQ8混合量化,或者参考Tim Dettmers在《LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale》中的混合量化思路。

W8A16 vs W8A8

:以INT8为例,相比FP32/FP16/BF16,W8A16(仅权重量化)在几乎不损失精度的前提下,带来了两大好处:一是权重显存占用大幅降低;二是Decoding阶段对权重的访存压力显著缓解,推理延迟降下来了。W8A8则是把权重和激活值都量化了,进一步增加了激活值方面的显存和访存收益——具体收益跟输入Prompt和输出序列的长度有关,Prompt和输出序列越长,收益越明显;此外,

W8A16走的是FP16/BF16 Tensor Core,而W8A8可以用算力更高的INT8 Tensor Core,既能降低延迟,又能提升Nvidia GPU的硬件利用率