Keras + Tensorflow и многопроцессорная обработка в Python
Я использую Keras с Tensorflow в качестве бэкэнда.
Я пытаюсь сохранить модель в моем основном процессе, а затем загрузить / запустить (т.е. вызвать model.predict
) в другом процессе.
В настоящее время я просто пытаюсь наивный подход из документов, чтобы сохранить / загрузить модель: https://keras.io/getting-started/faq/.
Итак, в основном:
model.save()
в основном процессеmodel = load_model()
в дочернем процессеmodel.predict()
в дочернем процессе
Тем не менее, он просто висит на load_model
вызов.
Обыскивая, я обнаружил этот потенциально связанный ответ, предполагая, что Keras можно использовать только в одном процессе: с использованием многопроцессорной обработки с theano, но я не уверен, что это правда (кажется, не могу найти много по этому поводу).
Есть ли способ достичь моей цели? Высоко ценится описание высокого уровня или короткий пример.
Примечание: я попытался выполнить подходы по линии передачи графа процессу, но потерпел неудачу, так как кажется, что графики тензорного потока не выбираются (связанный с этим пост SO для этого здесь: Tensorflow: передача сеанса в многопроцессный процесс Python). Если действительно есть способ передать график / модель тензорного потока дочернему процессу, то я также открыт для этого.
Спасибо!
2 ответа
Из моего опыта - проблема заключается в загрузке Keras
к одному процессу, а затем порождает новый процесс, когда keras
был загружен в вашу основную среду. Но для некоторых приложений (например, для обучения смеси Keras
модели) просто лучше иметь все это в одном процессе. Поэтому я советую следующий (немного громоздкий, но работающий на меня) подход:
НЕ ЗАГРУЖАЙТЕ KERAS В СВОЮ ОСНОВНУЮ СРЕДУ. Если вы хотите загрузить Keras / Theano / TensorFlow, делайте это только в функциональной среде. Например , не делайте этого:
import keras def training_function(...): ...
но сделайте следующее:
def training_function(...): import keras ...
Выполнять работу, связанную с каждой моделью, в отдельном процессе: я обычно создаю рабочих, которые выполняют работу (например, тренировку, настройку, оценку), и я запускаю их в отдельных процессах. Что приятно, что вся память, используемая этим процессом, полностью освобождается, когда ваш процесс завершен. Это поможет вам с множеством проблем с памятью, с которыми вы обычно сталкиваетесь, когда используете многопроцессорность или даже запускаете несколько моделей в одном процессе. Так это выглядит, например, так:
def _training_worker(train_params): import keras model = obtain_model(train_params) model.fit(train_params) send_message_to_main_process(...) def train_new_model(train_params): training_process = multiprocessing.Process(target=_training_worker, args = train_params) training_process.start() get_message_from_training_process(...) training_process.join()
Другой подход - это просто подготовка разных скриптов для разных действий модели. Но это может привести к ошибкам памяти, особенно если ваши модели занимают много памяти. ОБРАТИТЕ ВНИМАНИЕ, что по этой причине лучше делать ваше выполнение строго последовательным.
Я создал один простой пример, чтобы показать, как запустить модель Keras в нескольких процессах с несколькими графическими процессорами. Надеюсь, что этот образец может помочь вам. https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction
Я создал декоратор, который исправил мой код.
from multiprocessing import Pipe, Process
def child_process(func):
"""Makes the function run as a separate process."""
def wrapper(*args, **kwargs):
def worker(conn, func, args, kwargs):
conn.send(func(*args, **kwargs))
conn.close()
parent_conn, child_conn = Pipe()
p = Process(target=worker, args=(child_conn, func, args, kwargs))
p.start()
ret = parent_conn.recv()
p.join()
return ret
return wrapper
@child_process
def keras_stuff():
""" Keras stuff here"""