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
.
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
:
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.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.