FP4
FP4 es un formato de coma flotante de 4 bits, normalmente E2M1, que usa escalas por bloque para reducir el tamaño y acelerar los modelos de IA. Incluye NVFP4, MXFP4, hardware y código.
FP4 es un formato de coma flotante de 4 bits que se utiliza para almacenar y calcular los pesos y las activaciones de las redes neuronales en la cuantización de modelos. El hardware y el software de IA utilizan la disposición E2M1: un bit de signo, dos bits de exponente y un bit de mantisa, que solo puede representar 0, ±0,5, ±1, ±1,5, ±2, ±3, ±4 y ±6. Cada valor ocupa la mitad de la memoria de FP8 y una cuarta parte de la de FP16 (precisión media), algo especialmente importante en los modelos de lenguaje grandes y otros modelos de IA generativa cuya latencia de inferencia depende sobre todo de mover los pesos fuera de la memoria. La aritmética matricial FP4 nativa llegó con las GPU Blackwell de NVIDIA y la serie Instinct MI350 de AMD; FP4 se utiliza tanto para inferencia como, cada vez más, para entrenamiento.
Cómo funciona FP4#
Quince valores distintos no bastan para cubrir el rango de los pesos y las activaciones reales, así que todos los formatos FP4 prácticos dividen un tensor en pequeños bloques y almacenan una escala compartida por bloque, elegida para que la magnitud máxima del bloque se aproxime al valor máximo E2M1 de 6. Los dos formatos principales se diferencian en el tamaño de bloque y la precisión de la escala:
- MXFP4: Definido en la especificación de microrreescalado (MX) del Open Compute Project, MXFP4 agrupa 32 valores bajo una escala de 8 bits en potencias de dos (E8M0). Al ser una especificación abierta, es compatible con distintos proveedores, entre ellos AMD con la serie MI350 y NVIDIA con las GPU Blackwell.
- NVFP4: El formato de NVIDIA agrupa 16 valores bajo una escala FP8 (E4M3) y añade una segunda escala FP32 por tensor. Los bloques más pequeños y las escalas más precisas reducen el error de cuantización; NVIDIA comunicó una pérdida de precisión del 1 % o inferior frente a FP8 en los benchmarks de DeepSeek-R1-0528.
El fragmento de código siguiente redondea un tensor con algunos valores atípicos a los valores E2M1 utilizando primero una escala para todo el tensor y, después, una escala por cada 32 y 16 valores, los tamaños de bloque de MXFP4 y 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}")Con una sola escala para todo el tensor, los valores atípicos amplían tanto la escala que la mayoría de los valores normales se redondean a cero, lo que produce un error absoluto medio de 0.7238. Los bloques de 32 y 16 valores limitan cada valor atípico a un solo bloque, de modo que los demás conservan una escala precisa y el error baja a 0.0901 y 0.0747.
Inferencia y entrenamiento en FP4#
Para la inferencia, un motor de inferencia como TensorRT cuantiza los pesos y, a menudo, las activaciones a FP4 después del entrenamiento, ejecuta las multiplicaciones de matrices en FP4 y acumula los resultados con una precisión mayor. Las configuraciones NVFP4 y MXFP4 de TorchAO incorporan el mismo flujo de trabajo a PyTorch en las GPU compatibles. OpenAI publicó gpt-oss-120b con los pesos de su mezcla de expertos entrenados posteriormente en MXFP4, lo que permite ejecutar el modelo de 117.000 millones de parámetros en una sola GPU de 80 GB.
El entrenamiento en FP4 amplía el entrenamiento de precisión mixta hasta los 4 bits y es más difícil que la inferencia, porque el rango de los gradientes y las activaciones cambia durante el entrenamiento. El estudio de preentrenamiento NVFP4 de NVIDIA entrenó un modelo de 12.000 millones de parámetros con 10 billones de tokens en NVFP4 y obtuvo una pérdida de entrenamiento y una precisión en tareas posteriores comparables a las de una referencia FP8. Para ello combinó transformadas de Hadamard aleatorias que distribuyen los valores atípicos, redondeo estocástico para los gradientes y algunas capas mantenidas con una precisión mayor.
Despliegue de modelos FP4#
Los núcleos tensoriales FP4 nativos requieren GPU NVIDIA Blackwell o posteriores, como la B200 y la serie GeForce RTX 50, o aceleradores AMD Instinct MI350 para MXFP4; las GPU Hopper, como la H100, aceleran FP8, pero no FP4. La matriz de compatibilidad de TensorRT indica las precisiones compatibles con cada GPU. Comprueba la precisión tras la conversión y antes del despliegue del modelo, ya que las capas sensibles o los modelos pequeños pueden degradarse; el entrenamiento con cuantización consciente recupera precisión cuando la cuantización posterior al entrenamiento no basta. La exportación de Ultralytics YOLO26 a TensorRT crea motores en FP16 con quantize=16 o en INT8 con quantize=8, las opciones de baja precisión que ofrece para los modelos YOLO.
FP4 frente a formatos relacionados#
- FP8: FP8 (E4M3 o E5M2) ofrece muchos más valores distintos y un rango más amplio. Como el entrenamiento FP8 está muy extendido en los modelos grandes, suele ser la referencia con la que se comparan los resultados FP4.
- BFloat16: BF16 sigue siendo el formato estándar para entrenar y servir modelos grandes con calidad completa, y utiliza cuatro veces más bits que FP4.
- INT4: INT4 distribuye uniformemente sus 16 niveles, mientras que FP4 concentra más niveles cerca de cero, donde se sitúa la mayoría de los pesos y las activaciones. INT4 sigue siendo habitual para comprimir únicamente los pesos de modelos de lenguaje mediante métodos como GPTQ y AWQ.
- Socket AMD FP4: FP4 también es el nombre de un socket de procesador para portátiles de AMD sin relación con lo anterior, el encapsulado utilizado por las APU móviles de la generación Carrizo, como la FX-8800P.










