錯誤代碼:E1200

類別:編譯時間:主機卸載輸出內容不符

如果張量明確卸載至主機記憶體,並以程式輸出內容的形式傳回,但程式的輸出簽章未設定為預期主機記憶體,就會發生這項錯誤。

錯誤訊息示例:

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 後端:TPU、GPU

總覽

當編譯器遇到要將張量卸載至主機 (CPU) 的註解時,會透過運算圖形追蹤該張量的位置,直到發生下列其中一個事件為止:

  1. 移至裝置:相符的註解會將張量移回加速器。
  2. 主機運算:張量由主機端作業耗用。
  3. 程式結束:張量抵達程式結尾,並成為輸出內容。

這個錯誤會在情境 #3 中觸發。張量在執行結束時實際位於主機記憶體中,但 XLA 程式的輸入運算簽章會將該特定輸出定義為位於裝置記憶體中。由於編譯器無法隱含變更項目運算的介面,因此會引發錯誤。

偵錯

如要解決這項錯誤,請判斷您是否打算讓這個張量成為主機上的輸出內容,或是否應在傳回前移回裝置。

  • 預計在主機上傳回:如果您明確希望這個張量在主機記憶體中傳回 (避免傳回裝置),則應明確將項目運算的輸出記憶體空間設為這個特定輸出的「主機記憶體」

  • 預計在裝置上傳回:如果張量預計在方案結束前保留在裝置上或傳回裝置,您可能錯過註解。插入相符的註解,將張量移回裝置。

如果卸載張量的來源不明,或找不到「移至裝置」註解遺失的位置,請使用 XLA 記錄追蹤指令。

  • 啟用記錄:如果您使用 Google Cloud TPU,請使用下列標記重新執行程式:--vmodule=host_offloader=1
  • 分析記錄:在記錄中尋找「追蹤」輸出內容。這會顯示從卸載指令開始的張量路徑。使用這項功能,即可精確找出張量到達程式邊界的確切位置,不必移回裝置。