Articulo de referencia

formato de punto flotante bfloat16

El formato de punto flotante bfloat16 ( brain floating point ) [ 1 ] [ 2 ] es un formato numérico que ocupa 16 bits en la memoria de la computadora ; representa un amplio rango ...

El formato de punto flotante bfloat16 ( brain floating point ) [ 1 ] [ 2 ] es un formato numérico que ocupa 16 bits en la memoria de la computadora ; representa un amplio rango dinámico de valores numéricos mediante el uso de una base de punto 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 a sensores . [ 3 ] Conserva el rango dinámico aproximado de los números de punto flotante de 32 bits al mantener 8 bits de exponente , pero solo admite una precisión de 8 bits en lugar de la mantisa de 24 bits del formato binary32. Más que los números de punto flotante de precisión simple de 32 bits, 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 en Google, para su uso en su TPU v2 , lanzado en 2017. [ 1 ] Se utiliza en muchas CPU, GPU y procesadores de IA , como procesadores Intel Xeon (extensiones AVX-512 BF16), GPU Intel Data Center, Intel Nervana NNP-L1000, FPGA de Intel , [ 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 M2 de Apple [ 12 ] y por lo tanto chips 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 usar en aritmética de precisión mixta , donde se puede operar con números bfloat16 y expandirlos a tipos de datos más amplios.

formato de punto flotante bfloat16

bfloat16 tiene el siguiente formato:

El formato bfloat16, al ser una versión abreviada de un número de coma flotante de precisión simple de 32 bits IEEE 754 , permite una conversión rápida hacia y desde dicho número. En la conversión al formato bfloat16, se conservan los bits del exponente, mientras que el campo de la mantisa puede reducirse 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 de coma flotante de 32 bits de ≈ 10⁻³⁸ a ≈ 3 × 10³⁸ . [ 16 ]

Las piezas están dispuestas de la siguiente manera:

Codificación exponencial

El exponente binario de punto flotante bfloat16 se codifica utilizando una representación binaria con desplazamiento , donde el desplazamiento cero es 127; también conocido como sesgo del exponente en el estándar IEEE 754.

Por lo tanto, para obtener el verdadero exponente tal como lo define la representación binaria con desplazamiento, se debe restar el desplazamiento de 127 del valor del campo del exponente.

Los valores mínimo y máximo del campo del exponente (00 H y FF H ) se interpretan de forma especial, como en los formatos estándar IEEE 754.

El valor mínimo positivo normal es 2 −126 ≈ 1,18 × 10 −38 y el valor mínimo positivo (subnormal) es 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .

Redondeo y conversión

El caso de uso más común es la conversión entre IEEE 754 binary32 y bfloat16. La siguiente sección describe el proceso de conversión y su esquema de redondeo. Cabe destacar que existen otros escenarios posibles de conversión de formato hacia o desde bfloat16, por ejemplo, int16 y bfloat16.

  • De binary32 a bfloat16. Cuando bfloat16 se introdujo por primera vez como formato de almacenamiento, [ 15 ] la conversión de IEEE 754 binary32 (punto flotante de 32 bits) a bfloat16 es truncamiento ( redondeo hacia 0 ). Posteriormente, cuando se convierte en la entrada de las unidades de multiplicación de matrices, la conversión puede tener varios mecanismos de redondeo dependiendo de las plataformas de hardware. Por ejemplo, para Google TPU, el esquema de redondeo en la conversión es redondeo al par más cercano; [ 18 ] ARM utiliza el modo no IEEE Round-to-Odd; [ 19 ] para NVIDIA, admite la conversión de números flotantes a precisión bfloat16 en modo redondeo al par más cercano. [ 20 ]
  • De bfloat16 a binary32. Dado que binary32 puede representar todos los valores exactos en bfloat16, la conversión simplemente agrega 16 ceros en los bits de la mantisa. [ 18 ]

Codificación de valores especiales

infinito positivo y negativo

Al igual que en IEEE 754 , el infinito positivo y negativo se representan con sus bits de signo correspondientes , todos los 8 bits de exponente establecidos (FF hexadecimal ) y todos los bits de mantisa cero. Explícitamente,

val s_exponent_signcnd +inf = 0_11111111_0000000 -inf = 1_11111111_0000000 

No es un número

Al igual que en IEEE 754 , los valores NaN se representan con cualquiera de los bits de signo, los 8 bits del exponente establecidos (FF hexadecimal ) y no todos los bits de la mantisa 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 señalización de los NaN de bfloat16.

Alcance y precisión

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³⁸ .

Ejemplos

Estos ejemplos se presentan 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 = 1 c000 = 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 inferior a (2 24 − 1) × 2 −23 × 2 127 = 3,402823466 × 10 38 , el valor finito positivo máximo representable en precisión simple.

Ceros e infinitos

0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinito ff80 = 1 11111111 0000000 = −infinito

Valores especiales

4049 = 0 10000000 1001001 = 3,140625 ≈ π ( pi ) 3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3

NaN

ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN

Véase también

Referencias

  1. 1 2 Teich, Paul (10 de mayo de 2018). "Desmontando el coprocesador de IA TPU 3.0 de Google" . The Next Platform . Recuperado el 11 de agosto de 2020. Google inventó su propio formato interno de punto flotante llamado "bfloat" por "punto flotante cerebral" (en honor a Google Brain).
  2. Wang, Shibo; Kanwar, Pankaj (23 de agosto de 2019). "BFloat16: El secreto del alto rendimiento en Cloud TPUs" . Google Cloud . Consultado el 11 de agosto de 2020. Este formato de punto flotante personalizado se llama "Formato de punto flotante Brain" o "bfloat16" para abreviar. El nombre proviene de "Google Brain", un grupo de investigación de inteligencia artificial de Google donde se concibió la idea de este formato.
  3. Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benini, Luca (2018). «Una plataforma de punto flotante de precisión trans para computación de ultrabajo consumo». 2018 Design, Automation & Test in Europe Conference & Exhibition (DATE) . pp. 1051–1056 . arXiv : 1711.10374 . doi : 10.23919/DATE.2018.8342167 . ISBN  978-3-9819263-0-9. S2CID 5067903 . 
  4. Dr. Ian Cutress (17 de marzo de 2020). "Intel': Planes del lago Cooper: ¿Por qué es importante BF16?" . Archivado del original el 18 de marzo de 2020. Recuperado el 12 de mayo de 2020. 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 mayor precisión de los valores dentro del algoritmo mientras permite el doble de datos en cualquier conjunto de datos dado (o duplica la velocidad en esas secciones de cálculo).
  5. Khari Johnson (23 de mayo de 2018). "Intel presenta la red neuronal Nervana L-1000 para el entrenamiento acelerado de IA" . VentureBeat . Consultado el 23 de mayo de 2018. ...Intel extenderá la compatibilidad con bfloat16 a todas nuestras líneas de productos de IA, incluidos los procesadores Intel Xeon y las FPGA de Intel.
  6. Michael Feldman (23 de mayo de 2018). "Intel presenta una nueva hoja de ruta para su cartera de IA" . TOP500 Supercomputer Sites . Consultado el 23 de mayo de 2018. Intel planea dar soporte a este formato en todos sus productos de IA, incluidas las líneas Xeon y FPGA.
  7. Lucian Armasu (23/05/2018). "Intel lanzará Spring Crest, su primer procesador de redes neuronales, en 2019" . Tom's Hardware . Consultado el 23/05/2018 . Intel afirmó que el NNP-L1000 también sería compatible con bfloat16, un formato numérico que están adoptando todos los actores de la industria del aprendizaje automático para redes neuronales. La compañía también ofrecerá compatibilidad con bfloat16 en sus FPGA, procesadores Xeon y otros productos de aprendizaje automático. El Nervana NNP-L1000 está programado para su lanzamiento en 2019.
  8. "Operaciones de TensorFlow disponibles | Cloud TPU | Google Cloud" . Google Cloud . Consultado el 23 de mayo de 2018. Esta página enumera las API de Python de TensorFlow y los operadores de grafos disponibles en Cloud TPU.
  9. Elmar Haußmann (26 de abril de 2018). "Comparación de TPUv2 de Google con V100 de Nvidia en ResNet-50" . Blog de RiseML . Archivado del original el 26 de abril de 2018. Recuperado el 23 de mayo de 2018. Para Cloud TPU, Google recomendó que usáramos la implementación bfloat16 del repositorio oficial de TPU con TensorFlow 1.7.0. Tanto las implementaciones de TPU como las 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.
  10. 1 2 Autores de Tensorflow (23-07-2018). "ResNet-50 usando BFloat16 en TPU" . Google . Recuperado el 06-11-2018 .
  11. "Extensiones BFloat16 para Armv8-A" . community.arm.com . 29 de agosto de 2019. Consultado el 30 de agosto de 2019 .
  12. "AArch64: agregar soporte para CPU de Apple más recientes · llvm/llvm-project@677da09" . GitHub . Consultado el 8 de mayo de 2023 .
  13. "Intrínsecos de bloat16 de la biblioteca CUDA" .
  14. "Historial de versiones de ROCm" . github.com . Consultado el 23 de octubre de 2019 .
  15. 1 2 Joshua V. Dillon, Ian Langmore, Dustin Tran, Eugene Brevdo, Srinivas Vasudevan, Dave Moore, Brian Patton, Alex Alemi, Matt Hoffman, Rif A. Saurous (2017-11-28). TensorFlow Distributions (Informe). arXiv : 1711.10604 . Bibcode : 2017arXiv171110604D . Consultado el 2018-05-23. Todas las operaciones en TensorFlow Distributions son numéricamente estables en precisiones de punto flotante de media, simple y doble (como dtypes de TensorFlow: tf.bfloat16 (punto flotante truncado), tf.float16, tf.float32, tf.float64). Los constructores de clase tienen una bandera validate_args para aserciones numéricas{{cite report}}: CS1 maint: varios nombres: lista de autores ( enlace )
  16. "Transmisión en vivo Día 1: Etapa 8 (Google I/O '18) - YouTube" . Google . 8 de mayo de 2018. Consultado el 23 de mayo de 2018. En muchos modelos, este es un reemplazo directo para float-32 .
  17. Buck, Ian (13 de marzo de 2005), «Capítulo 32. Dando el salto a la computación GPU» , en Pharr, Matt (ed.), GPU Gems , Addison-Wesley, ISBN 0-321-33559-7, consultado el 5 de abril de 2018.
  18. 1 2 "El formato numérico bfloat16" . Google Cloud . Recuperado el 11 de julio de 2023. En TPU, el esquema de redondeo en la conversión es redondear al par más cercano y desbordar a infinito.
  19. "Arquitectura del conjunto de instrucciones Arm A64" . developer.arm.com . Consultado el 26 de julio de 2023. Utiliza el modo de redondeo Round-to-Odd no IEEE.
  20. "1.3.5. Conversión de precisión Bfloat16 y movimiento de datos" (PDF) . docs.nvidia.com . pág. 199. Consultado el 26/07/2023 . Convierte un 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.