Visualiseur de motifs de bits FP16 et bfloat16

Visualisez les motifs de bits des nombres à virgule flottante en demi-précision (FP16, IEEE 754 binary16) et bfloat16. Convertissez du décimal aux bits et inversement, avec le signe, l'exposant et la mantisse mis en couleur. Utile pour apprendre la quantification en ML et l'accélération de l'inférence.

Structure de FP16 face à bfloat16

Les deux formats totalisent 16 bits, mais répartissent ces bits entre l'exposant et la mantisse de façon très différente, donnant à chacun une plage représentable et une précision très différentes.

Élément FP16 (IEEE 754 半精度) bfloat16
Bits au total 16 16
Bits d'exposant 5 8
Bits de mantisse 10 7
Plage représentable Environ ±6,1×10⁻⁵ à ±65504 (plage plus étroite, mais plus de bits de mantisse pour la précision) Environ ±1,2×10⁻³⁸ à ±3,4×10³⁸ (même large plage que float32, mais précision moindre)
Usage principal Traitement d'image, graphisme, inférence économe en mémoire (entraînement en demi-précision) Entraînement de deep learning (TPU et GPU récents) — pas besoin de se soucier du dépassement de l'exposant lors de la conversion depuis float32

bfloat16 partage la largeur d'exposant (8 bits) et le biais (127) de float32, ce qui signifie qu'il peut être obtenu à partir d'une valeur float32 simplement en tronquant la mantisse — un raccourci d'implémentation pratique.

Astuces d'utilisation

  • Même pour une valeur identique comme 0.1, FP16 et bfloat16 l'arrondissent très différemment. Changez de format et comparez les motifs de bits de la mantisse.
  • Comme bfloat16 partage la largeur d'exposant et le biais de float32, il résiste au dépassement même pour de grandes valeurs supérieures à 65504. FP16, en revanche, déborde vers l'infini dès que 65504 est dépassé.
  • Convertir "70000" en FP16 déborde vers l'infini, alors que bfloat16 le représente correctement (avec une précision réduite).
  • Lors de la quantification de modèles dans des frameworks comme PyTorch ou TensorFlow, bfloat16 se convertit facilement depuis float32, tandis que la plage plus étroite de FP16 nécessite parfois une mise à l'échelle préalable.
  • Pour reconvertir des bits en décimal, saisissez une valeur hexadécimale à 4 chiffres avec le préfixe `0x`, ou une valeur binaire à 16 chiffres (le préfixe `0b` est facultatif).

Questions fréquentes

Les deux totalisent 16 bits, mais FP16 (demi-précision IEEE 754) utilise 5 bits d'exposant et 10 bits de mantisse, tandis que bfloat16 utilise 8 bits d'exposant et 7 bits de mantisse. Les bits de mantisse supplémentaires de FP16 lui donnent une précision plus élevée mais une plage plus étroite ; bfloat16 sacrifie la précision pour la large plage de float32.

Pendant l'entraînement en deep learning, les gradients et paramètres peuvent osciller entre des valeurs extrêmement grandes et petites. bfloat16 conserve la large plage représentable de float32 (résistant au dépassement/soupassement) tout en réduisant de moitié la mémoire et le calcul. La plage plus étroite de FP16 peut déborder plus facilement, nécessitant parfois une mise à l'échelle supplémentaire de la perte (loss scaling) pendant l'entraînement.

Environ 65504. Convertir une valeur plus grande en FP16 déborde vers l'infini. bfloat16, partageant la largeur d'exposant de float32, peut représenter des valeurs jusqu'à environ 3,4×10³⁸.

Un motif de bits où l'exposant est tout à zéro mais la mantisse est non nulle. Les nombres à virgule flottante normaux ont un 1 implicite au début de la mantisse ; les subnormaux l'omettent, permettant des valeurs encore plus proches de zéro que le plus petit nombre normal, au prix de la précision.

bfloat16 correspond exactement à la largeur d'exposant (8 bits) et au biais (127) de float32, donc la conversion consiste simplement à conserver les 7 bits supérieurs de la mantisse du motif float32 (avec arrondi) — sans recalcul de l'exposant ni vérification de plage, ce qui simplifie l'implémentation.
ツールくん

Anecdote — Pourquoi le machine learning voulait une représentation numérique "moins précise"

Vers 2018, Google a conçu un nouveau format à virgule flottante de 16 bits appelé bfloat16 pour ses Tensor Processing Units (TPU). FP16 (demi-précision IEEE 754) existait déjà et était utilisé en pratique dans le traitement d'image et le graphisme, mais ses maigres 5 bits d'exposant lui donnaient une plage représentable étroite, mal adaptée aux gradients qui s'évanouissent ou explosent pendant l'entraînement en deep learning.

L'idée de conception de bfloat16 est simple : sacrifier la précision de la mantisse, mais garder l'exposant exactement aussi large que les 8 bits de float32, afin de pouvoir gérer en toute sécurité les valeurs extrêmement grandes et petites qui apparaissent pendant l'entraînement. Le nom "Brain Floating Point" vient de Google Brain, l'équipe de recherche en machine learning qui l'a créé.

En informatique classique, réduire la précision en virgule flottante a longtemps été considéré comme un terreau propice aux bugs. Mais les modèles de deep learning ont une propriété inhabituelle : une erreur numérique modeste nuit rarement beaucoup à la précision finale des prédictions. Tirer parti de cette propriété — "quelque peu imprécis mais qui fonctionne dans l'ensemble" — et réduire de moitié le coût mémoire et calcul avec un format 16 bits représente une optimisation propre au machine learning, assez éloignée de la sagesse traditionnelle de l'informatique.