Visualizador de patrones de bits FP16 y bfloat16

Visualiza los patrones de bits de coma flotante de media precisión (FP16, IEEE 754 binary16) y bfloat16. Convierte de decimal a bits y viceversa, con el signo, exponente y mantisa resaltados en colores. Útil para aprender sobre cuantización de ML y aceleración de inferencia.

Estructura de FP16 frente a bfloat16

Ambos formatos suman 16 bits en total, pero reparten esos bits entre exponente y mantisa de forma muy distinta, dando a cada uno un rango representable y una precisión muy diferentes.

Elemento FP16 (IEEE 754 半精度) bfloat16
Bits totales 16 16
Bits de exponente 5 8
Bits de mantisa 10 7
Rango representable Aproximadamente ±6.1×10⁻⁵ a ±65504 (rango más estrecho, pero más bits de mantisa para precisión) Aproximadamente ±1.2×10⁻³⁸ a ±3.4×10³⁸ (mismo rango amplio que float32, pero menor precisión)
Uso principal Procesamiento de imágenes, gráficos e inferencia eficiente en memoria (entrenamiento en media precisión) Entrenamiento de deep learning (TPU y GPU modernas) — sin preocuparse por el desbordamiento del exponente al convertir desde float32

bfloat16 comparte el ancho de exponente (8 bits) y el sesgo (127) de float32, lo que significa que puede obtenerse de un valor float32 simplemente truncando la mantisa — un atajo práctico de implementación.

Consejos de uso

  • Incluso para el mismo valor, como 0.1, FP16 y bfloat16 lo redondean de forma muy distinta. Cambia de formato y compara los patrones de bits de la mantisa.
  • Como bfloat16 comparte el ancho de exponente y el sesgo de float32, resiste el desbordamiento incluso con valores grandes por encima de 65504. FP16, en cambio, se desborda a infinito en cuanto se supera 65504.
  • Convertir "70000" a FP16 se desborda a infinito, mientras que bfloat16 lo representa bien (con precisión reducida).
  • Al cuantizar modelos en frameworks como PyTorch o TensorFlow, bfloat16 se convierte fácilmente desde float32, mientras que el rango más estrecho de FP16 a veces requiere un escalado previo.
  • Para convertir bits de vuelta a decimal, introduce un valor hexadecimal de 4 dígitos con prefijo `0x`, o un valor binario de 16 dígitos (el prefijo `0b` es opcional).

Preguntas frecuentes

Ambos suman 16 bits, pero FP16 (media precisión IEEE 754) usa 5 bits de exponente y 10 de mantisa, mientras que bfloat16 usa 8 bits de exponente y 7 de mantisa. Los bits extra de mantisa de FP16 le dan mayor precisión pero un rango más estrecho; bfloat16 sacrifica precisión por el amplio rango de float32.

Durante el entrenamiento de deep learning, los gradientes y parámetros pueden oscilar entre valores extremadamente grandes y pequeños. bfloat16 mantiene el amplio rango representable de float32 (resistiendo el desbordamiento/subdesbordamiento) mientras reduce a la mitad la memoria y el cómputo. El rango más estrecho de FP16 puede desbordarse más fácilmente, a veces requiriendo escalado adicional de la pérdida (loss scaling) durante el entrenamiento.

Aproximadamente 65504. Convertir algo mayor a FP16 se desborda a infinito. bfloat16, al compartir el ancho de exponente de float32, puede representar valores hasta aproximadamente 3.4×10³⁸.

Un patrón de bits donde el exponente es todo ceros pero la mantisa no es cero. Los números de coma flotante normales tienen un 1 implícito al inicio de la mantisa; los subnormales lo omiten, permitiendo valores aún más cercanos a cero que el menor número normal, a costa de precisión.

bfloat16 coincide exactamente con el ancho de exponente (8 bits) y el sesgo (127) de float32, así que la conversión solo consiste en conservar los 7 bits superiores de la mantisa del patrón float32 (con redondeo) — sin necesidad de recalcular el exponente ni comprobar rangos, lo que simplifica la implementación.
ツールくん

A propósito — Por qué el machine learning quería una representación numérica "menos precisa"

Alrededor de 2018, Google diseñó un nuevo formato de coma flotante de 16 bits llamado bfloat16 para sus Unidades de Procesamiento Tensorial (TPU). FP16 (media precisión IEEE 754) ya existía y se usaba en procesamiento de imágenes y gráficos, pero sus escasos 5 bits de exponente le daban un rango representable estrecho, poco adecuado para los gradientes que se desvanecen o explotan durante el entrenamiento de deep learning.

La idea de diseño de bfloat16 es sencilla: sacrificar precisión en la mantisa, pero mantener el exponente exactamente tan ancho como los 8 bits de float32, para poder manejar con seguridad los valores extremadamente grandes y pequeños que surgen durante el entrenamiento. El nombre "Brain Floating Point" proviene de Google Brain, el equipo de investigación de machine learning que lo creó.

En la informática convencional, reducir la precisión de coma flotante se ha considerado durante mucho tiempo un caldo de cultivo de errores. Pero los modelos de deep learning tienen una propiedad inusual: un error numérico modesto rara vez afecta mucho la precisión final de las predicciones. Aprovechar esa propiedad de "algo impreciso pero que funciona en conjunto" — y reducir a la mitad el coste de memoria y cómputo con un formato de 16 bits — representa una optimización propia del machine learning, bastante alejada de la sabiduría tradicional de la informática.