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 truncada (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] Conserva el rango dinámico aproximado de los números de coma flotante de 32 bits al retener 8bits de exponente , pero solo admite una precisión de 8 bits en lugar del significado de 24 bits del formato binary32. Más que los números de coma flotante de 32 bits de precisión simple, los números bfloat16 no son adecuados para cálculos de 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 se utiliza en procesadores Intel AI , como Nervana NNP-L1000, procesadores Xeon ( extensiones AVX-512 BF16) y FPGA de Intel , [5] [6] [7] TPU de Google Cloud , [8] [9] [10] y TensorFlow . [10] [11] ARMv8.6-A , [12] AMD ROCm , [13] y CUDA [14] también admiten el formato bfloat16. En estas plataformas, bfloat16 también se puede usar en aritmética de precisión mixta , donde los números de bfloat16 pueden operarse y expandirse a tipos de datos más amplios.
formato de coma flotante bfloat16
bfloat16 tiene el siguiente formato:
- Bit de signo : 1 bit
- Ancho de exponente : 8 bits
- Precisión significativa : 8 bits (7 almacenados explícitamente), a diferencia de 24 bits en un formato clásico de punto flotante de precisión simple
El formato bfloat16, al ser un flotante truncado de 32 bits de precisión simple IEEE 754 , permite una conversión rápida hacia y desde un 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 significativo se puede reducir mediante el truncamiento (correspondiente a redondear hacia 0 ), ignorando el caso especial NaN . La preservación de los bits del exponente mantiene el rango del flotante de 32 bits de ≈ 10 −38 a ≈ 3 × 10 38 . [15]
Los bits se distribuyen de la siguiente manera:
firmar | exponente (5 bits) | fracción (10 bit) | ||||||||||||||
┃ | ┌───────┐ | ┌─────────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 10 | 9 | 0 |
firmar | exponente (8 bits) | fracción (23 bit) | ||||||||||||||||||||||||||||||
┃ | ┌─────────────┐ | ┌──────────────────────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
31 | 30 | 23 | 22 | 0 |
firmar | exponente (8 bits) | fracción (7 bits) | ||||||||||||||
┃ | ┌─────────────┐ | ┌───────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 7 | 6 | 0 |
firmar | exponente (8 bits) | fracción (10 bit) | |||||||||||||||||
┃ | ┌─────────────┐ | ┌─────────────────┐ | |||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
18 | 17 | 10 | 9 | 0 |
firmar | exponente (7 bits) | fracción (16 bits) | ||||||||||||||||||||||
┃ | ┌───────────┐ | ┌─────────────────────────────┐ | ||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
23 | 22 | dieciséis | 15 | 0 |
firmar | exponente (8 bits) | fracción (15 bits) | ||||||||||||||||||||||
┃ | ┌─────────────┐ | ┌───────────────────────────┐ | ||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
23 | 22 | 15 | 14 | 0 |
Contraste con bfloat16 y precisión simple
S | mi | mi | mi | mi | mi | mi | mi | mi | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F | F |
Leyenda
- S: signo
- E: exponente
- F: fracción ( significado final ) en ambos formatos
- f: fracción (significand final) en precisión simple solamente
Codificación de exponentes
El exponente binario de coma flotante bfloat16 se codifica utilizando una representación binaria de compensación , siendo la compensación cero 127; también conocido como sesgo de exponente en el estándar IEEE 754.
- E min = 01 H −7F H = −126
- E máx = FE H −7F H = 127
- Sesgo de exponente = 7F H = 127
Por lo tanto, para obtener el verdadero exponente definido por la representación binaria de compensación, la compensación 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.
Exponente | Significand cero | Significativo y distinto de cero | Ecuación |
---|---|---|---|
00 H | cero , −0 | números subnormales | (-1) signbit × 2 -126 × 0.significandbits |
01 H , ..., FE H | valor normalizado | (−1) bit de signo × 2 bits de exponente − 127 × 1 bits de significante | |
FF H | ± infinito | NaN (silencioso, señalización) |
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 .
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 significado 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 de NaN se representan con cualquier bit de signo, los 8 bits de exponente establecidos (FF hexadecimal ) y no todos los bits de significado cero. Explícitamente,
val s_exponent_signcnd+ NaN = 0_11111111_klmnopq-NaN = 1_11111111_klmonpq
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 hay usos conocidos de señalización de bfloat16 NaN a partir de septiembre de 2018.
Alcance y precisión
Bfloat16 está diseñado para mantener el rango de números del formato de coma 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 de
Estos ejemplos se dan en representación de bits , en hexadecimal y binario , del valor de coma flotante. Esto incluye el signo, exponente (sesgado) y significando.
3f80 = 0 01111111 0000000 = 1c000 = 1 10000000 0000000 = −2
7f7f = 0 11.111.110 1.111.111 = (2 8 - 1) × 2 -7 × 2 127 ≈ 3,38953139 × 10 38 (max valor positivo finito en precisión bfloat16)0080 = 0 00.000.001 0.000.000 = 2 -126 ≈ 1,175494351 × 10 -38 (min normalizó valor positivo en la precisión bfloat16 y de coma 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
NaNs
ffc1 = x 11111111 1000001 => qNaNff81 = x 11111111 0000001 => sNaN
Ver también
- Formato de coma flotante de media precisión: flotante de 16 bits con signo de 1 bit, exponente de 5 bits y significado de 11 bits, según lo definido por IEEE 754
- ISO / IEC 10967 , aritmética independiente del idioma
- Tipo de datos primitivo
- Minifloat
- Google Brain
Referencias
- ↑ Teich, Paul (10 de mayo de 2018). "Desgarrando el coprocesador de AI 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 del cerebro" (después de Google Brain).
- ^ Wang, Shibo; Kanwar, Pankaj (23 de agosto de 2019). "BFloat16: el secreto del alto rendimiento en Cloud TPU" . 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.
- ^ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benín, Luca (2018). "Una plataforma de transprecisión de punto flotante para computación de ultra baja potencia". 2018 Design, Automation & Test in Europe Conference & Exhibition (DATE) . págs. 1051–1056. arXiv : 1711.10374 . doi : 10.23919 / FECHA.2018.8342167 . ISBN 978-3-9819263-0-9. S2CID 5067903 .
- ^ Dr. Ian Cutress (17 de marzo de 2020). "Intel ': Cooper Lake Plans: ¿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 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 dado (o duplicar la velocidad en esas secciones de cálculo).
- ^ 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 inteligencia artificial, incluidos los procesadores Intel Xeon y los FPGA de Intel.
- ^ Michael Feldman (23 de mayo de 2018). "Intel establece una nueva hoja de ruta para la cartera de inteligencia artificial" . TOP500 Sitios de supercomputadoras . Consultado el 23 de mayo de 2018 .
Intel planea admitir este formato en todos sus productos de inteligencia artificial, incluidas las líneas Xeon y FPGA
- ^ 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á siendo adoptado por todos los actores de la industria de ML para redes neuronales. La compañía también admitirá bfloat16 en sus FPGA, Xeons y otros productos ML. El lanzamiento de Nervana NNP-L1000 está programado para 2019.
- ^ "Disponible TensorFlow Ops | Cloud TPU | Google Cloud" . Google Cloud . Consultado el 23 de mayo de 2018 .
En esta página, se enumeran las API de Python de TensorFlow y los operadores de gráficos disponibles en Cloud TPU.
- ^ 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 desde el original el 26 de abril de 2018 . Consultado el 23 de mayo de 2018 .
Para Cloud TPU, Google recomendó que usemos la implementación bfloat16 del repositorio oficial de TPU con TensorFlow 1.7.0. Tanto las implementaciones de TPU como de GPU utilizan el cálculo de precisión mixta en la arquitectura respectiva y almacenan la mayoría de los tensores con precisión media.
- ^ a b Autores de Tensorflow (23 de julio de 2018). "ResNet-50 usando BFloat16 en TPU" . Google . Consultado el 6 de noviembre de 2018 .
- ^ 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 (informe). arXiv : 1711.10604 . Código bibliográfico : 2017arXiv171110604D . Consultado el 23 de mayo de 2018.
Todas las operaciones en las distribuciones de TensorFlow son numéricamente estables en precisiones de punto flotante medio, simple y doble (como tipos d de TensorFlow: tf.bfloat16 (punto flotante truncado), tf.float16, tf.float32, tf.float64). Los constructores de clases tienen un indicador validate_args para afirmaciones numéricas
CS1 maint: varios nombres: lista de autores ( enlace ) - ^ "Extensiones BFloat16 para Armv8-A" . community.arm.com . Consultado el 30 de agosto de 2019 .
- ^ "Historial de versiones de ROCm" . github.com . Consultado el 23 de octubre de 2019 .
- ^ "CUDA Library bloat16 Intrinsics" .
- ^ "Livestream Day 1: Stage 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 para float-32