Das numerische bfloat16-Format

Die Verwendung von Gleitkommazahlen mit niedriger Genauigkeit ist eine gängige Methode, mit der die Zeit bis zur Konvergenz verringert wird, ohne dass die Genauigkeit verloren geht. TPUs verwenden beim Ausführen von Matrixvorgängen das bfloat16-Zahlenformat. Matrixmultiplikationsvorgänge werden für bfloat16-Werte und Akkumulationen für IEEE-float32-Werte ausgeführt.

bfloat16 ist ein benutzerdefiniertes 16-Bit-Gleitkommaformat für maschinelles Lernen, das aus einem Vorzeichenbit, acht Exponentenbits und sieben Mantissa-Bits besteht. Das folgende Diagramm zeigt das Innere von drei Gleitkommaformaten: float32: IEEE-Einzelgenauigkeit, float16: IEEE-Halbgenauigkeit und bfloat16.

Image

Der dynamische Bereich von bfloat16 und float32 ist äquivalent. bfloat16 belegt jedoch den halben Arbeitsspeicher. Weitere Informationen zur bfloat16-Leistung finden Sie unter Studie von BFLOAT16 für Deep-Learning-Training.

bfloat16 auswählen

Das Google-Hardwareteam hat bfloat16 für Cloud TPUs gewählt, um die Hardwareeffizienz zu verbessern und gleichzeitig Deep-Learning-Modelle genau zu trainieren – minimalen Wechselkosten von float32. Die physische Größe eines Hardwaremultiplizierers wird mit dem Quadrat der Mantissenbreite skaliert. Mit weniger Mantissenbits als bei FP16 haben bfloat16-Multiplizierer in Silizium etwa die Hälfte der Größe eines typischen FP16-Multiplizierers und sind achtmal kleiner als ein float32-Multiplizierer.

Neurale Netzwerke sind empfindlicher auf die Größe des Exponenten als auf die Größe der Mantissa ausgerichtet. Damit das Verhalten bei Unterläufen, Überläufen und NaNs identisch ist, hat bfloat16 dieselbe Exponentengröße wie float32. bfloat16 verarbeitet Denormalzahlen anders als float32 – es löscht sie auf null. Im Gegensatz zu float16, das in der Regel eine spezielle Behandlung wie die Verlustskalierung erfordert, ist bfloat16 ein Ersatz für float32 beim Trainieren und Ausführen von neuronalen Deep-Learning-Netzwerken.

Training mit gemischter Genauigkeit

Die meisten Berechnungen innerhalb eines neuronalen Deep-Learning-Netzwerks können mit einer geringeren Genauigkeit eine Aufgabe mit derselben Genauigkeit ausführen. Einige Modelle können sogar mit niedrigerer Genauigkeit eine höhere Genauigkeit erreichen.

Beim Programmieren von Cloud TPUs konvertiert der XLA-Compiler automatisch Werte zwischen float32 und bfloat16.

Details zur Formatkonvertierung

Die Formatkonvertierung von float32 zu bfloat16 wird automatisch vom XLA-Compiler eingefügt. Auf der TPU ist das Rundungsmodell in der Umwandlung auf den nächsten gleichmäßigen Rundungswert und der Überlauf auf „inf“. Außerdem unterstützt das bfloat16 in Cloud TPU keine Subnormalen, sodass alle Subnormalen während der Konvertierung auf null geleert werden. Spezielle Werte wie NaN und inf bleiben in der Conversion erhalten.

Die Formatkonvertierung von bfloat16 in float32 wird auch automatisch vom XLA-Compiler eingefügt. Da float32 alle genauen Werte in bfloat16 darstellen kann, füllt die Umwandlung einfach 16 Nullen in den Mantissa-Bits auf. Spezielle Werte werden in der Konvertierung beibehalten.

Modellportabilität

Die Werte von Parametern und Aktivierungen in einem Modell können im 32-Bit-Format gespeichert werden, da die TPU-Hardware diese Werte automatisch in bfloat16 umwandeln kann. Prüfpunkte, die aus einem auf Cloud TPUs trainierten Modell abgerufen wurden, können ohne umfangreiche manuelle Konvertierungen auf anderen Hardwareplattformen (z. B. Inferenz oder Feinabstimmung auf CPUs oder GPUs) bereitgestellt werden.

Leistung mit bfloat16 verbessern

Während die automatische Formatumwandlung in TPUs erlaubt, dass Sie nicht über die numerische Genauigkeit nachdenken, können Sie durch explizites Umwandeln von Werten in bfloat16 weitere Leistungsverbesserungen erzielen. Dafür gibt es zwei Gründe:bfloat16

  1. Das Speichern von Werten im Format bfloat16 spart On-Chip-Arbeitsspeicher, sodass Cloud TPUs größere Modelle trainieren oder größere Batches verwenden können.

  2. Einige Operationen sind an die Arbeitsspeicherbandbreite gebunden. Das heißt, dass die Zeit, die zum Laden von Daten aus dem Arbeitsspeicher aufgewendet wird, die für die Berechnung benötigte Zeit verlängern kann. Das Speichern von Operanden und Ausgaben dieser Vorgänge im bfloat16-Format reduziert die zu übertragende Datenmenge, wodurch die Gesamtgeschwindigkeit verbessert wird.

Bevor Sie beginnen, empfehlen wir praktische Erfahrung mit einem der bfloat16-fähigen Referenzmodelle, die für Cloud TPUs optimiert wurden. Danach enthält unser Leistungsleitfaden, der Leitfaden für die Profilerstellung und der Leitfaden zur Fehlerbehebung ausführliche technische Informationen, die Ihnen helfen, Modelle für maschinelles Lernen selbst zu erstellen und zu optimieren.