Das numerische bfloat16-Format

Die Verwendung von Gleitkommazahlen mit geringerer Genauigkeit ist eine gängige Methode, um die Konvergenzzeit zu verkürzen, ohne die Genauigkeit zu beeinträchtigen. 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 Mantissenbits besteht. Das folgende Diagramm zeigt die Struktur von drei Gleitkommaformaten: float32: IEEE mit einfacher Genauigkeit, float16: IEEE mit halber Genauigkeit und bfloat16.

Image

Der dynamische Bereich von bfloat16 und float32 ist äquivalent. bfloat16 belegt jedoch nur halb so viel Arbeitsspeicher. Weitere Informationen zur Leistung von bfloat16 finden Sie unter Eine BFLOAT16-Studie für Deep-Learning-Schulungen.

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.

Neuronale Netzwerke reagieren empfindlicher auf die Größe des Exponenten als die Größe der Mantissen. 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 in einem neuronalen Deep-Learning-Netzwerk können eine Aufgabe mit derselben Genauigkeit unter Verwendung von Werten mit geringerer Genauigkeit erledigen. Einige Modelle können bei Werten mit geringerer Genauigkeit sogar eine höhere Genauigkeit erreichen.

Bei der Programmierung von Cloud TPUs konvertiert der XLA-Compiler automatisch Werte zwischen float32 und bfloat16.

Details zur Formatkonvertierung

Die Formatkonvertierung von float32 in bfloat16 wird vom XLA-Compiler automatisch eingefügt. Auf der TPU wird das Rundungsschema bei der Konvertierung auf den nächsten geraden Wert gerundet und der Überlauf auf inf erfolgt. Außerdem unterstützt bfloat16 in Cloud TPU keine Subnormale, sodass alle Subnormale während der Konvertierung auf null geleert werden. Spezielle Werte wie NaN und inf bleiben bei der Konvertierung erhalten.

Die Formatkonvertierung von bfloat16 in float32 wird ebenfalls automatisch vom XLA-Compiler eingefügt. Da float32 alle genauen Werte in bfloat16 darstellen kann, füllt die Konvertierung einfach 16 Nullen in den Mantissen-Bits auf. Spezielle Werte bleiben bei der Conversion erhalten.

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. Es gibt zwei Gründe für das explizite Umwandeln von Werten in 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.

Zuerst empfehlen wir Ihnen, praktische Erfahrungen mit einem der für bfloat16 aktivierten Referenzmodelle zu sammeln, die für Cloud TPUs optimiert wurden. Danach finden Sie in unserem Leitfaden zur Leistungssteigerung, im Leitfaden zur Profilerstellung und im Leitfaden zur Fehlerbehebung detaillierte technische Informationen, mit denen Sie selbst Modelle für maschinelles Lernen erstellen und optimieren können.