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

Tensorflow挂起。我可以做些什么来调试这个问题,tensorflow,tensorflow-gpu,Tensorflow,Tensorflow Gpu,我写了一个seq2seq网络,使用facebook fastText向量进行嵌入。我遇到了一个问题,模型在40%的时间里运行和训练都很好,然后在另外60%的时间里随机挂起 我考虑过的一些事情是,对参数的任何调整都可能导致瓶颈,因为Emebedings有多大,300x100000,序列长度平均为10个单位。也就是说,使用nvidia smi,我看不出这是一个计算瓶颈,因为GPU在给定时间内仅显示9-20%的使用率。类似地,网络确实进行了一些池大小调整,但在我的模型成功训练的跑步中,我从未遇到过OO

我写了一个seq2seq网络,使用facebook fastText向量进行嵌入。我遇到了一个问题,模型在40%的时间里运行和训练都很好,然后在另外60%的时间里随机挂起

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

这变得有点糟糕,因为每次我在做了一个调整后重新开始训练,我都有可能花费更多的时间来结束这个过程并重新运行,然后实际看到实验的结果。Im在EC2 p2xlarge实例上,单个K80位于12gib vram

此外,是否有任何方法可以快速检查挂起是否确实是挂起,tensorflow实际上并不仅仅是为我计算数字而努力?我已经设置好了钩子,可以每隔2000步打印一次,但是看起来好像连一步都没有完成。有什么东西可以更精确地告诉我某个操作节点正在执行


我也尝试过tfdbg,但我认为它与我正在使用的contrib.estimator.estimator不兼容,因为它在调用步进器上崩溃了几步,导致堆栈跟踪中的奇怪错误似乎与我的代码无关

在这个特殊的例子中,在连接gdb并查看线程之后,看起来事情好像被锁定了。我在tensorflow的github上搜索了一个与此相关的问题,结果发现在一个潜在的livelocking问题上有一个与我类似的大量线程。在该线程结束时,另一个相关问题与摘要编写器未能关闭线程和产生无法管理的线程数有关


我使用的是tf.train“tf.train.LoggingTensorHook”中更高级别的日志机制,结果发现它没有使用摘要编写器,所以我所做的一个飞跃是,出于某种原因,这个函数没有很好地处理tensorflow的内部线程,并以类似的方式锁定所有内容。自从移除日志钩子以来,我已经挂起了0次,运行了20多次,直到成功完成,还有一些更长的运行,超过100000步

最常见的“悬而未决”问题之一是饥饿的队列。您正在将数据送入队列吗?如果是这样,请启动另一个线程,每隔一秒左右打印出该队列的大小,然后查看是否正在启动该队列。您可以连接gdb或strace以查看它挂起的位置。如果它挂在session.run调用中,您可以添加tf.Print语句,以确定它挂在哪个op上。