如何用gunicorn有效地将空间模型加载到fastapi ?



在更新到使用小型模型的spacy_en_core_web_lg后,我的fastapi服务器遇到了内存不足的挑战。

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

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

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

总结:

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

我提到的文章中的进一步链接和阅读。我对这些建议的反馈非常感兴趣,因为到目前为止我还没能在网上找到任何好的参考资料。

最新更新