Fehlercode: E1200

Kategorie:Kompilierzeit: Nichtübereinstimmung der Host-Auslagerungsausgabe

Dieser Fehler tritt auf, wenn ein Tensor, der explizit in den Host-Arbeitsspeicher ausgelagert wurde, als Programmausgabe zurückgegeben wird, die Ausgabesignatur des Programms jedoch nicht für den Host-Arbeitsspeicher konfiguriert ist.

Beispiel für Fehlermeldungen :

INVALID_ARGUMENT: Tensor which is moved to host (starting from tuple.64) is returned from the entry computation but the layout for this output is not set to host memory.

XLA-Back-Ends:TPU, GPU

Übersicht

Wenn der Compiler auf eine Annotation stößt, um einen Tensor auf den Host (CPU) auszulagern, verfolgt er den Speicherort dieses Tensors über den Berechnungsgraphen, bis eines von drei Ereignissen eintritt:

  1. Auf Gerät verschieben:Eine passende Annotation verschiebt den Tensor zurück zum Beschleuniger.
  2. Host-Berechnung:Der Tensor wird von einer hostseitigen Operation verwendet.
  3. Programmende:Der Tensor erreicht das Ende des Programms und wird zu einer Ausgabe.

Dieser Fehler wird im Szenario 3 ausgelöst. Der Tensor befindet sich am Ende der Ausführung physisch im Host-Arbeitsspeicher, aber die Signatur der Eingabeberechnung des XLA-Programms definiert, dass sich diese bestimmte Ausgabe im Gerätespeicher befindet. Da der Compiler die Schnittstelle der Eingabeberechnung nicht implizit ändern kann, wird ein Fehler ausgelöst.

Debugging

Um diesen Fehler zu beheben, müssen Sie festlegen, ob dieser Tensor eine Ausgabe auf dem Host sein soll oder ob er vor der Rückgabe zurück auf das Gerät verschoben werden sollte.

  • Rückgabe auf dem Host beabsichtigt:Wenn Sie möchten, dass dieser Tensor explizit im Host-Arbeitsspeicher zurückgegeben wird (um eine Rückübertragung auf das Gerät zu vermeiden), sollten Sie den Ausgabespeicherplatz der Eingabeberechnung für diese bestimmte Ausgabe explizit auf Host-Arbeitsspeicher festlegen.

  • Rückgabe auf dem Gerät beabsichtigt:Wenn der Tensor auf dem Gerät bleiben oder vor dem Ende des Programms darauf zurückgegeben werden sollte, haben Sie wahrscheinlich eine Annotation vergessen. Fügen Sie eine passende Annotation ein, um den Tensor zurück auf das Gerät zu verschieben.

Wenn die Quelle des ausgelagerten Tensors unklar ist oder Sie nicht finden können, wo die Annotation „Auf Gerät verschieben“ fehlt, verwenden Sie die XLA-Protokollierung, um die Anweisungen nachzuverfolgen.

  • Protokollierung aktivieren:Wenn Sie Google Cloud TPU verwenden, führen Sie Ihr Programm mit dem folgenden Flag noch einmal aus: --vmodule=host_offloader=1.
  • Logs analysieren:Suchen Sie in den Logs nach der Ausgabe „trace“. Dort wird der Pfad des Tensors ab der Auslagerungsanweisung angezeigt. So können Sie genau feststellen, wo der Tensor die Programmgrenze erreicht, ohne zurück auf das Gerät verschoben zu werden.