用途:排查 SGLang 分布式推理(TP/PP/DP/EP)中的挂起问题。挂起通常源于各 rank 状态分歧,导致 AllGather、AllReduce、Broadcast、Barrier 等集合通信死锁,常见原因包括张量尺寸不匹配、分支分歧、级联状态漂移和资源耗尽。
主要能力:先用 watchdog 或 py-spy 定位卡住的线程与调用栈;通过 NCCL_DEBUG=INFO 与 NCCL_DEBUG_SUBSYS=COLL 查看最后一次集合通信;用 CUDA coredump 配合 cuda-gdb 查看阻塞的 GPU kernel;再通过逐 rank 日志、张量哈希与 diff 找出分歧步骤,并二分回溯根因。
必要用法:安装 py-spy(pip install py-spy,需 root 或 CAP_SYS_PTRACE),cuda-gdb 随 CUDA toolkit 提供。手动抓取用 py-spy dump --pid <scheduler_pid>。触发 coredump 需设置 CUDA_ENABLE_USER_TRIGGERED_COREDUMP=1、CUDA_COREDUMP_PIPE、CUDA_COREDUMP_FILE 等环境变量,再向管道写入数据,或用 kill -SIGABRT <pid>。逐 rank 日志需自行在代码中加入 SGLANG_DEBUG_HANG 环境变量判断(该变量非 SGLang 内置)。
适用场景:TP 集合通信尺寸不匹配、PP 点对点 send/recv 不匹配、浮点非确定性、随机数分歧、条件分支不一致等导致的间歇性挂起。
限制:日志中避免 tensor.cpu()、tolist()、numpy() 等隐式同步,以免改变时序或引入死锁;修复后需多次运行验证,间歇性挂起需足够多的干净通过次数。