我似乎无法弄清楚这一点。我有一个使用 scikit-learn 训练的模型,保存到一个 .pkl 文件中,我想制作一个 API 来根据它进行预测。
我已经有了进行预测的代码,它在控制台/单元测试中运行良好。为了加快预测速度,我拆分数据(数千个图像 block )并使用 joblib
/multiprocessing
分散负载。
我正在设置 JOBLIB_START_METHOD=forkserver
,因为如果在 multiprocessing
进程中使用 scikit-learn 会挂起。
我已经用 flask
完成了一个 API,它使用了这段代码,当与 flask 的开发服务器一起运行时,它工作得很好。现在,我正尝试在 gunicorn
中托管 flask
应用程序,但它根本无法正常工作。
如果我使用默认工作器,那么在尝试预测时它就会挂起而不会出现错误,就像我没有设置“forkserver”多处理一样。我正在像这样运行 gunicorn
:
JOBLIB_START_METHOD=forkserver gunicorn -w 2 -b 0.0.0.0:$PORT --timeout 3600 web.app:app
我还尝试使用 gevent
后端。这确实有效,但速度很慢,并且打印如下:
多处理支持的并行循环不能嵌套在线程下,设置 n_jobs=1
因此,关于以多个网络 worker 运行的方式(我认为 Flask 的开发服务器不是这种情况)以及能够利用 joblib
的请求的任何想法>/多处理
?谢谢
最佳答案
Gevent 不会与 joblib 一起工作,因为它会生成线程来同时处理请求(请参阅此 discussion),这就是您的警告实际所说的内容。其次,它非常慢,因为 joblib 将您的并行调用转换为顺序调用并执行它们(请参阅此 discussion)。
我在使用 joblib 执行并行时遇到了同样的问题。虽然我没有使用 sklearn,但我认为以下命令也适用于您:
gunicorn -b 0.0.0.0:$SERVICE_PORT --workers=2 -t $SERVICE_TIMEOUT rest_api:app
想看完整源码的可以关注 here .
关于python - Gunicorn/flask API 暴露 sklearn 模型不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480758/