Prhub

#22458 Fix NCCL AllGather hanging issue for Qwen3 Next MTP

原始 PR 作者 ispobock 合并时间 2026-04-10 11:40 文件变更 2 提交数 3 评论 17 代码增减 +38 / -0

执行摘要

修复 EAGLE 推测解码在 TP>1 和非贪婪采样时因浮点非确定性导致的 NCCL AllGather 死锁问题。

修复Issue #22276中报告的NCCL AllGather死锁问题。具体场景是Qwen3 Next MTP模型在TP>1和非贪婪采样时,由于浮点非确定性导致不同GPU的采样结果(predict、accept_index、accept_length)不一致,进而引发后续LogitsProcessor中的AllGather大小不匹配,最终导致分布式推理挂起。

该PR是解决分布式推测解码死锁问题的关键修复,值得所有涉及分布式推理和推测解码的工程师精读。重点关注浮点非确定性在分布式采样中的影响,以及通过广播确保一致性的设计模式。

讨论亮点

review中主要讨论了三个关键点:

  1. gemini-code-assist[bot]指出初始实现只同步了predict张量,但accept_index和accept_length同样受浮点非确定性影响,必须一并同步,否则仍会导致不一致。
  2. yudian0504建议考虑DP Attention场景下的TP group选择,并提供了具体的广播代码示例。
  3. ispobock确认了tp_group.broadcast内部已处理rank转换,简化了实现。最终所有关键张量都被同步,解决了完整性问题。

实现拆解

在EAGLE推测解码的两个核心文件(eagle_info.py和eagle_info_v2.py)的采样函数中,添加了TP rank间的同步逻辑:

  1. 根据是否启用DP Attention选择合适的TP group(get_attention_tp_group()或get_tp_group())。
  2. 当TP group大小>1时,从rank 0广播predict、accept_index和accept_length三个张量,确保所有rank采样结果一致。
文件 模块 状态 重要度
python/sglang/srt/speculative/eagle_info.py speculative-decoding modified 8.0
python/sglang/srt/speculative/eagle_info_v2.py speculative-decoding modified 8.0

关键符号

verify sample

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

评论区精华

同步张量完整性 正确性

gemini-code-assist[bot] 指出初始实现只同步了 predict 张量,但 accept_index 和 accept_length 同样需要同步,否则仍会导致不一致。

结论:采纳建议,同步了所有三个关键张量(predict、accept_index、accept_length)。 · 已解决

TP group 选择 设计

yudian0504 建议考虑 DP Attention 场景,使用 get_attention_tp_group() 或 get_tp_group() 选择合适的 TP group。

结论:采纳建议,更新了 tp_group 选择逻辑以支持 DP Attention。 · 已解决

广播 rank 转换 正确性

yudian0504 和 ispobock 讨论了广播时 rank 转换的实现细节,确认 tp_group.broadcast 内部已处理。

结论:确认现有实现正确,无需额外转换。 · 已解决

风险与影响

风险较低:

  1. 广播操作增加了少量通信开销,但在TP规模不大时影响有限。
  2. 修改位于推测解码的核心路径,需确保不会引入新的正确性问题。
  3. 依赖TP group的正确配置,如果group选择逻辑有误可能导致同步失败。

影响范围:

  1. 修复了EAGLE推测解码在TP>1和非贪婪采样时的分布式死锁问题,提升了系统稳定性。
  2. 影响所有使用EAGLE推测解码且TP>1的场景,特别是Qwen3 Next MTP模型。
  3. 对用户透明,无需额外配置,直接解决现有CI测试失败问题。
核心路径变更 分布式同步开销

关联 Issue

#22276 [Bug] NCCL AllGather deadlock in Qwen3 Next MTP

完整报告

参与讨论