Basta ya de buscar por todo internet porque estás al lugar perfecto, contamos con la respuesta que quieres recibir pero sin liarte.
Solución:
Un problema de git de junio de 2016 (https://github.com/tensorflow/tensorflow/issues/1727) indica que existe el siguiente problema:
Actualmente, el asignador en GPUDevice pertenece a ProcessState, que es esencialmente un singleton global. La primera sesión que usa GPU lo inicializa y se libera cuando el proceso se cierra.
Por lo tanto, la única solución sería usar procesos y cerrarlos después del cálculo.
Código de ejemplo:
import tensorflow as tf
import multiprocessing
import numpy as np
def run_tensorflow():
n_input = 10000
n_classes = 1000
# Create model
def multilayer_perceptron(x, weight):
# Hidden layer with RELU activation
layer_1 = tf.matmul(x, weight)
return layer_1
# Store layers weight & bias
weights = tf.Variable(tf.random_normal([n_input, n_classes]))
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
pred = multilayer_perceptron(x, weights)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(100):
batch_x = np.random.rand(10, 10000)
batch_y = np.random.rand(10, 1000)
sess.run([optimizer, cost], feed_dict=x: batch_x, y: batch_y)
print "finished doing stuff with tensorflow!"
if __name__ == "__main__":
# option 1: execute code with extra process
p = multiprocessing.Process(target=run_tensorflow)
p.start()
p.join()
# wait until user presses enter key
raw_input()
# option 2: just execute the function
run_tensorflow()
# wait until user presses enter key
raw_input()
Así que si llamarías a la función run_tensorflow()
dentro de un proceso que creó y cerró el proceso (opción 1), la memoria se libera. si solo corres run_tensorflow()
(opción 2) la memoria no se libera después de la llamada a la función.
Puede usar la biblioteca numba para liberar toda la memoria gpu
pip install numba
from numba import cuda
device = cuda.get_current_device()
device.reset()
Esto liberará toda la memoria.
Uso numba para liberar gpu, con tensorflow no puedo encontrar un método de efecto.
import tensorflow as tf
from numba import cuda
a = tf.constant([1.0,2.0,3.0],shape=[3],name='a')
b = tf.constant([1.0,2.0,3.0],shape=[3],name='b')
with tf.device('/gpu:1'):
c = a+b
TF_CONFIG = tf.ConfigProto(
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.1),
allow_soft_placement=True)
sess = tf.Session(config=TF_CONFIG)
sess.run(tf.global_variables_initializer())
i=1
while(i<1000):
i=i+1
print(sess.run(c))
sess.close() # if don't use numba,the gpu can't be released
cuda.select_device(1)
cuda.close()
with tf.device('/gpu:1'):
c = a+b
TF_CONFIG = tf.ConfigProto(
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.5),
allow_soft_placement=True)
sess = tf.Session(config=TF_CONFIG)
sess.run(tf.global_variables_initializer())
while(1):
print(sess.run(c))