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

editar

O 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

editar

O 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

editar

O 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

editar

Infinito positivo e negativo

editar

Assim 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

editar

Assim 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

editar

O 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

editar

Estes 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

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

Valores especiais

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

NaNs

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

Ver também

editar

Referências

  1. 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 
  2. 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 
  3. 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.10374Acessível livremente. doi:10.23919/DATE.2018.8342167 
  4. 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 
  5. 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 
  6. 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 
  7. 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 
  8. «Available TensorFlow Ops | Cloud TPU | Google Cloud». Google Cloud. Consultado em 23 de maio de 2018 
  9. 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 
  10. a b Tensorflow Authors (23 de julho de 2018). «ResNet-50 using BFloat16 on TPU». Google. Consultado em 6 de novembro de 2018 
  11. «BFloat16 extensions for Armv8-A». community.arm.com. 29 de agosto de 2019. Consultado em 30 de agosto de 2019 
  12. «AArch64: add support for newer Apple CPUs · llvm/llvm-project@677da09». GitHub. Consultado em 8 de maio de 2023 
  13. «CUDA Library bloat16 Intrinsics» 
  14. «ROCm version history». github.com. Consultado em 23 de outubro de 2019 
  15. 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.10604Acessível livremente 
  16. «Livestream Day 1: Stage 8 (Google I/O '18) - YouTube». Google. 8 de maio de 2018. Consultado em 23 de maio de 2018 
  17. 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 
  18. a b «The bfloat16 numerical format». Google Cloud. Consultado em 11 de julho de 2023 
  19. «Arm A64 Instruction Set Architecture». developer.arm.com. Consultado em 26 de julho de 2023 
  20. «1.3.5. Bfloat16 Precision Conversion and Data Movement» (PDF). docs.nvidia.com. 199 páginas. Consultado em 26 de julho de 2023 

📚 Artikel Terkait di Wikipedia

Transformada rápida de Fourier

Transform in the South. FFTPACK – another Fortran FFT library (public domain) Math Kernel Library Algoritmo Cooley–Tukey FFT Algoritmo Prime-factor FFT

Marilyn Breen

American Mathematical Society. Breen, Marilyn Staircase kernels in orthogonal polygons. Arch. Math. (Basel) 59 (1992), no. 6, 588–594. Breen, Marilyn An

Núcleo (sistema operacional)

Na informática, o kernel (em português: "núcleo") é o componente central do sistema operativo da maioria dos dispositivos computacionais (computador e

John Forbes Nash

MR 0990239. doi:10.1017/CBO9780511566158  Grigor'yan, Alexander (2009). Heat kernel and analysis on manifolds. Col: AMS/IP Studies in Advanced Mathematics.

Análise topológica de dados

Applications Aprendizagem Topológica de Kernel: A Teoria Morse Discreta é usada para conectar aprendizado de máquina de kernel à análise de dados topológicos.

John von Neumann

Karnick, Harish (2013). «On Translation Invariant Kernels and Screw Functions». arXiv:1302.4343 [math.FA]  Parâmetros não válidos no arXiv (ajuda) Alpay

Passeio aleatório

crossings by NetLogo package. Retrieved from Wolfram Library Archive: http://library.wolfram.com/infocenter/MathSource/9281/ Pearson, K. (1905). The Problem of

AMD FireStream

aberto e otimizada para computação de fluxo. A AMD Core Math Library (ACML) e a AMD Performance Library (APL) com otimizações para o AMD FireStream e a biblioteca