我制作了一个具有相对常见操作的张量流模型(除了几个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
答案 0 :(得分:0)
TF团队在更改其内存分配器之前(见Corresponding issue on github)解决了这个特定问题。
如果在训练过程中遇到内存增长,则常见的错误是在训练过程中将节点添加到图形中(除非您使用急切执行,否则TF不是numpy)。确保在训练循环之前调用graph.finalize()
,以确保在训练过程中未添加任何节点,这会导致许多内存增长问题。