每个 GPU 最多可以支持 7 个模型、10 个模型所需 GPU 数量从 1192 个减至 213 个、最终节约高达 82% 的 GPU 资源——这便是由北京大学团队和阿里巴巴团队提出的名为 Aegaeon 的多模型服务系统实现的效果。相关论文发表于由美国计算机协会主办的国际顶会 2025 年操作系统原理研讨会(SOSP,Symposium on Operating Systems Principles)上,阿里云 CTO 周靖人也是相关论文的作者之一。
图 | 相关论文(https://dl.acm.org/doi/pdf/10.1145/373)
Aegaeon 能在 token 粒度上执行模型自动扩缩容,从而能够实现有效的 GPU 池化(一种通过虚拟化技术将物理 GPU 资源动态分配给多个模型使用的管理方法)。它以每个 token 为基础来调度多模型请求,并能做出自动扩缩容决策,从而可以实现服务质量的最大化。它通过组件重用、显式内存管理和细粒度键值(KV,Key-Value)缓存同步,将自动扩缩容开销降低了 97%。
实验表明,与现有解决方案相比,Aegaeon 能维持高出 2 倍–2.5 的请求到达率,并能实现高出 1.5 倍–9 倍的有效吞吐量。目前,Aegaeon 已经在阿里云 Model Studio 进行 Beta 版部署并已服务于 10 个模型。
下图是 Aegaeon 的架构图,展示了它服务于多个模型的过程。具体来说,Aegaeon 先是通过代理层分发这些模型,代理层通过共享内存机制与底层服务实例同步请求元数据,以便确保负载均衡和容错。Aegaeon 可以将不同模型的请求分发到同一个实例,一旦请求被发送到某个实例,Aegaeon 会在 token 级调度器的指导之下调度它们的执行。
图 | Aegaeon 的架构图(https://dl.acm.org/doi/pdf/10.)
解决 token 级调度难题,实现自动扩缩容成本优化
除了实现上述能力之外,Aegaeon 还解决了以下两个技术问题:
一方面,Aegaeon 解决了 token 级调度的挑战。
在 token 级别执行自动扩缩容的时候,需要一定的调度策略来处理 token 级执行时间和自动扩缩容延迟之间复杂的相互作用,同时还要满足服务等级目标(SLO,Service-Level Objective)要求,因此很难实现这一问题的最优解,与此同时此前人们使用的启发式方法很难实现多方面的平衡。
为此,本次研究人员提出了一个 token 级调度器,从而能够以联合的方式调度请求处理和自动扩缩容决策。鉴于首个 token 和后续 token 的执行时间和 SLO 的差异比较大,因此研究人员采用了预填充与解码阶段解耦的架构,并对二者进行独立的调度和服务。针对预填充阶段,他们打造了一个分组先到先服务调度器,以便将每个请求的首个 token 时间实现最小化。
另一方面,Aegaeon 实现了自动扩缩容成本优化。
尽管自动扩缩容已经得到广泛研究,但是在本次研究人员的调查中他们发现,此前已有的解决方案都无法支持 token 级的自动扩缩容,因为这涉及到 KV 缓存换出、显存碎片整理、引擎重新初始化、KV 缓存换入等一系列超出既有考虑的关键过程。如果不对此进行优化,这一序列可能要耗时数十秒左右,从而让 token 级方案变得不切实际。
而 Aegaeon 通过一系列深度优化实现了高效的 token 级自动扩缩容。
具体来说:
其一,研究人员针对推理引擎的初始化步骤进行了全面研究,借此识别并利用了引擎重新初始化中组件重用的机会;
其二,研究人员针对 GPU 和主机内存进行了显式内存管理,借此消除了碎片和显存碎片整理开销;
其三,研究人员实现了一种用于传输 KV 缓存的细粒度同步机制,实现了更好的执行重叠和解耦。
实现内存零碎片,奠定 GPU 池化基石
达成内存零碎片,是 Aegaeon 实现 GPU 池化的基础。这得益于它的以下特质:
其一,Aegaeon 拥有自管理的显存缓冲区。
为了减少显存碎片,研究人员在 GPU 上为模型权重和 KV 缓存完全使用资管理的分配。启动的时候,Aegaeon 在一次分配中请求所有权重和 KV 缓存所需的显存作为一个自管理缓冲区,留下大约 10% 的空闲内存供张量库管理使用。
这一缓冲区使用指针递增的分配方式运行,即通过递增指针进行连续分配,并且可以通过简单地重置这一指针立即完成释放。
在每次的模型扩容期间,Aegaeon 使用自定义包装器类针对相关的 Python 类进行猴子补丁 Monkey Patch,这些包装器类由自管理缓冲区进行分配和支持,这样一来让 Aegaeon 能够绕过张量库的分配机制,省去了调用显存碎片整理的需要。
其二,Aegaeon 能够实现快速的模型加载。
它能通过将模型检查点中的原始张量块缓存在一个名为“模型缓存”的共享主机内存区域来实现更快的模型加载。此外,每个 GPU 关联一个专用的“暂存缓冲区”,以用于在设备和主机之间暂存内存拷贝。
假如扩容模型已经缓存在主机内存之中,Aegaeon 可以通过暂存缓冲区以多线程的、分块的、流水线的方式,直接将权重从模型缓存复制到 GPU,从而实现与此前最优解决方案相当的加载时间。
(https://dl.acm.org/doi/pdf/10.1145/3731569.3764815)
其三,Aegaeon 也实现了统一 KV 缓存。
为了解决存储几种不同形状的 KV 缓存时的内存碎片问题,Aegaeon 借鉴了经典的内存管理技术,采用 Slab 分配来为每个可能的形状构建统一的 KV 缓存。每个 KV 缓存区域被划分为固定大小的块。每个 Slab 被分配给一个形状来作为这一特定形状的 KV 缓存块池,这样一来就能在真实工作负载中实现高效的缓存内存利用率。
Slab 分配好比是一个高效的“文具管理员”,它同时管理着许多盒子,每个盒子只装一种特定尺寸的便签纸,当需要某种便签纸的时候,它可以直接从对应的盒子里取一张,用完之后再放回原来的盒子里。
让 AI 模型服务从“专线”走向“高速公路”
从本次论文可知,这一成果要解决的痛点是:在 Hugging Face 等模型市场上拥有种类繁多的模型,这些模型的特性和用户量各不相同。使用专用 GPU 实例来服务并发推理工作负载中那些偶发和不可预测的请求,会导致大量的资源浪费。虽然现有的多模型服务解决方案采用 GPU 池化和无服务器计算来提高资源效率,但其有效性仅限于每个 GPU,最多支持两到三个模型,这对于充分利用 GPU 资源来说是远远不够的。
在 AI 模型爆炸式增长的今天,各大模型平台同时运行着成百上千个模型,传统部署方式导致 GPU 资源利用率极低,每个 GPU 往往只能服务 2-3 个模型,大量的算力被闲置。而本次研究团队通过 Aegaeon 实现的 token 级自动扩缩容技术,通过将调度粒度细化到每个生成单元,在配合全栈优化,让单个 GPU 可以智能地同时服务多个模型。
这一技术不仅大幅提升了资源利用效率,更为未来“模型超市”的设想奠定了基础。也许未来人们只需轻点鼠标,就能在云端瞬间调用最适合的 AI 模型,无需担心背后的资源调度难度。
参考资料:
相关论文 https://dl.acm.org/doi/10.1145/3731569.3764815
运营/排版:何晨龙