类别: 编译时:主机卸载输出不匹配
当显式卸载到主机内存的张量作为程序输出返回,但程序的输出签名未配置为预期主机内存时,就会发生此错误。
示例出错提示:
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) 的注解时,它会通过计算图跟踪该张量的位置,直到发生以下三个事件之一:
- 移至设备: 匹配的注解会将张量移回加速器。
- 主机计算: 张量由主机端操作使用。
- 程序结束: 张量到达程序末尾并成为输出。
此错误在场景 #3 中触发。张量在执行结束时实际位于主机内存中,但 XLA 程序的入口计算签名将该特定输出定义为驻留在设备内存 中。由于编译器无法隐式更改入口计算的接口,因此会引发错误。
调试
如需解决此错误,请确定您是否打算让此张量成为主机上的输出,或者是否应在返回之前将其移回设备。
打算在主机上返回: 如果您明确希望此张量在主机内存中返回(避免返回到设备),则应为此特定输出将入口计算的输出内存空间显式设置为主机内存 。
打算在设备上返回: 如果张量打算在程序结束之前保留在设备上或返回到设备,则您可能遗漏了注解。插入匹配的注解,将张量移回设备。
如果卸载的张量的来源不明确,或者您找不到缺少“移至设备”注解的位置,请使用 XLA 日志记录来跟踪指令。
- 启用日志记录: 如果您使用的是 Google Cloud TPU,请使用以下标志重新运行程序:
--vmodule=host_offloader=1。 - 分析日志: 在日志中查找“跟踪”输出。这将显示张量从卸载指令开始的路径。使用此路径可以准确找出张量到达程序边界而未移回设备的位置。