我使用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。谁能告诉我为什么?
答案 0 :(得分:0)
好吧,您可以尝试以下操作来释放会话关闭后分配的GPU内存。
将两个会话代码都放在不同的子进程中。因此,当子进程在调用sess.close()后完成时,它将释放其使用的资源。
在sess.close()之后使用tf.reset_default_graph()
使用Pool为不同的会话创建不同的单个进程
使用CUDA并尝试cuda.close
查看this链接以获取更多信息。