El formato de punto flotante bfloat16 ( brain floating point ) [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 cercana al sensor . [3] Conserva 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 mantisa de 24 bits del formato binary32. 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 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 FPGAs , [5] [6] [7] AMD Zen , AMD Instinct , GPU NVIDIA, Google Cloud TPU , [8] [9] [10] AWS Inferentia, AWS Trainium, ARMv8.6-A , [11] y los chips M2 [12] y A15 y posteriores de Apple . 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 se pueden operar números bfloat16 y expandirlos a tipos de datos más amplios.
bfloat16 tiene el siguiente formato:
El formato bfloat16, al ser un número flotante de 32 bits de precisión simple IEEE 754 abreviado, permite una conversión rápida hacia y desde un número flotante de 32 bits de precisión simple IEEE 754; en la conversión al formato bfloat16, los bits del exponente se conservan mientras que el campo de mantisa se puede reducir mediante truncamiento (lo que corresponde a un redondeo hacia 0 ) u otros mecanismos de redondeo, ignorando el caso especial NaN . La conservación de los bits del exponente mantiene el rango del número flotante de 32 bits de ≈ 10 −38 a ≈ 3 × 10 38 . [16]
Los bits se distribuyen de la siguiente manera:
El exponente de punto flotante binario bfloat16 se codifica utilizando una representación binaria de desplazamiento , donde el desplazamiento cero es 127; también conocido como sesgo de exponente en el estándar IEEE 754.
Por lo tanto, para obtener el verdadero exponente tal como lo define la representación binaria de desplazamiento, el desplazamiento de 127 debe restarse del valor del campo de exponente.
Los valores mínimo y máximo del campo de exponente (00 H y FF H ) se interpretan de manera especial, 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 el formato IEEE 754 binary32 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 conversión 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 bits de signo correspondientes , los 8 bits de exponente establecidos (FF hexadecimal ) y todos los bits de significación 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 un bit de signo, los 8 bits de exponente configurados (FF hexadecimal ) y no todos los bits de significación en 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 NaN pueden ser silenciosos o de señalización, aunque no se conocen usos de los NaN de señalización bfloat16 a septiembre de 2018.
Bfloat16 está diseñado para mantener el rango de números 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 la mantisa.
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 normalizado mínimo 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 en 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 => qNaN ff81 = x 11111111 0000001 => sNaN
Google inventó su propio formato de punto flotante interno llamado "bfloat" (por "brain floating point" [punto flotante cerebral], en honor a Google Brain).
Este formato de punto flotante personalizado se llama "Brain Floating Point Format" o "bfloat16" para abreviar. El nombre proviene de "Google Brain", que es un grupo de investigación de inteligencia artificial en Google donde se concibió 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 cerca de cero pero siendo un poco más flexible con la precisión cerca de los límites del estándar. El estándar bfloat16 tiene muchos usos dentro de los algoritmos de aprendizaje automático, al ofrecer una mejor precisión de los valores dentro del algoritmo al tiempo que permite duplicar los 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 de 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á siendo adoptado por todos los actores de la industria de ML para redes neuronales. La compañía también admitirá bfloat16 en sus FPGA, Xeon y otros productos de ML. El lanzamiento del Nervana NNP-L1000 está programado para 2019.
Esta página enumera las API de Python y los operadores de gráficos de TensorFlow disponibles en Cloud TPU.
la TPU en la nube, Google recomendó que usemos la implementación bfloat16 del repositorio oficial de TPU con TensorFlow 1.7.0. Tanto la implementación de la TPU como la de la GPU hacen uso de 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 distribuciones de TensorFlow son numéricamente estables en todas las precisiones de punto flotante simple, doble y medio (como los tipos de datos de TensorFlow: tf.bfloat16 (punto flotante truncado), tf.float16, tf.float32, tf.float64). Los constructores de clase tienen un indicador validation_args para las afirmaciones numéricas.
{{cite report}}
: CS1 maint: varios nombres: lista de autores ( enlace )En muchos modelos, este es un reemplazo directo de float-32
En TPU, el esquema de redondeo en la conversión es redondear al número par más cercano y desbordar a inf.
Utiliza el modo de redondeo Round-to-Odd no IEEE.
Convierte un número flotante a precisión nv_bfloat16 en modo de redondeo al valor par más cercano y devuelve nv_bfloat16 con el valor convertido.