1. 先问:究竟在比较哪个系统问题
一条 any-to-any 请求不一定走完整模型。图文问答可能只需要媒体 encoder 和 Thinker;文本到语音还要经过 Talker、codec 与 vocoder;图像编辑又可能进入 VAE、DiT 和 classifier-free guidance 分支。若一个系统只执行其中一条路径,而另一系统把整张图固定在同一进程,二者的资源占用和排队对象已经不同。
因此本文用同一层次的问题来读各项目:谁声明逻辑图,谁决定一项工作何时进入局部 batch,谁持有 KV、feature 或 codec 状态,谁把大对象交给下游,以及谁能够改变 GPU 放置。接口名称相同,例如 /v1/chat/completions,只说明入口相似,不能说明内部路径、流式语义和可靠性相同。
2. 证据锚点与版本,不把移动主线混在一起
| 路线 | 本页使用的公开锚点 | 可证明的范围 |
|---|---|---|
| vLLM-Omni | v0.26.0,commit a4ea67a21b20054dacc6e83952f9bd407e8ee4e7,2026-08-03。 | 固定代码、配置与文档;另有 2026-02 的独立系统论文。 |
| SGLang-Omni | main 7daa5be3aa0e2c3787eb1bc371594ea277191b61,2026-08-07;release 0.1.0 为 8e272bcb...。 | 官方仓库、文档、cookbook、release 和明确的 issue;截至核验日没有独立 SGLang-Omni 论文。 |
| Cornserve | arXiv:2603.12118v2,2026-04-28;CAIS 2026 论文。 | 论文描述的 task abstraction、model fission、Kubernetes runtime 与论文评测,不能替代任意部署的资格报告。 |
| M* | arXiv:2606.12688 与 公开代码 commit 82ea8212,2026-08-05。 | Walk Graph、Conductor/Worker、论文列出的模型与实验;研究结果不是所有组件组合的生产 SLO。 |
| FlashRT | 公开代码 commit 7fd75d20,2026-08-06。 | 小 batch、延迟敏感的模型前端、CUDA Graph 和内核路径;它不是通用分布式 Omni 编排器。 |
上表也解释了不对 SGLang-Omni 伪造论文引用的原因。它可以有清楚的源码与 cookbook 证据,但这些证据的推断范围仍不同于有固定实验表、基线和系统设计章节的论文。
3. 执行图:相同模型,系统切分可不同
下列图是比较用的概念图,不是对每个 checkpoint 的精确拓扑。它展示的是系统把哪一种关系升为一等对象:stage、task、component walk,或单个低延迟 forward。模型作者仍必须声明哪些边在特定请求中会被跳过、复制或流式化。
any-to-any 的一条语音输出路径
media -> encoder -> Thinker -> Talker -> codec tokens -> vocoder -> audio chunks
vLLM-Omni: PipelineConfig 的 stage graph,Orchestrator 连接独立 stage engine
SGLang-Omni: StageConfig 的平面 DAG,Coordinator + stage-local scheduler + relay
Cornserve: Python task / composite task,record 后 replay 请求实际调用的子图
M*: component graph + request Walk,Seq / Parallel / Loop / Stream 都可成为边
FlashRT: 模型专用小 batch forward / captured CUDA Graph;无通用跨 worker 图语义
平面 DAG 很适合已知的 Thinker-Talker-vocoder 管线;record-and-replay 适合请求内容决定分支的应用;Walk Graph 进一步把并行、循环和流视为图原语。FlashRT 的目标则不同:它尽可能缩短一个已知模型路径的运行时间,通常不替用户做跨节点任务拆分。
4. Scheduler ownership:谁有权把工作放进 GPU
| 路线 | 全局/图级 owner | 局部 owner 与调度单位 |
|---|---|---|
| vLLM-Omni | AsyncOmniEngine 与 Orchestrator 跟踪请求在配置 stage 间的依赖与路由。 | 每个 stage engine 的 scheduler 管理自己的 AR 或 generation 工作、队列和 batch;论文明确描述 per-stage request batching。 |
| SGLang-Omni | Coordinator 维护请求生命周期、terminal 聚合与 abort 广播,Stage runtime 处理 fan-in/out。 | OmniScheduler bridge 负责 AR stage;SimpleScheduler 与 streaming scheduler 服务轻量/codec/vocoder stage。它们不是一个全局 token loop。 |
| Cornserve | Gateway、Task Dispatcher 与 Task Manager 把 record 的任务调用转为 executor 调度。 | Task Manager 负责某 unit task 的 executor 副本与路由;论文的重点是组件粒度 fission 和独立扩缩,不是一个统一 AR scheduler。 |
| M* | Conductor 跟踪 request Walk 并向 GPU Worker 派发 component work。 | Worker 内有 AR KV engine 与 stateless engine;论文/项目页把 loop 上的 continuous batching 描述为通用机制。 |
| FlashRT | 没有面向任意分布式图的 Conductor 或 task control plane。 | 应用调用模型前端;关注固定形状、少量并发的内核、量化和 CUDA Graph replay,而非多 stage 的 admission 与负载均衡。 |
“每 stage 一个 scheduler”不等于“已经全局最优”。局部 scheduler 需要从下游得到容量、deadline 或 credit,才不会让快速 Thinker 无限制造 Talker 等待的状态。下一页把这个问题写成可验证的 backpressure 合同。
5. Batching:batch 边界跟着计算形状,而不是跟着 HTTP 请求
vLLM-Omni 的论文与架构文档以独立 stage engine 和 per-stage batching 为核心;其部署配置还允许分别设定 max_num_seqs、token budget、GPU memory 与 async scheduling。SGLang-Omni 也让 AR、普通函数与流式 vocoder 使用不同 scheduler,因而把 KV、chunk window 与媒体 batch 的约束留在各自 stage。
Cornserve 允许 task executor 在独立组件边界扩缩,batch 政策取决于所选 executor。M* 则宣称其 AR KV engine 和 stateless engine 都支持 continuous batching,且把 loop 纳入同一执行抽象。FlashRT 明确瞄准小 batch、延迟敏感工作负载,其静态 CUDA Graph 需要稳定的 shape、buffer 与运行路径;它的优势前提不能拿来推导高并发混合队列下的 goodput。
6. Cache 与中间状态:名字相同,身份和寿命不同
| 路线 | 公开的状态着眼点 | 不可从中推出什么 |
|---|---|---|
| vLLM-Omni | AR 路径继承 vLLM 的 KV 管理;配置/connector 可在 stage 间搬运 KV、hidden state 和 chunk payload;Diffusion 另有自己的 cache 路径。 | 一个 stage 的 prefix cache 开启,不保证另一个 stage、不同模型 revision 或不同媒体 processor 也可复用。 |
| SGLang-Omni | AR stage 复用 SGLang tree/Radix KV 机制;Qwen 路径还明确有媒体 encoder output cache,Talker 的 cache policy 可不同。 | core SGLang 的全部缓存或 scheduling feature 自动适用于 Omni pipeline。 |
| Cornserve | 论文强调 data dependency、direct tensor forwarding 和可共享的等价 task executor。 | 论文没有把任意 KV cache coherence 或跨租户复用写成通用保证。 |
| M* | AR engine 使用 FlashInfer paged-attention KV cache;无状态 engine 运行 encoder、decoder 与 codec,rollout 的 KV 可跨 loop 保留。 | 所有模型 component 都可按同一 key 安全共享,或跨网络有持久缓存语义。 |
| FlashRT | 仓库记录 checkpoint/sequence-length 维度的量化 calibration cache 和预分配 buffer。 | 它有一个通用、多租户、跨节点的 KV/媒体 feature cache。 |
安全的复用 identity 至少要包含模型/processor revision、输入媒体派生规则、position/precision/layout、adapter 和租户访问策略。将“同一文本 prompt”当作完整 key,会让媒体 resize、抽帧或音频采样率变化被静默忽略。
7. Connector 与数据面:控制消息和 tensor 不应混为一条线
vLLM-Omni 的 OmniConnector 是可配置的 stage-edge 合同。固定版本文档列出同机 SharedMemoryConnector,以及 Mooncake store/transfer-engine 等远端后端;后者的性能、RDMA 与清理语义都依赖实际 connector、NIC、内存池和拓扑。SGLang-Omni 则把控制消息与 payload reference 分开,当前文档按同进程、CUDA IPC、SHM、NCCL/NIXL 与 Mooncake 等条件选择 relay 路径。
Cornserve 的论文让 per-GPU Sidecar 直接在 producer 与 consumer executor 间转发 tensor,避开中心控制面;M* 公开 shared memory、RDMA 或经 Mooncake 的 TCP 数据面。FlashRT 没有等价的通用 remote tensor connector,因此不宜因它的低延迟单机结果而比较它的跨节点 data-plane 能力。
连接器选型应报告 payload 类型与字节数,而不是只写“zero-copy”:一条边可能传 KV block、hidden state、latent、codec code、CPU bytes 或仅 metadata。每一种对象的序列化、所有权、ACK、cancel 和回收成本不同。
8. Placement 与独立扩缩:声明、计划与实际容量是三件事
vLLM-Omni 的 PipelineConfig 固定逻辑 topology,deploy YAML 决定 stage 的 GPU、TP、每 stage capacity 和 connector edge。SGLang-Omni 的 StageConfig 也可声明 process、GPU、TP、后继和 fan-in;Router 在更外层选完整 worker,不应被误读成把一个请求的 Thinker 与 Talker 随意拆到不同 worker。
Cornserve 论文的 Cornfigurator 根据模型和 workload 搜索 fission、共置与副本计划,并通过 Task Manager 实现;M* 的 placement YAML 映射 component 到 GPU rank,允许 component disaggregation、TP 与 path-aware placement。FlashRT 是模型/硬件前端的显式选择,目标通常是把既定路径压进受控的实时 cell,而非运行在线集群 placement search。
无论哪种系统,资源决定至少包含权重常驻、KV/feature/latent 峰值、workspace、connector pool、网络路径和故障冗余。只把一个组件“放到另一张卡”没有回答它是否能在下游速度、显存和网络预算下持续运行。
9. 支持工作负载:用“已展示的路径”而不是项目名做矩阵
| 路线 | 公开代表路径 | 正确的支持结论 |
|---|---|---|
| vLLM-Omni | 官方矩阵列出 Qwen2.5/3-Omni、Ming Flash Omni、BAGEL、TTS、图像/视频/音频 diffusion 与部分 action policy。 | 以固定版本的“模型 × backend”表和对应 recipe 为准;表中的 model class 不自动证明所有输出组合、流式或多节点已验收。 |
| SGLang-Omni | 固定提交的文档覆盖 Qwen3-Omni、Ming-Omni、多种 TTS、ASR 与 Router capability routing。 | 区分 text-only、speech、streaming 和实验 cookbook;接口或模型目录存在不等于生产成熟。 |
| Cornserve | 论文评测涉及 Qwen2.5-VL、InternVL 3、Qwen Image、Qwen2.5/3-Omni 等异构组件图。 | 它证明论文实现的代表模型/工作负载,不声明每个开源 checkpoint 都有现成 executor。 |
| M* | 论文实例化 BAGEL、Qwen3-Omni TTS、Orpheus、V-JEPA 2 等图。 | 这是多类 composite model 的研究证据;新增模型仍需 component adapter、placement 和正确性验证。 |
| FlashRT | README 的旗舰路径是 Pi0、Pi0.5、GROOT N1.6/N1.7、Pi0-FAST 等 VLA,另含若干 TTS、world-model、视觉/视频和单流 LLM 路径。 | 按模型、GPU 架构和固定实时 profile 读;它不承诺 general any-to-any serving matrix。 |
10. API、代码、论文与生产资格不能互相替代
可运行 demo、OpenAI-compatible API、单元测试、论文 prototype、正式 release、持续集成、硬件矩阵和长期故障 SLO 分别回答不同问题。一个项目可能在模型接入与单机 demo 上很强,却没有公开跨节点恢复证据;另一个项目有论文实验,却没有面向任意用户的安装/升级承诺。
故此页不制造“成熟度分”。部署判断应逐路径记录:目标模型 revision、端点、输入输出模态、是否流式、GPU/NIC、并发范围、质量回归、cancel/timeout 结果和可复现环境。特别是 SGLang-Omni 的接口与 stage 架构已经是可验证的公开事实,但没有独立论文不能被补写成论文成熟度;反过来,M* 或 Cornserve 的论文也不能被误当作全量生产支持清单。
11. Benchmark 数字的边界:不能把不同论文的最大值横着相除
| 来源中的数字 | 原始口径 | 不可外推的结论 |
|---|---|---|
| vLLM-Omni:JCT 最多降低 91.4% | 其论文选定的模型、硬件、baseline 与 workload。 | 任何模型、任何拓扑都可降低 91.4%,或高于另一篇论文的吞吐数。 |
| Cornserve:最多 3.81× throughput、5.79× tail-latency reduction | 论文的 monolith 比较、组件 fission 和部署计划。 | 任意 vLLM-Omni/SGLang-Omni 版本在相同 GPU 数上必然被超过。 |
| M*:BAGEL 文生图平均更低端到端延迟;Qwen3-Omni TTS 的 RTF/throughput 结果 | 论文/项目页给出的模型、placement、batch、H100/H200 等明确设置。 | 一条 Walk Graph 必然优于所有平面 stage graph,或数值可换到另一模型。 |
| FlashRT 的 repo benchmark | 多为特定模型、量化、GPU、热态与小 batch 的实时 profile。 | 可与集群 goodput、长队列 p99 或多租户性能直接比较。 |
| SGLang-Omni cookbook/benchmark | 模型路径和文档中列出的有限硬件、并发与音频合同。 | 没有论文就没有性能,或某个 cookbook 数字代表所有模型/connector。 |
正确做法是选择一个模型路径,例如 Qwen3-Omni 文本到语音,固定 checkpoint、音色、输入长度、输出时长、采样、TP、GPU、connector、到达过程和质量门,在相同 harness 中交替运行。没有等价模型适配时,应报告“不可直接比较”,而不是拿各项目最漂亮的一行数字排名。
12. 一套可执行的公平比较协议
- 将请求写成冻结 trace:输入媒体 hash、prompt、输出合同、开始时间、deadline 和取消时间都固定。
- 锁定模型/processor revision、runtime commit、镜像 digest、驱动、CUDA、GPU/NIC 拓扑与全部 stage placement。
- 先通过输出质量门:文本语义、音频样本数/采样率、图像或视频质量、stream 拼接与终态一致性。
- 分别报告 TTFT、TTFA、完整 JCT、RTF、阶段 queue、batch、cache hit、连接器字节、GPU memory 与失败原因。
- 在冷启动、热态、开放环饱和、慢消费者、client cancel、worker restart 与 connector 延迟下重复。
- 保留全量请求分母和失败 attempt;只统计成功样本会人为抬高吞吐、压低 tail latency。
对同一请求 \(r\),比较单位不是一个裸延迟,而是配置元组 \(C_r=(m,p,h,a,s,q)\):模型/processor \(m,p\),硬件与拓扑 \(h\),到达过程 \(a\),stream 与采样合同 \(s\),以及质量门 \(q\)。只有 \(C_r\) 等价时,端到端时间差才主要可归因于 runtime;这是本站的分析约定,不是任一论文的原始公式。
13. 选型时先匹配问题形状
目标是使用其固定版本已经列出的模型、stage deploy YAML、connector 与硬件后端。优先从模型 recipe、feature matrix 和目标 workload 的本地回归出发。
目标是 Qwen/Ming/TTS/ASR 等明确 cookbook 路径,并愿意按 stage scheduler、relay 与模型特有流式合同做验证。不要把 core SGLang feature 表当作 Omni feature 表。
Cornserve 的 task fission/record-and-replay,或 M* 的 Walk Graph/placement,提供了更通用的研究坐标。它们的论文数字应当成为复现实验的假设,而不是采购结论。
FlashRT 的 CUDA-first、固定路径策略更接近问题本身。若需求转为高并发、多租户、多 stage 集群,还需要额外的 admission、状态与恢复层。
14. 这张比较表刻意不作的推断
第一,connector 的模块或 README 名称不证明每个模型和跨节点组合都经过端到端资格化。第二,GitHub issue 只表明某个版本、配置或调查方向值得复现;它不是所有版本都失败的证据。第三,某系统支持多种模型不表示每个模型都支持相同 API、流式形式、缓存策略或硬件。第四,静态 CUDA Graph 的单机低延迟和 stage-disaggregated 集群吞吐是不同目标函数。
真正值得横比的是能够保留同一输出语义、相同资源和相同负载的可复现实验。其余差异应被保留为架构选择、待验证假设或证据缺口,而不是变成宣传语。
15. 一手来源与本页使用范围
- vLLM-Omni 论文:stage graph、per-stage batching、connector 与论文 JCT 口径;固定源码树:当前配置、engine 与 connector 证据。
- vLLM-Omni architecture overview、stage configuration、supported models:实现和支持矩阵边界。
- SGLang-Omni 固定源码树与通信文档:stage-local scheduler、relay 和 API/模型路径。
- Cornserve 论文:task abstraction、record-and-replay、Task Manager/Sidecar、论文 workload 和数字。
- M* 论文与项目技术页:Walk Graph、Conductor/Worker、placement、缓存和受限 benchmark。
- FlashRT 固定源码树:小 batch 实时目标、支持模型、CUDA Graph 与 calibration cache 的范围。