Prhub

#22361 [Whisper] Batch encoder forward for concurrent prefill requests

原始 PR 作者 JustinTong0323 合并时间 2026-04-12 14:15 文件变更 1 提交数 2 评论 12 代码增减 +21 / -16

执行摘要

Whisper 模型编码器从串行改为批量执行,提升高并发预填充吞吐量。

根据PR body中的描述,当预填充批次包含N个新的Whisper请求时,编码器原本在for循环中串行运行N次。每个编码器调用在B200上约7ms,在GB300上约18ms,导致5个请求的批次会阻塞调度器35-90ms,期间无法执行解码批次。性能分析显示编码器在高并发时占调度器时间的35%,串行执行直接限制了吞吐量扩展。

该PR值得精读,尤其是对于关注模型推理性能优化的工程师。关键设计决策包括:

1) 识别编码器为瓶颈并量化其开销;
2) 利用编码器天然的批次兼容性实现无交互的批量执行;
3) 输出重塑策略以适配下游KV缓存。建议结合基准测试数据理解不同硬件平台上的收益差异。

讨论亮点

review中仅有一次实质性讨论:gemini-code-assist[bot]建议将encoder_position_ids张量直接创建在目标设备上以避免不必要的CPU到GPU传输。该建议被采纳,体现在最终代码中使用了device=features_batch.device。yhyang201批准了PR,无其他争议。

实现拆解

主要修改位于python/sglang/srt/models/whisper.py的forward方法。关键改动包括:

1) 添加设备放置修复(从#22293 cherry-pick),确保输入特征和位置ID移动到正确设备;
2) 重构编码器逻辑,收集所有未缓存请求的特征到features_to_encode列表;
3) 使用torch.cat将特征拼接为批次张量features_batch;
4) 单次调用self.encoder处理整个批次;
5) 将输出从[N, seq_len, dim]重塑为[N*seq_len, dim]以适应下游交叉注意力KV缓存。

文件 模块 状态 重要度
python/sglang/srt/models/whisper.py models modified 9.0

关键符号

forward

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

评论区精华

编码器位置 ID 张量的设备创建优化 性能

gemini-code-assist[bot] 建议将 encoder_position_ids 直接创建在目标设备上,避免不必要的 CPU 到 GPU 传输。

结论:建议被采纳,代码中已使用 device=features_batch.device。 · 已解决

风险与影响

风险较低:

1) 编码器本身完全支持批次处理(Conv1d、embed_positions、32个transformer层、LayerNorm均沿批次维度操作),无跨请求交互,逻辑正确性有保障;
2) 包含#22293的设备放置修复,避免设备不匹配问题;
3) 基准测试显示WER(12.77-12.78%)未变化,准确性无影响;
4) 修改范围局限在单个文件的forward方法,影响面可控。潜在风险:批次张量拼接可能增加内存峰值,但在音频特征维度固定且批次大小有限的情况下影响不大。

对系统:显著提升Whisper模型在高并发预填充场景下的吞吐量,尤其在GB300等编码器开销较大的平台上效果明显(64并发时+28.9%)。减少调度器阻塞时间,改善整体资源利用率。对用户:提升语音识别服务的并发处理能力,降低延迟。对团队:展示了针对特定模型组件的性能优化模式,可作为类似优化的参考。

低风险变更 已通过基准测试验证

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论