Keras / Tensorflow: обучайте несколько моделей на одном графическом процессоре в цикле или с помощью процесса

У меня есть несколько моделей для обучения в Keras / Tensorflow подряд, одна за другой, без ручного вызова train.py, поэтому я сделал:

for i in range(0, max_count):
    model = get_model(i)   # returns ith model
    model.fit(...)
    model.save(...)

Он отлично работает с i=0 (и на самом деле отлично работает при отдельном запуске). Проблема в том, что при загрузке второй модели я получаю ResourceExhaustedError OOM, поэтому я попытался освободить память в конце цикла for.

del model
keras.backend.clear_session()
tf.clear_session()
tf.reset_default_graph()
gc.collect()

ни один из которых индивидуально или коллективно не работает.

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

Также из этого keras проблема

Update (2018/08/01): Currently only TensorFlow backend supports proper cleaning up of the session. This can be done by calling K.clear_session(). This will remove EVERYTHING from memory (models, optimizer objects and anything that has tensors internally). So there is no way to remove a specific stale model. This is not a bug of Keras but a limitation of the backends.

Итак, очевидно, что нужно создавать процесс каждый раз, когда я загружаю модель и жду ее завершения, а затем создаю еще один в новом процессе, как здесь:

import multitasking
def train_model_in_new_process(model_module, kfold_object, x, y, x_test, y_test, epochs, model_file_count):
    training_process = multiprocessing.Process(target=train_model, args=(x, y, x_test, y_test, epochs, model_file_count, ))
    training_process.start()
    training_process.join()

но затем он выдает эту ошибку:

  File "train.py", line 110, in train_model_in_new_process
    training_process.start()
  File "F:\Python\envs\tensorflow\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle module objects
Using TensorFlow backend.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "F:\Python\envs\tensorflow\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

Я действительно не могу использовать информацию, представленную в ошибке, чтобы понять, что я делал не так. Он явно указывает на строку training_process.start(), но я не могу понять, в чем проблема.

Приветствуется любая помощь в обучении моделей с использованием цикла for или с использованием Process.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
943
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по всему, Multiprocessing не любит modules, а точнее importlib модули. Я загружал модели из пронумерованных файлов .py с помощью importlib

model_module = importlib.import_module(model_file)

отсюда и беда.

Я сделал то же самое внутри Process, и все было нормально :)

Но я все еще НЕ мог найти способ сделать это без Processes, используя fors. Если у вас есть ответ, разместите его здесь, пожалуйста. Но в любом случае, я продолжаю работать с процессами, потому что они, как мне кажется, чище в том смысле, что они изолированы и по завершении очищают всю память, выделенную для этого конкретного.

Другие вопросы по теме