O formato de ponto flutuante bfloat16 (brain floating point, ou ponto flutuante cerebral)[1][2] é um formato de número de computador que ocupa 16 bits na memória do computador; ele representa um amplo alcance dinâmico de valores numéricos ao utilizar uma vírgula flutuante (ponto flutuante). Este formato é uma versão encurtada (de 16 bits) do formato de ponto flutuante de precisão simples IEEE 754 de 32 bits (binary32), com o intuito de acelerar o aprendizado de máquina e a computação próxima ao sensor.[3] Ele preserva o alcance dinâmico aproximado dos números de ponto flutuante de 32 bits ao reter os 8 bits de expoente, mas suporta apenas uma precisão de 8 bits em vez do significando de 24 bits do formato binary32. Mais ainda do que os números de ponto flutuante de precisão simples de 32 bits, os números bfloat16 são inadequados para cálculos de inteiros, mas este não é o seu uso pretendido. O bfloat16 é utilizado para reduzir os requisitos de armazenamento e aumentar a velocidade de cálculo de algoritmos de aprendizado de máquina.[4]
O formato bfloat16 foi desenvolvido pelo Google Brain, um grupo de pesquisa em inteligência artificial do Google. Ele é utilizado em muitas CPUs, GPUs e processadores de IA, tais como os processadores Intel Xeon (extensões AVX-512 BF16), Intel Data Center GPU, Intel Nervana NNP-L1000, FPGAs da Intel,[5][6][7] AMD Zen, AMD Instinct, GPUs da NVIDIA, TPUs do Google Cloud,[8][9][10] AWS Inferentia, AWS Trainium, ARMv8.6-A,[11] e os chips M2, A15 e posteriores da Apple.[12] Muitas bibliotecas suportam o bfloat16, tais como CUDA,[13] Intel oneAPI Math Kernel Library, AMD ROCm,[14] AMD Optimizing CPU Libraries, PyTorch e TensorFlow.[10][15] Nessas plataformas, o bfloat16 também pode ser usado em aritmética de precisão mista, onde números bfloat16 podem ser operados e expandidos para tipos de dados mais amplos.
Formato de ponto flutuante bfloat16
editarO bfloat16 possui o seguinte formato:
- Bit de sinal: 1 bit
- Largura do expoente: 8 bits
- Precisão do significando: 8 bits (7 explicitamente armazenados, com um bit condutor implícito), em oposição aos 24 bits em um formato de ponto flutuante clássico de precisão simples
O formato bfloat16, sendo um float de 32 bits de precisão simples IEEE 754 encurtado, permite uma rápida conversão de e para um float de 32 bits de precisão simples IEEE 754; na conversão para o formato bfloat16, os bits do expoente são preservados enquanto o campo do significando pode ser reduzido por truncamento (correspondendo assim ao arredondamento em direção a 0) ou outros mecanismos de arredondamento, ignorando o caso especial de NaN. A preservação dos bits do expoente mantém o intervalo do float de 32 bits de ≈ 10−38 a ≈ 3 × 1038.[16]
Os bits são dispostos da seguinte forma:
| Meia precisão IEEE float de 16 bits | ||||||||||||||||||||||||||||||||||
| sinal | expoente (5 bit) | fração (10 bit) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| bfloat16 | ||||||||||||||||||||||||||||||||||
| sinal | expoente (8 bit) | fração (7 bit) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 7 | 6 | 0 | ||||||||||||||||||||||||||||||
| TensorFloat-32 da Nvidia (19 bits) | ||||||||||||||||||||||||||||||||||
| sinal | expoente (8 bit) | fração (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 | ||||||||||||||||||||||||||||||
| Formato fp24 da ATI[17] | ||||||||||||||||||||||||||||||||||
| sinal | expoente (7 bit) | fração (16 bit) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 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 | 16 | 15 | 0 | ||||||||||||||||||||||||||||||
| Formato PXR24 da Pixar | ||||||||||||||||||||||||||||||||||
| sinal | expoente (8 bit) | fração (15 bit) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||
| Precisão simples IEEE 754 float de 32 bits | ||||||||||||||||||||||||||||||||||
| sinal | expoente (8 bit) | fração (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 | ||||||||||||||||||||||||||||||
Codificação do expoente
editarO expoente de ponto flutuante binário do bfloat16 é codificado usando uma representação em binário deslocado, com o deslocamento zero sendo 127; também conhecido como viés do expoente no padrão IEEE 754.
- Emin = 01H−7FH = −126
- Emax = FEH−7FH = 127
- Viés do expoente = 7FH = 127
Assim, para obter o expoente verdadeiro conforme definido pela representação em binário deslocado, o deslocamento de 127 deve ser subtraído do valor do campo do expoente.
Os valores mínimo e máximo do campo do expoente (00H and FFH) são interpretados de forma especial, assim como nos formatos padrão IEEE 754.
| Expoente | Significando zero | Significando não nulo | Equação |
|---|---|---|---|
| 00H | zero, −0 | números subnormais | (−1)bitdesinal×2−126× 0.bitsdosignificando |
| 01H, ..., FEH | valor normalizado | (−1)bitdesinal×2bitsdoexpoente−127× 1.bitsdosignificando | |
| FFH | ±infinito | NaN (quiet, signaling) | |
O menor valor normal positivo é 2−126 ≈ 1,18 × 10−38 e o menor valor positivo (subnormal) é 2−126−7 = 2−133 ≈ 9,2 × 10−41.
Arredondamento e conversão
editarO caso de uso mais comum é a conversão entre o IEEE 754 binary32 e o bfloat16. A seção a seguir descreve o processo de conversão e seu esquema de arredondamento. Note que existem outros cenários possíveis de conversões de formato de ou para o bfloat16, por exemplo, de int16 para bfloat16.
- De binary32 para bfloat16: quando o bfloat16 foi introduzido pela primeira vez como um formato de armazenamento, a conversão do IEEE 754 binary32 (ponto flutuante de 32 bits) para bfloat16 se dava por truncamento (arredondamento em direção a 0). Mais tarde, quando ele passou a ser a entrada de unidades de multiplicação de matrizes, a conversão passou a contar com vários mecanismos de arredondamento dependendo das plataformas de hardware. Por exemplo, para as TPUs do Google, o esquema de arredondamento na conversão é o arredondamento para o par mais próximo (round-to-nearest-even);[18] a ARM utiliza o modo não IEEE Round-to-Odd (aritmética de arredondamento para o ímpar);[19] a NVIDIA suporta a conversão de números float para a precisão bfloat16 no modo de arredondamento para o par mais próximo.[20]
- De bfloat16 para binary32: como o binary32 pode representar todos os valores exatos contidos no bfloat16, a conversão simplesmente preenche os bits do significando com 16 zeros.[18]
Codificação de valores especiais
editarInfinito positivo e negativo
editarAssim como no IEEE 754, o infinito positivo e o negativo são representados com seus respectivos bits de sinal, todos os 8 bits do expoente definidos como um (FFhex) e todos os bits do significando iguais a zero. Explicitamente:
val s_exponent_signcnd +inf = 0_11111111_0000000 -inf = 1_11111111_0000000
Not a Number
editarAssim como no IEEE 754, os valores NaN são representados com qualquer bit de sinal, todos os 8 bits do expoente definidos como um (FFhex) e os bits do significando não todos iguais a zero. Explicitamente:
val s_exponent_signcnd +NaN = 0_11111111_klmnopq -NaN = 1_11111111_klmnopq
onde pelo menos um dentre k, l, m, n, o, p ou q é igual a 1. Da mesma forma que no IEEE 754, os valores NaN podem ser quietos (qNaN) ou sinalizadores (sNaN), embora não existam usos conhecidos de NaNs sinalizadores em bfloat16.
Intervalo e precisão
editarO bfloat16 foi projetado para manter o intervalo numérico do format de ponto flutuante de precisão simples IEEE 754 de 32 bits (binary32), enquanto reduz a precisão de 24 bits para 8 bits. Isso significa que a precisão fica entre dois e três dígitos decimais, e o bfloat16 pode representar valores finitos de até cerca de 3,4 × 1038.
Exemplos
editarEstes exemplos são dados na representação de bits, em hexadecimal e binário, do valor de ponto flutuante. Isso inclui o sinal, o expoente (com viés) e o significando.
3f80 = 0 01111111 0000000 = 1 c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (28 − 1) × 2−7 × 2127 ≈ 3,38953139 × 1038 (valor positivo finito máximo em precisão bfloat16) 0080 = 0 00000001 0000000 = 2−126 ≈ 1,175494351 × 10−38 (valor positivo normal mínimo em precisão bfloat16 e em ponto flutuante de precisão simples)
O valor finito positivo máximo de um número bfloat16 normal é 3,38953139 × 1038, ligeiramente abaixo de (224 − 1) × 2−23 × 2127 = 3,402823466 × 1038, que é o valor positivo finito máximo representável em precisão simples.
Zeros e infinitos
editar0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinito ff80 = 1 11111111 0000000 = −infinito
Valores especiais
editar4049 = 0 10000000 1001001 = 3,140625 ≈ π ( pi ) 3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3
NaNs
editarffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
Ver também
editar- Formato de ponto flutuante de meia precisão: float de 16 bits com 1 bit de sinal, expoente de 5 bits e significando de 11 bits, conforme definido pelo IEEE 754
- Minifloat
- Google Brain
Referências
- ↑ Teich, Paul (10 de maio de 2018). «Tearing Apart Google's TPU 3.0 AI Coprocessor». The Next Platform. Consultado em 11 de agosto de 2020
- ↑ Wang, Shibo; Kanwar, Pankaj (23 de agosto de 2019). «BFloat16: The secret to high performance on Cloud TPUs». Google Cloud. Consultado em 11 de agosto de 2020
- ↑ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benin, Luca (2018). «A transprecision floating-point platform for ultra-low power computing». 2018 Design, Automation & Test in Europe Conference & Exhibition (DATE). [S.l.: s.n.] pp. 1051–1056. arXiv:1711.10374
. doi:10.23919/DATE.2018.8342167
- ↑ Dr. Ian Cutress (17 de março de 2020). «Intel's Cooper Lake Plans: Why is BF16 Important?». Consultado em 12 de maio de 2020. Cópia arquivada em 18 de março de 2020
- ↑ Khari Johnson (23 de maio de 2018). «Intel unveils Nervana Neural Net L-1000 for accelerated AI training». VentureBeat. Consultado em 23 de maio de 2018
- ↑ Michael Feldman (23 de maio de 2018). «Intel Lays Out New Roadmap for AI Portfolio». TOP500 Supercomputer Sites. Consultado em 23 de maio de 2018
- ↑ Lucian Armasu (23 de maio de 2018). «Intel To Launch Spring Crest, Its First Neural Network Processor, In 2019». Tom's Hardware. Consultado em 23 de maio de 2018
- ↑ «Available TensorFlow Ops | Cloud TPU | Google Cloud». Google Cloud. Consultado em 23 de maio de 2018
- ↑ Elmar Haußmann (26 de abril de 2018). «Comparing Google's TPUv2 against Nvidia's V100 on ResNet-50». RiseML Blog. Consultado em 23 de maio de 2018. Arquivado do original em 26 de abril de 2018
- ↑ a b Tensorflow Authors (23 de julho de 2018). «ResNet-50 using BFloat16 on TPU». Google. Consultado em 6 de novembro de 2018
- ↑ «BFloat16 extensions for Armv8-A». community.arm.com. 29 de agosto de 2019. Consultado em 30 de agosto de 2019
- ↑ «AArch64: add support for newer Apple CPUs · llvm/llvm-project@677da09». GitHub. Consultado em 8 de maio de 2023
- ↑ «CUDA Library bloat16 Intrinsics»
- ↑ «ROCm version history». github.com. Consultado em 23 de outubro de 2019
- ↑ Joshua V. Dillon, Ian Langmore, Dustin Tran, Eugene Brevdo, Srinivas Vasudevan, Dave Moore, Brian Patton, Alex Alemi, Matt Hoffman, Rif A. Saurous (28 de novembro de 2017). TensorFlow Distributions (Relatório). arXiv:1711.10604
- ↑ «Livestream Day 1: Stage 8 (Google I/O '18) - YouTube». Google. 8 de maio de 2018. Consultado em 23 de maio de 2018
- ↑ Buck, Ian (13 de março de 2005). «Chapter 32. Taking the Plunge into GPU Computing». In: Pharr, Matt. GPU Gems. [S.l.]: Addison-Wesley. ISBN 0-321-33559-7. Consultado em 5 de abril de 2018
- ↑ a b «The bfloat16 numerical format». Google Cloud. Consultado em 11 de julho de 2023
- ↑ «Arm A64 Instruction Set Architecture». developer.arm.com. Consultado em 26 de julho de 2023
- ↑ «1.3.5. Bfloat16 Precision Conversion and Data Movement» (PDF). docs.nvidia.com. 199 páginas. Consultado em 26 de julho de 2023