Я пытаюсь создать веб-приложение, которое получает входные данные из запроса 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 «правильным» способом выполнения таких тяжелых вычислений?
- Как я могу отладить эту проблему? Что я делаю не так?
- Правильно ли инициализировать модели вверху файла?