У меня утечка памяти с TensorFlow. Я ссылался на Tensorflow: утечка памяти даже при закрытии сессии? чтобы решить мою проблему, и я последовал советам ответа, который, казалось, решил проблему. Однако это не работает здесь.
Чтобы воссоздать утечку памяти, я создал простой пример. Во-первых, я использую эту функцию (которую я получил здесь: Как узнать текущее использование процессора и оперативной памяти в Python?), Чтобы проверить использование памяти процессом python:
def memory():
import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30 # memory use in GB...I think
print('memory use:', memoryUse)
Затем, каждый раз, когда я build_model
функцию build_model
, использование памяти увеличивается.
Вот функция build_model
с утечкой памяти:
def build_model():
'''Model'''
tf.reset_default_graph()
with tf.Graph().as_default(), tf.Session() as sess:
tf.contrib.keras.backend.set_session(sess)
labels = tf.placeholder(tf.float32, shape=(None, 1))
input = tf.placeholder(tf.float32, shape=(None, 1))
x = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense1')(input)
x1 = tf.contrib.keras.layers.Dropout(0.5)(x)
x2 = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense2')(x1)
y = tf.contrib.keras.layers.Dense(1, activation='sigmoid', name='dense3')(x2)
loss = tf.reduce_mean(tf.contrib.keras.losses.binary_crossentropy(labels, y))
train_step = tf.train.AdamOptimizer(0.004).minimize(loss)
#Initialize all variables
init_op = tf.global_variables_initializer()
sess.run(init_op)
sess.close()
tf.reset_default_graph()
return
Я бы подумал, что использование блока with tf.Graph().as_default(), tf.Session() as sess:
а затем закрытие сессии и вызов tf.reset_default_graph
очистит всю память, используемую TensorFlow. Видимо это не так.
Утечка памяти может быть воссоздана следующим образом:
memory()
build_model()
memory()
build_model()
memory()
Вывод этого (для моего компьютера):
memory use: 0.1794891357421875
memory use: 0.184417724609375
memory use: 0.18923568725585938
Ясно видно, что вся память, используемая TensorFlow, впоследствии не освобождается. Зачем?
Я составил график использования памяти за 100 итераций вызова build_model
, и вот что я получаю:
Я думаю, что это показывает, что есть утечка памяти.