python-3.x - 哪种 gunicorn worker 类型用于机器学习推理?
问题描述
- gunicorn 版本:19.9.0
- 蟒蛇版本:3.7.0
获得了一个使用 flask+gunicorn(无 nginx)构建的命名实体识别 (NER) 机器学习推理应用程序。
该应用程序接收一个请求,其中包含存储在云中的文档的详细信息。它从云中获取文档,对其进行 NER,将结果存储在云中(如果成功),并向客户端发送成功/失败响应。SLA 是客户端在发送请求后一分钟内收到响应。NER 任务使用 python 多处理并行运行多个模型,并且非常占用 CPU。
我们目前正在使用具有 7 个线程的单个 gunicorn 'sync' worker。我们只使用一个工人,因为模型占用了大量内存。这种设置大部分工作正常,除了一些线程在从云获取文档后在处理请求的过程中消失(日志中没有错误),这需要我们每隔几个小时重新启动 gunicorn。
根据gunicorn 文档:
默认同步工作程序假定您的应用程序在 CPU 和网络带宽方面是资源受限的。一般来说,这意味着您的应用程序不应该做任何花费未定义时间的事情。花费未定义时间的示例是对 Internet 的请求。
我们的应用程序确实向互联网(云存储)发出请求,并且也是 CPU 密集型的。
在这种情况下,最好的工人阶级是什么?另外,有没有更好的工人+线程组合?
解决方案
当你使用
sync
带有 7 个线程的 worker 时,Gunicorn 会自动将其转换为threads
worker 类型。线程配置的存在会使 Gunicorn 切换 worker 类型使用更多工人时,您可能会看到更多改进。如果您的模型太大,请考虑使用 Tensorflow 服务 ( https://www.tensorflow.org/tfx/serving/docker )。除了请求批处理等其他好处外,TF 服务在单独的进程中加载和运行模型
tensorflow_model_server
,因此只需要一个 ML 模型副本,这将释放您的 Gunicorn 服务器,因此您可以启动更多 Gunicorn 工作人员而无需担心每个工人将自己的模型加载到内存中现在您可以使用更多工作人员,请尝试使用更多没有线程配置的同步工作人员。同步工作者应该对 CPU 绑定应用程序很好。
然后尝试使用 gevent workers 没有线程配置。gevent worker 使用伪线程,应该非常适合 I/O 绑定应用程序。
将结果与同步工作人员和 gevent 工作人员进行比较,看看哪个更好。
推荐阅读
- json - 用 jq 过滤嵌套数组
- javascript - 如何使用 JS 'onClickEvent()' 在 HTML 中的表格上设置数字
- yaml - YAML合并2套
- python-3.x - 抓取所有 youtube 搜索结果
- python - 如何覆盖python的“不在”运算符
- c++ - Segmentation fault 调试器报错信息是什么意思?
- python - 为什么堆叠 CNN 会破坏可重复性(即使使用种子和 CPU)?
- javascript - 按每个对象数组中的值对对象数组进行排序
- systemd - systemd 上 emmc 上的 ioctl() 需要哪些功能?
- javascript - 密码字段仅在输入用户名后才显示?