如何使用 gunicorn 将 spacy 模型有效地加载到 fastapi 中?

How to RAM efficiently load spacy models into fastapi with gunicorn?

我的 fastapi 服务器 运行 在更新为使用小型模型的 spacy_en_core_web_lg 后内存不足。

当 运行 生成 fastapi 4 gunicorn worker 时,根据内存使用情况,我认为每个 worker 都在模型中加载。有没有一种方法可以在工作人员之间共享模型,这样我就不需要在每个工作人员中加载它?

以下内容对我的情况有所帮助。 YMMV,特别是因为我没有直接使用 Spacy,而是使用 PyTorch。

我在这里写了一篇关于这个主题的长篇文章 post:http://www.streppone.it/cosimo/blog/2021/08/deploying-large-deep-learning-models-in-production/

总结如下:

  • 使用 gunicorn preload_app = True 选项,让 gunicorn 在 workers fork()
  • 之前加载您的应用程序
  • 在创建 FastAPI 应用程序之前加载模型
  • 如果模型是基于 PyTorch 的,请使用 model.eval()model.share_memory()。请在此处查看更多文档:https://pytorch.org/docs/stable/multiprocessing.html
  • 限制工人数量(您已经在这样做)。三个工人最适合我。四个好像也挺合理的,要看你的项目和要求了
  • 通过 gunicorn 限制每个 worker 的生命周期 max_requests。在我的例子中,我注意到一段时间后每个工作人员的内存使用量急剧增加,所以这个选项抑制了这种行为。

我提到的 post 中的更多链接和阅读。我对有关这些技巧的反馈非常感兴趣,因为到目前为止我还无法在网上找到任何好的参考资料。