一、项目定位 SGLang-Omni 是 sgl-project 下的多阶段(multi-stage)推理服务运行时,专门面向 omni 模型、语音 / TTS 模型以及统一多模态模型。它把一次生成拆成多个异构阶段——预处理、编码器、自回归引擎、talker、解码器、vocoder、聚合器——分别匹配不同的调度器与传输后端,对外暴露 OpenAI 兼容的 /v1/audio/speech、/v1/audio/transcriptions、多模态 chat 等接口。项目明确把自己定位在 SGLang 生态之上:自回归调度与 token 级执行复用 SGLang,而 pipeline 拓扑、阶段生命周期、跨阶段传输、模型族适配层、serving surface 由 SGLang-Omni 自己拥有。
从 README 与提交历史看,项目处于活跃但偏早期的生产化阶段:PyPI 最新 release 为 v0.1.7(2026-09-28),近一周提交热点集中在 Qwen3-Omni 内核级性能优化(MoE kernel compile、predictor 重叠发射、MRoPE 元数据裁剪)、MiniCPM-o HiFT decode compile、CosyVoice3 / MOSS-TTS 的跨阶段零拷贝、以及 XPU / Router 安全修复。README 把 Apple Silicon、Intel XPU 都标为 Experimental,CUDA 为默认完整支持后端。仓库结构上,sglang_omni/(739 文件)是主 Python 包,sglang_omni_router/ 是 Rust+Python 的多 worker 前置路由,sglang_omni_mlx/ 是 Apple Silicon 适配层,OmniTyper 与 Voxt 是 Swift / iOS 侧配套项目,tests/(610 文件)和 benchmarks/(87 文件)提供测试与回归基准。整体是一个正在从研究原型走向多硬件、多模型族产品化的 serving 框架。
解决什么问题、给谁用 解决的核心问题是:现代 omni / TTS / 语音模型不再是单一自回归 decode,而是由多个计算模式完全不同、依赖结构各异、资源需求不等的阶段串/并而成(如文本 thinker → 音频 talker → vocoder,或 ASR encoder → LLM → 说话人日志)。现有 serving 框架要么只覆盖纯文本 LLM(vLLM、TensorRT-LLM),要么只覆盖单阶段扩散/解码,无法原生表达这种多阶段 pipeline 的调度、阶段间 tensor 传输、异构硬件后端切换、以及流式 vocoder 输出。SGLang-Omni 的目标用户是:需要把 Qwen3-Omni、MiniMax Music 3、Higgs Audio v3、MOSS-TTS、Fish Speech S2-Pro、Qwen3-ASR 等模型以生产级延迟与吞吐部署在 NVIDIA CUDA、Intel XPU、Apple Silicon、ROCm、NPU 等多硬件上的推理工程师、MLSys 研究者、以及需要 OpenAI 兼容音频 API 的产品团队。典型场景包括:实时语音对话(全双工)、歌词→立体声歌曲生成、批量 TTS、流式语音、上传参考语音克隆、ASR+说话人分离一站式服务。
1) 推理系统工程师:负责把 omni / TTS 模型部署到 GPU 集群,需要多阶段 pipeline 调度、跨阶段 tensor relay、NCCL/NIXL/Mooncake 传输后端、以及 OpenAI 兼容 API;2) 性能优化工程师:在 Qwen3-Omni、MiniCPM-o 等模型上做 kernel 级调优(MoE compile、HiFT decode、predictor 重叠、MRoPE 裁剪);3) 多硬件支持工程师:为 Intel XPU、Apple Silicon MLX、ROCm、NPU 等非 CUDA 后端添加适配层;4) 研究者 / 评测工程师:使用 benchmarks/ 与 playground/ 跑回归、对比不同模型族;5) 端侧 / iOS 开发者:通过 OmniTyper、Voxt 把能力带到 Apple 平台。
同类项目与差别 SGLang (sgl-project/sglang) :SGLang 是纯文本 LLM 的高性能 autoregressive 调度与模型执行引擎;SGLang-Omni 在其之上接管多阶段 pipeline、阶段间传输、vocoder/talker 调度、音频 API。自回归部分复用 SGLang,非自回归阶段由 Omni 自己拥有。vLLM :vLLM 聚焦单阶段自回归 LLM serving,无多阶段 pipeline、无 vocoder/talker 调度、无跨阶段 tensor relay、无 OpenAI 兼容音频端点。Omni 在音频/多模态 serving 层面是 vLLM 的上层扩展。TensorRT-LLM :NVIDIA 官方优化,深度绑定 CUDA/TensorRT,单阶段为主;Omni 面向多硬件(XPU/ROCm/NPU/MLX)、多阶段、模型族更宽(TTS/ASR/音乐/Omni),但单卡极致优化深度可能不如 TRT-LLM。FasterWhisper / WhisperX :专注 ASR 单任务;Omni 把 ASR、TTS、音乐生成、多模态 chat 统一到一个 serving surface 与多阶段框架下。Coqui TTS / ChatTTS :专注 TTS 模型本身;Omni 是 serving 运行时,把 TTS 作为多阶段 pipeline 之一,支持 batch/streaming/voice-clone 以及与其他模态组合。
核心能力 能力 在哪 成熟度 多阶段 pipeline 调度(preprocessing / encoder / autoregressive engine / talker / decoder / vocoder / aggregator) sglang_omni/pipeline/, sglang_omni/scheduling/, sglang_omni/serve/ 成熟 SGLang 自回归调度与模型执行复用 sglang_omni/model_runner/, sglang_omni/models/, pyproject.toml 依赖 sglang==0.5.21 成熟 跨阶段 tensor relay(shared-memory / NCCL / NIXL / Mooncake) sglang_omni/relay/, pyproject.toml 依赖 nixl-cu13 / mooncake-transfer-engine-cuda13 成熟 OpenAI 兼容音频 API(/v1/audio/speech, /v1/audio/transcriptions, 多模态 chat) sglang_omni/http/, examples/, docs/cookbook/ 成熟 多硬件后端:NVIDIA CUDA(默认) docker/Dockerfile, pyproject.toml, sglang_omni/platforms/ 成熟 多硬件后端:Intel XPU(Experimental) pyproject_xpu.toml, docker/xpu.Dockerfile, scripts/xpu/, 提交热点含 XPU 修复 实验 多硬件后端:Apple Silicon / MLX(Experimental) sglang_omni_mlx/, pyproject_cpu.toml, install.sh, OmniTyper/, Voxt/ 实验 多硬件后端:ROCm / NPU / MUSA(Experimental) pyproject_rocm.toml, pyproject_npu.toml, pyproject_musa.toml, docker/rocm.Dockerfile, docker/npu.Dockerfile, docker/musa.Dockerfile 实验 多 worker 前置路由(health / readiness / lifecycle / capability discovery) sglang_omni_router/ (Rust + Python) 成熟 模型族适配层(Qwen3-Omni, MiniCPM-o, MiniMax Music 3, Higgs Audio v3, MOSS-TTS, Fish Speech S2-Pro, Qwen3-TTS, Qwen3-ASR 等) sglang_omni/models/, docs/cookbook/ 成熟 内核级性能优化(MoE compile、HiFT decode compile、predictor 重叠、MRoPE 元数据裁剪、跨阶段零拷贝) sglang_omni/models/, 提交热点 #2599/#2598/#2597/#2518/#2555/#2525 成熟 Apple / iOS 端侧配套(Swift 类型映射、Voxt 应用) OmniTyper/ (Swift Package), Voxt/ (Xcode 项目) 实验 评测与回归基准 benchmarks/ (87 文件), playground/, tests/ (610 文件) 成熟
阶段: 活跃开发、早期生产化。PyPI 最新 v0.1.7(2026-09-28),近一周仍有密集性能提交;README 明确标注 Apple Silicon、XPU 为 Experimental;CUDA 为默认完整支持后端。
技术栈: Python 3.10–3.12(主包 sglang_omni);Rust + Python(sglang_omni_router);Swift(OmniTyper、Voxt);PyTorch 2.13.0 + torchvision 0.28.0;SGLang 0.5.21(自回归调度/执行);MLX / mlx-lm(Apple Silicon 后端);flashinfer_python[cu13] 0.6.18 + flash-attn-4 + kernels 0.14.x(CUDA 内核);cache-dit 1.3.0(MiniMax Music 3 DIT);nixl-cu13 / mooncake-transfer-engine-cuda13(跨阶段传输);transformers 5.12.1, accelerate, pyzmq, msgpack, msgspec, pydantic, PyYAML, fastapi, uvicorn;多硬件 pyproject_*.toml(cpu/musa/npu/rocm/xpu);setuptools 构建;GitHub Actions CI(.github/workflows)
规模: 主包 sglang_omni 739 文件;tests/ 610 文件;benchmarks/ 87 文件;examples/ 66 文件;docs/ 95 文件;sglang_omni_router/ 72 文件;sglang_omni_mlx/ 8 文件;OmniTyper 42 文件;Voxt 1008 文件。最近提交热点:tests/unit_test 24 次、sglang_omni/models 20 次、sglang_omni/preprocessing 4 次。PyPI release v0.1.7(2026-09-28)、v0.1.6(2026-09-17)、v0.1.5(2026-09-10),约每周一版。README 显示 GitHub stars、open/closed issues 徽章(具体数值需验证)。最近提交日期 2026-10-08,开发活跃。
三、本地跑起来(没有 GPU 的 Mac) 安装 # 1. 前置:Homebrew + Python 3.10–3.12(Apple Silicon 要求)brew install uv# 2. 克隆仓库git clone https://github.com/sgl-project/sglang-omni.git && cd sglang-omni# 3. 一键安装脚本(README Quick Start 明确指向)# 内部会检测 arm64 + darwin,走 pyproject.toml 的 mlx/mlx-lm 分支,跳过 flashinfer_python[cu13]/flash-attn-4/nixl-cu13/mooncake-transfer-engine-cuda13/kernels 等 CUDA-only 依赖./install.sh# 4. 失败回退:手动用 uv 创建 venv 并安装 Apple Silicon 子集# pyproject.toml 中 Apple Silicon 专属依赖:mlx>=0.32.0, mlx-lm;CUDA 依赖通过 sys_platform != 'darwin' or platform_machine != 'arm64' 自动排除uv venv --python 3.11 .venv && source .venv/bin/activateuv pip install -e . --prerelease=allow# 5. 验证安装(应看到 torch=2.13.0, transformers=5.12.1, sglang 从源码编译的 all_mps 变体, mlx 已安装)python -c "import sglang_omni, torch, mlx; print('torch', torch.__version__); print('mlx ok')"# 6. 跳过/不会装上的依赖(pyproject.toml 中 sys_platform 条件排除):# flashinfer_python[cu13]==0.6.18, flash-attn-4>=4.0.0b18, kernels>=0.14.1,<0.15,# nixl-cu13>=1.1.0, mooncake-transfer-engine-cuda13>=0.3.10# 这些是 CUDA relay/attention 后端,Apple Silicon 上 import 会直接报错,不要尝试安装
哪些路径能真跑 ['# 能在 Apple Silicon / MPS / MLX 上真正执行的代码路径:', '# - sglang_omni_mlx/ 整个包:Qwen3-ASR 的 MLX 推理路径(README 明确 Apple Silicon 支持 Qwen3-ASR via MLX)', '# - sglang_omni/models/*/mlx/ 子模块:arkasr/mlx/, fun_cosyvoice3/mlx/, fun_asr/torch_mps_runner.py —— 这些是 Apple Silicon 专用 runner', '# - sglang_omni/model_runner/audio_mlx.py, audio_torch_mps.py —— MLX/MPS 音频执行器', '# - sglang_omni/mps/ —— Metal Performance Shaders 后端适配', "# - sglang_omni/models/fun_cosyvoice3/engine_builder.py 中 uses_torch_mps() 分支(device.type == 'mps' 时走 Torch MPS 而非 MLX)", '# - sglang_omni/models/fun_asr/torch_mps_runner.py —— Fun-ASR 的 MPS 实现', '# - sglang_omni_router/ —— Rust+Python 路由层,无 GPU 依赖,纯 CPU 可编译运行', '# - tests/unit_test/ —— 纯 Python 单元测试(调度逻辑、配置解析、payload 序列化)', '# - sglang_omni/config/ —— 配置系统,CPU 可跑', '# - sglang_omni/scheduling/ —— 调度逻辑(除 CUDA graph 相关)', '# - sglang_omni/pipeline/ —— pipeline 拓扑定义', '# - sglang_omni/profiler/, diagnostics/ —— 诊断工具(部分 GPU 相关功能会降级)', '#', '# 只能读代码或必须 Colab T4 验证的路径:', '# - 所有 *cuda_graph*.py:encoder_cuda_graph.py, step_cuda_graph.py, vocoder_cuda_graph.py, prefix_cuda_graph.py, whisper_prefill_cuda_graph_runner.py', '# - sglang_omni/comm/kv_transfer.py 中 NCCL 路径、relay.py 中 NIXL/Mooncake 后端', '# - sglang_omni/models/qwen3_omni/ 的 thinker/talker 内核(MoE compile、MRoPE 优化均为 CUDA 专属)', '# - sglang_omni/models/dots_tts/ 的 torch_compile 路径(configure_optimized_kernels)', '# - sglang_omni/models/fishaudio_s2_pro/ 的 Fast-AR attention(强制要求 SM89/90/100/120 + flashinfer)', '# - sglang_omni/models/higgs_tts/ 的 CUDA graph 路径', '# - sglang_omni/platforms/ 中 CUDA 后端的具体 kernel 调用', '# - benchmarks/ 下所有 eval 脚本(均需真实 GPU 推理)']
最小可运行 # 冒烟测试 1:验证 Apple Silicon 上 Qwen3-ASR MLX 路径可 import 并加载模型(README 明确这是 Apple Silicon 主打功能)python -c "from sglang_omni_mlx import qwen3_asr; print('Qwen3-ASR MLX module loaded')"# 冒烟测试 2:验证 Torch MPS 音频 runner 可实例化(不跑推理,只验 import 和设备检测)python -c "from sglang_omni.model_runner.audio_torch_mps import *; print('Torch MPS audio runner import ok')"# 冒烟测试 3:验证 Fun-ASR Torch MPS runner 路径(sglang_omni/models/fun_asr/torch_mps_runner.py 存在)python -c "from sglang_omni.models.fun_asr.torch_mps_runner import FunASRTorchMpsModelRunner; print('FunASR MPS runner import ok')"# 冒烟测试 4:验证 CosyVoice3 MLX 子模块可 import(fun_cosyvoice3/mlx/ 目录存在)python -c "from sglang_omni.models.fun_cosyvoice3.mlx import model as cv3_mlx_model; print('CosyVoice3 MLX import ok')"# 冒烟测试 5:验证配置系统 CPU 可跑(无 GPU 依赖)python -c "from sglang_omni.config.manager import ConfigManager; cm = ConfigManager(); print('ConfigManager init ok')"# 冒烟测试 6:验证 sglang_omni_router Python 层可 import(Rust 部分需单独编译)python -c "from sglang_omni_router.python import *; print('Router Python layer import ok')" # 需验证具体导出
测试 ['# 测试框架:pytest(tests/ 目录 610 文件,含 test_ci/, test_model/, unit_test/, utils/)', '# 目录结构:', '# tests/unit_test/ —— 纯 CPU 单元测试(调度、配置、payload、序列化)', '# tests/test_ci/ —— CI 专用测试', '# tests/test_model/ —— 模型级测试(多数需 GPU)', '# tests/utils/ —— 测试工具', '# tests/data/ —— 测试数据', '#', '# 只跑 CPU 子集(Apple Silicon 推荐):', "pytest tests/unit_test/ -x -v --timeout=120 -k 'not gpu and not cuda and not trt'", '# 预估耗时:unit_test 子集在 16GB MacBook Air 上约 5–15 分钟(取决于是否触发模型下载)', '#', '# 跳过 GPU 测试的标记(需验证具体 marker 名称):', '# 查看 pytest.ini 或 conftest.py 中是否有 @pytest.mark.gpu / @pytest.mark.cuda', '# 若无显式 marker,用 -k 排除关键词过滤', '#', '# 注意:tests/test_model/ 下多数测试会尝试 import flashinfer 或 CUDA 相关模块,', '# 在 Apple Silicon 上会 collect error,建议只跑 unit_test/']
调试 # 日志开关: # SGLANG_OMNI_LOG_LEVEL=DEBUG —— 全局日志级别(需验证环境变量名) # sglang 自身:SGLANG_LOG_LEVEL=DEBUG # 各 model_runner 模块使用标准 logging.getLogger(__name__),可通过 logging.basicConfig(level=DEBUG) 开启 # # 断点入口(关键类和方法): # - sglang_omni/scheduling/omni_scheduler.py:OmniScheduler.schedule() —— 多阶段调度主循环 # - sglang_omni/pipeline/ 下各 Stage 的 process() 方法 —— 单阶段执行 # - sglang_omni/model_runner/base.py:ModelRunner.before_prefill/post_prefill/post_decode —— 模型执行钩子 # - sglang_omni/comm/data_ref.py —— 跨阶段 tensor 传输的共享内存路径(CPU 可断点) # - sglang_omni_mlx/qwen3_asr/ —— Apple Silicon MLX 推理入口 # # Profiling 入口: # - sglang_omni/profiler/ —— 内置性能剖析工具 # - sglang_omni/diagnostics/gpu.py —— GPU 诊断(Apple Silicon 上部分功能降级) # - .claude/skills/omni-gpu-deep-dive/scripts/omni_trace_pair.py —— 提交轨迹追踪脚本 # - benchmarks/runtime_metrics.py —— 运行时指标采集 # # 环境变量(需验证): # SGLANG_OMNI_MLX_DEVICE=1 —— 强制使用 MLX 后端(Apple Silicon) # SGLANG_DISABLE_CUDA_GRAPH=1 —— 禁用 CUDA graph(CPU/MPS 调试时) # Metal/MPS 相关:PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 —— 调整 MPS 内存上限 CI ['# CI 系统:GitHub Actions(.github/workflows/ 下多个 workflow,.github/scripts/ 含辅助脚本)', '# 关键 CI 脚本:', '# .github/scripts/pr_ci_gate.py —— PR 门禁逻辑', '# .github/scripts/verify_omni_installed_pins.py —— 验证依赖 pin 一致性', '# .github/scripts/omni_missing_dependencies.py —— 缺失依赖检测', '# .github/update_ci_permission.py —— CI 权限管理', '#', '# 多后端 CI 矩阵(docker/ 目录对应):', '# Dockerfile(CUDA 默认)、cpu.Dockerfile、musa.Dockerfile、npu.Dockerfile、rocm.Dockerfile、xpu.Dockerfile', '# CI 会分别在这些镜像中跑测试', '#', '# PR 会被卡住的检查(推测,需看 workflows 文件名确认):', '# 1. pre-commit:isort、check_if_else.py、check_leading_underscore.py 等代码风格检查', '# 2. unit_test 子集必须在 CPU 上通过', '# 3. 依赖 pin 一致性检查(verify_omni_installed_pins.py)', '# 4. 多后端构建验证(CUDA/XPU/NPU/ROCm 各自有 CI job)', '# 5. 可能有的 docs 构建检查(docs/ 含 Makefile 和 serve.sh)', '#', '# Apple Silicon 相关 CI:需确认是否有 macOS arm64 runner(README 标 Experimental,可能无专属 CI)']
坑 # 坑 1:sglang PyPI wheel 的 CUDA 依赖是 unconditional 的 # pyproject.toml 注释明确说:'SGLang's PyPI wheel has unconditional CUDA dependencies, so Apple Silicon installs this exact tag from source with the all_mps extra' # 解决:必须用 install.sh 或从源码编译 sglang 的 all_mps extra,不能直接 pip install sglang # # 坑 2:flashinfer_python[cu13] 的 cubin wheel 问题 # pyproject.toml 注释:'Do NOT add flashinfer-cubin: PyPI has no matching cubin, and any leftover cubin wheel fails MiniMax DIT import' # 在 Apple Silicon 上这些会被 sys_platform 条件排除,但如果你手动改 pyproject 或混用 pip install 可能触发 # # 坑 3:torch==2.13.0 和 transformers==5.12.1 是硬 pin # 这是为了匹配 sglang 的 pinned stack,不要随意升级,否则 sglang 内部会 break # # 坑 4:Apple Silicon 上 Qwen3-ASR 是唯一官方支持的端到端推理路径 # README Hardware Support 表:'Apple Silicon | Experimental | Qwen3-ASR runs through native MLX or Torch MPS' # 其他模型(Qwen3-Omni, dots.tts, FishAudio S2-Pro 等)在 Apple Silicon 上无法跑推理,只能读代码 # # 坑 5:MLX 和 Torch MPS 路径的切换逻辑不透明 # fun_cosyvoice3/engine_builder.py 中 uses_torch_mps() 依赖 sglang.srt.hardware_backend.mlx.runtime.use_mlx() 的返回值 # 如果 MLX 库存在但 device 是 mps,会走 Torch MPS;否则走 MLX。切换逻辑需要读源码确认,无文档说明 # # 坑 6:tests/test_model/ 在 Apple Silicon 上会大量 collect error # 这些测试会 import flashinfer、CUDA graph 相关模块,在 macOS 上 import 阶段就失败 # 建议只跑 tests/unit_test/,不要跑全量 pytest tests/ # # 坑 7:sglang_omni_router 的 Rust 部分需要独立编译 # sglang_omni_router/ 含 rust/ 子目录,需要 cargo 工具链 # 如果只跑 Python 层,需确认 python/ 子目录的纯 Python fallback 是否完整 # # 坑 8:16GB 内存限制对 unit_test 的影响 # 部分 unit_test 可能加载小模型或 mock 权重,16GB 可能紧张 # 建议用 -k 过滤 + --timeout 限制,避免 OOM # # 坑 9:cache-dit==1.3.0 和 addict==2.4.0 是 hard import 不是 optional # pyproject.toml 注释:'hard import, not optional' # 这两个包在 Apple Silicon 上也会被安装,如果它们有 CUDA 依赖可能会 import error(需验证) # # 坑 10:CONTRIBUTING 文件为空字符串(仓库 evidence 中 contributing 字段为空) # 项目可能依赖 AGENTS.md / CLAUDE.md 中的 coding style 指南 # 修改代码前必须读 .claude/skills/code-review/coding-style.md(AGENTS.md 明确要求) 七、任务卡 任务 1 优先 · low · Mac · 2 个晚上
[Apple Silicon] 为 Fun-ASR TorchMPS runner 补 request builder 单元测试 Issue #1967 · [RFC] Apple Silicon support roadmap ↗
已指派 AkazaAkane 已有 PR #1977 23 条评论 更新 2026-10-06
用到的专长: 端侧部署经验(TensorRT/量化)直接迁移到 Apple Silicon 后端适配;单元测试是低风险高信任的入门贡献。
目标: 为 fun_asr/torch_mps_runner.py 的 request builder 逻辑新增单元测试,覆盖:音频输入预处理、prompt 构造、MPS device 分支、repetition_penalty 传递。测试在 MacBook Air 上可跑,不依赖 GPU。
为什么值得长期做: Apple Silicon 是 README 明确标注的 Experimental 后端,Qwen3-ASR 已有 MLX 路径,但 Fun-ASR 的 TorchMPS runner(sglang_omni/models/fun_asr/torch_mps_runner.py)缺乏测试覆盖。补全测试是成为 Apple Silicon 后端负责人的第一步。
怎么介入: Issue #1967 已有 assignee AkazaAkane 和多个 open PR,但测试覆盖仍是明确缺口。此卡不与现有 PR 冲突,属于补测试而非改生产代码。第一个 PR 的边界: 第一个 PR 只新增 tests/unit_test/test_fun_asr_mps_runner.py,不修改任何生产代码。
第一步: 克隆仓库,在 Mac 上执行 ./install.sh 安装 Apple Silicon 依赖,然后运行 pytest tests/unit_test/ -k fun_asr 确认现有测试状态。
本机怎么复现 / 验证: git clone && ./install.sh && pip install -e '.[test]' && pytest tests/unit_test/ -k fun_asr -v # 确认基线;然后编写新测试并运行 pytest tests/unit_test/test_fun_asr_mps_runner.py -v
认领留言(英文,可直接贴到 Issue) Hi, I'd like to add unit tests for the Fun-ASR TorchMPS runner request builders under the Apple Silicon roadmap (#1967). Plan: create tests/unit_test/test_fun_asr_mps_runner.py covering audio preprocessing, prompt construction, the MPS device branch, and repetition_penalty passthrough. All tests will run on Apple Silicon without GPU. I'll keep the first PR scoped to tests only. Could you confirm if the request builder lives in torch_mps_runner.py or a separate module? Target: PR within 2 evenings. 复制留言
大致实施方案 定位 fun_asr/torch_mps_runner.py 中的 request builder 函数(如 build_request / prepare_input)。 在 tests/unit_test/ 下新增 test_fun_asr_mps_runner.py(新增文件)。 构造 mock 音频输入(小段随机 tensor),验证 builder 输出字段完整性。 验证 device.type == 'mps' 分支确实走到 Torch MPS 路径而非 MLX。 验证 repetition_penalty 参数从请求传递到 sampling 配置。 在 Mac 上跑 pytest tests/unit_test/test_fun_asr_mps_runner.py -v 确认通过。 可能涉及的目录或文件 sglang_omni/models/fun_asr/torch_mps_runner.py sglang_omni/models/fun_asr/request_builders.py(需确认是否存在) tests/unit_test/test_fun_asr_mps_runner.py(新增)
验收方式 pytest tests/unit_test/test_fun_asr_mps_runner.py -v 在 MacBook Air 上全部通过 ruff check tests/unit_test/test_fun_asr_mps_runner.py 无警告 测试覆盖 device=mps 和 device=cpu 两个分支 开工前问题与风险 向维护者确认 Fun-ASR TorchMPS runner 的 request builder 具体在哪个文件?是 torch_mps_runner.py 内联还是独立模块? 是否需要覆盖 batch 场景,还是单请求即可? 风险 若 torch_mps_runner.py 依赖 MLX 或 CUDA 特定符号,Mac 上 import 可能失败;需确认纯 MPS 路径可独立导入。 任务 2 优先 · medium · Mac · 2-3 个晚上
[Apple Silicon] 新增 Apple Silicon runtime_metrics 基准脚本(Qwen3-ASR MLX) Issue #1967 · [RFC] Apple Silicon support roadmap ↗
已指派 AkazaAkane 已有 PR #1977 23 条评论 更新 2026-10-06
用到的专长: 性能剖析与 roofline 分析经验直接适用于 Apple Silicon 基准建立。
目标: 在 benchmarks/ 下新增 apple_silicon_asr_mlx.py,测量 Qwen3-ASR 在 Apple Silicon 上的 RTF、首 token 延迟、内存占用,输出结构化 JSON 报告。
为什么值得长期做: Apple Silicon 上缺乏系统性能基准是 README 明确标注 Experimental 的原因之一。建立可重复的 MLX vs MPS vs CPU baseline 是后端成熟度的关键证据。
怎么介入: Issue #1967 的 open PR 集中在模型移植,基准脚本是独立且不冲突的贡献。第一个 PR 的边界: 第一个 PR 只新增 benchmarks/apple_silicon_asr_mlx.py 及少量说明文档,不改框架代码。
第一步: 阅读 benchmarks/eval/benchmark_asr_seedtts.py 了解现有基准结构,然后基于 sglang_omni_mlx/qwen3_asr 实现 Apple Silicon 专用脚本。
本机怎么复现 / 验证: git clone && ./install.sh && python benchmarks/apple_silicon_asr_mlx.py --device mlx --num-samples 5 # 在 MacBook Air 上直接运行并检查 JSON 输出
认领留言(英文,可直接贴到 Issue) Hi, under the Apple Silicon roadmap (#1967), I'd like to add a runtime_metrics benchmark script for Qwen3-ASR on Apple Silicon. Plan: create benchmarks/apple_silicon_asr_mlx.py measuring RTF, first-token latency, and peak memory across MLX/MPS/CPU backends. Will use a small local audio set (5-10 samples) to avoid large downloads. Output structured JSON for regression tracking. First PR scoped to the script only. Target: 2 evenings. 复制留言
大致实施方案 克隆仓库,确认 sglang_omni_mlx/qwen3_asr 的 MLX 推理入口。 在 benchmarks/ 下新增 apple_silicon_asr_mlx.py(新增文件)。 实现本地音频加载(避免下载大数据集,用 5-10 条内置样本)。 测量:端到端延迟、RTF、峰值内存(psutil)、MLX vs MPS vs CPU 三档对比。 输出 JSON 报告到 stdout 或本地文件。 在 MacBook Air 上运行并记录输出作为 PR 附件。 可能涉及的目录或文件 sglang_omni_mlx/qwen3_asr/ benchmarks/apple_silicon_asr_mlx.py(新增) sglang_omni/models/qwen3_asr/(参考现有实现)
验收方式 python benchmarks/apple_silicon_asr_mlx.py 在 MacBook Air 上成功运行并输出 JSON 报告包含 RTF、p50/p95 延迟、内存占用三项核心指标 脚本支持 --device mlx/mps/cpu 参数切换 开工前问题与风险 向维护者确认 基准数据集:是否可以用本地 5-10 条音频替代完整 SeedTTS 数据集? MLX 和 MPS 的对比是否需要同一模型权重? 风险 MLX 在 Apple Silicon 上的内存占用可能较高,需设置合理的输入长度上限。 任务 3 可选 · medium · CPU · 3-4 个晚上
[RFC] Full-Duplex Recoverable Unit Failures 中「Unit 生命周期状态机」子项 Issue #2561 · [RFC] [Duplex] [Sessions] Recoverable Unit Failures for Full-Duplex Sessions ↗
无人认领 0 条评论 更新 2026-10-06
用到的专长: 分布式训练中的容错与状态机设计经验直接适用于 Unit 生命周期管理。
目标: 基于 RFC #2561 的设计,实现 Unit 生命周期状态机(pending → running → committed / failed → retrying),确保单 session 内 Unit 严格有序 commit,跨 session 故障隔离。
为什么值得长期做: Full-Duplex 是 SGLang-Omni 的核心会话模型,RFC #2561 提出 Unit 必须按序 commit、失败可恢复的契约。实现 Unit 生命周期状态机是 Full-Duplex 生产化的基础。
怎么介入: Issue #2561 无 assignee、无 open PR,仍在 RFC 阶段。此卡应先开 Issue 提案(或在 #2561 下留言),得到维护者对状态机设计的确认后再动手实现。第一个 PR 的边界: 第一个 PR 只新增 Unit 状态机骨架(UnitState 枚举 + commit cursor + 基础转换逻辑)和单元测试,不修改调度器主循环。
第一步: 阅读 RFC #2561 全文,理解 recovery ladder(fast retry / rollback / reset / session fatal),然后定位现有 session 状态管理代码。
本机怎么复现 / 验证: git clone && pip install -e '.[test]' && pytest tests/unit_test/ -k session -v # 确认现有 session 测试基线;然后编写状态机测试并运行
认领留言(英文,可直接贴到 Issue) Hi, I'd like to implement the Unit lifecycle state machine proposed in #2561 as a step toward recoverable full-duplex sessions. Plan: first post a design sketch here for feedback (UnitState enum, commit cursor per stage, fast-retry vs rollback-retry ladder), then implement with unit tests once aligned. I'll keep the first PR scoped to the state machine skeleton + tests, without changing the scheduler thread. Could you confirm if this RFC is ready for implementation? Target: design comment within 1 evening, PR within 4 evenings after alignment. 复制留言
大致实施方案 定位现有 session 状态管理:sglang_omni/serve/realtime/session.py 或 scheduling/ 相关文件。 设计 Unit 状态机:定义 UnitState 枚举(PENDING, RUNNING, COMMITTED, FAILED, RETRYING)。 实现 commit 顺序保证:每个 stage 维护一个 commit cursor,后续 Unit 不得越过未解决的更早 Unit。 实现 fast retry:若 Unit 失败且未修改持久状态,直接重试。 实现 rollback + retry:若 Unit 可能修改状态,先 checkpoint 再重试。 添加单元测试:模拟 Unit 失败场景,验证状态机行为符合 RFC 契约。 在 Mac 上跑测试确认逻辑正确。 可能涉及的目录或文件 sglang_omni/serve/realtime/session.py sglang_omni/scheduling/omni_scheduler.py(需确认文件名) sglang_omni/pipeline/(stage commit 逻辑)
验收方式 单元测试覆盖:fast retry、rollback retry、session fatal 三种恢复路径 测试验证跨 session 故障隔离(A session 失败不影响 B session) 测试验证 commit 顺序不变量 开工前问题与风险 向维护者确认 RFC #2561 是否已有维护者认领实现?还是仍在设计讨论阶段? 现有 session 状态管理代码在哪个模块?是 realtime/session.py 还是 scheduling/ 层? 是否需要先实现状态机骨架,再逐步添加 recovery 策略? 风险 R F C 仍 在 讨 论 中 , 实 现 前 需 得 到 维 护 者 对 设 计 方 向 的 确 认 。