我似乎无法弄清楚。我有一个模型训练了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
如果您想查看完整的源代码,则可以关注它这里。