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