Задача сельдерея для предсказания ML висит в выполнении - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь создать веб-приложение, которое получает входные данные из запроса POST и предоставляет некоторые прогнозы ML на основе этих входных данных.

Поскольку модель прогнозирования довольно тяжелая, я не хочу, чтобы пользователь ждал для расчета, чтобы завершить. Вместо этого я делегировал тяжелые вычисления задаче Celery, и пользователь может позже проверить результат.

Я использую простое приложение Flask с Celery, Redis и Flower.

My view.py:

@ns.route('predict/')
class Predict(Resource):
    ...
    def post(self):
        ...
        do_categorize(data)
        return jsonify(success=True)

Мой tasks.py файл выглядит примерно так:

from ai.categorizer import Categorizer
categorizer = Categorizer(
    model_path='category_model.h5',
    tokenizer_path='tokenize.joblib',
    labels_path='labels.joblib'
)


@task()
def do_categorize(data):
    result = categorizer.predict(data)
    print(result)
    # Write result to the DB
    ...

Мой predict() метод внутри Categorizer класс:

def predict(self, value):
    K.set_session(self.sess)
    with self.sess.as_default():
        with self.graph.as_default():
            prediction = self.model.predict(np.asarray([value], dtype='int64'))
            return prediction

I ' Я запускаю Celery так:

celery worker -A app.celery --loglevel=DEBUG

Проблема, с которой я сталкиваюсь последние пару дней, заключается в том, что categorizer.predict(data) вызов зависает в середине выполнения.

Я пытался запустить categorizer.predict(data) внутри метода post, и это работает. Но если я помещу это в задачи сельдерея, он перестанет работать. Нет журнала консоли, если я пытаюсь его отладить, он просто зависает на .predict().

Мои вопросы:

  • Как мне решить эту проблему?
  • Есть ли память, лимит ЦП для рабочего?
  • Являются ли задачи Celery «правильным» способом выполнения таких тяжелых вычислений?
  • Как я могу отладить эту проблему? Что я делаю не так?
  • Правильно ли инициализировать модели вверху файла?

1 Ответ

0 голосов
/ 19 января 2020

Благодаря этому ТАКому вопросу Я нашел ответ для своей проблемы:

Оказывается, для Keras лучше работать с пулом Threads вместо значения по умолчанию Process.

К счастью для меня, с Celery 4.4 Threads пул был вновь введен не долго go. Вы можете прочитать больше на Celery 4.4 Changelogs :

Пул многопоточных задач

Мы вновь представили пул многопоточных задач с помощью concurrent.futures.ThreadPoolExecutor.

Предыдущий многопоточный пул задач был экспериментальным. Кроме того, он был основан на устаревшем пакете threadpool.

Вы можете использовать новый пул многопоточных задач, задав для worker_pool значение «threads» или передав поток –pool в команду celery worker.

Теперь вы можете использовать потоки вместо процессов для пула.

celery worker -A your_application --pool threads --loginfo=INFO

Если вы не можете использовать последнюю версию Celery, у вас есть возможность использовать пакет gevent:

pip install gevent
celery worker -A your_application --pool gevent --loginfo=INFO
...