【发布时间】:2019-01-29 13:19:44
【问题描述】:
我有一个scikit-learn 分类器作为Dockerised Flask app 运行,使用gunicorn 启动。它以 POST 请求的形式接收 JSON 格式的输入数据,并以结果的 JSON 对象进行响应。
当应用首次使用 gunicorn 启动时,会从数据库中读取一个大型模型 (serialised with joblib),并在应用准备好接受请求之前将其加载到内存中。这可能需要 10-15 分钟。
一个可重现的例子是不可行的,但基本结构如下图所示:
from flask import Flask, jsonify, request, Response
import joblib
import json
def classifier_app(model_name):
# Line below takes 10-15 mins to complete
classifier = _load_model(model_name)
app = Flask(__name__)
@app.route('/classify_invoice', methods=['POST'])
def apicall():
query = request.get_json()
results = _build_results(query['data'])
return Response(response=results,
status=200,
mimetype='application/json')
print('App loaded!')
return app
如何配置 Flask 或 gunicorn 以在 _load_model 仍在运行时向任何传入的 http 请求返回“仍在加载”响应(或适当的错误消息)?
【问题讨论】:
-
你想创建一个进度条还是什么?
-
您可以使用 Celery 异步处理 joblib 任务。您还需要安装充当任务队列的代理,例如 RabbitMQ 或 Redis
-
@Montreal 没有进度条 - 只是对 POST 请求的 http 响应。
-
@prithajnath 这听起来很有趣,但你能解释一下它是如何解决问题的吗?应用是在joblib任务运行的时候创建的,然后如果在模型存在之前有请求进来,我们可以返回错误吗?
标签: python flask scikit-learn gunicorn