FP16- & bfloat16-Bitmuster-Visualisierer

Visualisieren Sie die Bitmuster von Gleitkommazahlen halber Genauigkeit (FP16, IEEE 754 binary16) und bfloat16. Konvertieren Sie Dezimalzahlen in Bits und zurück, mit farblich markiertem Vorzeichen, Exponent und Mantisse. Nützlich zum Lernen über ML-Quantisierung und Inferenzbeschleunigung.

Struktur von FP16 vs. bfloat16

Beide Formate haben insgesamt 16 Bit, verteilen diese aber sehr unterschiedlich auf Exponent und Mantisse — mit jeweils sehr unterschiedlichem darstellbarem Bereich und Genauigkeit.

Element FP16 (IEEE 754 半精度) bfloat16
Bits gesamt 16 16
Exponent-Bits 5 8
Mantissen-Bits 10 7
Darstellbarer Bereich Etwa ±6,1×10⁻⁵ bis ±65504 (engerer Bereich, aber mehr Mantissen-Bits für Genauigkeit) Etwa ±1,2×10⁻³⁸ bis ±3,4×10³⁸ (gleich weiter Bereich wie float32, aber geringere Genauigkeit)
Haupteinsatzgebiet Bildverarbeitung, Grafik und speichereffiziente Inferenz (Training mit halber Genauigkeit) Deep-Learning-Training (TPUs und moderne GPUs) — kein Sorgen über Exponenten-Überlauf bei der Konvertierung von float32

bfloat16 teilt sich die 8-Bit-Exponentenbreite und den Bias (127) mit float32 — es kann daher einfach durch Abschneiden der Mantisse aus einem float32-Wert erzeugt werden, ein praktischer Implementierungsvorteil.

Tipps zur Verwendung

  • Selbst bei demselben Wert wie 0.1 runden FP16 und bfloat16 sehr unterschiedlich. Wechseln Sie das Format und vergleichen Sie die Mantissen-Bitmuster.
  • Da bfloat16 die Exponentenbreite und den Bias von float32 teilt, widersteht es Überläufen selbst bei großen Werten über 65504. FP16 dagegen läuft schon oberhalb von 65504 zu Unendlich über.
  • Die Umwandlung von "70000" in FP16 läuft zu Unendlich über, während bfloat16 den Wert (mit reduzierter Genauigkeit) korrekt darstellt.
  • Bei der Quantisierung von Modellen in Frameworks wie PyTorch oder TensorFlow lässt sich bfloat16 leicht aus float32 konvertieren, während der engere Bereich von FP16 manchmal eine vorherige Skalierung erfordert.
  • Um Bits zurück in Dezimalzahlen umzuwandeln, geben Sie einen 4-stelligen Hexadezimalwert mit `0x`-Präfix oder einen 16-stelligen Binärwert ein (das `0b`-Präfix ist optional).

Häufig gestellte Fragen

Beide haben insgesamt 16 Bit, aber FP16 (IEEE 754 halbe Genauigkeit) verwendet 5 Exponenten-Bits und 10 Mantissen-Bits, während bfloat16 8 Exponenten-Bits und 7 Mantissen-Bits verwendet. Die zusätzlichen Mantissen-Bits von FP16 geben ihm höhere Genauigkeit, aber einen engeren Bereich; bfloat16 tauscht Genauigkeit gegen den weiten Bereich von float32.

Beim Deep-Learning-Training können Gradienten und Parameter zwischen extrem großen und kleinen Werten schwanken. bfloat16 behält den weiten darstellbaren Bereich von float32 bei (widersteht Über-/Unterlauf) und halbiert dabei Speicher und Rechenaufwand. Der engere Bereich von FP16 kann leichter überlaufen, was manchmal zusätzliches Loss-Scaling beim Training erfordert.

Etwa 65504. Die Umwandlung eines größeren Werts in FP16 läuft zu Unendlich über. bfloat16 kann dank gleicher Exponentenbreite wie float32 Werte bis etwa 3,4×10³⁸ darstellen.

Ein Bitmuster, bei dem der Exponent null ist, die Mantisse aber nicht. Reguläre (normale) Gleitkommazahlen haben eine implizite führende 1 in der Mantisse; subnormale Zahlen lassen diese weg und ermöglichen so Werte, die noch näher an null liegen als die kleinste normale Zahl — auf Kosten der Genauigkeit.

bfloat16 entspricht exakt der Exponentenbreite (8 Bit) und dem Bias (127) von float32, sodass die Umwandlung lediglich darin besteht, die oberen 7 Mantissen-Bits des float32-Musters zu behalten (mit Rundung) — ohne Neuberechnung des Exponenten oder Bereichsprüfung, was die Implementierung vereinfacht.
ツールくん

Übrigens – Warum das maschinelle Lernen eine "weniger genaue" Zahlendarstellung wollte

Um 2018 entwickelte Google für seine Tensor Processing Units (TPUs) ein neues 16-Bit-Gleitkommaformat namens bfloat16. FP16 (IEEE 754 halbe Genauigkeit) existierte bereits und wurde in Bildverarbeitung und Grafik praktisch eingesetzt, doch seine mageren 5 Exponenten-Bits gaben ihm einen engen darstellbaren Bereich — schlecht geeignet für die verschwindenden und explodierenden Gradienten, die beim Deep-Learning-Training auftreten.

Die Designidee von bfloat16 ist einfach: Mantissen-Genauigkeit opfern, aber den Exponenten exakt so breit wie die 8 Bit von float32 halten, um die extrem großen und kleinen Werte, die beim Training auftreten, sicher zu handhaben. Der Name "Brain Floating Point" stammt von Google Brain, dem Forschungsteam für maschinelles Lernen, das es entwickelt hat.

In der konventionellen Informatik galt eine Reduzierung der Gleitkomma-Genauigkeit lange als Nährboden für Fehler. Doch Deep-Learning-Modelle haben eine ungewöhnliche Eigenschaft: Ein bescheidener numerischer Fehler beeinträchtigt die endgültige Vorhersagegenauigkeit selten stark. Diese Eigenschaft — "etwas ungenau, funktioniert aber insgesamt" — zu nutzen und dabei mit einem 16-Bit-Format Speicher- und Rechenkosten zu halbieren, stellt eine Optimierung dar, die ganz eigen für das maschinelle Lernen ist und weit von der traditionellen Informatik-Weisheit abweicht.