FP8
了解什么是 FP8、E4M3 和 E5M2 的工作原理,以及缩放、硬件支持和混合精度如何改进 AI 训练与推理。
FP8(即 8 位浮点数)是一种低精度数值格式,每个值使用八位存储。AI 系统利用 FP8 来减少内存传输,并在兼容硬件上加速矩阵乘法、卷积以及其他开销较大的操作。与 FP16 或 FP32 相比,它表示的离散值更少,因此成功的 FP8 工作流会将快速的低精度计算与缩放和选择性更高精度的操作结合起来,以维护模型质量。
Link to this sectionFP8 如何表示数字#
浮点值包含符号、控制范围的指数以及控制细节的尾数。FP8 通常出现在 PyTorch 浮点数据类型文档所记录的两种格式中:
- E4M3: 一个符号位、四个指数位和三个尾数位。它提供更多的数值细节,但范围较窄。
- E5M2: 一个符号位、五个指数位和两个尾数位。它的范围更广,但对数值的四舍五入更激进。
E4M3 通常适用于权重和激活值,而 E5M2 可以更好地适应具有大数值范围的梯度。正如 AMD 低精度浮点文档所示,确切的变体在各个平台之间有所不同,因此 FP8 模型并不能在所有加速器和运行时之间自动实现跨平台移植。
由于八位无法表示张量最初的完整范围和细节,框架通常会在转换前将数值乘以一个缩放因子。NVIDIA 的 FP8 缩放入门介绍了诸如延迟缩放等策略,该策略根据先前观测到的最大值来推导未来的缩放比例。缩放限制了上溢、下溢和饱和,同时不需要每个操作都在更高精度下运行。
Link to this sectionFP8 与相关格式的对比#
FP8 在常见的 AI 数据类型中占据中间地位:
- FP16 或半精度: 使用两倍的位数,提供更高的数值细节并且训练通常更简单。FP8 可以进一步减少存储和带宽,但需要更仔细的缩放。
- BF16: 保持宽指数范围,同时提供比 FP16 更少的分数细节。它通常用作 FP8 训练中精度较高的伴侣。
- INT8: 表示整数而不是浮点值。INT8 模型量化通常依赖缩放将真实值映射到固定的整数级别,而 FP8 保留用于自然非均匀间距的指数。
- FP4: 仅使用四位,可以提供更高的压缩率,但其极其有限的范围和粒度通常会使精度维护变得更加困难。
FP8 经常是混合精度工作流的一部分,而不是每个张量都使用的数据类型。累加、归一化、优化器状态或敏感层可以保持在 BF16、FP16 或 FP32 中。此外,数值精度不同于精度评估指标,后者用于衡量多少个积极的模型预测是正确的。
Link to this section实际应用#
两个实际应用说明了为什么 FP8 很重要:
-
大模型训练: Transformer 训练会重复执行大型矩阵乘法。支持 FP8 的框架可以将符合条件的权重和激活值转换为 FP8,同时在稳定性需要的地方保留较高精度。这降低了带宽需求并可以提高训练吞吐量。TorchAO 量化训练工作流包含按张量和按行的缩放选项,用于在最大速度与更好地处理异常值之间进行权衡。
-
高吞吐量视觉推理: 数据中心可能会在数百个零售、交通或制造视频流中运行目标检测。具备 FP8 能力的内核可以减少符合模型的层所使用的时间和内存,从而有可能降低推理延迟并增加并发流容量。TensorRT 量化类型指南解释了显式量化和反量化操作如何描述 FP8 执行。
Link to this section数值风险与硬件支持#
缩放不当会导致大数值饱和,小数值四舍五入为零。当一个缩放比例覆盖整个张量时,异常值尤其成问题。这些效应会改变置信度分数、破坏训练稳定性或降低检测准确率,因此开发者应该针对其较高精度的基线来验证转换后的模型。
原生硬件支持同样重要。NVIDIA Hopper 架构引入了 FP8 Tensor Core 加速,而较旧的 NVIDIA A100 GPU 支持 FP16、BF16 和 INT8,但不原生支持 FP8 计算。因此,在选择部署精度之前,应检查 TensorRT 硬件支持矩阵。
Link to this section在实践中使用 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))The documented Ultralytics TensorRT export workflow provides FP16 and calibrated INT8 options for Ultralytics YOLO rather than a one-argument FP8 export. FP8 deployment therefore requires a compatible downstream conversion toolchain. Whatever precision is selected, use Ultralytics benchmark mode on the target GPU to compare latency, throughput, memory use, and task accuracy before production deployment.






