FP4
FP4 是一种 4 位浮点格式,通常采用 E2M1,并通过按块缩放来缩小和加速 AI 模型。涵盖 NVFP4、MXFP4、硬件和代码。
FP4 是一种 4 位浮点数格式,用于在模型量化中存储和计算神经网络的权重与激活值。AI 硬件和软件采用 E2M1 布局:1 个符号位、2 个指数位和 1 个尾数位,因此只能表示 0、±0.5、±1、±1.5、±2、±3、±4 和 ±6。每个值所占内存是 FP8 的一半,是 FP16(半精度)的四分之一;这对大型语言模型和其他生成式 AI模型尤为重要,因为这些模型的推理延迟主要取决于从内存中读取权重的速度。NVIDIA Blackwell GPU和 AMD Instinct MI350 系列引入了原生 FP4 矩阵运算;FP4 既用于推理,也越来越多地用于训练。
FP4 的工作原理#
15 个不同取值无法覆盖权重和激活值的实际范围,因此所有实用的 FP4 格式都会将张量划分为小块,并为每块存储一个共享缩放因子,使块内绝对值最大的数接近 E2M1 的最大值 6。两种主要格式在块大小和缩放精度方面有所不同:
- MXFP4:MXFP4 由 Open Compute Project 的 Microscaling (MX) 规范定义,每 32 个值共用一个 8 位的二次幂缩放因子 (E8M0)。作为一项开放规范,它获得了多家厂商的支持,包括 AMD MI350 系列和 NVIDIA Blackwell GPU。
- NVFP4:NVIDIA 的格式让每 16 个值共用一个 FP8 (E4M3) 缩放因子,并为每个张量额外添加一个 FP32 缩放因子。更小的块和更精细的缩放降低了量化误差;NVIDIA 报告称,在 DeepSeek-R1-0528 基准测试中,相比 FP8,准确率损失不超过 1%。
下面的代码片段将含有少数离群值的张量舍入到 E2M1 值,分别使用整个张量共用一个缩放因子、每 32 个值共用一个缩放因子,以及每 16 个值共用一个缩放因子;后两者对应 MXFP4 和 NVFP4 的块大小:
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")整个张量只使用一个缩放因子时,离群值会大幅拉伸缩放范围,导致大多数普通值都被舍入为零,平均绝对误差达到 0.7238。将张量划分为 32 个值和 16 个值的块后,每个离群值都被限制在单个块中,因此其他块可以保持精细的缩放范围,误差也降至 0.0901 和 0.0747。
FP4 推理与训练#
在推理时,TensorRT等推理引擎会在训练后将权重量化为 FP4,通常也会量化激活值,以 FP4 执行矩阵乘法,并以更高精度累加结果。TorchAO 的 NVFP4 和 MXFP4 配置让受支持的 GPU 上的 PyTorch也能采用相同工作流。OpenAI 发布的 gpt-oss-120b采用了经后训练的 MXFP4 混合专家权重,使这个拥有 1,170 亿参数的模型可以在单张 80 GB GPU 上运行。
FP4 训练将混合精度训练进一步扩展到 4 位,比推理更难,因为梯度和激活值的范围会在训练过程中不断变化。NVIDIA 的 NVFP4 预训练研究使用 NVFP4 在 10 万亿个 token 上训练了一个 120 亿参数的模型,其训练损失和下游准确率与 FP8 基线相当。该方法结合使用随机 Hadamard 变换来分散离群值、随机舍入来处理梯度,并让少数层保持较高精度。
部署 FP4 模型#
原生 FP4 张量核心需要 NVIDIA Blackwell 或更新的 GPU,例如 B200 和 GeForce RTX 50 系列;MXFP4 也可使用 AMD Instinct MI350 加速器。H100 等 Hopper GPU 支持加速 FP8,但不支持 FP4。TensorRT 支持矩阵列出了各 GPU 支持的精度。转换后、部署模型前必须检查准确率,因为敏感层或小型模型可能出现性能下降;如果训练后量化不足以恢复准确率,可采用量化感知训练。Ultralytics YOLO26 的 TensorRT 导出会使用 quantize=16 构建 FP16 引擎,或使用 quantize=8 构建 INT8 引擎;这是 YOLO 模型提供的低精度选项。
FP4 与相关格式的比较#
- FP8:FP8 (E4M3 或 E5M2) 有更多不同取值,数值范围也更广。由于 FP8 训练已广泛应用于大型模型,因此 FP4 的结果通常以 FP8 为基准进行比较。
- BFloat16:BF16 仍是以完整质量训练和提供大型模型服务的标准格式,位数是 FP4 的四倍。
- INT4:INT4 将 16 个级别等距排列,而 FP4 会在零附近分配更多级别,因为大多数权重和激活值都集中在零附近。使用 GPTQ 和 AWQ 等方法对语言模型进行仅权重量化时,INT4 仍然很常见。
- AMD Socket FP4:FP4 也是一个与上述格式无关的 AMD 笔记本电脑处理器插槽名称,用于 Carrizo 一代移动 APU 等产品,例如 FX-8800P。










