Batch Overlap、split prefill 与多路复用执行#

这章解决什么问题#

前几章已经解释了 batch 怎样形成、forward mode 怎样切换,但真实执行里还有一层更复杂的现象:同一时刻并不总是只有“一个完整 batch 按顺序跑完”这么简单。系统有时会做 batch overlap、有时会做 split prefill、有时还会启用 multiplexing,把不同阶段的工作交织起来推进。

如果不补这一层,execution model 仍然会显得过于整齐,像一条顺序流水线;而真实系统里的很多复杂行为,其实正来自这些更高级的推进方式。

为什么要引入 overlap 和 multiplexing#

根本原因并不神秘:硬件资源、运行队列和请求形状并不总是完美匹配。如果严格要求“一个 batch 完整跑完,再开始下一个动作”,系统就会在很多地方留下空泡。因此,batch overlap 和 multiplexing 更像是为了减少这些空泡、提高资源利用率而出现的执行策略。

从源码组织看,这件事也不是隐藏逻辑。python/sglang/srt/batch_overlap/two_batch_overlap.pypython/sglang/srt/multiplex/multiplexing_mixin.py 以及 ForwardMode.SPLIT_PREFILL 的存在,都在告诉你:执行层并不总是单批次直线推进。

split prefill 改变了什么#

在普通直觉里,prefill 像是“一次性把上下文送进去”。但 ForwardMode.SPLIT_PREFILLmultiplexing_mixin.py 明确说明,prefill 也可以被拆开推进。这样做的价值,是让长上下文或特殊运行模式下的工作不必一次性占满整条执行链。

这也解释了为什么 execution model 和 scheduling/memory 之间会不断相互回扣。只要 prefill 能被 split,调度器和 execution layer 的边界就不会只是“前者排,后者跑”,而会进一步变成“前者决定怎样切,后者决定怎样接”。

two_batch_overlap 解决的是哪类问题#

two_batch_overlap.py 的存在说明,系统会显式考虑不同 batch 在执行链中的重叠推进问题。这里最关键的不是背具体函数,而是理解:execution model 已经从“一个 batch 的内部循环”进一步扩展到“多个 batch 在时间上怎样交错”。

这是一种很典型的 runtime 复杂化:逻辑抽象仍然想保持统一,但真实系统已经在用更复杂的调度与执行技巧去减少空泡和等待。好技术书需要把这层现实讲出来,否则读者会误以为所有性能和时序表现都能从单 batch 视角直接解释。

一个更贴近复杂执行路径的图#

flowchart LR
    A["waiting / prefill batch"] --> B["split prefill?"]
    B -->|是| C["ForwardMode.SPLIT_PREFILL"]
    B -->|否| D["normal EXTEND / DECODE path"]
    C --> E["overlap / multiplexing policy"]
    D --> E
    E --> F["two_batch_overlap / stream groups"]
    F --> G["shared execution resources"]

这张图不是为了引入更多术语,而是为了说明 execution model 的另一层复杂度:forward mode 变化之外,batch 之间也可能存在时间上的交错关系。

调试这一层时最容易走错的地方#

一旦系统进入 overlap 或 multiplexing 路径,很多现象都会看起来像“普通 scheduler 问题”或“普通 model forward 问题”。但更稳的做法是先确认:当前是不是已经进入了 split prefill 或 overlap 路径。如果是,排障入口就不应再局限在单 batch 逻辑。

换句话说,这一章真正补的,是“什么时候不能再用直线 batch 心智模型看系统”。这一点对理解复杂场景下的 latency、吞吐波动和执行路径差异尤其重要。

本章对应哪些代码路径#

这一章最重要的锚点包括 python/sglang/srt/batch_overlap/two_batch_overlap.pypython/sglang/srt/multiplex/multiplexing_mixin.pypython/sglang/srt/model_executor/forward_batch_info.py 中的 ForwardMode.SPLIT_PREFILL,以及相关 split_prefill / forward_mode / overlap 策略路径。

小结#

一旦把 overlap、split prefill 和 multiplexing 补进 execution model,整节就不再像“单批次主循环说明书”,而更像一个真实 runtime 的执行章节。读者也会更清楚,为什么有些现象只在复杂负载下才出现。