aru*_*run 6 python-3.x gunicorn
获得了一个使用 Flask+gunicorn(无 nginx)构建的命名实体识别(NER)机器学习推理应用程序。
\n\n该应用程序收到一个请求,其中包含存储在云中的文档的详细信息。它从云端获取文档,对其进行 NER,将结果存储在云端(如果成功),并向客户端发送成功/失败响应。SLA 是客户端在发送请求后一分钟内收到响应。NER 任务使用 python 多处理并行运行多个模型,并且非常消耗 CPU 资源。
\n\n我们目前使用的是带有 7 个线程的单个 Gunicorn“同步”工作线程。我们只使用一名工作人员,因为模型占用大量内存。这个设置大部分工作正常,除了一些线程在从云端获取文档后处理请求的过程中消失(日志中没有错误),这需要我们每隔几个小时重新启动一次gunicorn。
\n\n根据gunicorn文档:
\n\n\n\n\n默认同步工作线程假定您的应用程序在 CPU 和网络带宽方面受到资源限制。一般来说,这意味着您的应用程序不应该执行任何需要未定义时间的操作。需要一段不确定的时间的示例是对互联网的请求。
\n
我们的应用程序确实会向互联网(云存储)发出请求,并且也是 CPU 密集型的。
\n\n在这种情况下最适合使用什么工人阶级?另外,有没有更好的工人+线程组合?
\n小智 4
当您使用sync具有7个线程的worker时,Gunicorn会自动将其转换为threadsworker类型。线程配置的存在将使 Gunicorn 切换工作类型
使用更多工人时,您可能会看到更多改进。如果您的模型太大,请考虑使用 Tensorflow 服务 ( https://www.tensorflow.org/tfx/serving/docker )。除了请求批处理等其他好处之外,TF 服务在单独的进程中加载和运行模型tensorflow_model_server,因此只需要一份 ML 模型副本,这将释放您的 Gunicorn 服务器,这样您就可以启动更多的 Gunicorn 工作人员,而不必担心每个worker将自己的模型加载到内存中
现在您可以使用更多工作线程,尝试使用更多没有线程配置的同步工作线程。同步工作线程应该适合 CPU 密集型应用程序。
然后尝试使用 gevent Workers 无线程配置。gevent Worker 使用伪线程,并且应该非常适合 I/O 绑定应用程序。
将结果与同步工作人员和 gevent 工作人员进行比较,看看哪一个更好。
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |