Keras + Tensorflow и многопроцессорная обработка в Python

Я использую Keras с Tensorflow в качестве бэкэнда.

Я пытаюсь сохранить модель в моем основном процессе, а затем загрузить / запустить (т.е. вызвать model.predict) в другом процессе.

В настоящее время я просто пытаюсь наивный подход из документов, чтобы сохранить / загрузить модель: https://keras.io/getting-started/faq/.
Итак, в основном:

  1. model.save() в основном процессе
  2. model = load_model() в дочернем процессе
  3. model.predict() в дочернем процессе

Тем не менее, он просто висит на load_model вызов.

Обыскивая, я обнаружил этот потенциально связанный ответ, предполагая, что Keras можно использовать только в одном процессе: с использованием многопроцессорной обработки с theano, но я не уверен, что это правда (кажется, не могу найти много по этому поводу).

Есть ли способ достичь моей цели? Высоко ценится описание высокого уровня или короткий пример.

Примечание: я попытался выполнить подходы по линии передачи графа процессу, но потерпел неудачу, так как кажется, что графики тензорного потока не выбираются (связанный с этим пост SO для этого здесь: Tensorflow: передача сеанса в многопроцессный процесс Python). Если действительно есть способ передать график / модель тензорного потока дочернему процессу, то я также открыт для этого.

Спасибо!

2 ответа

Решение

Из моего опыта - проблема заключается в загрузке Keras к одному процессу, а затем порождает новый процесс, когда keras был загружен в вашу основную среду. Но для некоторых приложений (например, для обучения смеси Kerasмодели) просто лучше иметь все это в одном процессе. Поэтому я советую следующий (немного громоздкий, но работающий на меня) подход:

  1. НЕ ЗАГРУЖАЙТЕ KERAS В СВОЮ ОСНОВНУЮ СРЕДУ. Если вы хотите загрузить Keras / Theano / TensorFlow, делайте это только в функциональной среде. Например , не делайте этого:

    import keras
    
    def training_function(...):
        ...
    

    но сделайте следующее:

    def training_function(...):
        import keras
        ...
    
  2. Выполнять работу, связанную с каждой моделью, в отдельном процессе: я обычно создаю рабочих, которые выполняют работу (например, тренировку, настройку, оценку), и я запускаю их в отдельных процессах. Что приятно, что вся память, используемая этим процессом, полностью освобождается, когда ваш процесс завершен. Это поможет вам с множеством проблем с памятью, с которыми вы обычно сталкиваетесь, когда используете многопроцессорность или даже запускаете несколько моделей в одном процессе. Так это выглядит, например, так:

    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"""
Другие вопросы по тегам