tf.Estimator переполнен ОЗУ (MemoryError) в поезде + цикл проверки - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть довольно стандартный код tf.Estimator с циклом обучения / оценки, который выглядит следующим образом:

for _ in range(params['epochs']):
    classifier.train(input_fn=lambda: input_fn(example_generator, source='train', batch_size=params['batch_size']))
    classifier.evaluate(input_fn=lambda: input_fn(example_generator, source='validation', batch_size=params['batch_size']))

Он начинается примерно с 5 ГБ ОЗУ (включая все другие задачи ЦП) и без каких-либоПомехи попадают в заполнение целых 16 ГБ.Модель обучается на графическом процессоре, но это переполнение центрального процессора.

Я не понимаю, почему использование оперативной памяти должно измениться во время выполнения этого кода.При каждом вызове .evaluate / .train накапливается еще 200 МБ ~.

Если это имеет какое-либо значение, input_fn выглядит следующим образом:

def input_fn(example_generator: ExampleGenerator, source, batch_size):
    dataset = tf.data.Dataset.from_generator(generator=lambda: example_generator.generate(source, shuffle=True),
                                             output_types=(tf.string, tf.int32, tf.int32, tf.int32, tf.int32),
                                             output_shapes=(
                                                 tf.TensorShape([]), tf.TensorShape([None]), tf.TensorShape([None]),
                                                 tf.TensorShape([None]), tf.TensorShape([])))

    # Shuffle, repeat, and batch the examples.
    dataset = dataset.padded_batch(batch_size,
                                                 padded_shapes=([], [None], [None], [None], []))

    dataset = dataset.prefetch(buffer_size=batch_size)

    iterator = dataset.make_one_shot_iterator()

    f1, f2, f3, f4, label = iterator.get_next()

    return {'f1': f1, 'f2': f2, 'f3': f3, 'f4': f4}, label

Где ExampleGenerator - этопростой класс, который просто содержит список всех примеров, имеет метод generate, который выдает примеры и перетасовывает их между вызовами.

РЕДАКТИРОВАТЬ:

Я также пытался поменять местами ExampleGenerator класс с функцией генератора, которая выдает тот же результат, тот же результат.

...