我写了一个seq2seq网络,使用facebook fastText向量进行嵌入。我遇到了模型运行的问题,并且可能有40%的时间训练得很好,然后在训练开始时随机挂起另外60%的时间。
我考虑过的一些事情是对我的参数的任何调整可能会导致瓶颈,因为emebeddings有多大,300x100000和序列长度平均为10个单位。也就是说使用nvidia-smi我可以看到它不是计算瓶颈,因为GPU在给定时间仅显示9-20%的使用率。类似地,网络确实进行了一些池调整大小,但我从未在我的模型成功训练的运行中击中OOM。我使用预定的火车助手为我的训练解码器和一个波束搜索解码器用于我的预测解码器。
它变成了一个废话,因为每次我在进行调整后重新开始训练时,我都有可能花费更多的时间来杀死这个过程并重新开始运行然后实际看到实验发挥出来。我在EC2 p2xlarge实例上使用单个K80在12gib vram。
另外有没有办法快速检查挂起确实是一个挂起,而张量流实际上并不是在努力工作,为我处理数字?我有钩子设置,目前每隔2000步打印一次,但即使采取了一个步骤也看起来不像。是否有某些东西可以更精确地向我显示正在执行某个opnode。
我已经尝试了tfdbg以及我不认为它与我使用的contrib.estimator.estimator兼容,因为它在几步之后在invoke_stepper上崩溃,从而产生了奇怪的错误堆栈跟踪似乎与我的代码无关。
答案 0 :(得分:2)
在这个特殊情况下,在附加gdb并查看线程后,它看起来像是锁定了。我搜索了与tensorflow相关的github上的一个问题,结果发现有一个潜在的活锁问题的大量线程看起来与我的类似。在该线程结束时,另一个相关问题被链接到摘要编写器未能关闭线程并产生无法管理的线程数。
我正在使用tf.train" tf.train.LoggingTensorHook"中更高级别的日志记录机制。事实证明,这并没有使用摘要编写器,所以我所做的飞跃是由于某种原因,这个函数不能很好地与tensorflow的内部线程一起使用并以类似的方式锁定所有内容。由于删除了日志记录挂钩,我已经有0次挂起并运行超过20次运行以成功完成,以及一些超过100000步的更长时间运行。