• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xiaoFine
V2EX  ›  程序员

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

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

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

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

    前面提了很多解决办法,比如加机器,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
    xiaoFine
    OP
    Jun 1, 2020
    21
    @helloworld000 感谢(看来还有很多路要走
    kennylam777
    kennylam777
    Jun 1, 2020
    22
    如果你的 GPU 只是一種保證獨佔的計算資源,在 k8s 已經輕鬆解決。
    xiaoFine
    xiaoFine
    OP
    Mar 16, 2022
    23
    回头自问自答下。
    这个要看各家的 serving 框架,目前 triton 和 torchserver 都能做到 dynamic batching 之类的功能,但本质上每次推理还是显卡独占;如果是为了省 GPU ,另一个思路是 GPU 虚拟化,暂时没实践
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1309 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 21:39 · PVG 05:39 · LAX 13:39 · JFK 16:39
    ♥ Do have faith in what you're doing.