GPU PoolAllocator会爆炸CPU内存

时间:2017-03-17 15:53:52

标签: memory tensorflow cpu cpu-usage

我制作了一个具有相对常见操作的张量流模型(除了几个tf.where和索引处理之外),但是使用非常不同的输入形状(模型中有许多未定义的张量形状)来调用它。

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版本,因为我当前模型运行所需的一些错误修正。此外,在培训期间未添加任何操作,因为我调用了tf.get_default_graph().finalize()

编辑尝试使用tcmalloc代替malloc投放。没有帮助。我还使用了内存分析器,并没有说存在内存泄漏,即使top中的内存使用率更高且程序最终运行OOM,tcmalloc的内存使用量稳定在500MB。 那么为什么tcmalloc分析器不同意我在top中看到的内存使用情况?

编辑2:使用已更改的硬编码参数重新编译TF以使其“正常工作”。见here

1 个答案:

答案 0 :(得分:0)

TF团队在更改其内存分配器之前(见Corresponding issue on github)解决了这个特定问题。

如果在训练过程中遇到内存增长,则常见的错误是在训练过程中将节点添加到图形中(除非您使用急切执行,否则TF不是numpy)。确保在训练循环之前调用graph.finalize(),以确保在训练过程中未添加任何节点,这会导致许多内存增长问题。