LLVM für Tensorflow oder Moore's Law End Compiler

Originalautor: Das TensorFlow MLIR-Team
  • Übersetzung
Das TensorFlow-Ökosystem enthält eine Reihe von Compilern und Optimierern, die auf verschiedenen Ebenen des Software- und Hardware-Stacks arbeiten. Für diejenigen , die Tensorflow täglich verwenden, kann dieser Schichtstapel herzustellen schwierig zu versteh Fehler ist eine Kompilierung-und Laufzeit mit der Verwendung von verschiedenen Arten von Eisen zugeordnet (GPU, TPU, mobiler Plattformen, etc.).

Diese Komponenten, mit dem Grafen beginnen Tensorflow kann in Form eines solchen Diagramms dargestellt werden:



Tatsächlich ist alles komplizierter.

In diesem Diagramm können Tensorflow-Diagramme auf verschiedene Arten gestartet werden

eine Notiz
In TensorFlow 2.0 können Diagramme implizit sein, und die Ausführung kann Operationen einzeln, in Gruppen oder in einem vollständigen Diagramm ausführen. Diese Graphen oder Fragmente des Graphen müssen optimiert und ausgeführt werden.

Zum Beispiel: 

  • Wir senden die Grafiken an den Tensorflow-Executor, der spezielle handgeschriebene Kernel aufruft
  • Konvertieren Sie sie in XLA HLO (XLA High-Level Optimizer-Darstellung) - eine Darstellung auf hoher Ebene des XLA-Optimierers, der wiederum den LLVM- Compiler für die CPU oder GPU aufrufen oder weiterhin XLA für TPU verwenden oder sie kombinieren kann. 
  • Wir konvertieren sie in TensorRT , nGraph oder ein anderes Format für einen speziellen Befehlssatz, der in Hardware implementiert ist.
  • Wir konvertieren sie in das TensorFlow Lite- Format , führen sie in der TensorFlow Lite-Laufzeit aus oder konvertieren sie in Code, um sie über die Android Neural Networks API (NNAPI) oder dergleichen auf der GPU oder dem DSP auszuführen.

Es gibt auch komplexere Methoden, einschließlich vieler Optimierungsdurchläufe auf jeder Ebene, wie zum Beispiel im Grappler-Framework, das Vorgänge in TensorFlow optimiert.

Obwohl diese verschiedenen Implementierungen von Compilern und Zwischendarstellungen die Leistung verbessern, stellt ihre Vielfalt die Endbenutzer vor ein Problem, beispielsweise verwirrende Fehlermeldungen beim Koppeln dieser Subsysteme. Außerdem müssen die Entwickler neuer Software- und Hardwarestacks die Optimierungs- und Konvertierungspassagen für jeden neuen Fall anpassen.

Aus diesem Grund freuen wir uns, MLIR, eine mehrstufige zwischengeschaltete Vertretung, bekannt zu geben. Dies ist ein Zwischenformat für Ansichten und Kompilierungsbibliotheken zur Verwendung zwischen einer Modellansicht und einem Low-Level-Compiler, der hardwareabhängigen Code generiert. Mit der Einführung von MLIR wollen wir neuen Forschungen bei der Entwicklung von optimierten Compilern und Implementierungen von Compilern, die auf Komponenten industrieller Qualität basieren, Platz machen.

Wir gehen davon aus, dass MLIR für viele Gruppen von Interesse sein wird, darunter:

  • Compilerforscher sowie Praktiker, die die Leistung und den Speicherverbrauch von Modellen für maschinelles Lernen optimieren möchten;
  • Hardwarehersteller, die nach einer Möglichkeit suchen, ihre Hardware mit Tensorflow zu kombinieren, z. B. TPUs, mobile Neuroprozessoren in Smartphones und andere benutzerdefinierte ASICs;
  • Personen, die den Programmiersprachen die Vorteile der Optimierung von Compilern und Hardwarebeschleunigern bieten möchten;

Was ist MLIR?


MLIR ist im Wesentlichen eine flexible Infrastruktur für moderne, optimierende Compiler. Dies bedeutet, dass es aus einer Intermediate Representation (IR) -Spezifikation und einer Reihe von Tools zur Transformation dieser Repräsentation besteht. Wenn wir über Compiler sprechen, wird der Übergang von einer Ansicht auf höherer Ebene zu einer Ansicht auf niedrigerer Ebene als Absenken bezeichnet, und wir werden diesen Begriff in Zukunft verwenden.

MLIR wurde unter dem Einfluss von LLVM entwickelt und entlehnt schamlos viele gute Ideen. Es verfügt über ein flexibles Typensystem und dient zum Darstellen, Analysieren und Transformieren von Diagrammen, wobei viele Abstraktionsebenen in einer Kompilierungsebene kombiniert werden. Diese Abstraktionen umfassen Tensorflow-Operationen, verschachtelte polyedrische Schleifenbereiche, LLVM-Anweisungen sowie Festkommaoperationen und -typen.

Dialekte von MLIR 


Um die verschiedenen Software- und Hardware-Ziele zu trennen, verfügt MLIR über „Dialekte“, darunter:

  • TensorFlow IR, das alles beinhaltet, was in TensorFlow-Diagrammen möglich ist
  • XLA HLO IR, entwickelt, um alle Vorteile des XLA-Compilers zu nutzen, dessen Ausgabe wir nicht nur für TPU-Code erhalten können.
  • Ein experimenteller Affinitätsdialekt, der speziell für polyedrische Darstellungen und Optimierungen entwickelt wurde
  • LLVM-IR, 1: 1 passend zur nativen LLVM-Ansicht, sodass MLIR mit LLVM Code für die GPU und die CPU generieren kann. 
  • TensorFlow Lite zum Generieren von Code für mobile Plattformen

Jeder Dialekt enthält eine Reihe bestimmter Operationen unter Verwendung von Invarianten, z. B .: "Es ist ein binärer Operator, und seine Eingabe und Ausgabe sind vom gleichen Typ."

Erweiterungen MLIR


MLIR verfügt nicht über eine feste und integrierte Liste globaler innerer Operationen. Dialekte können vollständig benutzerdefinierte Typen definieren, und auf diese Weise kann MLIR Dinge wie das LLVM-IR-Typsystem (mit erstklassigen Aggregaten), domänensprachliche Abstraktionen wie quantisierte Typen, die für ML-optimierte Beschleuniger wichtig sind, modellieren. sogar ein System vom Typ Swift oder Clang.

Wenn Sie diesem System einen neuen Low-Level-Compiler hinzufügen möchten, können Sie einen neuen Dialekt erstellen und vom Dialekt des TensorFlow-Diagramms zu Ihrem Dialekt absteigen. Dies vereinfacht den Pfad für Hardwareentwickler und Compilerentwickler. Sie können den Dialekt auf verschiedene Ebenen desselben Modells ausrichten. Optimierer auf hoher Ebene sind für bestimmte Teile des IR verantwortlich.

Für Compiler-Forscher und Framework-Entwickler bietet MLIR die Möglichkeit, Transformationen auf allen Ebenen zu erstellen, eigene Operationen und Abstraktionen in IR zu definieren und so Ihre Anwendungsaufgaben besser zu modellieren. MLIR ist also mehr als eine reine Compiler-Infrastruktur, wie sie LLVM ist.

MLIR arbeitet zwar als Compiler für ML, ermöglicht aber auch die Verwendung von Technologien für maschinelles Lernen! Dies ist sehr wichtig für Ingenieure, die numerische Bibliotheken entwickeln, und kann nicht die gesamte Vielfalt der ML-Modelle und -Hardware unterstützen. Die Flexibilität von MLIR erleichtert das Erforschen von Strategien für die Codeabnahme beim Wechsel zwischen Abstraktionsebenen.

Was weiter


Wir haben ein GitHub-Repository eröffnet und laden alle Interessierten ein (lesen Sie unseren Guide!). Wir werden in den kommenden Monaten mehr als diese Toolbox veröffentlichen - die TensorFlow- und TF Lite-Dialektspezifikationen. Wir können Ihnen mehr sagen, um mehr zu erfahren, siehe die Präsentation von Chris Luttner und unsere README auf Github .

Wenn Sie über alle Themen rund um MLIR auf dem Laufenden bleiben möchten, nehmen Sie an unserer neuen Mailingliste teil , die sich in Kürze auf Ankündigungen zukünftiger Versionen unseres Projekts konzentriert. Bleib bei uns!

Jetzt auch beliebt: