El formato numérico bfloat16

El uso de números de punto flotante de precisión reducida es un método común para disminuir el tiempo de convergencia sin perder la exactitud. Las TPU usan el formato de número bfloat16 cuando realizan operaciones de matriz. Las operaciones de multiplicación de matrices se realizan en valores bfloat16 y las acumulaciones se realizan en valores float32 de IEEE.

bfloat16 es un formato personalizado de punto flotante de 16 bits para el aprendizaje automático. Se compone de un bit de signo, ocho bits exponentes y siete bits mantisa. En el siguiente diagrama, se muestran los componentes internos de tres formatos de punto flotante: float32: precisión simple IEEE, float16: precisión media IEEE y bfloat16.

imagen

Los rangos dinámicos de bfloat16 y float32 son equivalentes. Sin embargo, bfloat16 ocupa la mitad del espacio de la memoria. Para obtener más información sobre el rendimiento de bfloat16, consulta Un estudio de BFLOAT16 para el entrenamiento profundo.

Cómo elegir bfloat16

El equipo de hardware de Google eligió bfloat16 para Cloud TPU a fin de mejorar la eficiencia del hardware y, al mismo tiempo, mantener la capacidad de entrenar modelos de aprendizaje profundo con precisión, todo con costos de cambio mínimos desde float32. El tamaño físico de un multiplicador de hardware se escala con el cuadrado del ancho de la mantisa. Con menos bits de mantisa que FP16, los multiplicadores bfloat16 tienen aproximadamente la mitad del tamaño en silicio de un multiplicador típico de FP16 y son ocho veces más pequeños que un multiplicador float32.

Las redes neuronales son más sensibles al tamaño del exponente que al tamaño de la mantisa. Para garantizar un comportamiento idéntico para subdesbordamientos, desbordamientos y NaN, bfloat16 tiene el mismo tamaño de exponente que float32. bfloat16 controla las funciones desnormales de manera diferente a float32; las limpia a cero. A diferencia de float16, que suele requerir un control especial, como el escalamiento de pérdida, bfloat16 es un reemplazo directo de float32 cuando se entrenan y ejecutan redes neuronales profundas.

Entrenamiento de precisión mixta

La mayoría de los cálculos dentro de una red neuronal profunda pueden realizar una tarea con la misma exactitud mediante valores de menor precisión. Algunos modelos incluso pueden alcanzar una exactitud mayor con valores de menor precisión.

Cuando se programan las Cloud TPU, el compilador de XLA convierte automáticamente los valores entre float32 y bfloat16.

Detalles sobre la conversión de formato

El compilador XLA inserta automáticamente la conversión de formato de float32 a bfloat16. En la TPU, el esquema de redondeo en la conversión es redondeo al par más cercano y desborda hasta inf. Además, el bfloat16 en Cloud TPU no es compatible con las subnormales, por lo que todas las subnormales se limpian a cero durante la conversión. Los valores especiales, como inf y NaN, se conservan en la conversión.

El compilador de XLA también inserta automáticamente la conversión de formato de bfloat16 a float32. Como float32 puede representar todos los valores exactos en bfloat16, la conversión simplemente rellena 16 ceros en los bits mantisas. Los valores especiales se conservan en la conversión.

Portabilidad del modelo

Los valores de los parámetros y las activaciones en un modelo se pueden almacenar en formato de 32 bits porque el hardware de TPU puede transmitir automáticamente estos valores a bfloat16. Los puntos de control obtenidos de un modelo entrenado en Cloud TPU pueden implementarse en otras plataformas de hardware (por ejemplo, inferencia o ajuste en CPU o GPU) sin muchas conversiones manuales.

Cómo mejorar el rendimiento con bfloat16

Si bien la conversión automática de formato en TPU te permite evitar tener en cuenta la precisión numérica, se pueden lograr mejoras de rendimiento adicionales mediante la conversión explícita de valores a bfloat16. Existen dos motivos para convertir valores a bfloat16 de forma explícita:

  1. El almacenamiento de valores en formato bfloat16 ahorra memoria en el chip, lo que permite a las Cloud TPU entrenar modelos más grandes o usar tamaños de lote más grandes.

  2. Algunas operaciones dependen del ancho de banda de la memoria, lo que significa que la cantidad de tiempo que se tarda en cargar los datos desde la memoria puede ralentizar el tiempo total dedicado a realizar el cálculo. El almacenamiento de operandos y resultados de esas operaciones en formato bfloat16 reduce la cantidad de datos que se deben transferir, lo que mejora la velocidad general.

Para comenzar, te recomendamos adquirir experiencia práctica con uno de los modelos de referencia habilitados para bfloat16 que se optimizaron para Cloud TPU. Después, nuestras guías de rendimiento, herramientas de generación de perfiles y guías de solución de problemas proporcionan información técnica detallada para ayudarte a crear y optimizar modelos de aprendizaje automático por tu cuenta.