El formato de punto flotante bfloat16 ( coma flotante cerebral ) [1] [2] es un formato de número de computadora que ocupa 16 bits en la memoria de la computadora ; representa un amplio rango dinámico de valores numéricos mediante el uso de un punto de base flotante. Este formato es una versión abreviada (16 bits) del formato de punto flotante de precisión simple IEEE 754 de 32 bits (binary32) con la intención de acelerar el aprendizaje automático y la computación de sensores cercanos . [3] Preserva el rango dinámico aproximado de los números de punto flotante de 32 bits al retener 8 bits de exponente , pero solo admite una precisión de 8 bits en lugar del significado de 24 bits del formato binario32. Más que los números de punto flotante de 32 bits de precisión simple, los números bfloat16 no son adecuados para cálculos de números enteros, pero este no es su uso previsto. Bfloat16 se utiliza para reducir los requisitos de almacenamiento y aumentar la velocidad de cálculo de los algoritmos de aprendizaje automático. [4]
El formato bfloat16 fue desarrollado por Google Brain , un grupo de investigación de inteligencia artificial de Google. Se utiliza en muchas CPU, GPU y procesadores de IA , como los procesadores Intel Xeon ( extensiones AVX-512 BF16), Intel Data Center GPU, Intel Nervana NNP-L1000, Intel FPGA , [5] [6] [7] AMD Zen , AMD Instinct , GPU NVIDIA, TPU de Google Cloud , [8] [9] [10] AWS Inferentia, AWS Trainium, ARMv8.6-A , [11] y chips M2 de Apple [12] y, por lo tanto , A15 y posteriores. Muchas bibliotecas admiten bfloat16, como CUDA , [13] Intel oneAPI Math Kernel Library , AMD ROCm , [14] AMD Optimizing CPU Libraries, PyTorch y TensorFlow . [10] [15] En estas plataformas, bfloat16 también se puede utilizar en aritmética de precisión mixta , donde los números bfloat16 se pueden operar y expandir a tipos de datos más amplios.
bfloat16 tiene el siguiente formato:
El formato bfloat16, al ser un flotante IEEE 754 de precisión simple de 32 bits abreviado, permite una conversión rápida hacia y desde un flotante IEEE 754 de precisión simple de 32 bits; en la conversión al formato bfloat16, los bits de exponente se conservan mientras que el campo de significado se puede reducir mediante truncamiento (correspondiendo así a redondeo hacia 0 ) u otros mecanismos de redondeo, ignorando el caso especial de NaN . Preservar los bits del exponente mantiene el rango flotante de 32 bits de ≈ 10 −38 a ≈ 3 × 10 38 . [dieciséis]
Los bits se distribuyen de la siguiente manera:
El exponente binario de punto flotante bfloat16 se codifica utilizando una representación binaria con desplazamiento , siendo el desplazamiento cero 127; También conocido como sesgo de exponente en el estándar IEEE 754.
Por lo tanto, para obtener el verdadero exponente definido por la representación binaria de desplazamiento, el desplazamiento de 127 debe restarse del valor del campo del exponente.
Los valores mínimo y máximo del campo exponente (00 H y FF H ) se interpretan especialmente, como en los formatos estándar IEEE 754.
El valor normal positivo mínimo es 2 −126 ≈ 1,18 × 10 −38 y el valor positivo mínimo (subnormal) es 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .
El caso de uso más común es la conversión entre IEEE 754 binario32 y bfloat16. La siguiente sección describe el proceso de conversión y su esquema de redondeo en la conversión. Tenga en cuenta que existen otros escenarios posibles de conversiones de formato hacia o desde bfloat16. Por ejemplo, int16 y bfloat16.
Al igual que en IEEE 754 , el infinito positivo y negativo se representan con sus correspondientes bits de signo , los 8 bits exponentes establecidos (FF hexadecimal ) y todos los bits significativos cero. Explícitamente,
val s_exponent_signcnd+inf = 0_11111111_0000000-inf = 1_11111111_0000000
Al igual que en IEEE 754 , los valores NaN se representan con cualquier bit de signo, los 8 bits exponentes establecidos (FF hexadecimal ) y no todos los bits significativos son cero. Explícitamente,
val s_exponent_signcnd+NaN = 0_11111111_klmnopq-NaN = 1_11111111_klmnopq
donde al menos uno de k, l, m, n, o, p o q es 1. Al igual que con IEEE 754, los valores de NaN pueden ser silenciosos o de señalización, aunque no se conocen usos de la señalización de bfloat16 NaN a septiembre de 2018.
Bfloat16 está diseñado para mantener el rango numérico del formato de punto flotante de precisión simple IEEE 754 de 32 bits (binary32), al tiempo que reduce la precisión de 24 bits a 8 bits. Esto significa que la precisión está entre dos y tres dígitos decimales, y bfloat16 puede representar valores finitos de hasta aproximadamente 3,4 × 10 38 .
Estos ejemplos se dan en representación de bits , en hexadecimal y binario , del valor de punto flotante. Esto incluye el signo, el exponente (sesgado) y el significado.
3f80 = 0 01111111 0000000 = 1c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (2 8 − 1) × 2 −7 × 2 127 ≈ 3.38953139 × 10 38 (valor positivo finito máximo en precisión bfloat16)0080 = 0 00000001 0000000 = 2 −126 ≈ 1.175494351 × 10 −38 (valor positivo mínimo normalizado en precisión bfloat16 y punto flotante de precisión simple)
El valor finito positivo máximo de un número bfloat16 normal es 3,38953139 × 10 38 , ligeramente por debajo de (2 24 − 1) × 2 −23 × 2 127 = 3,402823466 × 10 38 , el valor positivo finito máximo representable con precisión simple.
0000 = 0 00000000 0000000 = 08000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinitoff80 = 1 11111111 0000000 = −infinito
4049 = 0 10000000 1001001 = 3,140625 ≈ π ( pi )3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3
ffc1 = x 11111111 1000001 => qNaNff81 = x 11111111 0000001 => sNaN
Google inventó su propio formato de punto flotante interno llamado "bfloat" para "punto flotante cerebral" (en honor a Google Brain).
Este formato de punto flotante personalizado se llama "Formato de punto flotante cerebral" o "bfloat16" para abreviar.
El nombre proviene de "Google Brain", que es un grupo de investigación de inteligencia artificial de Google donde surgió la idea de este formato.
El estándar bfloat16 es una forma específica de representar números que dan el rango de un número completo de 32 bits, pero en el tamaño de datos de un número de 16 bits, manteniendo la precisión cercana a cero pero siendo un poco más flexible con la precisión cercana. los límites de la norma.
El estándar bfloat16 tiene muchos usos dentro de los algoritmos de aprendizaje automático, al ofrecer una mayor precisión de los valores dentro del algoritmo y al mismo tiempo ofrecer el doble de datos en cualquier conjunto de datos determinado (o duplicar la velocidad en esas secciones de cálculo).
...Intel ampliará la compatibilidad con bfloat16 en todas nuestras líneas de productos de IA, incluidos los procesadores Intel Xeon y los FPGA Intel.
Intel planea admitir este formato en todos sus productos de IA, incluidas las líneas Xeon y FPGA.
Intel dijo que el NNP-L1000 también admitiría bfloat16, un formato numérico que están adoptando todos los actores de la industria ML para redes neuronales.
La empresa también admitirá bfloat16 en sus FPGA, Xeons y otros productos ML.
El lanzamiento del Nervana NNP-L1000 está previsto para 2019.
Esta página enumera las API de TensorFlow Python y los operadores de gráficos disponibles en Cloud TPU.
Para Cloud TPU, Google recomendó que utilicemos la implementación bfloat16 del repositorio oficial de TPU con TensorFlow 1.7.0.
Tanto las implementaciones de TPU como de GPU utilizan computación de precisión mixta en la arquitectura respectiva y almacenan la mayoría de los tensores con precisión media.
Todas las operaciones en TensorFlow Distributions son numéricamente estables en precisiones de punto flotante medio, simple y doble (como tipos de TensorFlow: tf.bfloat16 (punto flotante truncado), tf.float16, tf.float32, tf.float64).
Los constructores de clases tienen un indicador validar_args para afirmaciones numéricas.
{{cite report}}
: Mantenimiento CS1: varios nombres: lista de autores ( enlace )En muchos modelos, este es un reemplazo directo del float-32.
En TPU, el esquema de redondeo en la conversión es redondear al par más cercano y desbordar a inf.
Utiliza el modo de redondeo de redondeo a impar que no es IEEE.
Convierte el número flotante a precisión nv_bfloat16 en modo de redondeo al par más cercano y devuelve nv_bfloat16 con el valor convertido.