python - Gunicorn/flask API 暴露 sklearn 模型不工作

标签 python flask scikit-learn gunicorn

我似乎无法弄清楚这一点。我有一个使用 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/

相关文章:

python - 如果用户有多个电子邮件地址,我是否需要存储多个 oauth token ?

tinymce - 在 Flask/WTForms/Google App Engine 中格式化博客文章

scikit-learn - SMOTE初始化期望n_neighbors <= n_samples,但n_samples <n_neighbors

python - scikit-learn : ValueError: not enough values to unpack (expected 2, 得到 1)

python - 如何在 python 中的同一个图形上绘制多个密度图

Python获取数字的所有排列

python - 在 Tensorflow 中计算梯度

python - Tensorflow 中线程安全图的使用

python - 如何在 Flask 中显示 MySql 数据库中的图像

python - sklearn - 如何使用 TfidfVectorizer 来使用整个字符串?