Как исправить проблему утечки памяти в Keras с помощью K.clear_session ()? - PullRequest
1 голос
/ 05 августа 2020

У меня есть сеть, которую я тренирую, загружая пакеты данных, и я использую model.train_on_batch() для этого. Если я запускаю только эту тренировочную часть, я вижу, что моя сеть прекрасно обучается при использовании ОЗУ 3% для 40+ эпох (пока что), и каждая эпоха имеет около 2000 итераций. Когда я пытаюсь выполнить проверку после каждой эпохи (что также происходит партиями), возникает очень серьезная утечка памяти, приводящая к использованию ОЗУ на 90%, и мой код убивается. Итак, я пробовал пару вещей за последние несколько дней, похоже, что model.predict() в al oop вызывает утечку памяти открытая проблема в Tensorflow GitHub . Я пробовал predict_on_batch(), такое же поведение. model(inputs, training=False) похоже замедлило утечку памяти, вместо резкого скачка с 3% - 7% - 13% - 40% - 80% - 90% (интервалы 60 сек c), оно увеличивалось как 1% в минуту. Но в какой-то момент он тоже достиг 90%. Единственное, что мне осталось попробовать из этого потока github, - это использовать K.clear_session().

Я пробовал читать документацию для K.clear_session() и некоторых сообщений SO, все предлагают использовать его при создании нескольких моделей, чего я не делаю. Итак, мой вопрос: если у меня есть одна модель, обучающаяся и оцениваемая в циклах, где я должен использовать K.clear_session() после каждой эпохи и перезагружать сохраненную модель перед каждой эпохой? Будет ли это правильно?

Помимо этого, я также получаю топологическую ошибку сортировки другая открытая проблема , поэтому мне интересно, потому ли это потому, что я тренируюсь в циклах, потому что мой код иначе не имеет циклы, и это тоже как-то вызывает утечку памяти, и K.clear_session() может как-то помочь?

Минимальный пример моей структуры кода:

from tensorflow.keras.models import Model
K = tf.keras.backend

def myModel():
    **some architecture**

ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mean_squared_error)

for e in range(numEpochs):
    for batch in range(0, num_train_batches):
        x = readImages()
        y = readLabels()
        loss = model.train_on_batch(x, y)
        

    for batch in range(0, num_val_batches):
        x = readImages()
        y = model.predict(x)
        val_loss = K.get_value(custom_mean_squared_error(x,y))
        # save predictions

# plot training vs validation loss

Tensorflow-gpu-1.14, python3 .6. Буду признателен за предложения, если я тоже что-то делаю не так.

1 Ответ

0 голосов
/ 05 августа 2020

Мне кажется, это работает, но замедляет процесс:

from tensorflow.keras.models import Model
K = tf.keras.backend

def myModel():
    **some architecture**

ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mse)

for e in range(numEpochs):
    for batch in range(0, num_train_batches):
        x = readImages()
        y = readLabels()
        # define appropriate flags for first loop
        model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
        loss = model.train_on_batch(x, y)

    model.save(model_path)

    for batch in range(0, num_val_batches):
        x = readImages()
        model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
        y = model.predict(x)
        K.clear_session()
        val_loss = K.get_value(custom_mean_squared_error(x,y))
        # save predictions

# plot training vs validation loss
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...