FP8
了解 FP8 是什么、E4M3 和 E5M2 如何工作,以及缩放、硬件支持和混合精度如何改善 AI 训练与推理。
FP8,即 8 位浮点格式,是一种低精度数值格式,每个值占用 8 位。AI 系统使用 FP8 来减少内存流量,并在兼容硬件上加速矩阵乘法、卷积及其他高开销运算。与 FP16 或 FP32 相比,它能表示的不同值更少,因此成功的 FP8 工作流会将快速的低精度计算与缩放及有选择的高精度运算相结合,以保持模型质量。
FP8 如何表示数字#
浮点值包含符号位、控制范围的指数和控制细节的尾数。FP8 通常有两种格式,详见 PyTorch 浮点数据类型:
- E4M3: 1 个符号位、4 个指数位和 3 个尾数位。它提供更多数值细节,但范围更窄。
- E5M2: 1 个符号位、5 个指数位和 2 个尾数位。它覆盖更宽的范围,但会更激进地对值进行舍入。
E4M3 通常适用于权重和激活值,而 E5M2 更适合容纳值范围较大的梯度。不同平台上的具体变体有所不同,如 AMD 低精度浮点文档所示,因此 FP8 模型并不能自动在每种加速器和运行时之间移植。
由于 8 位无法表示张量原始范围和细节的全部内容,框架通常会在转换前使用缩放因子对值进行缩放。NVIDIA 的 FP8 缩放简介介绍了延迟缩放等策略,这类策略根据之前观测到的最大值推导后续缩放值。缩放可以限制溢出、下溢和饱和,而不要求每项运算都以更高精度运行。
FP8 与相关格式的比较#
在常见 AI 数据类型中,FP8 处于中间位置:
- FP16 或半精度: 使用两倍的位数,提供更高的数值细节,训练通常也更简单。FP8 可以进一步减少存储和带宽需求,但需要更谨慎地进行缩放。
- BF16: 保留较宽的指数范围,但相比 FP16 提供的分数部分细节更少。它通常在 FP8 训练中作为更高精度的配套格式使用。
- INT8: 表示整数而不是浮点值。INT8 模型量化通常依赖缩放因子,将实际值映射到固定的整数级别;而 FP8 保留指数,从而实现自然的非均匀间隔。
- FP4: 仅使用 4 位,可以提供更高的压缩率,但其极为有限的范围和粒度通常会使精度保持更加困难。
FP8 通常是混合精度工作流的一部分,而不是所有张量都使用的数据类型。累加、归一化、优化器状态或敏感层可能仍使用 BF16、FP16 或 FP32。此外,数值精度不同于精确率评估指标,后者用于衡量模型的正类预测中有多少是正确的。
实际应用#
以下两个实际应用说明了 FP8 的重要性:
-
大模型训练: Transformer 训练会反复执行大型矩阵乘法。支持 FP8 的框架可以将符合条件的权重和激活值转换为 FP8,同时在稳定性需要时保留更高精度。这样可以降低带宽需求,并可能提高训练吞吐量。TorchAO 量化训练工作流包含按张量和按行缩放选项,可在最大速度与更好地处理离群值之间进行权衡。
-
高吞吐量视觉推理: 数据中心可能会对数百路零售、交通或制造业视频流运行目标检测。支持 FP8 的内核可以减少符合条件的模型层所需的时间和内存,从而可能降低推理延迟,并提高并发视频流容量。TensorRT 量化类型指南说明了显式量化和反量化运算如何描述 FP8 执行过程。
数值风险与硬件支持#
缩放不当可能导致较大值饱和,并使较小值舍入为零。当一个缩放因子覆盖整个张量时,离群值尤其成问题。这些影响可能改变置信度分数、破坏训练稳定性或降低检测精度,因此开发者应将转换后的模型与其高精度基线进行验证。
原生硬件支持同样重要。NVIDIA Hopper 架构引入了 FP8 Tensor Core 加速,而较早的 NVIDIA A100 GPU支持 FP16、BF16 和 INT8,但不支持原生 FP8 计算。因此,在选择部署精度之前,应先检查 TensorRT 硬件支持矩阵。
在实践中使用 FP8#
这个简短的 PyTorch 示例演示了 E4M3 转换,以及将 FP8 值还原为 FP32 时产生的舍入误差:
import torch
values = torch.tensor([0.1, 1.0, 3.14, 100.0], dtype=torch.float32)
# Convert to E4M3 FP8, then restore the values for comparison.
fp8_values = values.to(torch.float8_e4m3fn)
restored = fp8_values.to(torch.float32)
absolute_error = (restored - values).abs()
print(torch.stack((values, restored, absolute_error), dim=1))文档中的 Ultralytics TensorRT 导出工作流为 Ultralytics YOLO 提供 FP16 和经过校准的 INT8 选项,而不是通过一个参数即可完成的 FP8 导出。因此,FP8 部署需要兼容的下游转换工具链。无论选择哪种精度,都应在目标 GPU上使用 Ultralytics 基准测试模式,在生产部署前比较延迟、吞吐量、内存使用量和任务精度。






