```html 近年来,随着Transformer与MOE架构的相继推出,深度学习模型的参数量已轻松突破万亿大关。模型规模越大,部署成本越高,推理性能也面临更大挑战。如何破解这一困局?这便引出了大模型压缩技术——我们亟需通过一系列方法,让这些庞大的模型既能高效运转,又不致吞噬过多的算力资源。模型压缩
```html
近年来,随着Transformer与MOE架构的相继推出,深度学习模型的参数量已轻松突破万亿大关。模型规模越大,部署成本越高,推理性能也面临更大挑战。如何破解这一困局?这便引出了大模型压缩技术——我们亟需通过一系列方法,让这些庞大的模型既能高效运转,又不致吞噬过多的算力资源。模型压缩通常可划分为几大类:剪枝(Pruning)、知识蒸馏(Knowledge Distillation),以及本文重点探讨的量化(Quantization)。
本系列将逐一拆解主流的大模型量化方案,例如GPTQ、LLM.int8()、SmoothQuant、AWQ等。本文先从FP8量化入手,详细解析其背后的原理与实际应用场景。
---
## FP8 简介
FP8,全称为8位浮点数据格式,由Nvidia、Arm、Intel三家企业联合推出,专门用于加速深度学习训练与推理。当时他们共同发表了论文《FP8 Formats for Deep Learning》。如今,Nvidia的Hopper与Ada Lovelace架构GPU均已原生支持该格式。
## 补充:浮点表示法
在正式讨论FP8之前,有必要回顾浮点数的表示原理。根据IEEE 754标准,一个浮点数在计算机中由三部分组成:
- **符号位**:1bit,0代表正数,1代表负数。
- **指数部分**:决定数值的范围。
- **尾数部分**:决定数值的精度。
浮点数的计算公式看似简单,但根据指数位的取值,又可分为规格化数、非规格化数以及特殊值(无穷和NaN)。对于规格化数,指数位不全为0或全为1;非规格化数则是指数位全为0;特殊值方面,指数全为1、尾数全0表示无穷,尾数不全为0则为NaN。
## FP8 表示形式
在硬件层面,FP8通常有两种变体:E4M3和E5M2。这两种格式各有其适用场景。
- **E4M3**:1个符号位,4个指数位,3个尾数位。可表示的最大值为448,同时能表示NaN。
- **E5M2**:1个符号位,5个指数位,2个尾数位。可表示范围达到±57344,还能表示无穷与NaN。
简言之,E4M3精度更高,E5M2动态范围更大——范围扩大的代价是精度降低。
值得注意的是,E5M2的指数部分与FP16一致,这意味着其动态范围与FP16相当,因此常被用于训练的反向传播阶段。而E4M3则更适合前向传播。
在H100的第四代Tensor Core上,FP8的矩阵乘法(无论是E4M3还是E5M2)均可执行,甚至支持混合搭配,计算结果最终累加到FP32或FP16中。格式间的转换也由硬件直接支持。
E5M2完全遵循IEEE 754标准;E4M3则更加灵活——它允许指数位全为1时仍表示规格化数,只有当指数和尾数全为1时才表示NaN,且本身无法表示无穷。
举例说明:
- 二进制 (0 1111 110) 在E4M3中,表示 2^(15-7) * (1+1/2 + 1/4) = 448
- 二进制 (1 1111 100) 则表示 -384
- 二进制 (1 1111 111) 即为NaN
换个角度,可将浮点数视为2的幂之间的若干样本。例如在E5M2中,2与4之间仅有4个样本;而在E4M3中,相同区间却有8个样本。这意味着E5M2的量化误差比E4M3更大。此外,FP8表示的数值本身是非均匀的——越靠近0,分布越密集;越远离0,越稀疏。因此,浮点量化的误差会随着数值的增大而增大。
## INT8 与 FP8 对比
### 精度对比
究竟INT8与FP8谁更优?这取决于数据分布。高通AI研究院对此有过专项研究。
- 对于**均匀分布**,INT8表现最佳,FP8-E4与FP8-E5均稍逊一筹。
- 对于**正态分布**,FP8-E2(2个指数位、5个尾数位)精度最高,INT8紧随其后。
- 而面对含有异常值的**t分布**,各格式精度均一般,但FP8-E4略优。
具体到模型权重与激活值的量化,情况更为有趣。有论文统计了LLaMA-65B各层权重的量化偏差,结果发现:**对于权重,INT8明显优于FP8-E4**。但对于激活值,情况则相反——**FP8-E4在大多数层上的精度高于INT8**。
原因在于激活值是动态的,每次输入都不同,需通过校准集确定量化尺度。校准过程通常取所有batch的最大值来计算尺度,导致非最大值的batch数值普遍偏小,而FP8-E4对小数值的精度更高。因此,**INT8与FP8并无绝对优劣**,完全可根据不同层的实际损失灵活选择。
### 性能对比
以Nvidia L40(Ada Lovelace)为例,其FP8 Tensor Core与INT8 Tensor Core在计算能力上保持一致。H800、L20、L40S情况类似。
但若深入硬件层面——乘法累加运算单元(MAC)——则存在差异。对于8位MAC,FP运算通常比INT占用更多芯片面积。然而有趣的是,当位宽降至8位时,FP8与INT8 MAC单元的面积几乎相同。这意味着二者的硬件成本与推理性能十分接近。
累加器是另一关键因素。定点累加器对INT8而言既精确又高效;而浮点累加器虽精度稍低,但对FP8-E4这类动态范围大的格式更友好——无需大幅增加累加器大小即可覆盖更大乘积范围。
综合数据表明,INT8配合定点累加器是最节省面积的方案。FP8-E4若搭配浮点累加器,所需门电路数量比INT8高出53%;若使用FP32累加器,效率甚至低183%。因此,纯从硬件效率看,FP8-E4比INT8成本更高。但这仅是其中一面。
### 综合对比
1. INT8为均匀量化,所有数值等间隔映射,容易损失边界特征值;FP8为非均匀量化,小数值更精确,大数值误差则更大。
2. 混合精度训练时,FP8转换为FP16/FP32/BF16更直接;INT8则需额外的乘法与加法操作,开销更大。
3. 在CPU上,FP8运行速度远慢于INT8。
4. 量化误差与步长正相关——FP8对小数值友好,但对大数值则不够友好。
## FP8 量化方案
### FP8 量化模拟
高通AI研究院提出了一种在FP32硬件上模拟FP8量化的方法,可快速完成实验,并易于在深度学习框架中实现。结论是:FP8格式在多种网络模型的PTQ(训练后量化)中通常优于INT8;其中E5M2与E4M3效果最佳。而对于Transformer等含有较多异常值的模型,增加指数位数效果更好。不过,一旦采用QAT(量化感知训练),FP8格式的优势会缩小——网络模型能够在训练中学会在INT8下同样表现出色。
### MoFQ 混合格式量化方法
不同层的数据分布差异显著,没有一种量化格式能通吃所有场景。上海交大、北大与微软亚洲研究院联合提出的MoFQ方法,采用逐层选择最优格式的策略,在W8A8量化上取得了接近全精度的结果。此外,MoFQ不会增加硬件开销——位宽仍为8比特,仅更换格式。
## FP8 推理流程
训练阶段,为保障梯度计算精度,权重通常保持在高精度(BF16或FP32)。但推理时权重固定,故可在模型加载时直接将其转换为FP8。
操作融合至关重要。例如将LayerNorm与后续的格式转换合并,确保kernel的输入输出尽可能为FP8,从而有效提升GPU内存带宽利用率。GeLU激活函数也应尽量融合其中。
目前,少量输出仍会保持FP16——因为NCCL仅支持高精度的reduce操作。因此,推理流程大致为:LayerNorm输出与权重均为FP8,矩阵运算结果暂存为FP16,完成后再转换回FP8。整个推理链路中,绿线表示FP8的I/O,红线表示高精度的I/O。
## FP8 在 TensorRT-LLM 中的应用
TensorRT-LLM从9.0版本起支持FP8推理。启用FP8需执行几个步骤:设置FP8标志、添加GEMM的缩放因子(scale)、编写FP8模型。具体而言,将FP16输入量化为FP8再反量化,权重也进行相同操作。TensorRT会自动将量化/反量化操作与前后的kernel融合,最终计算图即为量化后的X与W直接进行FP8计算,输出亦为FP8。
TensorRT-LLM还封装了FP8 linear与FP8 row linear函数,可直接使用线性层,无需自行编写代码。流程大致为:权重以FP8存储,计算前先反量化为FP16甚至FP32,然后执行矩阵乘法,累加使用FP32完成,最后乘以scale,输出FP8结果。
## FP8 在 vLLM 中的应用
vLLM在H100与AMD MI300x等GPU上支持FP8量化,目前仅适用于Hopper与Ada Lovelace架构。使用FP8可使模型内存占用减半,吞吐量提升1.6倍,且精度影响极小。
### 在线动态量化
无需校准数据,只需在启动推理引擎时指定 `--quantization="fp8"` 即可。所有Linear模块(除lm_head外)的权重按per-tensor量化为FP8_E4M3,激活值则在每次前向传播时动态计算。缺点在于延迟提升有限,且需要足够内存先加载原始精度模型。
### 离线动态量化
借助AutoFP8库,提前将权重量化为FP8(E4M3)并生成检查点,vLLM运行时仅处理激活的动态缩放。这种方式精度更高,内存占用也更低。
### 离线静态量化
为追求最佳推理性能,可使用AutoFP8配合校准数据,为权重与激活生成静态的per-tensor缩放因子。随后在vLLM中直接加载量化后的模型检查点。
### KV Cache FP8 量化
vLLM还支持对KV Cache进行FP8量化,分为E5M2与E4M3两种。E4M3精度更高,但数据范围小,通常需要为每个量化tensor配备一个FP32的缩放因子。若指定了量化参数JSON,缩放因子可自动加载;未指定时默认值为1.0。研究表明,FP8 E4M3的KV Cache量化带来的精度损失极小,但推理速度可显著提升。
## FP8 在不同推理框架及硬件的性能对比
在TensorRT-LLM中,FP16的max值可达75,而FP8能提升至85——主要得益于权重内存节省。若KV Cache也转为FP8,内存再减半,吞吐量甚至可接近FP16的两倍。
此外,使用vLLM对Qwen1.5-Chat在不同硬件(4090、H800、H20)上进行了FP8静态量化测试。结果非常直观:相较于BF16,FP8在所有硬件上均实现了10%~30%的性能提升。
## 总结
本文从FP8基本概念讲起,对比了其与INT8在精度与性能上的差异,并介绍了几种主流的FP8量化方案。尽管FP8仍在不断演进之中,但主流推理框架如TensorRT-LLM与vLLM均已提供成熟支持。实测数据也表明,在不同硬件上,FP8相较于BF16均能带来实质性的性能提升。量化选对路,效果立竿见影。
```
热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:使用FP8进行大模型量化的原理与实践全解析要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。