kimi论文自曝推理架构,80%流量都靠它承担-pg电子游戏平台
月之暗面和清华kvcache.ai团队的最新论文,首次揭秘了kimi背后的推理架构! 要知道kimi是国产大模型的当红炸子鸡,火到可以说从来没缺过流量,甚至还经常出现过载。 而随着论文的发布,这泼天的流量到底如何被kimi接住的问题,也有了答案。 kimi背后的推理架构名叫mooncake(月饼),主要特点是采取了分离式的设计方案。 而且,mooncake在设计之时就考虑了可能出现的大流量场景,并针对这种情况专门研发。 在模拟场景下,mooncake最高能带来525%的吞吐量增长,实际场景中也能多处理75%请求。 另据月之暗面工程副总裁许欣然的一篇知乎文章介绍,kimi有80%以上的流量,都是由该系统承接。 从kv缓存出发,建造分布式系统整个mooncake系统设计的核心,是围绕着kv缓存展开的。 (kv缓存用于存储键-值对(key-value pairs),主要优势在于可以简单高效地访问和检索数据,在大模型当中可以提高推理速度并减少计算资源消耗。) 之所以这样做,是因为团队预计kv缓存的容量会长期保持高位,因此围绕kv缓存进行优化十分必要。 从结构上看,mooncake由全局调度器(conductor)、prefill节点集群、decoding节点集群和分布式kvcache池几部分组成,另外还有rdma通信组件(messenger)。 其中全局调度器是用户请求到达系统后的第一站,它负责接收请求并根据kv缓存分布和负载情况,将请求调度到prefill和decoding节点。 调度器在调度时需要综合考虑kv缓存的复用长度、负载均衡等因素,实现kv缓存复用的最大化。 具体到mooncake,它采用了一种启发式的自动热点迁移策略,可以在不需要精确预测未来访问的情况下自动复制热点kv缓存块。 同时,这种动态复制热点kv缓存块的方式,也是实现均衡负载的一种重要途径。 实验结果表明,与随机调度和负载均衡调度相比,mooncake的调度策略可以显著降低ttft(time to first token,首个token延迟),提高系统性能。 完成调度之后,任务会分别交由prefill和decoding节点进行运算。 prefill节点接收到调度器转发过来的请求后,会从kv缓存池中读取缓存,执行预计算并生成新的kv缓存。 对于长上下文请求,mooncake还会分块流水并行的方式,使用多个节点并行处理来降低延迟。 而decoding节点除了接收调度器发来的请求外,还会收到prefill阶段生成的kv缓存,节点会对这些缓存执行解码并生成最终结果。 这当中,大容量、高性能的kv缓存存储由缓存池提供;rdma通信组件则凭借其高带宽、低延迟的优势,负责在不同节点之间的kv缓存传输。 除了采取以kv缓存为中心的工作流程外,mooncake还有另一个重要特点——分离式的架构。 采取分离式架构的重要因素之一,是在于prefill和decoding两个阶段的计算特性差异很大。 具体来说,它们分别要对ttft和tbt(time between tokens,token间延迟)负责。 这就导致了两者在计算复杂度、内存访问方式、并行粒度和对延迟的敏感度上都存在差异: 所以,月之暗面团队对gpu集群也进行了相应的拆分,以便将它们分别部署在不同节点集群上,实现资源隔离和专门优化。 另外,mooncake中的kv缓存池也是分布式的,同时充分利用了gpu集群中空闲的cpu、dram和ssd资源,实现了大容量、高带宽的kv缓存存储和传输,同时也减少了闲置资源的浪费。 提前预测负载,及时拒绝超量请求不过,即使mooncake采用了高效的分离架构,但实际环境中的超大流量,对系统仍然是一个考验。 对此,作者也提出了新的应对策略。 在过载场景下,调度的关键是决定是否接受新的请求。 由于mooncake采用的是分离式架构,可以采取早期拒绝策略,在prefill阶段就根据decoding节点的负载情况,提前拒绝请求。 mooncake使用ttft和tbt的slo(service level objective,服务等级目标)满足情况作为负载的度量指标。 具体的slo要求是ttft的90分位值(p90)不超过单个请求在空载条件下处理时间的10倍,tbt的p90值不超过5倍。 这种早期拒绝策略可以显著减少无效的prefill计算,提高资源利用率,但同时也带来了新的问题——prefill和decoding节点负载的波动,导致资源利用率下降、影响系统性能。 这是由于早期拒绝策略中,系统做出请求拒绝的决策时存在滞后性,如下图所示:
针对这一问题,月之暗面团队对这种简单的早期拒绝策略进行了修正,提出了基于预测的早期拒绝策略,从而降低节点负载的波动。 这种策略的核心思想是对一段时间后的decoding节点负载进行预测,并基于预测结果决定是否拒绝请求。 预测可以在请求级别和系统级别两个层面进行,请求级别的预测比较困难,因为要预测单个请求的执行时间;系统级别的预测相对容易一些,只需要预测整体的负载情况。 mooncake采用的是一种简化的系统级别预测方法,假设每个请求的执行时间服从某个固定分布,据此预测未来一段时间内的负载情况。 实验结果表明,这种基于预测的早期拒绝策略,可以有效缓解负载波动问题。 最终,端到端性能评估结果表明,mooncake的架构设计和优化策略,有效提高了推理服务性能,尤其在长上下文和真实场景下优势更加显著。 在arxiv summarization和l-eval数据集上,mooncake的吞吐量比baseline方法vllm分别提高了20%和40%。 在模拟数据集上,mooncake的吞吐量最高可达525%,在真实数据集上也可以比vllm多处理约75%的请求。 过载场景下的性能评估结果则显示,使用基于预测的早期拒绝策略时,拒绝的请求数量从baseline的4183个减少到了3589个,说明系统的请求处理能力得到了提高。 针对未来的发展,论文的另一位作者、清华大学计算机系助理教授章明星表示,从目前的趋势来看,大模型服务的负载会愈发的复杂和多元化,调度会越来越复杂,也会越来越重要。 而对于月之暗面的发展方向,则是由许欣然做了解答——分布式策略的实施,也意味着未来月之暗面的整个系统,将往“算力/$”和“带宽/$”两个方向独立发展,从而对硬件优化更加友好。 论文地址: https://arxiv.org/pdf/2407.00079 github: https://github.com/kvcache-ai/mooncake 参考链接: [1]https://zhuanlan.zhihu.com/p/705910725 [2]https://zhuanlan.zhihu.com/p/706204757 —完— |