Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Entwicklung eines neuen Backends für XLA

Dieser vorläufige Leitfaden richtet sich an Early Adopters, die TensorFlow auf effiziente Weise problemlos auf ihre Hardware zurückführen möchten. Die Anleitung ist nicht Schritt für Schritt und setzt Kenntnisse in LLVM , Bazel und TensorFlow voraus.

XLA bietet eine abstrakte Schnittstelle, die eine neue Architektur oder ein neuer Beschleuniger implementieren kann, um ein Backend zum Ausführen von TensorFlow-Diagrammen zu erstellen. Das Retargeting von XLA sollte wesentlich einfacher und skalierbarer sein als die Implementierung jedes vorhandenen TensorFlow Op für neue Hardware.

Die meisten Implementierungen fallen in eines der folgenden Szenarien:

  1. Bestehende CPU-Architektur, die von XLA noch nicht offiziell unterstützt wird, mit oder ohne vorhandenem LLVM- Backend.
  2. Nicht CPU-ähnliche Hardware mit vorhandenem LLVM-Backend.
  3. Nicht CPU-ähnliche Hardware ohne vorhandenes LLVM-Backend.

Szenario 1: Bestehende CPU-Architektur, die von XLA noch nicht offiziell unterstützt wird

Sehen Sie sich in diesem Szenario zunächst das vorhandene XLA-CPU-Backend an . Mit XLA ist es einfach, TensorFlow mithilfe von LLVM auf verschiedene CPUs auszurichten, da der Hauptunterschied zwischen XLA-Backends für CPUs der von LLVM generierte Code ist. Google testet XLA für x64- und ARM64-Architekturen.

Wenn der Hardwareanbieter ein LLVM-Backend für seine Hardware hat, ist es einfach, das Backend mit dem mit XLA erstellten LLVM zu verknüpfen. Im JIT-Modus gibt das XLA-CPU-Backend Code für die Host-CPU aus. Für die vorzeitige Kompilierung kann xla::AotCompilationOptions ein LLVM-Tripel zum Konfigurieren der Zielarchitektur bereitstellen.

Wenn kein LLVM-Backend vorhanden ist, aber eine andere Art von Codegenerator vorhanden ist, sollte es möglich sein, den größten Teil des vorhandenen CPU-Backends wiederzuverwenden.

Szenario 2: Nicht CPU-ähnliche Hardware mit einem vorhandenen LLVM-Backend

Es ist möglich, eine neue xla::Compiler Implementierung auf den vorhandenen xla::CPUCompiler und xla::GPUCompiler , da diese bereits LLVM-IR ausgeben. Abhängig von der Art der Hardware ist es möglich, dass viele Aspekte der LLVM-IR-Generierung geändert werden müssen, aber viel Code kann mit den vorhandenen Backends geteilt werden.

Ein gutes Beispiel ist das GPU-Backend von XLA. Das GPU-Backend zielt auf eine nicht CPU-ähnliche ISA ab. Daher sind einige Aspekte der Codegenerierung für die GPU-Domäne einzigartig. Andere Arten von Hardware, z. B. DSPs wie Hexagon (mit einem vorgelagerten LLVM-Backend), können Teile der LLVM-IR-Emissionslogik wiederverwenden, andere Teile sind jedoch eindeutig.

Szenario 3: Nicht CPU-ähnliche Hardware ohne vorhandenes LLVM-Backend

Wenn LLVM nicht verwendet werden kann, ist es am besten, ein neues Backend für XLA für die gewünschte Hardware zu implementieren. Diese Option erfordert den größten Aufwand. Folgende Klassen müssen implementiert werden:

  • StreamExecutor : Für viele Geräte werden nicht alle Methoden von StreamExecutor benötigt. Weitere StreamExecutor Sie in den vorhandenen StreamExecutor Implementierungen.
  • xla::Compiler : Diese Klasse kapselt die Kompilierung einer HLO-Berechnung in eine xla::Executable .
  • xla::Executable : Mit dieser Klasse wird eine kompilierte Berechnung auf der Plattform gestartet.
  • xla::TransferManager : Mit dieser Klasse können Backends plattformspezifische Mechanismen zum Erstellen von XLA-Literaldaten aus bestimmten Gerätespeicherhandles bereitstellen. Mit anderen Worten, es hilft, die Übertragung von Daten vom Host zum Gerät und zurück zu kapseln.