Prhub

#41382 [Bugfix] Fix double reduce in flashinfer_nvlink_two_sided and flashinfer_nvlink_one_sided backends

原始 PR 作者 amitz-nv 合并时间 2026-05-12 15:47 文件变更 2 提交数 3 评论 8 代码增减 +2 / -2

执行摘要

修复 FlashInfer NVLink 双 reduce 精度问题

使用 --all2all-backend flashinfer_nvlink_two_sided--all2all-backend flashinfer_nvlink_one_sided 时发现精度严重下降。通过分析 FlashInfer 源码发现其内部已执行 reduce(torch.sum over experts dim),而 vLLM 额外执行了第二次 reduce,导致精度损失。

此 PR 虽改动极小(两行代码),但修复了严重的精度问题,值得所有使用 FlashInfer NVLink 后端的用户合入。开发者在升级 FlashInfer 版本时需重新测试该兼容性契约。

讨论亮点

讨论了引入问题的 PR:可能是 PR #36022 或 PR #32567 在引入 output_is_reduced 时设定了 False,被后续实现复制。也讨论了是否可让 FlashInfer 延迟 reduce 以提升性能。

实现拆解

  1. flashinfer_nvlink_two_sided.py 中将 output_is_reduced() 的返回值从 False 改为 True,告知调用方输出已执行 reduce 操作,不再重复 reduce。
  2. flashinfer_nvlink_one_sided.py 中做相同更改,保持语义一致性。
  3. 无需修改测试或其他模块,仅修正 reduce 标记语意。
  4. GSM8K 评测显示两个后端的准确率均提升至 92%-93%,修复了精度退化。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py MoE 通信 modified 5.62
vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py MoE 通信 modified 5.62

关键符号

output_is_reduced

关键源码片段

vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py data-contract

核心修复文件之一,将 `output_is_reduced` 返回值从 `False` 改为 `True`,阻止重复 reduce。

# 文件 : flashinfer_nvlink_two_sided.py
class FlashInferNVLinkTwoSidedPrepareAndFinalize(mk.FusedMoEPrepareAndFinalizeModular):
    # ... 其他方法 ...
​
    def output_is_reduced(self) -> bool:
        # FlashInfer 内部已执行 reduce (torch.sum over experts dim),
        # 所以告知调用方输出已 reduce,避免 vLLM 重复 reduce。
        return True
vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py data-contract

核心修复文件之一,与 two_sided 对称性修复。

# 文件 : flashinfer_nvlink_one_sided.py
class FlashInferNvlinkOneSidedPrepareAndFinalize(mk.FusedMoEPrepareAndFinalizeModular):
    # ... 其他方法 ...
​
    def output_is_reduced(self) -> bool:
        # 与 two_sided 后端保持语义一致,FlashInfer 内部已 reduce。
        return True

评论区精华

问题根源追溯 设计

amitz-nv 问 robertgshaw2-redhat 是否 FlashInfer 内部有变更;robertgshaw2-redhat 询问是否 vLLM 侧有修改。amitz-nv 指向 PR #36022 和 #32567。

结论:确认 FlashInfer 内部已执行 reduce,vLLM 不应重复 reduce。 · 已解决

性能优化建议 性能

zyongye 提议是否可让 FlashInfer 延迟 reduce 以融合 MoE combine。

结论:未采纳,但提出了潜在优化方向。 · unresolved

风险与影响

回退后如果 FlashInfer 未来版本不再内部 reduce,会导致 correct 结果出错。目前依赖 FlashInfer v0.6.8.post1 的具体实现,升级 FlashInfer 需重新验证。此外,两行修改无安全或性能风险。

影响所有使用 flashinfer_nvlink_two_sidedflashinfer_nvlink_one_sided all2all 后端的 MoE 模型推理精度,GSM8K 准确率从约 80%+ 提升至约 93%,其他任务可能也有提升。对用户而言是透明修复,无需配置变更。

依赖外部库内部实现 无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论