首页 > 解决方案 > 哪种 gunicorn worker 类型用于机器学习推理?

问题描述

获得了一个使用 flask+gunicorn(无 nginx)构建的命名实体识别 (NER) 机器学习推理应用程序。

该应用程序接收一个请求,其中包含存储在云中的文档的详细信息。它从云中获取文档,对其进行 NER,将结果存储在云中(如果成功),并向客户端发送成功/失败响应。SLA 是客户端在发送请求后一分钟内收到响应。NER 任务使用 python 多处理并行运行多个模型,并且非常占用 CPU。

我们目前正在使用具有 7 个线程的单个 gunicorn 'sync' worker。我们只使用一个工人,因为模型占用了大量内存。这种设置大部分工作正常,除了一些线程在从云获取文档后在处理请求的过程中消失(日志中没有错误),这需要我们每隔几个小时重新启动 gunicorn。

根据gunicorn 文档

默认同步工作程序假定您的应用程序在 CPU 和网络带宽方面是资源受限的。一般来说,这意味着您的应用程序不应该做任何花费未定义时间的事情。花费未定义时间的示例是对 Internet 的请求。

我们的应用程序确实向互联网(云存储)发出请求,并且也是 CPU 密集型的。

在这种情况下,最好的工人阶级是什么?另外,有没有更好的工人+线程组合?

标签: python-3.xgunicorn

解决方案


  1. 当你使用sync带有 7 个线程的 worker 时,Gunicorn 会自动将其转换为threadsworker 类型。线程配置的存在会使 Gunicorn 切换 worker 类型

  2. 使用更多工人时,您可能会看到更多改进。如果您的模型太大,请考虑使用 Tensorflow 服务 ( https://www.tensorflow.org/tfx/serving/docker )。除了请求批处理等其他好处外,TF 服务在单独的进程中加载​​和运行模型tensorflow_model_server,因此只需要一个 ML 模型副本,这将释放您的 Gunicorn 服务器,因此您可以启动更多 Gunicorn 工作人员而无需担心每个工人将自己的模型加载到内存中

  3. 现在您可以使用更多工作人员,请尝试使用更多没有线程配置的同步工作人员。同步工作者应该对 CPU 绑定应用程序很好。

  4. 然后尝试使用 gevent workers 没有线程配置。gevent worker 使用伪线程,应该非常适合 I/O 绑定应用程序。

  5. 将结果与同步工作人员和 gevent 工作人员进行比较,看看哪个更好。


推荐阅读