V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Oilybear
V2EX  ›  Flask

给算法模型做后端的 flask 在生产部署时是否还需要 Gunicorn+ Gevent

  •  
  •   Oilybear · 2023-03-21 16:53:19 +08:00 · 2894 次点击
    这是一个创建于 736 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT, flask 时一个通常情况下是一个单进单线框架,所以生产一般会还会套一层 Gunicorn + Gevent 来满足并发需求,但是最近在给模型封装 webapi 的时候我萌生疑问:

    1. 对于计算密集型的服务是否还需要 Gunicorn+ Gevent
    2. 对于问题 1 是否需要区分 gpu 部署场景和 cpu 部署场景
    11 条回复    2024-03-19 09:39:30 +08:00
    yinmin
        1
    yinmin  
       2023-03-21 17:05:09 +08:00
    Gunicorn 是一定要用的,Gevent 要具体分析。Gevent 是基于协程的,需要连续 2 次 IO(例如:数据库、redis 、文件等)之间没有长时间的密集计算,否则会卡卡的。如果有长时间封闭式密集计算,Gunicorn+thread 更好些。
    对于第二个问题,Gevent 模式不区分 gpu 和 cpu ,只考虑协程模式下,多协程能否有效运行。
    yinmin
        2
    yinmin  
       2023-03-21 17:20:46 +08:00   ❤️ 1
    使用 Gunicorn + Gevent ,如果长时间无 io 的密集计算,需要定期运行 gevent.sleep(),把控制权交回 gevent 的事件循环,允许其他协程运行。同时,启用多个 workers 来提升并发量。
    Oilybear
        3
    Oilybear  
    OP
       2023-03-21 17:21:39 +08:00
    @yinmin 很感谢回复,可能我这个问题的核心确实应该是问 “是否还需要 gevent” 更合适一些,因为目前的服务为纯计算服务,慢 IO 我想应该只有异常日志会触发磁盘 IO ,所以想来可能确实不需要 gevent
    Oilybear
        4
    Oilybear  
    OP
       2023-03-21 17:24:27 +08:00
    另外还想向大家咨询,如果服务器上 GPU 不支持 VM 的话,使用 docker 部署多个容器使用同一块 GPU 是否类似于抢占式的场景,还是类似多线或者多进程并行场景
    yinmin
        5
    yinmin  
       2023-03-21 17:49:26 +08:00
    @Oilybear Gunicorn+gthread 更合适。
    yinmin
        6
    yinmin  
       2023-03-21 17:50:30 +08:00
    @Oilybear 不需要 gevent
    so1n
        7
    so1n  
       2023-03-21 17:55:26 +08:00
    如果给算法模型做 gateway 没有 IO 操作 gevent 可以不要
    hsfzxjy
        8
    hsfzxjy  
       2023-03-21 17:57:35 +08:00 via Android
    @Oilybear #4 类似于多进程
    chenzi0103
        9
    chenzi0103  
       2023-03-21 23:41:51 +08:00
    用 ray 来实现
    dayeye2006199
        10
    dayeye2006199  
       2023-03-22 01:41:13 +08:00
    gthread ,甚至流量不大的时候 sync 模式都可以。
    online inference 一般不会上 GPU ,因为往 GPU 上面来回搬数据也是有 overhead 的。特别是你自己写的服务,没有做 batching 的话,就是不断的搬很小的 tensor ,做很简单的运算。这个时候这个 IO 开销会超过运算开销。

    如果是做批量 inference (比如在数据管道里),可以考虑上 GPU 。

    几个程序一起用 GPU 我记得默认和多进程模型类似,timesharing 模式,不同进程切分为 time slices ,上 GPU 执行,CUDA 里面有个中央的调度器。
    nvidia 也有更高级的执行模式(可能要收费的),可以几个 kernel 一起上 GPU 并行执行,这样程序就不用中断。
    但这个 schedule 算法是闭源的,谁也说不清楚是咋弄的,
    zeromovie
        11
    zeromovie  
       2024-03-19 09:39:30 +08:00
    我是用 fastapi 加上 uvicorn 做算法的封装,配合 asyncio ,也能满足异步需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3272 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:31 · PVG 19:31 · LAX 04:31 · JFK 07:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.