Skip to content

[Bugfix] Allocate dynamic ports for paired HCCL listeners - #13

Merged
ShuweiShen772 merged 1 commit into
v0.3.12_xllm_patchfrom
fix/dynamic-hccl-listener-port
Nov 13, 2026
Merged

ShuweiShen772 merged 1 commit into
v0.3.12_xllm_patchfrom
fix/dynamic-hccl-listener-port

Conversation

@ShuweiShen772

Copy link
Copy Markdown
Collaborator

Description

修复旧 Ascend/HCCL 后端固定监听设备端口 16666,导致共享测试机上并行 PR 相互冲突的问题。

  • NIC 使用 HCCL 的 Listen() + 端口 0,由实际监听操作分配可用端口,成功后读取 GetLocalPort()。
  • VNIC 使用 NIC 实际分配的同一端口;两端均成功后才写回 RankInfo.devicePort。现有 segment 元数据继续发布实际端口,对端直接使用该值,协议字段保持兼容。
  • VNIC 端口占用时通过 DeInit() 回滚本轮监听,再重新申请。仅监听阶段的 HCCL_E_UNAVAIL 进入端口重试,上限 32 次。
  • 内存、参数、系统调用、设备运行时错误原样返回;回滚失败停止重试。
  • 该改动独立于 deferred cleanup PR [Bugfix] Preserve deferred batch cleanup ownership after query errors #11。以当前 xllm main 使用的 v0.3.12_xllm_patch 为基线,便于同步后直接接入。

实现依据:开发机 CANN 8.2.RC1 的 HcclSocket 提供 GetLocalPort() / DeInit();其 RA listen 适配层将“端口已绑定”映射为 HCCL_E_UNAVAIL,并在请求端口为 0 时回填实际端口。Close() 关闭连接,DeInit() 负责停止监听。

Suggested Merge Priority

  • P2 — 修复共享 CI 测试机上的端口冲突

Module

  • Transfer Engine (mooncake-transfer-engine)

Type of Change

  • Bug fix

How Has This Been Tested?

新增 3 个聚焦用例,直接调用生产端口选择 helper。Socket 边界使用两组 loopback 地址和真实 POSIX bind/listen,保留实际 HCCL 状态枚举:

  1. 默认端口 16666 被占用,8 组并发 NIC/VNIC 成功建立互不冲突的监听。
  2. VNIC 首次冲突,NIC 正确回滚;重试成功后释放全部监听资源。
  3. 冲突重试上限,以及内存/参数/系统调用/运行时错误不重试。

验证结果:

  • 本仓库新增 3 项 + xllm 网络测试 8 项,共 11 项通过。
  • 两组二进制并行启动 32 个进程,每个重复 20 轮,共 3520 次用例执行通过。
  • 同组 ASan/UBSan,detect_leaks=1,全部通过。
  • clang-format 20.1.6、限定文件的 pre-commit 检查通过。

测试覆盖范围为真实主机 socket 的监听、错误和生命周期;真实 NIC/VNIC 设备监听及匹配 CANN 的完整 legacy 后端构建由 NPU CI 验收。

Checklist

  • 新增回归用例并通过
  • 已执行改动自查及限定文件的格式检查
  • 人工逐行评审及 NPU CI 验收

AI Assistance Disclosure

  • AI tools were used: Codex 用于调用链调查、代码实现、回归验证和 PR 准备。

Signed-off-by: ShuweiShen772 <shenshuwei.3@jd.com>
@ShuweiShen772
ShuweiShen772 marked this pull request as ready for review November 13, 2026 12:33
@ShuweiShen772

Copy link
Copy Markdown
Collaborator Author

Qoder 检查失败诊断

已核对本次 qoder-review 运行 的检查注释、步骤状态、workflow 和 Qoder action 的输入定义。

失败发生在 Qoder 认证配置步骤,原始错误:

Environment variable 'QODER_PERSONAL_ACCESS_TOKEN' is required for configure-qoder-auth.sh

仓库 workflow 的 qoder_personal_access_token 输入名正确;Qoder action 将其映射到 QODER_PERSONAL_ACCESS_TOKEN。GitHub API 返回本仓库 Actions Secrets 为 0,且对本仓库可用的组织 Actions Secrets 为 0,因此当前引用未取得凭据。

处理方法:在 本仓库 Actions Secrets 设置 添加:

  • Name:QODER_PERSONAL_ACCESS_TOKEN
  • Value:Qoder Personal Access Token(Qoder 的凭据)

配置完成后重跑该失败 job,即可执行代码评审。此次认证失败应按 CI 凭据配置问题处理;端口修复保持独立评审。

@ShuweiShen772
ShuweiShen772 merged commit cc67eda into v0.3.12_xllm_patch Nov 13, 2026
1 check failed
@ShuweiShen772
ShuweiShen772 deleted the fix/dynamic-hccl-listener-port branch November 13, 2026 12:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant