常规调试
有几种方法可以获得有关 TPU 正在做什么的更多信息。
最直接的方法是添加tf.logging语句。如果您使用的是 TPUEstimator,您可能希望将此日志记录在您的 model_fn 中,因为这通常是核心 TPU 执行逻辑所在的位置。确保您将详细程度设置在正确的级别以捕获您正在记录的任何内容。但请注意,与在其他设备上运行时相比,日志记录对 TPU 性能的影响可能更大。
您还可以使用Cloud TPU 工具获取有关正在运行的操作以及在 TPU 上占用资源的详细信息。这些工具将为您的 TensorBoard 添加额外的选项卡。
这些工具更多的是用于性能调整而不是调试,但它们仍然可能对您在崩溃发生之前查看正在运行的操作有所帮助。
DeadlineExceededError 疑难解答
更多的日志记录或分析可能无助于您遇到的特定问题。超出期限错误可能是由连接到 TPU 的主机问题引起的。通常,当 TPU 出现错误时,将返回两条堆栈跟踪,一条来自主机,一条来自 TPU。如果您没有从 TPU 端获得任何跟踪,则主机可能永远无法连接。
作为快速故障排除步骤,您可以尝试停止并重新启动 TPU 服务器:
gcloud compute tpus stop $TPU_SERVER_NAME && gcloud compute tpus start $TPU_SERVER_NAME
这通常可以解决主机与 TPU 通信的任何问题。该命令是从非常有用的TPU 故障排除页面复制而来的。
该页面还给出了主机和 TPU 之间的连接无法首先建立的最常见原因:
如果 TensorFlow 在 TPU 执行期间遇到错误,脚本有时似乎挂起而不是退出到 shell。如果发生这种情况,请按键盘上的 CTRL+\ 以触发 SIGQUIT,这会导致 Python 立即退出。
类似地,在 TPU 执行期间按 CTRL+C 不会立即关闭 TensorFlow,而是等到当前迭代循环结束后干净退出。点击 CTRL+\ 会导致 Python 立即退出。
如果 TPU 仍在尝试完成上次运行的迭代循环,则主机将无法连接。使用建议的 CTRL+\ 可以防止将来发生这种情况。