Arm TechCon 2019 Neues Datenformat Bfloat16 soll ML-Anwendungen beschleunigen

Arm hat im Rahmen einer Keynote auf seiner Entwicklerkonferenz TechCon angekündigt, dass die nächste Version seiner ArmV8-A-Architektur die Unterstützung von bfloat16 beinhalten wird, einem Gleitkommaformat, das zunehmend zur Beschleunigung von maschinellen Lernanwendungen eingesetzt wird.

Arm schließt sich damit Google, Intel und einer Handvoll Startups an, die alle bfloat16 in ihre Architekturen integrieren. Bfloat16, auch bekannt als 16-Bit "brain floating point", wurde von Google erfunden und erstmals in der dritten Generation seiner Tensor-Processing-Unit (TPU) implementiert. Intel hielt das Format für wichtig genug, um bfloat16 in seine zukünftigen "Cooper Lake" Xeon SP Prozessoren sowie in seine kommenden "Spring Crest" neuronalen Netzwerkprozessoren zu integrieren.

Die Grundidee von bfloat16 ist es, ein 16-Bit Gleitkommaformat bereitzustellen, das den gleichen Zahlenumfang wie Standard IEEE-FP32 aber mit geringerer Genauigkeit aufweist. Dies bedeutet konkret, die 8 bit des FP32-Exponenten beizubehalten und die 23 bit der FP32-Mantisse auf 7 bit zu reduzieren (Bild).

Laut Arm ist das Format in den meisten Fällen für Berechnungen neuronaler Netze so genau wie FP32, aber eben mit der Hälfte der Anzahl von Bits.  Dadurch kann der Durchsatz verdoppelt und der Speicherbedarf im Vergleich zu seinem 32-Bit-Gegenstück halbiert werden. Und zum größten Teil kann blfloat16 ein "Drop-in"-Ersatz für FP32 in diesen Algorithmen des maschinellen Lernens sein. Glücklicherweise sind neuronale Netze aufgrund ihres statistischen Charakters überraschend widerstandsfähig gegen einen geringen Umfang an Rauschen, solange der Datentyp einen ausreichenden Zahlenbereich abdeckt und eine ausreichende Genauigkeit aufweist.

Im Falle von Arm gilt die zusätzliche Unterstützung für alle unter dem Armv8-A-Dach unterstützten Gleitkommabefehlssätze, nämlich SVE (Scalable Vector Extension), AArch64 Neon (64-Bit SIMD) und AArch32 Neon (32-Bit SIMD). Die zusätzliche Unterstützung ist so konzipiert, dass sie sowohl für die Inferenz des maschinellen Lernens als auch für das Training über armbasierte Clients und Server hinweg verwendet werden kann.

Konkret wird es vier neue Anweisungen geben, um die Multiplikation von blfoat16-Werten zu unterstützen, der häufigsten Berechnung, die zum Training und Inferenz neuronaler Netze verwendet wird. Die Unterstützung wird dabei von Arm's eigenen Machine Learning Bibliotheken kommen. Dies sind die vier neuen Anweisungen:

  • BFDOT: ein [1×2] × [2×1] Dot-Produkt aus BF16-Elementen, das sich in jedem IEEE-FP32-Element innerhalb eines SIMD-Ergebnisses aufkummuliert.
  • BFMMLA: effektiv zwei BFDOT-Operationen, die eine Matrixmultiplikation von BF16-Elementen durchführen, die sich in jeder[2×2] Matrix von IEEE-FP32-Elementen innerhalb eines SIMD-Ergebnisses aufkummulieren.
  • BFMLAL:  ein einfaches Produkt der geraden oder ungeraden BF16-Elemente, das sich in jedem IEEE-FP32-Element innerhalb eines SIMD-Ergebnisses aufkummuliert.
  • BFCVT: konvertiert IEEE-FP32-Elemente oder Einzelwerte in das Format BF16.

Die Einbeziehung der bfloat16-Unterstützung in SVE ist insofern besonders interessant, als diese Vektoranweisungen speziell für High-Performance-Computing entwickelt wurden. Bis heute ist die einzige bekannte SVE-Implementierung die im A64FX-Chip von Fujitsu, dem Prozessor, der den kommenden Post-K-Supercomputer, der jetzt Fugaku heißt, antreiben wird. Diese Implementierung kam noch zu früh, um den Nutzen von bfloat16 zu nutzen, aber spätere wie der Arm-Prozessor, der für die European Processor Initiative (EPI) entwickelt wird, werden es mit ziemlicher Sicherheit beinhalten.

Angesichts des gestiegenen Interesses an maschinellem Lernen von konventionellen HPC-Anwendern und der Eignung von Arm-basierten Hochleistungssystemen für das Training großer neuronaler Netzwerke erscheint die Aufnahme von bfloat16 in SVE wie eine natürliche Ergänzung. Es gibt ja auch HPC-Forscher, die die Verwendung des neuen 16-Bit-Formats untersuchen, um gemischte Präzisionsrechnungen für traditionelle wissenschaftliche Anwendungen zu beschleunigen. Auch hier ist der Vorteil von bfloat16, dass es den gleichen Dynamikumfang wie FP32 hat, was es einfacher macht, bestehenden Code zu konvertieren, der FP32 verwendet.

Da SVE für verschiedene Vektorlängen, von 128 Bit bis zu 2.048 Bit, implementiert werden kann, sollte der bfloat16-Durchsatz theoretisch verglichen mit einer 128-Bit-Neon-Implementierung entsprechend skalieren.  In der Praxis wird der Durchsatz jedoch auch von den spezifischen Hardware-Implementierungsentscheidungen abhängen wie beispielsweise der Anzahl der SVE-Ausführungseinheiten im Backend im Vergleich zur Anzahl der Neon-Ausführungseinheiten.

Es gibt jedoch einen Kompromiss zwischen der einfachen Bereitstellung eines blfoat16-basierten Netzwerks und seiner endgültigen Größe und der Performance, wenn es in Typen mit kleinerem Zahlenraum wie INT8 und FP16 umgewandelt wird.  Die Verwendung von blfoat16 für die Inferenz dürfte für Entwickler attraktiv sein, die sich die zusätzlichen Kosten und die Verzögerung des erneuten Trainings eines Netzwerks zur Nutzung dieser kleineren Datentypen, die mehrere Monate dauern kann, nicht leisten können, wenn es einen einzigen Datentyp gibt, der sowohl für Training als auch Inferenz funktioniert.

Die andere Sache, die man beachten sollte, ist, dass es keinen IEEE-Standard für bfloat16 gibt, so dass es keine Garantie dafür gibt, dass die Ergebnisse der gleichen Berechnung auf verschiedenen Prozessoren exakt die gleichen sind. Aber diese Art von Variabilität ist sogar bei FP32 vorhanden, was Dot-Produkte betrifft. Auf jeden Fall ist das Rundungsrauschen fast immer akzeptabel, denn maschinelles Lernen basiert auf statistischen Überlegungen.

Die Unterstützung von bfloat16 durch Arm führt dazu, dass GPUs sowohl von Nvidia als auch von AMD zukünftig die einzigen weit verbreiteten Chips für maschinelles Lernen sind, die immer noch keine native Unterstützung dieses  Datenformats bieten.