2017-09-29 37 views
1

我似乎无法弄清楚这一点。我有一个使用scikit-learn培训过的模型,保存到.pkl文件中,并且我想制作一个基于它的预测的API。Gunicorn/flask API暴露sklearn模型不起作用

我已经有了能够做出预测的代码,它可以在控制台/单元测试中正常运行。为了加速预测,我将分割数据(数千个图像补丁)并使用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后端尝试。这实际上做的工作,但它的速度很慢,而且它打印此:

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

因此,在得到这个任何想法的方式工作,有是运行多个网络工作者(我不认为是这样的话用烧瓶的开发服务器)并且请求能够利用joblib/multiprocessing?谢谢

回答

0

Gevent不会与joblib一起工作,因为它会产生线程同时处理请求(请参阅此discussion),这就是您的警告实际上所说的。其次,它非常缓慢,因为joblib将您的并行调用转换为顺序调用并执行它们(请参阅此discussion)。

我在使用joblib执行并行操作时遇到了同样的问题。虽然我没有用sklearn,我想下面的命令应该为你工作,以及:

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

如果你想看看完整的源代码,你可以按照它 here