【问题标题】:loading models in FastAPI projects at startup启动时在 FastAPI 项目中加载模型
【发布时间】:2023-03-09 06:02:01
【问题描述】:

所以我目前正在开发一个为多个 NLP 服务提供服务的 FastAPI 项目。为此,我想提供 spacy 和 huggingface 的不同模型。

由于这些模型很大为每个发布请求加载模型时的推理时间很长。我的想法是在 FastAPI 启动时加载所有模型(在 app/main.py 中),但是,我不确定这是一个好的选择/想法还是存在一些缺点这种方法,因为模型将在缓存中(?)。 (信息:我想对项目进行 docker 化,然后将其部署在虚拟机上)

到目前为止,我无法在互联网上找到任何指导,所以我希望在这里得到一个好的答案:)

提前致谢!

【问题讨论】:

    标签: deployment fastapi


    【解决方案1】:

    如果您使用 gunicorn + uvicorn 工作程序堆栈部署您的应用程序。您可以使用gunicorn--preload 标志。

    来自gunicorn的文档

    preload_app

    --preload 默认值:False

    在工作进程被派生之前加载应用程序代码。

    通过预加载应用程序,您还可以节省一些 RAM 资源 加快服务器启动时间。虽然,如果你推迟申请 加载到每个工作进程,您可以重新加载您的应用程序代码 很容易通过重启工人。

    您只需在运行选项中使用--preload 标志。

    gunicorn --workers 2 --preload --worker-class=uvicorn.workers.UvicornWorker my_app:app
    

    【讨论】:

    • 嘿 Yagiz,感谢您的回答 - 因此,与其在“main.py”中加载模型,我应该坚持我当前的代码,并使用 gunicorn 和 --preload 标志集启动应用程序? 仅供参考:目前我使用自定义类加载模型,该类在发出 POST 请求时调用。 p.s.我还不能投赞成票:(
    • 嘿,我认为你可以使用单例方法。在您的main.py 中声明一次模型。然后使用它,它会在内存中加载一次模型,据我了解,您正在为每个请求创建一个新的类实例,这意味着您正在为每个请求将该模型加载到内存中,对吧?
    • 没错!我会根据您的建议更改我的代码 - 非常感谢! :)
    • @YagizDegirmenci:您能否验证我是否理解正确?如果我们使用--preload 标志,gunicorn 主线程会在启动时加载应用程序,然后当工人分叉时,他们会得到应用程序的副本?如果是这种情况,worker 加载的应用程序是否会共享相同的内存空间?这种方法有什么需要注意的警告吗?谢谢。
    猜你喜欢
    • 2023-03-18
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多