错误代码: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
  • 分析日志: 在日志中查找“跟踪”输出。这将显示张量从卸载指令开始的路径。使用此路径可以准确找出张量到达程序边界而未移回设备的位置。