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

占用 GPU 的服务如何解决并发?

  •  
  •   xiaoFine · 2020-05-31 19:58:41 +08:00 via iPhone · 4045 次点击
    这是一个创建于 1623 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如某个服务需要用 GPU 资源(而且不是 JAVA 写的,是 cpp 或者 Python ),是不是需要用跨语言的 MQ 来实现削峰呢(例如 rabbitMQ )
    23 条回复    2022-03-16 22:36:46 +08:00
    blless
        1
    blless  
       2020-05-31 20:03:19 +08:00 via Android
    并发是解决 IO 密集问题, 计算密集要么靠算法 要么就靠加硬件了
    helloworld000
        2
    helloworld000  
       2020-05-31 20:27:52 +08:00   ❤️ 3
    哥们我从你问的这些问题可以感觉你貌似学了不少 fancy 的名词,但是并没有都真正理解这些到底是干嘛的。。。
    David1119
        3
    David1119  
       2020-05-31 20:29:33 +08:00
    @helloworld000 哈哈哈,够 fancy~~~
    andj4cn
        4
    andj4cn  
       2020-05-31 20:37:13 +08:00
    你需要的仅仅是计算资源调度和分配,跟 MQ 没有任何卵关系
    xiaoFine
        5
    xiaoFine  
    OP
       2020-05-31 20:38:55 +08:00 via iPhone
    @blless 对,算法端已经不能提速了,gpu 资源有限,并发一高就崩了,所以想着加个消息队列
    xiaoFine
        6
    xiaoFine  
    OP
       2020-05-31 20:39:27 +08:00 via iPhone
    @andj4cn 这两个已经没法优化了
    xiaoFine
        7
    xiaoFine  
    OP
       2020-05-31 20:43:39 +08:00 via iPhone
    @helloworld000 是的,确实是个二把刀,还请指教
    janxin
        8
    janxin  
       2020-05-31 21:26:01 +08:00
    @xiaoFine 不能优化就多插卡啊
    matrix67
        9
    matrix67  
       2020-05-31 21:56:37 +08:00
    @xiaoFine 并发一高就崩了 你要限流啊。 调用 gpu 说到底也是个任务,你让任务进不来不就行了。
    inwar
        10
    inwar  
       2020-05-31 22:12:40 +08:00 via Android
    专业平台有多实例+gpu 虚拟化,自己玩可以做调度,分时间片
    sioncheng
        11
    sioncheng  
       2020-05-31 22:12:40 +08:00
    粗浅地认为,消耗 GPU 的程序应该是计算密集型的吧,而 rabbbitmq 是用来支撑 IO 密集型的程序。
    liuxey
        12
    liuxey  
       2020-05-31 22:19:24 +08:00
    分开来看
    1. 急迫需要 GPU 算力的服务,为什么要削峰,还不赶紧跑满计算出结果
    2. 不急破 GPU 算力的服务,反正不急,GPU 跑着慢慢算呗,阻塞就阻塞
    tfdetang
        13
    tfdetang  
       2020-05-31 22:33:15 +08:00 via Android
    小规模的推理服务其实不是特别需要 gpu, 因为显存 io 的开销很大,不如多分几个 cpu 推理服务。

    如果非要用 gpu,那必须用好 batch 运算。将队列中的任务压到一个 batch 里再传递到 gpu 。

    当然简单的只是做一个阻塞队列也是可以的
    hallDrawnel
        14
    hallDrawnel  
       2020-05-31 22:35:52 +08:00
    这个要看具体的算法,比如深度学习模型可以做 batch 化调度,稍微增加一小点延迟提高计算速度。计算密集型的任务问题不在于 IO 等待,在于算不完,只能加硬件或者优化算法解决。
    xiaoFine
        15
    xiaoFine  
    OP
       2020-05-31 23:01:39 +08:00 via iPhone
    @tfdetang 队列转 batch 我确实没想到!感谢,我去试试
    qieqie
        16
    qieqie  
       2020-05-31 23:07:56 +08:00
    其实楼主的想法并非没有道理,
    cuda 的驱动对于每一个 stream 是维护了一个内部的 kernel 发射队列的,
    如果超过了这个队列的上限会阻塞 cpu 线程。
    所以需要做 batch 或者在 cpu 上用 queue 调度。
    xcstream
        17
    xcstream  
       2020-05-31 23:09:28 +08:00
    就是排队,一个一个来
    different
        18
    different  
       2020-05-31 23:15:06 +08:00 via Android
    会不会是多个服务申请显存,显存不够就炸了?
    xiaoFine
        19
    xiaoFine  
    OP
       2020-05-31 23:29:39 +08:00 via iPhone
    @different 嗯对的,所以单纯的加显卡和优化模型可能对大量的并发请求而言是杯水车薪
    helloworld000
        20
    helloworld000  
       2020-06-01 07:05:39 +08:00
    好了不开玩笑了

    前面提了很多解决办法,比如加机器,multiple-queue,batch ( gang scheduling )这些都算方法之一

    但真正的得看你具体应用具体环境的。这玩意不会有银弹或者 1,2 个这些 fancy words 就能搞定的。

    整个一套里面还有很多东西,弄下来真没你想的那么简单,大公司都是有专门的 infra team 来做这些。


    给你一个正确的学习思路,你可以看看 k8s 相关文档,google borg,borg2 ( https://research.google/pubs/pub49065/) 还有 bytedance 的这个工作 https://github.com/bytedance/byteps
    xiaoFine
        21
    xiaoFine  
    OP
       2020-06-01 09:41:39 +08:00
    @helloworld000 感谢(看来还有很多路要走
    kennylam777
        22
    kennylam777  
       2020-06-01 14:36:45 +08:00
    如果你的 GPU 只是一種保證獨佔的計算資源,在 k8s 已經輕鬆解決。
    xiaoFine
        23
    xiaoFine  
    OP
       2022-03-16 22:36:46 +08:00
    回头自问自答下。
    这个要看各家的 serving 框架,目前 triton 和 torchserver 都能做到 dynamic batching 之类的功能,但本质上每次推理还是显卡独占;如果是为了省 GPU ,另一个思路是 GPU 虚拟化,暂时没实践
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2630 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:29 · PVG 18:29 · LAX 02:29 · JFK 05:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.