Session()的配置是否对所有Session()对象都有效?

时间:2018-12-23 13:35:30

标签: python tensorflow

我使用Session()的配置参数来防止tensorflow进程占用所有GPU内存。我的测试代码如下:

import os
import math
import numpy as np
import tensorflow as tf


os.environ["CUDA_VISIBLE_DEVICES"] = '0'
config = tf.ConfigProto()  
config.gpu_options.allow_growth = True


input_length = 10
output_length = 10
n_epochs = 10000
n_batches = 10

X = tf.placeholder(tf.float32, [None, input_length], name="x_in")
W = tf.Variable(tf.random_uniform([input_length, output_length],
                                  -1.0 / math.sqrt(input_length),
                                  1.0 / math.sqrt(input_length)), name="w")
Out = tf.matmul(X, W, name="out")


sess1 = tf.Session(config=config)
sess2 = tf.Session()

sess2.run(tf.global_variables_initializer())
for epoch_i in range(n_epochs):
    print("epoch {}.".format(epoch_i))
    for batch in range(n_batches):
        batch = np.random.rand(50, input_length)
        out = sess2.run([Out], feed_dict={X: batch})

sess1.close()
sess2.close()

我使用sess2运行图形,GPU占用241MB。
我的问题是我只使用config=config来初始化sess1,为什么它仍然可以用于sess2?如果我在声明sess1之前关闭sess2

sess1 = tf.Session(config=config)
sess1.close()
sess2 = tf.Session()

sess2.run(tf.global_variables_initializer())
for epoch_i in range(n_epochs):
    print("epoch {}.".format(epoch_i))
    for batch in range(n_batches):
        batch = np.random.rand(50, input_length)
        out = sess2.run([Out], feed_dict={X: batch})

sess2.close()

GPU占用仍然是241 MB,而不是所有GPU。谁能告诉我为什么?

1 个答案:

答案 0 :(得分:0)

好吧,您可以尝试以下操作来释放会话关闭后分配的GPU内存。

  1. 将两个会话代码都放在不同的子进程中。因此,当子进程在调用sess.close()后完成时,它将释放其使用的资源。

  2. 在sess.close()之后使用tf.reset_default_graph()

  3. 使用Pool为不同的会话创建不同的单个进程

  4. 使用CUDA并尝试cuda.close

查看this链接以获取更多信息。