Visualizador de padrões de bits FP16 e bfloat16

Visualize os padrões de bits de ponto flutuante de meia precisão (FP16, IEEE 754 binary16) e bfloat16. Converta de decimal para bits e vice-versa, com sinal, expoente e mantissa destacados por cores. Útil para aprender sobre quantização de ML e aceleração de inferência.

Estrutura de FP16 vs. bfloat16

Ambos os formatos somam 16 bits no total, mas distribuem esses bits entre expoente e mantissa de forma muito diferente, dando a cada um um intervalo representável e precisão muito distintos.

Item FP16 (IEEE 754 半精度) bfloat16
Total de bits 16 16
Bits de expoente 5 8
Bits de mantissa 10 7
Intervalo representável Aproximadamente ±6,1×10⁻⁵ a ±65504 (intervalo mais estreito, mas mais bits de mantissa para precisão) Aproximadamente ±1,2×10⁻³⁸ a ±3,4×10³⁸ (mesmo intervalo amplo do float32, mas menor precisão)
Uso principal Processamento de imagens, gráficos e inferência com economia de memória (treinamento em meia precisão) Treinamento de deep learning (TPUs e GPUs modernas) — sem se preocupar com estouro do expoente ao converter de float32

O bfloat16 compartilha a largura do expoente (8 bits) e o viés (127) do float32, o que significa que pode ser obtido a partir de um valor float32 simplesmente truncando a mantissa — um atalho de implementação prático.

Dicas de uso

  • Mesmo para o mesmo valor, como 0.1, FP16 e bfloat16 o arredondam de forma bem diferente. Alterne os formatos e compare os padrões de bits da mantissa.
  • Como o bfloat16 compartilha a largura do expoente e o viés do float32, ele resiste a estouros mesmo com valores grandes acima de 65504. Já o FP16 estoura para infinito assim que ultrapassa 65504.
  • Converter "70000" para FP16 estoura para infinito, enquanto o bfloat16 o representa bem (com precisão reduzida).
  • Ao quantizar modelos em frameworks como PyTorch ou TensorFlow, o bfloat16 se converte facilmente a partir do float32, enquanto o intervalo mais estreito do FP16 às vezes exige um escalonamento prévio.
  • Para converter bits de volta para decimal, digite um valor hexadecimal de 4 dígitos com prefixo `0x`, ou um valor binário de 16 dígitos (o prefixo `0b` é opcional).

Perguntas frequentes

Ambos somam 16 bits, mas o FP16 (meia precisão IEEE 754) usa 5 bits de expoente e 10 de mantissa, enquanto o bfloat16 usa 8 bits de expoente e 7 de mantissa. Os bits extras de mantissa do FP16 dão maior precisão, mas um intervalo mais estreito; o bfloat16 troca precisão pelo amplo intervalo do float32.

Durante o treinamento de deep learning, gradientes e parâmetros podem oscilar entre valores extremamente grandes e pequenos. O bfloat16 mantém o amplo intervalo representável do float32 (resistindo a estouro/underflow) enquanto reduz memória e computação praticamente pela metade. O intervalo mais estreito do FP16 pode estourar mais facilmente, às vezes exigindo escalonamento adicional de perda (loss scaling) durante o treinamento.

Aproximadamente 65504. Converter algo maior para FP16 estoura para infinito. O bfloat16, por compartilhar a largura do expoente do float32, pode representar valores até aproximadamente 3,4×10³⁸.

Um padrão de bits em que o expoente é todo zero, mas a mantissa não é zero. Números de ponto flutuante normais têm um 1 implícito no início da mantissa; os subnormais o omitem, permitindo valores ainda mais próximos de zero do que o menor número normal, à custa da precisão.

O bfloat16 corresponde exatamente à largura do expoente (8 bits) e ao viés (127) do float32, então a conversão consiste apenas em manter os 7 bits superiores da mantissa do padrão float32 (com arredondamento) — sem necessidade de recalcular o expoente ou verificar intervalos, o que simplifica a implementação.
ツールくん

Curiosidade — Por que o machine learning quis uma representação numérica "menos precisa"

Por volta de 2018, o Google projetou um novo formato de ponto flutuante de 16 bits chamado bfloat16 para suas Unidades de Processamento Tensorial (TPUs). O FP16 (meia precisão IEEE 754) já existia e era usado em processamento de imagens e gráficos, mas seus meros 5 bits de expoente lhe davam um intervalo representável estreito, pouco adequado aos gradientes que desaparecem ou explodem durante o treinamento de deep learning.

A ideia de projeto do bfloat16 é direta: sacrificar precisão na mantissa, mas manter o expoente exatamente tão largo quanto os 8 bits do float32, para lidar com segurança com os valores extremamente grandes e pequenos que surgem durante o treinamento. O nome "Brain Floating Point" vem do Google Brain, a equipe de pesquisa em machine learning que o criou.

Na ciência da computação convencional, reduzir a precisão de ponto flutuante sempre foi tratado como um terreno fértil para bugs. Mas os modelos de deep learning têm uma propriedade incomum: um erro numérico modesto raramente prejudica muito a precisão final das previsões. Aproveitar essa propriedade de "um tanto impreciso, mas que funciona no conjunto" — e reduzir pela metade o custo de memória e computação com um formato de 16 bits — representa uma otimização própria do machine learning, bem distante da sabedoria tradicional da ciência da computação.