У меня есть довольно стандартный код 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
класс с функцией генератора, которая выдает тот же результат, тот же результат.