【问题标题】:Sharing data across my gunicorn workers在我的 gunicorn 员工之间共享数据
【发布时间】:2017-09-14 00:08:19
【问题描述】:

我有一个 Flask 应用程序,由 Nginx 和 Gunicorn 提供服务,有 3 个工作人员。我的 Flask 应用程序是一个 API 微服务,专为进行 NLP 工作而设计,我正在使用 spaCy 库。

我的问题是他们正在占用大量 RAM,因为加载 spaCy 管道spacy.load('en') 非常占用内存,并且由于我有 3 个 gunicorn 工人,每个人将占用大约 400MB 的 RAM。

我的问题是,有没有办法一次性加载管道并在我所有的 gunicorn 工人之间共享?

【问题讨论】:

  • 也许你可以使用 gunicorn 的preload_app。见stackoverflow.com/a/27242874/7724457
  • 你找到解决办法了吗?
  • @Lee,你在这方面有什么发现吗?
  • 你如何使用你的gunicorn worker,即线程或进程?如果进程可以使用redis吗?
  • 这个问题几乎是我发的。我有完全相同的设置!

标签: python gunicorn spacy


【解决方案1】:

This 是一个在 2021 年使用 Python3.6 和 3.9(均经过测试)有效的答案。我和你有同样的设置,使用烧瓶来部署 Spacy NLU API。解决方案是简单地将--preload 附加到gunicorn 命令,如下所示: gunicorn src.main:myFlaskApp --preload。这将导致fork 在整个src/main.py 文件已执行之后发生,而不是在myFlaskApp = Flask(__name__) 之后发生。

【讨论】:

    【解决方案2】:

    我需要在实例之间共享千兆字节的数据并使用内存映射文件 (https://docs.python.org/3/library/mmap.html)。如果您需要从池中的每个请求检索的数据量很小,这很好。否则,您可以在找到已安装文件的位置安装 ramdisk。

    由于我不熟悉 SpaCy,我不确定这是否有帮助。我将有一名工作人员在加载(spacy.load?)时实际处理数据并将生成的文档(酸洗/编组)写入其他工作人员可以从中读取的 mmf。

    要更好地了解 mmap,请查看 https://realpython.com/python-mmap/

    【讨论】:

      【解决方案3】:

      在工作人员之间共享内存中的管道可能会对您有所帮助。

      请查看gc.freeze

      我认为,只需在您的 app.py 中执行此操作:

      1. 冻结 gc
      2. 加载管道或任何其他将使用大量内存的资源
      3. 解冻 gc

      和,

      • 确保您的工作人员不会修改(直接或间接)在冻结期间创建的任何对象
      • 将 app.py 传递给 gunicorn

      fork发生时,那些持有大资源的内存页不会被操作系统真正复制,因为你要确保上面没有写操作。

      如果不冻结 gc,内存页仍然会被写入,因为 gc 正在写入对象引用计数。这就是为什么冻结很重要。

      我只知道这种方法,但我没有尝试过。

      【讨论】:

      • 顺便说一下,gc冻结首先是在python3.7中加入的
      【解决方案4】:

      一种解决方法是,您可以预先加载 spaCy 管道,腌制(或任何舒适的序列化方式)结果对象并将其存储在数据库或文件系统中。每个工作人员都可以获取序列化的对象,然后简单地反序列化它。

      【讨论】:

      • 在模块中腌制它会起作用吗?我正在考虑在脚本中加载模块,导入它,然后启动工作人员。如果这样做,工人会接受进口吗?
      • 当您在脚本中加载模块并导入时,导入功能肯定会起作用。但是您仍然会面临高内存消耗的问题,因为每个工作人员都会再次独立加载它。您必须在启动 Flask 应用程序之前单独腌制它,并将序列化文件存储在工作人员可以访问的位置。
      猜你喜欢
      • 2017-08-23
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2011-01-13
      • 2011-06-03
      相关资源
      最近更新 更多