【问题标题】:Celery task for ML prediction hangs in execution用于 ML 预测的 Celery 任务在执行中挂起
【发布时间】:2020-05-05 09:08:03
【问题描述】:

我正在尝试创建一个 Web 应用程序,它接收来自 POST 请求的输入并根据该输入提供一些 ML 预测。

由于预测模型非常繁重,我不希望用户等待计算完成。相反,我将繁重的计算委托给 Celery 任务,用户可以稍后检查结果。

我正在使用带有 Celery、Redis 和 Flower 的简单 Flask 应用程序。

我的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
    ...

Categorizer 类中我的predict() 方法:

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

我正在像这样运行 Celery:

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

过去几天我遇到的问题是 categorizer.predict(data) 调用在执行过程中挂起。

我尝试在 post 方法中运行 categorizer.predict(data) 并且它有效。但是如果我把它放在 Celery 任务中,它就会停止工作。没有控制台日志,如果我尝试调试它,它只会在.predict() 上冻结。

我的问题:

  • 我该如何解决这个问题?
  • worker 是否有内存、CPU 限制?
  • Celery 任务是执行如此繁重计算的“正确”方式吗?
  • 如何调试这个问题?我做错了什么?
  • 在文件顶部初始化模型是否正确?

【问题讨论】:

    标签: tensorflow machine-learning flask redis celery


    【解决方案1】:

    感谢SO question 我找到了问题的答案:

    事实证明,Keras 使用 Threads 池而不是默认的 Process 更好。

    我很幸运,不久前重新引入了 Celery 4.4 Threads 池。 你可以在Celery 4.4 Changelogs阅读更多内容:

    线程任务池

    我们重新引入了一个线程任务池,使用 concurrent.futures.ThreadPoolExecutor。

    之前的线程任务池是实验性的。此外,它基于已过时的线程池包。

    您可以通过将 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
    

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2017-06-15
      • 2020-12-14
      • 2023-03-09
      • 2013-03-08
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多