【发布时间】: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