stringtranslate.com

formato de punto flotante bfloat16

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), la GPU Intel Data Center, Intel Nervana NNP-L1000, los FPGA Intel , [5] [6] [7] AMD Zen , AMD Instinct , las GPU NVIDIA, las TPU de Google Cloud , [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.

formato de punto flotante bfloat16

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:

Codificación de exponentes

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 .

Redondeo y conversión

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.

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 , 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

No es un numero

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.

Alcance y precisión

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 .

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

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 => qNaN
ff81 = x 11111111 0000001 => sNaN

Véase también

Referencias

  1. ^ Teich, Paul (10 de mayo de 2018). "Tearing Apart Google's TPU 3.0 AI Coprocessor" (Desmontando el coprocesador de IA TPU 3.0 de Google). The Next Platform . Consultado el 11 de agosto de 2020. Google inventó su propio formato de punto flotante interno llamado "bfloat" (por "brain floating point" [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 las TPU de la nube". Google Cloud . Consultado el 11 de agosto de 2020 . 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.
  3. ^ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benin, Luca (2018). "Una plataforma de punto flotante de transprecisión para computación de potencia ultra baja". Conferencia y exposición de diseño, automatización y pruebas en Europa de 2018 (DATE) . págs. 1051–1056. arXiv : 1711.10374 . doi :10.23919/DATE.2018.8342167. ISBN . 978-3-9819263-0-9. Número de identificación del sujeto  5067903.
  4. ^ Dr. Ian Cutress (17 de marzo de 2020). "Intel': Cooper lake Plans: Why is BF16 Important?" . 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 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).
  5. ^ Khari Johnson (23 de mayo de 2018). "Intel presenta Nervana Neural Net L-1000 para 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 de Intel.
  6. ^ Michael Feldman (23 de mayo de 2018). "Intel presenta una nueva hoja de ruta para su cartera de productos de IA". TOP500 Supercomputer Sites . 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 redes neuronales, en 2019". Tom's Hardware . Consultado el 23 de mayo de 2018. 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.
  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 y los operadores de gráficos de TensorFlow disponibles en Cloud TPU.
  9. ^ Elmar Haußmann (26 de abril de 2018). "Comparación de la TPUv2 de Google con la 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 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 TPU como las implementaciones 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 Tensorflow Authors (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". community.arm.com . 29 de agosto de 2019 . Consultado el 30 de agosto de 2019 .
  12. ^ "AArch64: agrega compatibilidad con CPU Apple más nuevas · llvm/llvm-project@677da09". GitHub . Consultado el 8 de mayo de 2023 .
  13. ^ "Intrínsecos de la biblioteca CUDA bloat16".
  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 (2017-11-28). Distribuciones de TensorFlow (informe). arXiv : 1711.10604 . Bibcode :2017arXiv171110604D. Consultado el 23 de mayo de 2018. 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 )
  16. ^ "Transmisión en vivo del día 1: Etapa 8 (Google I/O '18) - YouTube". Google . 2018-05-08 . Consultado el 2018-05-23 . En muchos modelos, este es un reemplazo directo de float-32
  17. ^ ab "El formato numérico bfloat16". Google Cloud . Consultado el 11 de julio de 2023 . En TPU, el esquema de redondeo en la conversión es redondear al valor par más cercano y desbordar a inf.
  18. ^ "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.
  19. ^ "1.3.5. Conversión de precisión de Bfloat16 y movimiento de datos" (PDF) . docs.nvidia.com . p. 199 . Consultado el 26 de julio de 2023 . 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.