在更新到使用小型模型的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/
总结:
- 使用gunicorn
preload_app = True
选项,让gunicorn在工人fork()
之前加载应用程序 - 在FastAPI应用程序创建之前加载模型
- 如果模型是基于PyTorch的,使用
model.eval()
和model.share_memory()
。在这里查看更多文档:https://pytorch.org/docs/stable/multiprocessing.html - 限制工人的数量(你已经这样做了)。三个工人最适合我。四也似乎合理,这真的取决于你的项目和要求
- 通过gunicorn
max_requests
限制每个worker的寿命。在我的例子中,我注意到一段时间后每个worker的内存使用量急剧增加,所以这个选项限制了这种行为。
我提到的文章中的进一步链接和阅读。我对这些建议的反馈非常感兴趣,因为到目前为止我还没能在网上找到任何好的参考资料。