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()
以确保在训练过程中不添加任何节点,这样可以解决许多内存增长问题。
我用相对常见的操作制作了一个张量流模型(除了几个 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()
以确保在训练过程中不添加任何节点,这样可以解决许多内存增长问题。