# PR #21170 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[BUGFIX] Fix CP residual size mismatch crash when tp_size == attn_cp_size 
- 合并时间：2026-03-23 15:12
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/21170

---

# 执行摘要

- 一句话：修复上下文并行中当 tp_size 等于 attn_cp_size 时残余张量大小不匹配导致的推理崩溃。
- 推荐动作：对于维护 sglang 并行通信模块的工程师，建议精读此 PR 以理解 CP 中模式匹配和数据布局一致性的细节。变更虽小，但揭示了在并行计算中条件逻辑顺序的重要性，值得关注以防止类似错误；对于管理者，可快速合并以确保系统稳定。

# 功能与动机

PR body 描述：'After merging commit bb737d7a829bac8fb6386fb6f494e1b2403c598f https://github.com/sgl-project/sglang/pull/18233, GLM-5/DS-V3.2 with context parallelism (CP) crashes during inference with: RuntimeError: Check failed: residual.size(0) == batch_size (885 vs. 7080)'。这表明合并历史 PR 后引入了崩溃 bug，需要紧急修复以恢复系统稳定性。

# 实现拆解

修复集中在文件 python/sglang/srt/layers/communicator_nsa_cp.py 的 get_fn 函数中。关键改动是将检查特定模式组合（hidden_states_input_mode == ScatterMode.FULL 且 residual_input_mode == ScatterMode.SCATTERED 且 output_mode == ScatterMode.SCATTERED）的逻辑移到检查 group sizes 是否相同之前。这样，即使 tp_size == attn_cp_size 导致 group sizes 相等，FULL 和 SCATTERED 模式的不同数据布局也会触发正确的 scatter 操作，而不是错误地使用 trivial 函数，从而避免残余大小不匹配的崩溃。

关键文件：
- `python/sglang/srt/layers/communicator_nsa_cp.py`（模块 srt/layers）: 唯一修改的文件，包含了修复 CP 通信中残余大小不匹配的关键逻辑调整，防止了特定配置下的推理崩溃。

关键符号：get_fn


# 评论区精华

Review 过程中没有实质性技术讨论。Reviewer Fridge003 直接批准了变更，表明修复被认可为正确且必要，没有争议或未解决疑虑。Issue 评论中只有非技术内容（如配额限制和人员通知），未涉及技术细节。

- 批准合并 (other): 变更被批准并合并，无技术讨论。

# 风险与影响

- 风险：风险较低，因为变更只涉及一个函数的条件逻辑顺序调整，且修复了已知崩溃。但需注意：1. 修改了核心通信路径，如果新逻辑在其他边界情况下（如其他模式组合）有误，可能引入新 bug；2. 修复针对特定配置（tp_size == attn_cp_size），在其他配置下的行为需确保不变。建议在相关配置下进行回归测试，并检查是否覆盖所有可能的 ScatterMode 组合。
- 影响：直接影响是修复了 GLM-5/DS-V3.2 模型在使用上下文并行且 tp_size 等于 attn_cp_size 时的推理崩溃问题，恢复了系统稳定性和可靠性。影响范围限于特定模型和并行配置，但鉴于标签为 'high priority'，可能影响生产环境的关键推理任务。对用户透明，提升服务可用性，对团队而言减少了调试和宕机时间。
- 风险标记：核心路径变更 , 特定配置依赖

# 关联脉络

- PR #18233 未知（未在提供列表中）: PR body 提到合并该 PR 后引入了导致本 bug 的变更，因此是直接相关的历史 PR，需要回溯检查其变更以避免类似问题。