[控场AI]
· 4 分钟阅读· 2,214 字

告别预取,Bevy用请求交织让MoE推理提速3.46倍

告别预取,Bevy用请求交织让MoE推理提速3.46倍

Bevy用并发请求调度替代专家预取,使本地MoE推理吞吐达llama.cpp的3.46倍。

文章讨论本地运行混合专家(MoE)大模型时的专家卸载加速问题。传统批处理会让GPU在等待缺失专家时停顿,常见补救是预取,但研究指出当GPU存在专家缓存时预取可能有害:缓存越大,剩余待预测的专家越分散,预测精度反而下降,错误预取还会浪费带宽和显存。作者由此提出核心洞见——恰当的请求调度优于预取,并设计了Bevy系统。Bevy基于前瞻推理,让所需专家已就绪的请求先跑到更靠后的层,从而自然暴露后续专家需求,在计算同时加载缺失专家,无需预测;自平衡调度器则在每层分批处理就绪请求并优先照顾滞后请求,控制共享权重重复读取的开销。实测解码吞吐达llama.cpp的3.46倍、最快预取基线的1.55倍。

在本地运行大型混合专家(MoE)语言模型时,专家卸载(expert offloading)是一项关键技术,它允许将不常用的专家参数存放在外部存储(如CPU内存或SSD),需要时再加载到GPU。然而,传统的批处理方式会导致GPU在等待缺失专家时陷入停顿,严重影响推理速度。

MoE推理加速示意图

预取策略的局限:缓存越大,预测越难

为了掩盖专家加载的延迟,一种常见的补救措施是预取(prefetching):预测接下来需要哪些专家,并利用空闲的链路带宽提前加载。但这种方法的有效性高度依赖于预测的准确性。不精确的预测会浪费带宽和GPU内存,去获取实际上并不需要的专家。

该研究的关键发现是:当GPU内存中存在专家缓存时,预取可能是有害的。这是因为随着缓存中包含的必需专家越来越多,专家预测的精度反而会下降。也就是说,缓存越大,预取带来的收益越小,甚至可能因为占用宝贵的GPU内存而拖累性能。

混合专家(MoE,Mixture of Experts)模型的核心结构是将传统的稠密前馈网络替换为多个并行的"专家"子网络,并引入一个门控(gating)网络,对每个 token 只激活其中少数几个专家(常见为 Top-2)。因此,一个 MoE 层的全部参数可能高达数十乃至数百 GB,但单次前向实际用到的仅是一小部分。专家卸载正是利用这种稀疏激活特性:把未被激活的专家留在 CPU 内存或 SSD 上,只把当前 batch 需要的专家搬运到 GPU。这一机制让显存有限的消费级设备也能运行超大模型,但代价是专家搬运要经过 PCIe 等带宽受限的链路,一旦搬运不能与计算重叠,GPU 就会空转等待,形成所谓的"专家加载停顿"(expert loading stall)。理解这一点,是理解后文预取与调度两种思路为何都围绕"隐藏加载延迟"展开的前提。

核心洞见:合理的请求调度胜过预取

基于上述发现,研究者提出了一个关键洞见:恰当的请求调度比预取更有效。与其费力预测未来的专家需求,不如通过调度并发请求来自然地揭示专家需求,并重叠计算与加载。

预取(prefetching)本质上是一种"时间维度"的优化:在专家真正被需要之前,依据历史访问模式或轻量预测器推测未来需求,提前发起搬运。它的收益完全取决于预测命中率——预测对了,加载延迟被完全隐藏;预测错了,则白白占用链路带宽和有限的 GPU 显存,甚至把真正需要的专家挤出缓存。与之相对,请求调度是一种"空间维度"的优化:同时服务多个并发请求,让它们的专家需求在时间上自然错开,当某个请求因缺专家而阻塞时,另一个专家已就绪的请求可以继续计算。这样无需任何预测,专家需求就由请求本身"暴露"出来。Bevy 的贡献在于把这一直觉工程化:通过前瞻推理(runahead inference)让就绪请求越过阻塞层继续前进,再用自平衡调度器控制共享权重重复读取的开销,从而在无预测的前提下实现计算与加载的重叠。

Bevy:基于前瞻推理的并发请求调度系统

基于这一洞见,研究者设计了Bevy,一个基于前瞻推理(runahead inference)的MoE推理系统,专门针对并发请求优化。

工作原理:让就绪请求“先跑”

Bevy的核心机制是:当一个请求所需的专家已经可用时,该请求可以“向前跑”到更靠后的层,而其他请求则等待专家加载。通过这种方式,Bevy能够揭示该请求接下来需要哪些专家,从而在计算就绪请求的同时,获取这些缺失的专家,实现计算与加载的重叠,而无需预测专家选择。

自平衡调度器:平衡收益与开销

单独运行请求会重复读取GPU内存中的共享权重,从而增加计算时间。为了限制这一开销,Bevy设计了一个自平衡调度器(self-balancing scheduler)。它在每一层将就绪的请求分批处理,并优先处理滞后的请求,根据专家可用性的变化动态调整分组。

llama.cpp 是目前最流行的本地大模型推理框架之一,以纯 C/C++ 实现、支持 CPU/GPU 混合推理和多种量化格式著称,常被用作本地部署的默认基线与性能参照。在专家卸载场景下,llama.cpp 采用按层顺序执行、缺失专家即阻塞等待的策略,因此 GPU 利用率会随专家命中率波动而明显起伏。Bevy 选择 llama.cpp 作为端到端对比基线,衡量的是整机解码吞吐(tokens/s),这一指标同时反映了计算效率与链路利用率。而"最快预取基线"则代表在同样硬件上采用预测式预取的最优方案,Bevy 相对它取得 1.55 倍提升,说明其优势并非来自更快的搬运,而是来自更少的无效搬运和更好的计算/加载重叠。

性能表现:显著超越基线

在两个本地平台上,Bevy的解码吞吐量(decode throughput)达到了llama.cpp的3.46倍,并且是最快预取基线的1.55倍。这一结果验证了请求调度优于预取的思路,为本地MoE推理加速提供了新的方向。

Bevy的成功表明,在专家卸载场景下,与其依赖不完美的预测,不如通过巧妙的调度来利用请求间的并发性,从而更高效地利用GPU和链路资源。这一方法有望推动本地大模型推理的进一步普及。

#MoE推理#专家卸载#预取#请求调度#Bevy#本地推理#混合专家模型#前瞻推理
分享:

相关推荐