memory - GPU PoolAllocator 爆 CPU 内存

标签 memory tensorflow cpu cpu-usage

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

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

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

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

最佳答案

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

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

关于memory - GPU PoolAllocator 爆 CPU 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42861956/

相关文章:

java - Tomcat 在部署 WebSocket 应用程序后逐渐耗尽内存

c++ - 编译器如何以及在内存中的什么位置存储有关变量类型的信息?

c - 添加新功能会导致内存损坏

tensorflow - keras 训练的 DenseNet 模型的 TensorFlow-lite 转换的量化性能差异很大

Tensorflow 成本等于无

java - RMI 性能太慢

c# - C# 程序能否以某种方式测量其自身的 CPU 使用率?

c - 如何知道 x264 是否使用多处理器 Windows

c++ - 类在内存中是否比它们在 C++ 中的成员大?

tensorflow 每次运行发现多个图形事件