GPU PoolAllocator会爆炸CPU内存

Ben*_*uin 12 memory cpu cpu-usage tensorflow

我制作了一个具有相对常见操作的张量流模型(除了一些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
Run Code Online (Sandbox Code Playgroud)

据我所知,GPU的某些DMA内存的池分配器.问题是它似乎永远不会满足它所获得的驱逐率,并且永远不会为自己分配更多的空间.

这是正常的行为吗?他们是控制这个的方法吗?现在,在耗尽内存之前,我无法训练模型超过1小时.

注意:我使用TF的nigthly构建版本,因为我当前模型运行所需的一些错误修正.此外,在训练期间没有添加任何操作,因为我打电话tf.get_default_graph().finalize()

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

编辑2:重新编译TF与改变硬编码参数,使其"工作".看到这里

Ben*_*uin 0

TF 团队不久前在更改内存分配器时解决了这个具体问题(请参阅github 上的相应问题)。

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