为了账号安全,请及时绑定邮箱和手机立即绑定

在循环中构建图时,Tensorflow 内存泄漏

在循环中构建图时,Tensorflow 内存泄漏

手掌心 2021-09-11 10:03:04
当我选择 Tensorflow(1.12.0 版)模型的超参数的网格搜索由于内存消耗激增而崩溃时,我注意到了这一点。请注意,与此处类似的问题不同,我确实关闭了图形和会话(使用上下文管理器),并且我没有向循环中的图形添加节点。我怀疑 tensorflow 可能维护了在迭代之间不会被清除的全局变量,所以我在迭代之前和之后调用了 globals() 但在每次迭代之前和之后没有观察到全局变量集的任何差异。我做了一个重现问题的小例子。我在循环中训练一个简单的 MNIST 分类器并绘制该过程消耗的内存:import matplotlib.pyplot as pltimport osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'import psutilimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataprocess = psutil.Process(os.getpid())N_REPS = 100N_ITER = 10mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)x_test, y_test = mnist.test.images, mnist.test.labels# Runs experiment several times.mem = []for i in range(N_REPS):    with tf.Graph().as_default():        net = tf.contrib.layers.fully_connected(x_test, 200)        logits = tf.contrib.layers.fully_connected(net, 10, activation_fn=None)        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_test, logits=logits))        train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(loss)        init = tf.global_variables_initializer()        with tf.Session() as sess:            # training loop.            sess.run(init)            for _ in range(N_ITER):                sess.run(train_op)    mem.append(process.memory_info().rss)plt.plot(range(N_REPS), mem)结果图如下所示:在我的实际项目中,进程内存从几百 MB 开始(取决于数据集大小),直到我的系统内存不足为止增加到 64 GB。我尝试了一些减缓增长的方法,例如使用占位符和 feed_dicts 而不是依赖 convert_to_tensor。但持续的增长仍在那里,只是变慢了。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

尝试在会话中进行循环。不要为每次迭代创建图形和会话。每次创建图形并初始化变量时,您不是重新定义旧图形,而是创建导致内存泄漏的新图形。我遇到了类似的问题,并且能够通过在会话中进行循环来解决这个问题。

从如何不编程 Tensorflow

  • 在创建操作时要注意,并且只创建您需要的操作。尽量保持运算创建不同的运算执行。

  • 特别是如果您只是使用默认图形并在常规 REPL 或笔记本中交互运行,则最终可能会在图形中出现大量废弃的操作。每次重新运行定义任何图形操作的笔记本单元时,您不仅仅是在重新定义操作,而是在创建新操作。


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信