类别:编译时:主机分流输出不匹配
如果明确分流到主机内存的张量作为程序输出返回,但程序的输出签名未配置为预期主机内存,则会发生此错误。
示例错误消息:
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 程序的入口计算签名将该特定输出定义为位于设备内存中。由于编译器无法隐式更改条目计算的接口,因此会引发错误。
调试
如需解决此错误,请确定您是否希望此张量成为主机上的输出,或者是否应在返回之前将其移回设备。
验证输出 intent 和轨迹路径
旨在返回到主机:如果您明确希望此张量返回到主机内存(避免转移回设备),则应为此特定输出明确将入口计算的输出内存空间设置为主机内存。
旨在返回到设备:如果张量在程序结束之前旨在保留在设备上或返回到设备,则您可能遗漏了注释。插入一个匹配的注释,将张量移回设备。
如果分流张量的来源不明确,或者您找不到“移至设备”注释缺失的位置,请使用 XLA 日志记录来跟踪指令。
- 启用日志记录:如果您使用的是 Google Cloud TPU,请使用以下标志重新运行程序:
--vmodule=host_offloader=1。 - 分析日志:在日志中查找“trace”输出。这将显示从分流指令开始的张量的路径。使用此功能可精确定位张量到达程序边界的位置,而无需将其移回设备。