Prhub

#22463 Add skills for debugging hanging issues

sgl-project/sglang · 作者 ispobock · 合并时间 2026-04-10 01:37

分析状态 已生成
文件变更 1提交数 3 · 评论 3
代码增减 +248 / -0
documentation debugging run-ci

执行摘要

新增调试分布式推理挂起问题的技能文档,提供系统化排查方法。

动机源于 Issue #22276,该 Issue 描述了在 Qwen3 Next MTP 的 CI 测试中,服务器在分布式推理过程中因 NCCL AllGather 死锁而挂起。为解决此类问题,添加了一个技能文档来提供标准化的调试流程。

建议团队阅读此技能文档以掌握分布式调试方法,但无需精读代码变更。对于从事分布式推理开发的工程师,此文档是宝贵的参考资料。

讨论亮点

review 中,gemini-code-assist[bot] 提出了三个改进点:1) 修复 log 文件路径安全风险,建议使用相对路径或包含 PID;2) 优化 tensor hashing 效率,避免转换为 Python 列表;3) 确保测试脚本正确捕获 pytest 失败。这些建议已在提交历史中被采纳到文档更新中,提升了健壮性和准确性。

实现拆解

实现仅涉及一个新增文件:.claude/skills/debug-distributed-hang/SKILL.md。文档内容结构化分为多个步骤:首先通过 py-spy 和 watchdog 确认挂起位置;然后使用 NCCL 调试日志检查 collective 操作;接着利用 CUDA coredump 分析挂起内核;最后通过每 rank 日志记录和二进制搜索定位状态分歧点。还包括常见原因和修复模式。

文件 模块 状态 重要度
.claude/skills/debug-distributed-hang/SKILL.md .claude/skills added 5.0

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

评论区精华

Log file path security 安全

评论指出使用固定 /tmp 路径可能导致权限冲突或安全风险(如符号链接攻击)。

结论:建议使用相对路径或包含 PID 的文件名确保唯一性,已在文档中更新。 · 已解决

Tensor hashing efficiency 性能

评论指出将大 tensor 转换为 Python 列表和字符串效率低下,可能引发 AttributeError。

结论:建议使用 tobytes() 方法改进哈希计算,已在文档中更新。 · 已解决

Test script exit code handling 测试

评论指出管道到 tail 可能掩盖 pytest 失败,导致循环无法正确检测失败。

结论:建议移除管道或使用 set -o pipefail,已在文档中更新。 · 已解决

风险与影响

风险较低,因为这是纯文档变更,不直接影响代码执行。主要风险是文档内容可能过时或不准确,但 review 过程中的改进已缓解此问题;此外,依赖外部工具如 py-spy 和 cuda-gdb 可能增加使用复杂性。

对用户和开发者:提供实用的调试指南,有助于快速解决分布式挂起问题,减少停机时间。对系统:无直接性能或安全影响。对团队:标准化调试流程,提升问题排查效率和协作能力。

文档准确性风险 外部工具依赖

关联 Issue

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

完整报告

执行摘要

本 PR 新增了一个技能文档,用于调试 SGLang 分布式推理中的挂起问题,基于 Issue #22276 的死锁场景,提供从定位到修复的系统化方法,旨在提升团队调试效率。

功能与动机

动机源于 Issue #22276,其中报告了在 Qwen3 Next MTP 的 CI 测试中,服务器因 NCCL AllGather 死锁而挂起。该 Issue 详细描述了挂起时的堆栈跟踪和 NCCL 日志,揭示了分布式状态分歧导致的集体操作阻塞。为此,本 PR 添加技能文档,标准化调试流程,帮助开发者快速应对类似问题。

实现拆解

实现仅涉及一个文件 .claude/skills/debug-distributed-hang/SKILL.md,内容结构化如下:

  • 步骤 1:确认和定位挂起:使用 py-spy 和 watchdog 获取堆栈跟踪,识别阻塞线程。
  • 步骤 2:NCCL 调试日志:设置 NCCL_DEBUG=INFO 检查 collective 操作的大小匹配问题。
  • 步骤 3:CUDA Coredump:配置环境变量触发 GPU 核心转储,分析挂起的内核。
  • 步骤 4:每 rank 日志记录:通过装饰器记录每个 rank 的状态,使用二进制搜索定位首个分歧点。
  • 常见原因与修复模式:总结如大小不匹配、分支分歧等根因及相应解决方案。

关键代码示例(摘自文档):

def per_rank_log(func):
    def wrapper(*args, **kwargs):
        rank = torch.distributed.get_rank()
        with open(f"debug_rank{rank}.log", "a") as f:
            f.write(f"{func.__name__} called\n")
        return func(*args, **kwargs)
    return wrapper

评论区精华

review 中,gemini-code-assist[bot] 提出了三处改进,均被采纳:

安全风险:"使用固定路径在 /tmp 可能导致权限冲突或安全风险,建议使用相对路径或包含 PID。" —— 已更新为 f"debug_rank{rank}.log"

性能优化:"将 tensor 转换为 Python 列表和字符串效率低下,建议使用 tobytes() 进行哈希。" —— 已更新为 tensor.cpu().numpy().tobytes()

正确性保障:"管道到 tail 可能掩盖 pytest 失败,建议正确捕获退出码。" —— 已调整脚本逻辑。

这些讨论确保了文档的健壮性和实用性。

风险与影响

风险分析

  • 文档准确性:依赖外部工具和最新代码,可能过时;但 review 改进已缓解。
  • 使用复杂性:需要安装 py-spy、cuda-gdb 等工具,增加初始设置负担。
  • 无代码变更:对系统无直接回归或性能影响。

影响评估

  • 对团队:显著提升分布式调试能力,减少问题排查时间,促进协作。
  • 对用户:提供清晰指南,帮助解决生产环境中的挂起问题。
  • 对系统:无变更,不影响现有功能。

关联脉络

本 PR 是 SGLang 调试能力增强的一部分,与历史 PR #18569(添加对称调试模式)形成互补,两者共同扩展了系统的调试工具集。从近期 PR 趋势看,团队持续关注性能优化和问题排查(如 PR #22424 的 AMD 内核优化、PR #22335 的 AMD 崩溃修复),表明调试和性能调优是当前演进重点。

参与讨论