Keras переменная () утечка памяти - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в Keras, и тензор потока в целом, и у меня есть проблема. Я использую некоторые из функций потерь (главным образом, binary_crossentropy и mean_squared_error) для расчета потерь после прогнозирования. Поскольку Keras принимает только свой собственный тип переменной, я создаю его и указываю в качестве аргумента. Этот сценарий выполняется в цикле (со сном) следующим образом:

Получить соответствующие данные -> предсказать -> рассчитать потерянные -> вернуть их.

Поскольку у меня есть несколько моделей, которые следуют этому шаблону, я создал графики и сеансы тензорного потока для предотвращения столкновений (также при экспорте весов моделей у меня были проблемы с одним графиком и сессией, поэтому мне пришлось создавать разные для каждой отдельной модели).

Тем не менее, теперь память неуправляемо растет, с пары МБ до 700 МБ за пару итераций. Мне известны функции clear_session () и gc.collect () Keras, и я использую их в конце каждой итерации, но проблема все еще присутствует. Здесь я предоставляю фрагмент кода, который не является реальным кодом, из проекта. Я создал отдельный скрипт, чтобы изолировать проблему:

import tensorflow as tf

from keras import backend as K
from keras.losses import binary_crossentropy, mean_squared_error

from time import time, sleep
import gc
from numpy.random import rand

from os import getpid
from psutil import Process

from csv import DictWriter
from keras import backend as K

this_process = Process(getpid())

graph = tf.Graph()
sess = tf.Session(graph=graph)

cnt = 0
max_c = 500

with open('/home/quark/Desktop/python-test/leak-7.csv', 'a') as file:
    writer = DictWriter(file, fieldnames=['time', 'mem'])
    writer.writeheader()

    while cnt < max_c:  
        with graph.as_default(), sess.as_default():         
            y_true = K.variable(rand(36, 6))
            y_pred = K.variable(rand(36, 6))

            rec_loss = K.eval(binary_crossentropy(y_true, y_pred))
            val_loss = K.eval(mean_squared_error(y_true, y_pred))

            writer.writerow({
                'time': int(time()),
                'mem': this_process.memory_info().rss
            })

        K.clear_session()
        gc.collect()

        cnt += 1
        print(max_c - cnt)
        sleep(0.1)

Кроме того, я добавил график использования памяти: утечка памяти Keras

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

В итоге я удалил код K.variable() из оператора where. Таким образом, переменные являются частью графика по умолчанию, который позже очищается с помощью K.clear_session().

0 голосов
/ 08 ноября 2018

Я только что удалил оператор with (возможно, некоторый tf-код), и я не вижу никакой утечки. Я полагаю, что есть разница между сеансом keras и сеансом по умолчанию. Таким образом, вы не очищали правильный сеанс с K.clear_session(). Возможно, использование tf.reset_default_graph() тоже может сработать.

while True: 
    y_true = K.variable(rand(36, 6))
    y_pred = K.variable(rand(36, 6))

    val_loss = K.eval(binary_crossentropy(y_true, y_pred))
    rec_loss = K.eval(mean_squared_error(y_true, y_pred))

    K.clear_session()
    gc.collect()

    sleep(0.1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...