在循环中使用多个模型时,tensorflow 或 python 是不是存在内存清理问题?

Posted

技术标签:

【中文标题】在循环中使用多个模型时,tensorflow 或 python 是不是存在内存清理问题?【英文标题】:Does tensorflow or python have memory cleanup issues when using multiple models in loop?在循环中使用多个模型时,tensorflow 或 python 是否存在内存清理问题? 【发布时间】:2018-04-08 04:43:06 【问题描述】:

我正在研究一个占用大量 RAM 的 tensorflow 模型。它被迭代执行以处理给定的任务。

但是,随着时间的增加,整个过程开始消耗越来越多的 RAM,尽管它应该清理它。这听起来好像我会在迭代过程中保留一张图的数据,但我几乎可以肯定这些图是完全分开的。

问题

我将代码简化为以下内容:

import tensorflow as tf
import numpy as np

reps = 30
for i in range(reps):
    with tf.Graph().as_default() as graph:
        with tf.Session(graph=graph) as sess:
            tf.constant(np.random.random((1000,1000,200,1)))

我有 32GB RAM 可用,使用 CPU Tensorflow 1.3 的 ubuntu 17.04。这将在大约第 25 次或第 27 次迭代后给出以下错误消息:

在抛出 'std::bad_alloc' 的实例后调用终止 什么():std::bad_alloc

在每次迭代后给流程一些时间不会导致任何改进:

import tensorflow as tf
import numpy as np
import time

reps = 30
for i in range(reps):
    with tf.Graph().as_default() as graph:
        with tf.Session(graph=graph) as sess:
            tf.constant(np.random.random((1000,1000,200,1)))
    time.sleep(1)

但是,如果我在每次重复后强制垃圾回收调用,它就会起作用:

import tensorflow as tf
import numpy as np
import gc

reps = 30
for i in range(reps):
    with tf.Graph().as_default() as graph:
        with tf.Session(graph=graph) as sess:
            tf.constant(np.random.random((1000,1000,200,1)))
    gc.collect()

问题

现在我想知道为什么我需要强制垃圾收集运行,即使 tensorflow 应该关闭会话并取消引用图形对象。

回到我的原始模型,我不确定 gc 调用是否真的有帮助。内存使用量变得非常高,尤其是当我将模型持久化到磁盘时。

是否有关于如何以迭代方式处理大型模型的最佳实践?这是一个实际的内存问题吗?

感谢您提供任何见解。

【问题讨论】:

相关:***.com/questions/63411142/…(即使 gc.collect() 并不总是有帮助)。 【参考方案1】:

试试 tf.reset_default_graph()

Tensorflow memory leak when building graph in a loop

https://www.tensorflow.org/api_docs/python/tf/compat/v1/reset_default_graph

【讨论】:

以上是关于在循环中使用多个模型时,tensorflow 或 python 是不是存在内存清理问题?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow中一种融合多个模型的方法

如何使用for循环或条件在pandas数据框的子集中创建多个回归模型(statsmodel)?

关于同时运行多个tensorflow模型时线程创建失败

tensorflow 训练好的模型,怎么 调用

在 TensorFlow Functional API 中保存和加载具有相同图形的多个模型

TensorFlow:从 RNN 获取所有状态