Tensorflow 挂起。我可以做些什么来调试问题

Tensorflow hangs. What are some things I can do to debug the issue

我已经编写了一个 seq2seq 网络,使用 facebook fastText 向量作为我的嵌入。我正在 运行 遇到一个问题,模型会 运行 并且可能在 40% 的时间内训练良好,然后在其他 60% 的时间开始训练时随机挂起。

我考虑过的一些事情是对我的参数的任何调整都可能导致瓶颈,因为嵌入有多大,300x100000 和序列长度平均为 10 个单位。也就是说,使用 nvidia-smi 我可以看到它不是计算瓶颈,因为 GPU 在给定时间仅显示 9-20% 的使用率。类似地,网络确实会调整一些池的大小,但我从来没有在我的模型成功训练的 运行s 上遇到 OOM。我正在为我的训练解码器使用预定的火车助手,为我的预测解码器使用波束搜索解码器。

这变得有点麻烦,因为每次我在进行调整后重新开始训练时,我都冒着花费更多时间终止进程并重新 运行ning 然后实际看到实验进行的风险。我在 EC2 p2xlarge 实例上,单个 K80 为 12gib vram。

此外,有没有什么方法可以快速检查挂起是否确实是挂起,以及 tensorflow 实际上不只是在为我工作 运行ching 数字?我现在设置了以 2000 步为间隔进行打印的挂钩设置,但看起来甚至没有采取任何一步。有什么东西可以更详细地告诉我某个操作节点正在执行吗?

我也试过 tfdbg 我不认为它与我正在使用的 contrib.estimator.estimator 兼容,因为它在 invoke_stepper 上崩溃了几个步骤后出现奇怪的错误堆栈跟踪似乎与我的代码无关。

在这种特殊情况下,在附加 gdb 并查看线程后,它看起来像是被锁定了。我在 tensorflow 的 github 上搜索了一个与此相关的问题,结果发现有一个关于潜在活锁问题的大量线程看起来与我的相似。在该线程的末尾,另一个相关问题与摘要作者未能关闭线程和产生无法管理的线程数有关。

我使用了来自 tf.train "tf.train.LoggingTensorHook" 的更高级别的日志记录机制,结果证明这不使用摘要编写器,所以我做出的飞跃是这个功能出于某种原因是不能很好地使用 tensorflow 的内部线程并以类似的方式锁定所有内容。自从删除日志挂钩后,我有 0 次挂起和 运行 超过 20 运行s 成功完成以及更长的 运行s 超过 100000 步。