FP8
FP8 es un formato de coma flotante de 8 bits con variantes E4M3 y E5M2 que reduce a la mitad la memoria frente a 16 bits y duplica el rendimiento de matrices en las GPU compatibles.
FP8 es un formato de coma flotante de 8 bits que se utiliza para entrenar y ejecutar redes neuronales con la mitad de memoria y movimiento de datos que los formatos de 16 bits. Como cualquier tipo de coma flotante, cada valor tiene un bit de signo, bits de exponente que determinan su rango y bits de mantisa que determinan su precisión, pero al disponer de solo ocho bits en total, sacrifica buena parte de ambos. Ingenieros de NVIDIA, Arm e Intel definieron las dos variantes estándar, E4M3 y E5M2, en el artículo de septiembre de 2022 FP8 Formats for Deep Learning y validaron con ellas el entrenamiento de modelos de lenguaje de hasta 175 000 millones de parámetros. En las GPU con núcleos Tensor FP8, como la Hopper H100 de NVIDIA presentada en 2022, las multiplicaciones de matrices FP8 alcanzan el doble de rendimiento que en FP16 o BF16.
E4M3 y E5M2#
Las dos variantes distribuyen de forma distinta los siete bits que no son de signo:
- E4M3: Cuatro bits de exponente y tres de mantisa. Prescinde de los infinitos y conserva un único patrón NaN para alcanzar un máximo de 448; es adecuada para pesos y activaciones en la pasada hacia delante.
- E5M2: Cinco bits de exponente y dos de mantisa, según las convenciones de IEEE 754 para los valores especiales. Alcanza 57 344 con incrementos más gruesos y es adecuada para gradientes, cuyas magnitudes varían en un rango más amplio.
Ambos formatos convierten los valores pequeños en cero y limitan los grandes, así que los tensores FP8 suelen llevar un factor de escala que desplaza sus valores al rango representable. Convertir valores del tamaño de los gradientes con y sin ese factor muestra por qué:
import torch
torch.manual_seed(0)
grads = torch.randn(10_000) * 1e-4 # gradient-sized values, far below 1
e4m3, e5m2 = torch.float8_e4m3fn, torch.float8_e5m2
print(f"E4M3 max {torch.finfo(e4m3).max:g}, E5M2 max {torch.finfo(e5m2).max:g}")
# Per-tensor scaling maps the largest magnitude onto the E4M3 maximum before casting
scale = torch.finfo(e4m3).max / grads.abs().max()
results = {
"E4M3 direct": grads.to(e4m3).float(),
"E5M2 direct": grads.to(e5m2).float(),
"E4M3 scaled": (grads * scale).to(e4m3).float() / scale,
}
for name, restored in results.items():
zeros = (restored == 0).float().mean()
error = ((restored - grads).abs() / grads.abs()).median()
print(f"{name}: {zeros:.0%} rounded to zero, median relative error {error:.1%}")Una conversión directa a E4M3 redondea 100% de los valores a cero; el rango más amplio de E5M2 conserva la mayoría, con un error relativo mediano de 6.4% y 7% descartados, mientras que aplicar antes un factor de escala permite a E4M3 conservar todos los valores con un error mediano de 2.2%. PyTorch también ofrece float8_e4m3fnuz y float8_e5m2fnuz, las variantes que utilizan los aceleradores MI300 de AMD, que eliminan el cero negativo y modifican el sesgo del exponente, con lo que limitan E4M3 a 240. Por tanto, un modelo FP8 no es automáticamente portable entre proveedores.
Estrategias de escalado#
Un único factor de escala para todo un tensor falla cuando unos pocos valores atípicos determinan el máximo y empujan todo lo demás hacia cero, algo habitual en las activaciones de Transformers. Las recetas varían en el nivel de detalle del escalado:
- Escalado retardado por tensor: Transformer Engine de NVIDIA elige la escala de cada tensor a partir de los valores máximos observados en pasos de entrenamiento recientes, por lo que no hace falta una pasada adicional por los datos.
- Escalado por bloques: DeepSeek-V3 escaló las activaciones por teselas de 1 × 128 valores y los pesos por bloques de 128 × 128, y su equipo informó de la primera validación del entrenamiento FP8 de un modelo de tamaño extremadamente grande: 671 000 millones de parámetros.
- MXFP8: El formato de microescalado de Open Compute Project comparte un factor de escala de potencia de dos entre cada grupo de 32 valores, y las GPU Blackwell de NVIDIA lo ejecutan por hardware.
Las multiplicaciones de matrices acumulan los resultados con mayor precisión, y las capas sensibles o poco costosas, como la normalización, softmax y los pesos maestros del optimizador, se mantienen en BF16 o FP32. Por tanto, FP8 es una parte de una receta de precisión mixta.
FP8 en entrenamiento e inferencia#
Para el entrenamiento, Transformer Engine de NVIDIA y TorchAO sustituyen las capas lineales por versiones FP8 y mantienen los pesos maestros con mayor precisión. Para la inferencia, los motores de servicio almacenan los pesos del modelo y la caché KV de los modelos de lenguaje grandes en FP8, lo que reduce a la mitad su memoria respecto a los formatos de 16 bits y deja espacio para más solicitudes simultáneas. TensorRT también crea motores FP8 para GPU con núcleos Tensor FP8. Para que el formato resulte ventajoso, necesita compatibilidad de hardware: la A100 de NVIDIA ejecuta FP16, BF16 e INT8 en sus núcleos Tensor, pero no dispone de unidades FP8; las GPU Ada Lovelace, Hopper y Blackwell, así como la serie MI300 de AMD, sí.
FP8 se sitúa entre los formatos vecinos:
- FP16 o precisión media: Duplica el número de bits, con 10 bits de mantisa y un rango suficiente para la mayoría de las inferencias sin factores de escala por tensor.
- FP4: Reduce a la mitad de nuevo el número de bits y depende de factores de escala de granularidad fina por bloques para mantener la precisión.
- INT8: El otro formato de 8 bits, con 256 niveles equidistantes en lugar del espaciado basado en exponentes de FP8. Necesita factores de escala calibrados, pero funciona en mucho más hardware, incluidos la mayoría de los CPU y las NPU.
Ultralytics YOLO26 utiliza INT8 para la inferencia de 8 bits: al exportar con quantize=8 en modo de exportación a formatos como TensorRT y OpenVINO, se realiza una cuantización del modelo posterior al entrenamiento que calibra los factores de escala con imágenes del conjunto de datos data; en cambio, un modelo ajustado con quantize=8 mediante entrenamiento con conciencia de cuantización se exporta a TensorRT con los rangos aprendidos y no necesita calibración.










