执行摘要
本PR修复了MoE模型在专家并行(ep)大于1时,由于CUDA图捕获中缺失_MOE_TP通信组而导致的段错误(退出代码-9)。通过重构graph_capture()函数确保所有相关通信组被正确捕获,并添加了上下文并行(CP)的CUDA图禁用条件,恢复了受影响配置(如Qwen3-235B-FP8 --tp=8 --ep=2)的正常运行。这是一个关键bugfix,提升了分布式MoE场景下CUDA图的稳定性。
功能与动机
问题根源:PR #18233将MoE allreduce从通用的_TP组切换到专用的_MOE_TP组,但未同步更新graph_capture()函数。这导致在CUDA图回放时,自定义allreduce内核(cross_device_reduce_1stage)尝试访问未注册的IPC句柄,引发非法内存访问和进程崩溃。
影响范围:所有MoE模型配置满足1 < ep < tp且moe_tp_size > 1时受影响,例如Qwen3-235B-FP8 --tp=8 --ep=2。CI证据显示在PR #18233合并后出现段错误,而之前正常。
验证结果:在8xH200上测试,修复后Qwen3-235B-FP8配置通过测试(gsm8k 96.4%,3124 tok/s)。
实现拆解
主要改动集中在两个文件:
-
python/sglang/srt/distributed/parallel_state.py:
-
python/sglang/srt/server_args.py:
- 在
_handle_piecewise_cuda_graph()方法中添加条件,当attn_cp_size > 1时禁用分段CUDA图。
- 这反映了上下文并行(CP)目前不支持CUDA图捕获的现状。
评论区精华
由于本PR没有正式的review评论,讨论亮点主要从提交历史中推断:
- Fridge003的提交:添加了'disable cp for pcg'提交,表明在合并前对CP的CUDA图支持进行了调整,可能基于内部讨论或测试发现CP与CUDA图不兼容。
- 决策结论:采用保守策略,在CP启用时禁用CUDA图,避免潜在问题。
风险与影响
技术风险:
graph_capture()重构依赖id(group)唯一性,如果通信组对象被意外复制或重用,可能导致捕获遗漏。
- CP禁用条件可能影响依赖CUDA图优化的CP配置性能,但这是权衡后的安全选择。
- 修改涉及分布式通信核心路径,需在多样MoE配置下充分测试(如不同tp、ep、moe_tp_size组合)。
影响分析:
- 用户影响:修复了受影响的MoE模型用户的段错误问题,恢复模型功能;对不使用MoE或ep=1的用户无影响。
- 系统影响:提升了CUDA图在复杂分布式配置下的稳定性和可靠性。
- 团队影响:强调了通信组变更时需同步更新所有相关上下文(如CUDA图捕获)的协作规范。
关联脉络
- 直接关联:PR #18233是本问题的根源,它引入了
_MOE_TP组但未更新graph_capture(),导致本PR的修复需求。
- 演进趋势:从近期历史PR看,仓库持续优化分布式性能(如#21511启用FP8 KV缓存、#21591添加HiSparse缓存传输),本PR是这一趋势中的稳定性修复,确保MoE等高级特性在CUDA图优化下可靠工作。
- 跨PR模式:反映了基础设施变更(如新通信组)需全面测试的教训,未来类似改动应更注重影响面分析。
参与讨论