GPU PoolAllocator 爆炸 CPU 内存

GPU PoolAllocator explodes the CPU memory

我用相对常见的操作制作了一个张量流模型(除了几个 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 内存的池分配器。问题是它似乎永远不会满足于它获得的驱逐率,并且永远不会结束为自己分配更多 space。

这是正常现象吗?他们是控制这个的方法吗?现在,在运行内存不足

之前,我无法训练超过 1 小时的模型

注意:我使用 TF 的 nigthly build 版本,因为我当前的模型需要一些错误修复 运行。另外,在训练期间没有添加任何操作,因为我调用了 tf.get_default_graph().finalize()

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

编辑 2: 使用更改的硬编码参数重新编译 TF 使其成为 "work"。参见 here

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

如果您在训练过程中遇到内存增长,一个常见的错误是在训练过程中节点被添加到图中(TF 不是 numpy,除非您使用 eager execution)。确保在训练循环之前调用 graph.finalize() 以确保在训练过程中不添加任何节点,这样可以解决许多内存增长问题。