1. 先冻结比较合同
公平比较的对象不是两个默认命令,而是两个满足同一外部合同的系统。合同至少固定:输入媒体、输出模态、模型权重与修订、生成参数、质量阈值、请求到达过程、并发上限、硬件预算、失败定义和测量窗口。系统可以采用不同的内部图切分、批处理和传输后端,但不能一方输出完整音频,另一方只计到声码器之前;不能一方启用流式首包,另一方只给离线完成时间;也不能把失败请求从尝试数中静默删除。
每个实验声明一个主问题,例如“固定两张 H100 时,何种调度能在音质等价条件下降低 p99 TTFA”,而不是同时改变模型、精度、拓扑、请求集和采样参数。主指标、质量不变量、最大可接受失败率和停止条件必须在看到结果前写入 experiment.yaml。探索性分析可以追加,但要与预注册结论分开。
2. 版本、修订与容器台账
报告必须同时记录语义版本和不可变修订。本站核验锚点是 vLLM-Omni v0.26.0、commit a4ea67a21b20054dacc6e83952f9bd407e8ee4e7,以及 SGLang-Omni main commit 7daa5be3aa0e2c3787eb1bc371594ea277191b61;若使用其 0.1.0 发布,则记录 release commit 8e272bcb8832ef1a3865ec48255d36f4871ec885 和依赖 SGLang 0.5.16。实际复现实验应替换为本次运行真正 checkout 的 SHA,不能只写“最新版”。
台账还包括镜像 digest、Python 与 CUDA/ROCm 版本、驱动、NCCL/NIXL/Mooncake 版本、编译标志、环境变量、启动参数、补丁 diff、模型仓库 revision、tokenizer/processor revision、权重文件哈希和数据快照哈希。将 git diff --binary、pip freeze、容器 inspect 结果与启动日志一起归档。若实现来自未合并 PR,必须给出基线 commit 与补丁,而不是只给一个会移动的分支名。
3. 模型与工作负载矩阵
一个“Omni benchmark”不足以覆盖异构阶段。最小矩阵应包含:纯文本、音频输入到文本、文本到语音、音频到音频、图像/视频到文本,以及实现确实支持时的任意模态组合。每行明确模型、输入长度或媒体时长、输出 token 或音频时长、采样参数、语言、声学条件和是否流式。模型不支持的模态写成“不适用”,不能以失败零分替代能力边界。
数据集拆成固定的正确性集、容量集和压力集。正确性集覆盖短输入、长上下文、静音、极短音频、跨语言、不同采样率、长视频和多轮状态;容量集保持可重复的长度分布;压力集专门制造长尾与阶段不平衡。vLLM-Omni 论文使用数据集前 100 个查询的做法可以作为论文复现配置,但容量结论还需要更长稳态窗口和不同随机种子。
| 维度 | 必须固定 | 必须分层报告 |
|---|---|---|
| 输入 | 文本 token、音频秒数、图像尺寸、视频帧率 | 短/中/长及组合模态 |
| 输出 | 最大 token、目标音频时长、采样参数 | 实际生成长度与截断原因 |
| 服务 | 流式开关、超时、重试、优先级 | 单租户/多租户与到达类别 |
| 硬件 | GPU 型号与数量、CPU、内存、网络 | 单机/多机与阶段放置 |
4. 质量等价门先于性能排名
性能结果只有在输出语义等价时才可比较。先用离线参考实现建立质量基线,再为每个任务设置门限:ASR 用 WER/CER,语音理解用任务准确率,图像与视频理解使用相应官方评分,TTS 至少包含 UTMOS、说话人相似度、时长偏差、采样率和静音比例。SGLang-Omni 官方 benchmark 目录已经覆盖 WER、MMSU、MMMU、Video-MME、Video-AMME、UTMOS 与 speaker similarity,可作为脚本入口,但数据版本、评估器模型与随机种子仍需锁定。
流式音频还要做波形级不变量:chunk 拼接后的总样本数与声明时长一致,边界处没有重复或丢样,通道数和采样率不变,最终离线拼接与服务端完整输出在允许误差内一致。SGLang-Omni issue #1354 曾记录每块丢失固定样本的已关闭问题,它证明“听起来正常”不足以替代样本计数;该历史修复不是对当前版本存在同一问题的断言。
若候选系统未通过预设质量门,结果标记为 quality-failed,仍报告延迟、失败与资源数据,但不得进入“更快”排名。允许的近似,例如量化或减少扩散步数,必须成为独立配置,并以质量—成本前沿呈现。
5. 到达过程、并发与开放环
闭环并发测试中,每个虚拟用户等待上一个请求完成后再发送,慢系统会自动降低到达率,因此适合测“给定并发”的响应,不适合单独证明容量。开放环测试则按外生过程产生请求:稳定服务可用 Poisson 到达,交互语音应追加突发、会话波次和长短请求混合。记录计划到达时间与实际发送时间;负载生成器跟不上时,不能把发送延迟归因于被测系统。
推荐每个工作负载同时跑并发 \(c\in\{1,2,4,8,16,32\}\) 的闭环曲线,以及到达率 \(\lambda\) 从低负载逐步跨过饱和点的开放环曲线。对音频流还要固定 chunk 时长、真实时间播放比例、首块大小和客户端消费速度。压力实验加入慢消费者、客户端暂停、突发恢复和取消,以暴露跨阶段队列及背压行为。
请求标识必须贯穿入口、所有阶段和输出块。多轮会话另有 session_id,并记录轮次间隔与状态保留策略。禁止用不同请求集分别喂给两个系统;使用相同的请求清单与到达时间表,随机化系统运行顺序,降低时间漂移偏差。
6. 预热、缓存、重置与重复
冷启动与稳态是两个实验。冷启动从空进程计时,包含权重加载、编译、图捕获与首次内核;稳态则在完成规定预热后开始测量。预热终止条件应是编译完成、吞吐和显存进入稳定区间,而不是任意等待一分钟。每轮记录模型缓存、前缀缓存、多模态特征缓存、内核缓存和文件系统页缓存的状态。
至少执行一次 A/A 测试来估计基础噪声,并使用不少于三个独立进程级重复;高方差尾延迟通常需要更多重复和更长窗口。每次运行前检查 GPU 温度、功率限制、时钟、MIG、CPU governor、NUMA 绑定、后台进程和网络链路。系统 A 与 B 交替运行,必要时重启节点以清除不可见状态。任何人工重跑都保留原失败 run,并写明排除理由。
7. 端到端指标的统一定义
以入口接收时间 \(t_{\mathrm{in}}\) 为共同零点;不能一项从客户端计时,另一项从模型调度计时。首个文本 token、首个可播放音频块和终态分别记为 \(t_{\mathrm{text}}\)、\(t_{\mathrm{audio}}\)、\(t_{\mathrm{term}}\):
\[ \mathrm{TTFT}=t_{\mathrm{text}}-t_{\mathrm{in}},\qquad \mathrm{TTFA}=t_{\mathrm{audio}}-t_{\mathrm{in}},\qquad \mathrm{JCT}=t_{\mathrm{term}}-t_{\mathrm{in}}. \]
TTFA 的“可播放”必须定义最小有效样本数,并排除只有容器头或零长度块的伪首包。输出音频时长为 \(D_{\mathrm{audio}}\) 时,实时因子和实时倍速分别为
\[ \mathrm{RTF}=\frac{\mathrm{JCT}}{D_{\mathrm{audio}}},\qquad x_{\mathrm{RT}}=\frac{D_{\mathrm{audio}}}{\mathrm{JCT}}. \]
RTF 要声明 JCT 是否包含排队、预处理与网络;本站默认包含服务入口到完整输出。对文本追加 TPOT 与 inter-token latency,对音频追加块间间隔 \(\Delta_i=t_i-t_{i-1}\) 的 p50/p95/p99、最大间隙和变异系数 \(\mathrm{CV}=\sigma(\Delta)/\mu(\Delta)\)。吞吐写为 \(X=N_{\mathrm{success}}/(t_{\mathrm{end}}-t_{\mathrm{start}})\),同时报告尝试数与失败数,禁止只展示成功样本构造的高吞吐。
8. 阶段时间线、队列与通信
端到端数字只显示最终结果;定位瓶颈需要为每个请求、阶段与输出块至少记录:入队、可调度、批次形成、计算开始、计算结束、传输开始、传输结束、下游接收、取消和释放。由此分解阶段等待、批处理等待、GPU 计算、CPU 处理、序列化、主机到设备、设备到主机、跨进程与跨节点通信。报告每阶段 queue depth、oldest-wait、batch size、batch fill ratio、活跃序列、KV/特征缓存占用、GPU busy 与 CPU 核利用率。
vLLM-Omni 论文只给 connector 平均延迟不足以描述尾部与拥塞,因此复现时追加 p50/p95/p99、字节数、传输类型和拓扑路径。SGLang-Omni issue #1018 将阶段时间戳和 A/A 噪声列入性能路线,可用来说明需要这些观测字段;issue 不是已完成实现的保证。若官方指标缺失,允许使用 eBPF、Nsight Systems 或代理层 span,但必须报告探针开销并用开/关探针对照。
关键派生量是阶段 \(s\) 的等待 \(W_s=t^{\mathrm{start}}_s-t^{\mathrm{ready}}_s\) 与服务时间 \(S_s=t^{\mathrm{finish}}_s-t^{\mathrm{start}}_s\)。对分叉图还需记录每条边的 fan-out、复制字节和 join 等待,不能把最长分支以外的资源消耗丢掉。
9. 拓扑、资源预算与能耗
完整拓扑表包含 GPU 型号、显存、互连(PCIe/NVLink/NVSwitch)、NIC 型号与速率、交换网络、CPU socket、NUMA、内存通道、本地盘和阶段到设备的放置。报告 tensor/pipeline/expert parallel、stage replica、connector 后端和是否经过 host staging。比较必须保持相同 GPU 数或同时给出成本归一化结果;不能把“更多卡更快”写成调度收益。
用固定采样间隔收集 GPU 功率、CPU package 功率(若可用)、显存、HBM 带宽、PCIe/NVLink/NIC 流量和 GPU 时钟。成功请求平均动态能耗可写为
\[ E_{\mathrm{req}}=\frac{\int_{t_0}^{t_1}\bigl(P(t)-P_{\mathrm{idle}}\bigr)\,\mathrm dt}{N_{\mathrm{success}}}. \]
同时保留总能耗和空闲基线,因为动态扣除对短实验敏感。能耗结果注明传感器、采样率和是否包含 CPU、网络与负载生成器。对多节点实验按节点分别记录,避免只读取主节点 GPU 得到虚假的能效优势。
10. 原始轨迹与制品模式
每次运行生成不可变目录:metadata.json、experiment.yaml、requests.jsonl、events.jsonl、resources.parquet、quality.jsonl、stdout/stderr、拓扑快照和绘图脚本。汇总 CSV 不是原始数据。每个事件包含 run、request、session、stage、attempt、chunk、event、monotonic timestamp、wall-clock timestamp、device、bytes、batch 和状态码;跨节点先同步时钟,再保存原始节点时钟与校正量。
{"run_id":"...","request_id":"...","stage":"vocoder",
"event":"output_chunk","mono_ns":0,"chunk_id":7,
"samples":2400,"sample_rate":24000,"status":"ok"}
制品目录写入内容哈希,分析脚本只读原始轨迹并生成派生表。公开受限数据时至少发布请求长度、模态、到达时间与匿名分组,使他人能重放负载;不能公开输入时,提供可生成等价分布的合成器及统计检验。
11. 统计、A/A 与不确定性
延迟分布通常偏斜,不只报告均值。每个配置给出 p50、p90、p95、p99、最大值、成功率和样本数;以 run 为重采样单位做 bootstrap 置信区间,避免把同一 run 内相关请求当作完全独立。系统 A 与 B 使用配对请求和交替 run,报告相对变化 \(\delta=(M_B-M_A)/M_A\) 及置信区间。
A/A 的目标不是得到显著差异,而是测量平台噪声和虚假阳性。若 A/A 的 p99 漂移已经大于声称收益,就延长运行、控制时钟与背景负载,或降低结论强度。容量曲线的每个点独立重复;不要用一次长 run 中连续升压的片段代替独立稳态,因为缓存、热状态与积压会污染后续点。
同时进行分布等价检查:输入和实际输出长度、模态比例、质量分数、失败类型在比较组之间是否一致。性能提升若主要来自更早截断或更短音频,应归入质量/语义变化而非运行时加速。
12. 失败、取消、超时与重试记账
终态枚举至少包括 success、quality-failed、client-cancelled、deadline-exceeded、admission-rejected、OOM、worker-lost、transport-error、invalid-output 和 harness-error。每个初始请求是一个 attempt group;内部重试增加 attempt 号和资源消耗,但不制造新的外部成功。成功率分母是所有已计划并实际发出的初始请求,容量报告还要给出未能按计划发送的 generator lag。
超时从共同入口开始,不能为慢系统延长 deadline。取消实验验证:入口返回后所有后代阶段最终停止、队列引用清除、显存/共享内存/credit 回收、不会继续生成不可见输出。故障注入覆盖 worker kill、connector 丢包或延迟、下游停读、磁盘满、节点隔离和恢复;恢复语义明确是 fail-fast、重试、降级还是断点续传。
历史 issue 可以帮助选择注入点。例如 vLLM-Omni issue #5488 描述 deferred CFG companion 的 deadline/liveness 风险,issue #5349 描述 v0.24 下一个已关闭的流式静音停滞;它们只能证明相应版本和路径曾值得测试,不能替代对目标 commit 的复现。
13. 容量边界与 SLO 实验
容量不是峰值吞吐,而是在质量、错误率与尾延迟约束下可持续的最大到达率。预先定义 SLO,例如成功率不低于 99.9%、p99 TTFA 不高于 500 ms、p99 音频块间隙不高于 200 ms、RTF 小于 1。对每个到达率运行足够长的稳态窗口,若队列长度持续增长,即使窗口内吞吐看似很高,也判为不可持续。
用二分或分段搜索定位最大可持续 \(\lambda^\star\),然后在 \(0.5\lambda^\star\)、\(0.8\lambda^\star\)、\(0.95\lambda^\star\) 和过载区重复。过载时记录 admission、排队上限、优先级和降级行为。多租户场景同时报告每租户吞吐、尾延迟、拒绝率与 slowdown;聚合吞吐不能掩盖某个租户饥饿。
阶段容量还要单独测:固定上游回放轨迹,将某阶段视为服务中心,扫描 batch、replica 和输入长度。这能区分模型内核上限、主机 dispatch 上限和跨阶段供给不足,但最终结论必须回到端到端实验验证。
14. 可执行运行手册与验收清单
- checkout 固定 SHA,构建带 digest 的镜像,保存 diff 与依赖清单。
- 验证权重、processor、数据和评估器哈希,生成冻结请求清单。
- 采集拓扑、时钟、功率限制与空闲基线,执行 A/A 噪声测试。
- 先跑正确性集与流式样本计数,未过质量门则停止排名。
- 分别执行冷启动、闭环并发、开放环容量、慢消费者与故障注入。
- 保留所有 run,包括失败与人工判废 run;判废必须有机器可读原因。
- 从原始事件重建 TTFT、TTFA、JCT、RTF、jitter、阶段等待与能耗。
- 执行配对统计、bootstrap 区间和分布等价检查,再生成图表。
- 由另一环境按 README 重放至少一个配置,核对原始哈希和汇总结果。
最终报告的第一张表应是配置与质量门,第二张才是性能。每条结论都指向 run id、原始轨迹和分析 commit;系统优越性的证据只采用能够重放并核对原始记录的数字。
15. 一手来源与适用范围
- vLLM-Omni 论文(arXiv HTML, v1):论文系统结构、实验硬件、基线和公开指标。
- vLLM-Omni 官方仓库、官方发布页与官方 benchmark 目录。
- vLLM-Omni architecture overview:stage graph、独立 engine 与 connector。
- SGLang-Omni 官方仓库与官方 benchmark 目录。截至核验日没有独立 SGLang-Omni 论文。
- SGLang-Omni #1018:带版本上下文的 benchmark/观测路线;#1354:已关闭的流式音频样本问题。
- vLLM-Omni #5488、#5349:只作为故障注入线索,不作为跨版本事实。