Prhub

#47894 [ROCm][Bugfix] Fix empty-tensor .max() crash in AITER FA

原始 PR 作者 djramic 合并时间 2026-07-09 05:58 文件变更 1 提交数 3 评论 2 代码增减 +5 / -1

执行摘要

ROCm AITER FA 空张量 .max() 崩溃修复

ROCm 上 AITER FA 后端在语音转文本模型预热时,num_chunks 可能为 0,导致 cu_seq_lens_cpu[:, -1].max().item() 对空张量调用 .max(),抛出 RuntimeError: max(): Expected reduction dim to be specified for input.numel() == 0,进而杀死 EngineCore。PR 目的即在防止此崩溃。

建议合入此 PR。变更微小但关键,解决了实际崩溃问题,且经社区验证。值得关注的是同文件中是否存在其他类似的未守卫空张量操作。

讨论亮点

审核者 AndreasKaratzas 指出变更本身合理,但 CI 测试似乎失败;同时提到 Whisper 模型在 main 分支上已正常,但此 PR 修复的是不同的 AITER FA 崩溃(仍在 main 上未修复)。作者 djramic 确认准确性 bug 已在 main 上修复,而此 PR 针对独立的 AITER FA 崩溃,最新的 nightly 仍会触发该崩溃,建议合并。最终审核者批准并入。

实现拆解

vllm/v1/attention/backends/rocm_aiter_fa.pybuild 方法中,修改 max_cum_tokens 的计算:

  1. 原代码 max_cum_tokens = cu_seq_lens_cpu[:, -1].max().item() 无守卫,当 num_chunks == 0 时对空张量调用 .max()
  2. 改为条件表达式 cu_seq_lens_cpu[:, -1].max().item() if num_chunks > 0 else 0
  3. 后续逻辑使用 max_cum_tokens 构造 range_idx 等张量,当 max_cum_tokens == 0 时,这些张量的形状自然为 0,后续分块元数据构造也能正确工作。
    仅在单文件单行核心逻辑变更,无测试、配置或部署配套改动。
文件 模块 状态 重要度
vllm/v1/attention/backends/rocm_aiter_fa.py 注意力 modified 5.35

关键源码片段

vllm/v1/attention/backends/rocm_aiter_fa.py core-logic

核心修复文件,在 AITER FA 后端的 build 方法中添加了空张量守卫。

# vllm/v1/attention/backends/rocm_aiter_fa.py (lines 605-609)
            # 避免当没有 context 时对空张量调用 .max()
            # (num_chunks == 0, 例如 Whisper encoder 的第一次传递 )
            max_cum_tokens = (
                cu_seq_lens_cpu[:, -1].max().item() if num_chunks > 0 else 0
            )

评论区精华

CI 测试失败与修复必要性确认 other

AndreasKaratzas 指出 CI 测试似乎失败,且 Whisper 在 main 上已正常,但作者确认此 PR 修复的是独立的 AITER FA 崩溃(仍在 main 上未修复),并提供了 nightly 构建失败证据。

结论:作者澄清了独立崩溃的存在,审核者批准合并。 · 已解决

风险与影响

风险极低:变更仅在一行内添加条件守卫,当 num_chunks > 0 时行为完全不变;当 num_chunks == 0 时回退为 0,后续逻辑自然处理空输入。无性能影响。主要风险在于此修复可能未覆盖所有空张量场景(如其他位置的 .max() 调用),但本次 PR 范围明确。

影响范围有限:仅修复 ROCm 上 AITER FA 后端在特定边界条件(语音模型预热时 num_chunks == 0)下的崩溃。对正常流程用户无影响。团队可从修复中学到在空张量操作前添加守卫的防御性编程模式。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论