2016-09-22 72 views
2

当我使用大于4的批处理大小(我通常使用32运行)时,我有一个内存不足的操作。我认为我可以聪明的做法是沿着批处理维度分割这一个操作,使用tf.split,在批处理的一个子集上运行它,然后使用tf.concat进行重组。由于某些原因,这不起作用并导致OOM错误。要清楚的是,如果我以4的批处理大小运行,它不会分裂。相反,如果我以32的批处理大小运行,并且即使我要执行32路拆分,以便每个单独的元素都可以独立运行,但我仍然耗尽内存。不是TF安排单独的操作,以便它们不会压倒内存?如果没有,我需要明确设置某种条件依赖?最好的方法来分裂计算太大,以适应内存?

+0

谁在告诉你你的内存不足? TF抱怨,段错误,你在监视吗?在TF内部,他们目前不检查https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/common_runtime/threadpool_device_factory.cc#L26并设置一个很大的上限https://github.com /tensorflow/tensorflow/blob/master/tensorflow/core/common_runtime/threadpool_device_factory.cc#L40。我相信他们可以感谢你解决它并提交拉请求;) –

+0

TF正在抛出一个OOM错误。这实际上都在GPU上,所以我不确定你链接的页面是否相关? –

+0

在0.10版本的Placer/scheduler中没有内存感知,所以TensorFlow会尝试在分裂之后并行运行你的操作。使用较小的批量大小似乎是将工作分成足够小以适应内存的块的最自然的方式 –

回答

1

我发现功能性操作,特别是在这种情况下,map_fn,解决我的需求。通过将parallel_iterations选项设置为1(或使计算适合内存的一些小数字),我可以控制并行度并避免内存不足。