stringtranslate.com

bfloat16 formato de punto flotante

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 formato de punto flotante

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:

Codificación de exponentes

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 .

Redondeo y conversión

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.

Codificación de valores especiales.

Infinito positivo y negativo

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

No un número

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.

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 38 .

Ejemplos

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.

Ceros e infinitos

0000 = 0 00000000 0000000 = 08000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinitoff80 = 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 => qNaNff81 = x 11111111 0000001 => sNaN

Ver también

Referencias

  1. ^ Teich, Paul (10 de mayo de 2018). "Desmontando el coprocesador de IA TPU 3.0 de Google". La próxima plataforma . Consultado el 11 de agosto de 2020 . Google inventó su propio formato de punto flotante interno llamado "bfloat" para "punto flotante cerebral" (en honor a Google Brain).
  2. ^ Wang, Shibo; Kanwar, Pankaj (23 de agosto de 2019). "BFloat16: El secreto para un alto rendimiento en TPU en la nube". Nube de Google . Consultado el 11 de agosto de 2020 . 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.
  3. ^ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benín, Luca (2018). "Una plataforma de punto flotante de transprecisión para informática de consumo de energía ultrabaja". Conferencia y exposición de diseño, automatización y pruebas en Europa de 2018 (FECHA) . págs. 1051-1056. arXiv : 1711.10374 . doi : 10.23919/FECHA.2018.8342167. ISBN 978-3-9819263-0-9. S2CID  5067903.
  4. ^ Dr. Ian Cutress (17 de marzo de 2020). "Intel': Planes de Cooper Lake: ¿Por qué es importante BF16?" . Consultado 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 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).
  5. ^ Khari Johnson (23 de mayo de 2018). "Intel presenta Nervana Neural Net L-1000 para el entrenamiento acelerado de IA". VentureBeat . Consultado el 23 de mayo de 2018 . ...Intel ampliará la compatibilidad con bfloat16 en todas nuestras líneas de productos de IA, incluidos los procesadores Intel Xeon y los FPGA Intel.
  6. ^ Michael Feldman (23 de mayo de 2018). "Intel presenta una nueva hoja de ruta para la cartera de IA". TOP500 sitios de supercomputadoras . Consultado el 23 de mayo de 2018 . Intel planea admitir este formato en todos sus productos de IA, incluidas las líneas Xeon y FPGA.
  7. ^ Lucian Armasu (23 de mayo de 2018). "Intel lanzará Spring Crest, su primer procesador de red neuronal, en 2019". Hardware de Tom . Consultado el 23 de mayo de 2018 . 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.
  8. ^ "Operaciones de TensorFlow disponibles | Cloud TPU | Google Cloud". Nube de Google . Consultado el 23 de mayo de 2018 . Esta página enumera las API de TensorFlow Python y los operadores de gráficos disponibles en Cloud TPU.
  9. ^ Elmar Haußmann (26 de abril de 2018). "Comparación del TPUv2 de Google con el V100 de Nvidia en ResNet-50". Blog de RiseML . Archivado desde el original el 26 de abril de 2018 . Consultado el 23 de mayo de 2018 . 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.
  10. ^ ab Autores de Tensorflow (23 de julio de 2018). "ResNet-50 usando BFloat16 en TPU". Google . Consultado el 6 de noviembre de 2018 .
  11. ^ "Extensiones BFloat16 para Armv8-A". comunidad.arm.com . 29 de agosto de 2019 . Consultado el 30 de agosto de 2019 .
  12. ^ "AArch64: agregue soporte para CPU Apple más nuevas · 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. ^ ab Joshua V. Dillon, Ian Langmore, Dustin Tran, Eugene Brevdo, Srinivas Vasudevan, Dave Moore, Brian Patton, Alex Alemi, Matt Hoffman, Rif A. Saurous (28 de noviembre de 2017). Distribuciones de TensorFlow (Reporte). arXiv : 1711.10604 . Código Bib : 2017arXiv171110604D. Consultado el 23 de mayo de 2018. 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 )
  16. ^ "Día 1 de transmisión en vivo: Etapa 8 (Google I/O '18) - YouTube". Google . 2018-05-08 . Consultado el 23 de mayo de 2018 . En muchos modelos, este es un reemplazo directo del float-32.
  17. ^ ab "El formato numérico bfloat16". Nube de Google . Consultado 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 inf.
  18. ^ "Arquitectura del conjunto de instrucciones Arm A64". desarrollador.arm.com . Consultado el 26 de julio de 2023 . Utiliza el modo de redondeo de redondeo a impar que no es IEEE.
  19. ^ "1.3.5. Conversión de precisión y movimiento de datos de Bfloat16" (PDF) . docs.nvidia.com . pag. 199 . Consultado el 26 de julio de 2023 . 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.