Gunicorn/Blask API暴露了不起作用的Sklearn模型



我似乎无法弄清楚。我有一个模型训练了Scikit-learn,已保存到.pkl文件,我想制作一个可以根据它进行预测的API。

我已经有了预测的代码,并且可以从控制台/单元测试中运行良好。为了加快预测,我要拆分数据(数千个图像补丁),并使用joblib/multiprocessing分散负载。

我要设置JOBLIB_START_METHOD=forkserver,因为Scikit-learn如果在multiprocessing进程中使用。

我已经使用了使用此代码的flask完成了API,并且当使用Flask的Dev Server运行时,它可以正常工作。现在,我正在尝试在gunicorn中托管flask应用程序,并且根本无法正常工作。

如果我使用默认工人,那么试图预测时就不会挂着任何错误,就像我没有设置" forkserver"多处理。我正在运行gunicorn

JOBLIB_START_METHOD=forkserver gunicorn -w 2 -b 0.0.0.0:$PORT --timeout 3600 web.app:app

我还尝试使用gevent后端。这实际上确实有效,但非常慢,并且打印出来:

Multiprocessing backed parallel loops cannot be nested below threads, setting n_jobs=1

那么,以某种方式使该工作的工作人员有多个运行(我认为烧瓶的开发服务器是这种情况),并且请求能够利用joblib/multiprocessing的任何想法?谢谢

gevent无法与Joblib一起使用,因为它催生了线程以同时处理请求(请参阅此讨论),这就是您的警告实际上所说的。其次,这非常慢,因为Joblib将您的并行呼叫转换为顺序调用并执行它们(请参阅此讨论)。

我在使用Joblib进行并行性时遇到了相同的问题。尽管我没有使用Sklearn,但我认为以下命令也应该适合您:

gunicorn -b 0.0.0.0:$SERVICE_PORT --workers=2 -t $SERVICE_TIMEOUT rest_api:app

如果您想查看完整的源代码,则可以关注它这里。

相关内容

  • 没有找到相关文章

最新更新