Mooncake:解耦架构下的高效LLM服务调度平台
摘要
本文介绍了一种名为Mooncake的KVCache-centric解耦架构,用于高效地服务大型语言模型(LLM),特别是在处理长上下文和过载场景时。Mooncake通过分离预填充和解码集群,并利用GPU集群中未充分利用的CPU、DRAM和SSD资源来实现KVCache的解耦缓存。其核心是KVCache-centric调度器,旨在在满足与延迟相关的服务水平目标(SLOs)的同时最大化整体有效吞吐量。与传统研究假设所有请求都将被处理不同,Mooncake面临高度过载场景的挑战,为此开发了一种基于预测的早期拒绝策略。实验表明,Mooncake在长上下文场景中表现出色,与基线方法相比,在某些模拟场景中可以实现高达525%的吞吐量增加,同时遵守SLOs。在实际工作负载下,Mooncake的创新架构使Kimi能够处理75%以上的请求。
原理
Mooncake的核心工作原理是基于KVCache的解耦架构,它通过分离预填充和解码阶段来优化LLM服务的调度。预填充阶段处理所有输入令牌并生成第一个输出令牌,同时存储计算的键和值的中间结果,称为KVCache。解码阶段则使用这个KVCache来自回归生成新令牌,将新的键和值从计算中添加到KVCache。Mooncake的调度器Conductor负责根据当前的KVCache分布和负载来调度请求,并在必要时复制或交换某些KVCache块以优化未来的推理。此外,Mooncake还采用了基于预测的早期拒绝策略,以减少在过载场景中的无效计算。
流程
Mooncake的工作流程包括以下步骤:
- KVCache重用:选择的预填充节点(组)接收请求,包括原始输入、可重用的前缀缓存块ID和分配给请求的完整缓存块ID。它根据前缀缓存块ID从远程CPU内存加载到GPU内存以启动请求。
- 增量预填充:预填充节点(组)使用前缀缓存完成预填充阶段,并将新生成的增量KVCache存储回CPU内存。如果未缓存的输入令牌数量超过某个阈值(prefill_chunk),预填充阶段将分为多个块并以流水线方式执行。
- KVCache传输:上述Messenger服务部署在每个节点中,管理并传输这些缓存。每个Messenger在其各自的推理实例中作为一个独立进程运行,接收信号以促进高速、跨机器的KVCache传输。
- 解码:在解码节点的CPU DRAM中接收到所有KVCache后,请求加入下一个批处理的连续批处理过程中。Conductor根据其当前负载预先选择解码节点,以确保不违反TBT SLO。
应用
Mooncake的解耦架构和高效调度策略使其在处理长上下文和过载场景时具有显著优势,适用于需要高吞吐量和低延迟的LLM服务场景。随着LLM在各种应用中的普及,Mooncake有望在模型即服务(MaaS)提供商中得到广泛应用,特别是在需要处理大量用户请求和复杂约束优化的环境中。
