Prhub

#22073 [Feature] Adding Qwen3-asr Model Support

原始 PR 作者 adityavaid 合并时间 2026-04-07 13:27 文件变更 10 提交数 12 评论 36 代码增减 +571 / -11

执行摘要

为 SGLang 添加 Qwen3-ASR 模型支持,扩展其自动语音识别能力。

PR 动机源于 Issue #22025,该问题要求支持 Qwen3-ASR 模型,以丰富 SGLang 的自动语音识别能力。PR body 中明确指出:“This PR adds support so users can serve Qwen3-ASR via the existing /v1/audio/transcriptions endpoint”,旨在通过复用现有端点简化模型部署。

建议技术管理者和工程师精读此 PR,重点关注以下设计决策:配置嵌套结构的处理、模型权重复用策略、以及多模态处理器集成模式。同时,注意 review 中提出的代码重复和插件机制问题,可作为后续重构的参考点。

讨论亮点

Review 中的核心讨论包括:

  • 设计简化:AgainstEntropy 建议直接注册配置类,作者 adityavaid 采纳并简化了代码。
  • 代码健壮性:JustinTong0323 指出配置 fallback 可能导致危险,建议显式错误处理;作者添加了警告。
  • 代码重复:JustinTong0323 提到 _get_feat_extract_output_lengths 公式在 encode_server.py 中重复,存在同步风险,作者计划后续重构。
  • 插件机制:mickqian 和 JustinTong0323 均指出 serving_transcription.py 中的硬编码逻辑难以维护,建议使用策略模式或适配器,作者引用相关 PR #22181 作为后续解决方案。
    结论:大部分问题已通过修改解决,但代码结构和插件机制留作未来优化。

实现拆解

实现方案按模块拆解:

  1. 配置模块:新增 qwen3_asr.py 定义 Qwen3ASRConfigQwen3ASRThinkerConfig,处理嵌套配置结构。
  2. 模型模块:新增 qwen3_asr.py 实现 Qwen3ASRForConditionalGeneration,重用现有音频编码器和语言模型组件。
  3. 处理器模块:新增 qwen3_asr.py 实现 Qwen3ASRProcessor,处理音频特殊令牌和多模态数据。
  4. 服务器模块:修改 serving_transcription.py 添加模型检测逻辑,针对 Qwen3-ASR 构建特定提示词和后处理。
  5. 集成模块:更新 model_config.py 将 Qwen3-ASR 加入音频模型列表,并修改 encode_server.py 适配特征提取公式。
  6. 测试与文档:新增手动测试文件并更新支持模型文档。
文件 模块 状态 重要度
python/sglang/srt/configs/qwen3_asr.py configs added 8.0
python/sglang/srt/models/qwen3_asr.py models added 9.0
python/sglang/srt/multimodal/processors/qwen3_asr.py multimodal added 7.0
python/sglang/srt/entrypoints/openai/serving_transcription.py server modified 8.0
python/sglang/srt/configs/model_config.py configs modified 7.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

Qwen3ASRForConditionalGeneration Qwen3ASRProcessor is_audio_understandable_model _detect_model_family _postprocess_qwen3_asr

评论区精华

配置设计简化 设计

AgainstEntropy 建议直接注册 Qwen3ASRConfig 而无需包装类,作者采纳后简化了代码。

结论:作者修改配置类,移除冗余装饰器,提高可读性。 · 已解决

代码重复与同步风险 设计

JustinTong0323 指出 _get_feat_extract_output_lengths 公式在 config 和 encode_server.py 中重复,可能导致音频嵌入对齐错误。

结论:作者确认风险,计划作为后续重构任务,以保持 PR 焦点。 · pending

插件机制与代码结构 设计

mickqian 和 JustinTong0323 批评 serving_transcription.py 中的硬编码模型检测逻辑,建议使用策略模式或适配器分离模型特定代码。

结论:作者引用 PR #22181 作为正在进行的重构,将处理此问题,当前 PR 暂留 TODO 注释。 · pending

风险与影响

技术风险具体包括:

  1. 回归风险:修改 model_config.py 中的 is_audio_understandable_model 逻辑可能影响 Whisper 等其他音频模型的正确检测,需确保兼容性。
  2. 性能风险:新增模型加载和推理可能增加服务器内存和计算开销,尤其在大并发场景下。
  3. 兼容性风险:Qwen3-ASR 需要 --trust-remote-code 参数,可能引入依赖不稳定性或安全漏洞。
  4. 代码维护风险serving_transcription.py 中的模型特定逻辑硬编码,增加后续扩展复杂度;公式重复在 qwen3_asr.pyencode_server.py 中,若不一致会导致音频嵌入对齐错误。

影响评估:

  • 用户影响:用户可以通过 SGLang 服务 Qwen3-ASR 模型进行语音转录,支持多语言,提升功能多样性;文档更新提供了清晰的使用指南。
  • 系统影响:扩展了 SGLang 的多模态支持范围,增强了自动语音识别能力;服务器端点 /v1/audio/transcriptions 现在支持两种模型家族(Whisper 和 Qwen3-ASR)。
  • 团队影响:新增代码需维护,设计讨论揭示了架构改进方向(如插件化),促进了团队对多模态集成的技术洞察。
模型特定逻辑硬编码 公式重复风险 配置 fallback 风险 依赖外部代码

关联 Issue

#22025 [model] support qwen3-asr

完整报告

PR #22073 分析报告:添加 Qwen3-ASR 模型支持

执行摘要

此 PR 成功为 SGLang 框架集成了 Qwen3-ASR 自动语音识别模型,通过扩展现有 /v1/audio/transcriptions 端点,使用户能够服务该模型。实现涉及新增配置、模型和处理器模块,并修改服务器逻辑,影响范围覆盖多模态功能扩展。review 讨论揭示了代码重复和插件机制等设计权衡,建议关注后续重构以提升维护性。

功能与动机

为什么做? 此变更旨在解决 Issue #22025,该问题标记为“high priority”,要求支持 Qwen3-ASR 模型以丰富 SGLang 的语音识别能力。PR body 明确表述:“This PR adds support so users can serve Qwen3-ASR via the existing /v1/audio/transcriptions endpoint”,即复用现有端点降低用户使用门槛。动机还包括对齐 vLLM 等参考实现,提升框架竞争力。

实现拆解

实现按模块拆解如下:

  • 配置层:新增 python/sglang/srt/configs/qwen3_asr.py,定义 Qwen3ASRConfig 和嵌套 Qwen3ASRThinkerConfig,处理音频和文本配置。
    python class Qwen3ASRConfig(PretrainedConfig): model_type = "qwen3_asr" sub_configs = { "thinker_config": Qwen3ASRThinkerConfig, }
  • 模型层:新增 python/sglang/srt/models/qwen3_asr.py,实现 Qwen3ASRForConditionalGeneration,重用 Qwen3OmniMoeAudioEncoderQwen3ForCausalLM 组件。
  • 处理器层:新增 python/sglang/srt/multimodal/processors/qwen3_asr.py,实现 Qwen3ASRMultimodalProcessor,处理音频特殊令牌如 <|audio_start|>
  • 服务器层:修改 python/sglang/srt/entrypoints/openai/serving_transcription.py,添加 _detect_model_family 函数区分模型家族,并为 Qwen3-ASR 构建特定提示词和后处理逻辑。
  • 集成点:更新 python/sglang/srt/configs/model_config.py,将 Qwen3ASRForConditionalGeneration 加入音频模型列表,并修复 is_audio_understandable_model 以覆盖 Whisper 和嵌套配置。

评论区精华

Review 讨论中,多位贡献者提出了关键见解:

  • AgainstEntropy 指出配置类可简化:“Seems we can directly register Qwen3ASRConfig without a wrapper class”,作者采纳后移除了冗余装饰器。
  • JustinTong0323 强调代码健壮性:“text_config = PretrainedConfig() is a dangerous fallback”,建议显式错误处理,作者添加了警告日志。
  • mickqian 关注维护性:“TODO: we need some sort of plugin mechanism...”,批评硬编码逻辑,作者回应已有 PR #22181 在推进适配器模式重构。
  • 性能对比:在 Issue 评论中,AgainstEntropy 提供了基准测试数据,显示 SGLang 在吞吐量上优于 Transformers,但延迟略有增加,促使团队验证准确性和性能。

风险与影响

技术风险

  • 回归风险model_config.py 的修改可能意外影响 Whisper 模型检测,需通过现有测试套件验证。
  • 维护风险serving_transcription.py 中模型特定逻辑硬编码,增加未来扩展复杂度;_get_feat_extract_output_lengths 公式在 config 和 encode_server.py 中重复,若未同步将导致音频嵌入错误。
  • 依赖风险:Qwen3-ASR 需要 --trust-remote-code,可能引入安全或兼容性问题。

影响评估

  • 用户可直接使用新增模型进行语音转录,支持 52 种语言,提升应用灵活性。
  • 系统层面扩展了多模态支持,但服务器逻辑复杂度上升,需关注性能监控。
  • 团队通过讨论识别了架构改进点,如插件化设计,有助于长期代码质量。

关联脉络

此 PR 是 SGLang 多模态功能演进的一部分,近期历史 PR 如 #22229(修复多模态 PCG 问题)和 #21983(添加线性注意力后端注册)显示了类似集成模式。关联 PR #22181 被提及为解决转录逻辑硬编码的后续重构,表明团队正在推动更模块化的架构。Issue #22025 作为源头,突出了社区对新兴模型支持的迫切需求,驱动了此次实现。

参与讨论