您好,感谢跟进。
关于您要的两项信息,先简要回应,但更重要的是——我们已经把问题定位到 MCCL 层,Ray/日志层面看不到根因。直接给线索能帮您团队少走弯路:
一、Ray 配置与节点识别:已验证无问题
- 4 节点 × 8 卡 Ray 集群 ray status 显示 32/32 GPU ready
- PP=2 TP=8(2 节点 16 卡)可以稳定推理 65k 上下文 → 证明 Ray、MCCL 通信器初始化、GPU 识别全部正常
- 问题只在 PP≥3 时出现,所以不是 Ray 配置问题,而是多 stage P2P 传递时的 MCCL 行为问题
各节点完整 vLLM 日志已附在 evidence/vllm_pp3_v5.log(带 CudaCommunicator trace)和 evidence/vllm_pp2_external_launcher.log。
二、根因(请重点关注)
MCCL 的 mcclSend 在 Ray Compiled Graph + PP≥3 场景下 kernel 未投递到 GPU。
关键证据(gdb attach rank 1,hang 发生后约 90s)
Thread 234(mcclProxyProgress) 在空转:
#0 sched_yield()
#1 mcclProxyProgress(void*) from /opt/maca/lib/libmccl.so
MetaX driver AsyncEventsLoop 卡在等永不到来的 event:
[<0>] mxos_schedule_timeout
[<0>] mxcd_evt_wait_many + 0x543/0x660 [metax]
[<0>] mxcd_ioctl_wait_events [metax]
因果链:
1. stage0 → stage1 调 mcclSend,request 入 MCCL 内部队列,立即返回
2. mcclProxyProgress 线程在 sched_yield 空转,没把 request 推到 GPU 执行
3. GPU 不产生 completion event → driver AsyncEventsLoop 无限等
4. Ray CGRAPH 的 channel 等不到完成信号 → rank 1 execute_model 从未被调度
5. 表现为 "第一步少量 throughput 后归零 → RayChannelTimeoutError"
排除项(已验证)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────────────────────┐
│ 验证 │ 结果 │
├──────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────┤
│ mccl_perf sendrecv 4 节点 │ ✅ 通过,22 GB/s │
├──────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────┤
│ mccl_perf all_reduce 4 节点 │ ✅ 通过,71 GB/s │
├──────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────┤
│ 最小 repro pp_chain_test.py(3 节点 blocking send/recv chain,torch.distributed + nccl backend) │ ✅ 通过,0.5ms │
├──────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────┤
│ vLLM patch A:绕过 PyNccl 走 torch.distributed.send │ ❌ 仍 hang,但 Ray CGRAPH 追不到 event │
├──────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────┤
│ vLLM patch B:保留 ncclSend + ncclGroupStart/End + stream.synchronize() │ ❌ 仍 hang,sync 没 event 可等 │
└──────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────┘
→ vLLM Python 层无法绕开,必须在 MCCL 内修。
三、建议排查方向
- mcclProxyProgress 线程 sched_yield 空转条件是什么?为什么 2-rank P2P 能投递、3-rank 多对并发就不投递?
- mcclSend 入队后到 GPU stream enqueue 之间是否存在竞态?PP≥3 时 rank 1 同时作为 recv target(来自 rank 0)和 send source(发往 rank 2),是否触发了未覆盖的分支?
- 请在沐曦侧复现:vllm-metax + PP=3 + TP=8 + Ray 后端 + enforce-eager
- 开启 NCCL_DEBUG=INFO 时需要通过 Ray runtime_env 传递,否则收不到 worker 子进程日志
四、完整材料
已整理附件中