【发布时间】:2018-09-07 20:36:15
【问题描述】:
我用相对常见的操作(除了几个 tf.where 和索引处理)创建了一个 tensorflow 模型,但是用非常不同的不同输入形状(模型中有许多未定义的张量形状)调用它。
在 CPU 上一切正常。 但是当您使用 GPU 时,RAM 使用量(不是 GPU 内存,是 CPU 内存)稳步增加,以填满机器的 256GB 并自行终止。
在此过程中,我收到了通常的消息:
2017-03-17 16:42:22.366601: I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 18347 get requests, put_count=18345 evicted_count=1000 eviction_rate=0.0545108 and unsatisfied allocation rate=0.0763068
2017-03-17 16:42:22.366680: I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 4385 to 4823
据我所知,这是用于 GPU 的一些 DMA 内存的池分配器。问题是它似乎永远不会满足于它所获得的驱逐率,并且永远不会结束为自己分配更多空间。
这是正常行为吗?他们有办法控制吗?目前,在内存不足之前,我无法训练模型超过 1 小时。
注意:我使用 TF 的 nigthly build 版本,因为我当前的模型运行需要一些错误修复。另外,训练过程中没有添加任何操作,因为我调用了tf.get_default_graph().finalize()
编辑: 尝试使用tcmalloc 而不是malloc 运行。没有帮助。我还使用了内存分析器,这并不是说存在内存泄漏,tcmalloc 的内存使用量稳定在 500MB,即使 top 中的内存使用量更高并且程序最终运行 OOM。
那么为什么tcmalloc 分析器不同意我在top 中看到的内存使用情况?
编辑 2: 使用更改的硬编码参数重新编译 TF 以使其“工作”。见here
【问题讨论】:
-
貌似是内存泄漏,有没有看this topic in the documentation?
-
感谢您的链接,我已经小心在使用
finalize执行期间不添加节点。将看看这个 tcmalloc 替代方案。 -
我不知道是什么导致了您的问题,但“这正常吗”的答案显然是“不”
-
最后我设法通过更改 PoolAllocator 的硬编码参数重新编译 TF 来摆脱它。我发布了一个 Github 问题 here 关于它,但我猜可怜的 TF 开发者被他们淹没了......
-
适用于出现相同症状但原因不一定相同的人。您还应该在训练之前完成您的图表,即
sess.graph.finalize()。我忘记了一次,TF 愉快地一遍又一遍地分配新内存(这是我的 python 代码中的一个错误),在几次迭代后导致了这个问题。对于调试,您还可以设置TF_CPP_MIN_VLOG_LEVEL=1
标签: memory tensorflow cpu cpu-usage