formato de ponto flutuante bfloat16 - bfloat16 floating-point format

O formato de ponto flutuante bfloat16 ( Brain Floating Point ) é um formato de número de computador que ocupa 16 bits na memória do computador ; ele representa uma ampla faixa dinâmica de valores numéricos usando um ponto base flutuante . Este formato é uma versão truncada (16 bits) do formato de ponto flutuante de precisão única IEEE 754 de 32 bits (binary32) com a intenção de acelerar o aprendizado de máquina e a computação próxima ao sensor . Ele preserva o intervalo dinâmico aproximado de números de ponto flutuante de 32 bits, retendo 8 bits expoentes , mas oferece suporte apenas a uma precisão de 8 bits em vez do significando de 24 bits do formato binary32. Mais do que números de ponto flutuante de 32 bits de precisão única, os números bfloat16 são inadequados para cálculos inteiros, mas esse não é o uso pretendido. Bfloat16 é usado para reduzir os requisitos de armazenamento e aumentar a velocidade de cálculo de algoritmos de aprendizado de máquina.

O formato bfloat16 foi desenvolvido pelo Google Brain , um grupo de pesquisa de inteligência artificial do Google. O formato bfloat16 é utilizado em processadores Intel AI , como Nervana NNP-L1000, processadores Xeon ( extensões AVX-512 BF16) e Intel FPGAs , Google Cloud TPUs e TensorFlow . ARMv8.6-A , AMD ROCm e CUDA também suportam o formato bfloat16. Nessas plataformas, 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

bfloat16 tem o seguinte formato:

O formato bfloat16, sendo um float de 32 bits de precisão simples IEEE 754 truncado , permite a conversão rápida de e para um float de 32 bits de precisão única IEEE 754; na conversão para o formato bfloat16, os bits do expoente são preservados enquanto o campo de significando pode ser reduzido por truncamento (correspondendo assim a arredondar para 0 ), ignorando o caso especial NaN . Preservar os bits expoentes mantém o intervalo do float de 32 bits de ≈ 10 −38 a ≈ 3 × 10 38 .

Os bits são dispostos da seguinte forma:

Flutuação de 16 bits de meia precisão IEEE
sinal expoente (5 bits) fração (10 bits)
  ┃ ┌────────┐ ┌────────────────────┐
 0   0   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
15 14 10 9 0
IEEE 754 de precisão simples de 32 bits flutuante
sinal expoente (8 bits) fração (23 bits)
  ┃ ┌───────────────┐ ┌────────────────────────────────────────────────────────────────────────────────────────
 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
bfloat16
sinal expoente (8 bits) fração (7 bits)
  ┃ ┌───────────────┐ ┌─────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0 
15 14 7 6 0
TensorFloat da NVidia
sinal expoente (8 bits) fração (10 bits)
  ┃ ┌───────────────┐ ┌────────────────────┐
 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 AMD
sinal expoente (7 bits) fração (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 16 15 0
Formato PXR24 da Pixar
sinal expoente (8 bits) fração (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 com bfloat16 e precisão simples

S E E E E E E E E F F F F F F F f f f f f f f f f f f f f f f f

Lenda

  •   S: sinal
  •   E: expoente
  •   F: fração ( significando final ) em ambos os formatos
  •   f: fração (significando final) em precisão única de 32 bits (comparativo)

Codificação de expoente

O expoente de ponto flutuante binário bfloat16 é codificado usando uma representação binária de deslocamento , com o deslocamento de zero sendo 127; também conhecido como viés de expoente no padrão IEEE 754.

  • E min = 01 H −7F H = −126
  • E máx = FE H -7F H = 127
  • Viés do expoente = 7F H = 127

Assim, para obter o expoente verdadeiro conforme definido pela representação binária de deslocamento, o deslocamento de 127 deve ser subtraído do valor do campo do expoente.

Os valores mínimo e máximo do campo expoente (00 H e FF H ) são interpretados especialmente, como nos formatos do padrão IEEE 754.

Expoente Significand zero Significativo e diferente de zero Equação
00 H zero , −0 números subnormais (−1) bit de sign × 2 −126 × 0.significandbits
01 H , ..., FE H valor normalizado (−1) signbit × 2 exponentbits − 127 × 1.significandbits
FF H ± infinito NaN (silencioso, sinalizando)

O valor mínimo positivo normal é 2 −126 ≈ 1,18 × 10 −38 e o valor mínimo positivo (subnormal) é 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .

Codificação de valores especiais

Infinito positivo e negativo

Assim como no IEEE 754 , infinito positivo e negativo são representados com seus bits de sinal correspondentes , todos os 8 bits de expoente definidos (FF hex ) e todos os bits de significando zero. Explicitamente,

val    s_exponent_signcnd
+inf = 0_11111111_0000000
-inf = 1_11111111_0000000

Não é um número

Assim como no IEEE 754 , os valores NaN são representados com qualquer um dos bits de sinal, todos os 8 bits de expoente definidos (FF hex ) e nem todos os bits de significando zero. Explicitamente,

val    s_exponent_signcnd
+NaN = 0_11111111_klmnopq
-NaN = 1_11111111_klmnopq

onde pelo menos um de k, l, m, n, o, p ou q é 1. Como com IEEE 754, os valores NaN podem ser silenciosos ou sinalizadores, embora não haja usos conhecidos de sinalização bfloat16 NaNs em setembro de 2018.

Alcance e precisão

O Bfloat16 foi projetado para manter o intervalo de números do formato de ponto flutuante de precisão única IEEE 754 de 32 bits (binary32), enquanto reduz a precisão de 24 bits para 8 bits. Isso significa que a precisão está entre dois e três dígitos decimais e bfloat16 pode representar valores finitos de até cerca de 3,4 × 10 38 .

Exemplos

Esses exemplos são dados em representação de bits , em hexadecimal e binário , do valor de ponto flutuante. Isso inclui o sinal, o expoente (tendencioso) 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 (max finite positive value in bfloat16 precision)
0080 = 0 00000001 0000000 = 2−126 ≈ 1.175494351 × 10−38 (min normalized positive value in bfloat16 precision and single-precision floating point)

O valor finito positivo máximo de um número bfloat16 normal é 3,38953139 × 10 38 , ligeiramente abaixo (2 24 - 1) × 2 −23 × 2 127 = 3,402823466 × 10 38 , o valor positivo finito máximo representável em precisão única.

Zeros e infinitos

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

Valores especiais

4049 = 0 10000000 1001001 = 3.140625 ≈ π ( pi )
3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3

NaNs

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

Veja também

Referências