基于双 Roaring Bitmap 的无锁 GPU 调度方案

解决 AI 云中 GPU 资源调度的并发瓶颈,通过双位图状态机实现零数据库读取、低延迟防过载。
基于双 Roaring Bitmap 的无锁 GPU 调度方案
在构建高并发的 Serverless AI 云平台时,GPU 资源的调度是决定系统稳定性的关键。对于像 Ticketmaster 或 Live Nation 这样的平台工程师而言,如何让成千上万个调度器同时高效地分配 H100 或其他高性能实例,是一个巨大的挑战。传统的调度方式往往面临数据库过载、缓存失效和竞态条件等问题。
传统调度方案的痛点
在传统的架构中,每当有新的工作负载请求(例如需要预加载 Llama-3-70B 模型的 vLLM 实例)时,调度器通常需要向数据库发起查询:检查特定机架(Rack)中哪些运行时(Runtime)处于可用状态。
然而,随着请求量的激增,这种简单的查询会演变成灾难。当几十个调度代理同时扫描同一机架,并尝试抢占相同的 GPU 槽位时,会出现严重的竞态条件。如果所有调度器都基于过时的“可用”状态进行分配,会导致请求被路由到内存已满的节点,从而引发请求失败、冷启动超时甚至容器崩溃。
此外,依赖数据库查询会导致数据库 CPU 飙升至 100%,而使用 Redis 缓存又难以在超高并发下同步缓存失效。我们急需一种既能快速判断状态,又无需频繁查询数据库的方案。
核心方案:Dual Roaring Bitmaps 状态机
为了解决上述问题,我们采用了一种基于**双 Roaring Bitmaps(双位图)**的状态机架构。这种方案不追踪微小的浮点数内存余量,而是将 GPU 运行时的可用性抽象为三个离散状态:
- 绿色:健康状态,有大量空闲槽位,可安全分配。
- 黄色:低可用状态,处于危险阈值边缘,需要谨慎分配。
- 红色:不健康/已满状态,没有任何执行槽位。
为了高效表示这些状态,我们为每个 GPU 机架维护两个并行的位图:健康位图 和 低可用位图。Roaring Bitmap 是一种高效的压缩位图数据结构,特别适合处理大规模集合的交集与并集运算。
实现细节:索引映射与 SSE 流
索引映射:每个 GPU 机架维护一个本地映射表,将活跃的运行时(如不同的模型实例)映射到 0 到 N-1 的索引上。位图中的每一位代表一个具体的 GPU 槽位。
状态流转:当某个运行时启动或销毁时,系统会更新对应的位图。例如,一个新实例启动会将其索引位从健康位图移除或标记为占用。
实时同步:利用 Server-Sent Events (SSE),我们将位图的状态变化实时推送给客户端调度器。由于位图是紧凑的二进制数据,网络传输开销极低,且不需要在每次读取时都查询数据库。
实际价值与适用场景
这套方案为开发者带来了显著的性能提升:
- O(1) 访问时间:调度器只需检查位图的特定位即可瞬间判断机架状态,无需复杂的数据库查询。
- 零数据库读取开销:路由引擎在评估候选机架时,完全依赖本地位图数据,极大地减轻了后端数据库压力。
- 防止过载:通过将状态分为绿、黄、红三级,系统能有效避免将请求发送到即将耗尽资源的节点。
对于平台架构师和 AI 基础设施开发者来说,引入 Dual Roaring Bitmaps 是构建高吞吐量、低延迟 GPU 调度系统的最佳实践之一。
本文基于 Hacker Noon 的公开内容,由 AI 辅助整理改写后发布。
原标题:Designing Lock-Free GPU Runtime Scheduling at Scale Using Dual Roaring Bitmaps, Sse
阅读原文