tensorflow.keras.fit использует все больше и больше памяти до сбоя

#tensorflow #keras #memory-leaks

#tensorflow #keras #утечки памяти

Вопрос:

Я пытаюсь решить упражнение из книги по машинному обучению, в котором классификатор должен быть обучен набору данных cifar10 с использованием tensorflow и keras. Я приложил пример кода. Код выполняется в записной книжке Jupyter внутри PyCharm.

 import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

import time
import os

import tensorflow as tf
from tensorflow import keras

tf.random.set_seed(42)
np.random.seed(42)

def build_model():
    # Build a model as instructed
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=[32, 32, 3]))
    for i in range(20):
        model.add(keras.layers.Dense(100,
                                     activation=keras.activations.elu,
                                     kernel_initializer=tf.keras.initializers.HeNormal))

    model.add(keras.layers.Dense(10, activation=keras.activations.softmax))

    return model

model = build_model()

# Load the CIFAR10 image dataset
cifar10 = keras.datasets.cifar10.load_data()

X_train = cifar10[0][0] / 255.
X_test = cifar10[1][0] / 255.
y_train = cifar10[0][1]
y_test = cifar10[1][1]
print(X_train.max())
from sklearn.model_selection import train_test_split

# Split the data
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.1, shuffle= True)



model = build_model()
root_logdir = os.path.join(os.curdir, "my_logs_11-8")

def get_run_logdir():
    run_id = time.strftime("run_%Y_%m_%d_%H_%M_%S")
    return os.path.join(root_logdir, run_id)

run_logdir = get_run_logdir()

tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)
model.compile(optimizer=keras.optimizers.Nadam(lr=5e-5), loss="sparse_categorical_crossentropy")
history = model.fit(X_train, y_train, epochs=100,
                    validation_data=(X_valid, y_valid),
                    callbacks=[tensorboard_cb],
                    batch_size=32)
  

Здесь я уже сталкиваюсь с проблемами:

  1. Я не могу пройти несколько эпох (10-20), потому что с каждой эпохой процесс python занимает все больше и больше памяти. На моей машине 16 ГБ, из которых 12 ГБ обычно свободны. Когда память заполнена, моя IDE (PyCharm) выходит из строя, и процесс python завершается. Это из-за утечки памяти? Что я могу сделать, чтобы это исправить?

  2. Для каждой эпохи keras измеряет предполагаемое время, сколько времени заняла эта эпоха. Однако измеренное время намного меньше, чем время работы на стене (24 с / эпоха против ~ 60 с / эпоха). Книга, за которой я следую, похоже, обеспечивает гораздо более быстрое обучение на гораздо более слабой машине. Как это может быть?

Комментарии:

1. когда я запускал ваш код на colab, он использовал 3 ГБ памяти и не зависал, поэтому я предполагаю, что утечки памяти нет.

2. Я могу подтвердить, что запуск этого на colab работает и для меня. Есть идеи, как моя личная среда на моем компьютере может вызвать эту проблему? Я использую ту же версию tensorflow (2.3.0) и tensorflow.keras (2.4.0), что и colab…

3. Дополнение: запуск кода за пределами Jupyter Notebook также работает нормально. Эта проблема должна быть связана с Jupyter. Есть идеи?