| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
refactor: remove _add_ephemeral_timeout_for_all_pgs patch Co-authored-by: yt1525<yangting141@huawei.com> # message auto-generated for no-merge-commit merge: !44917 merge master into master refactor: remove _add_ephemeral_timeout_for_all_pgs patch Created-by: yt1525 Commit-by: yt1525 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [ ] issue/工单 - [x] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 1. **背景**:上游 PyTorch 已原生实现 _add_ephemeral_timeout_for_all_pgs(torch/distributed/distributed_c10d.py),其调用链为 ProcessGroup::addEphemeralTimeout → 遍历所有 backend 虚函数分派;不支持的 backend(gloo 等)默认空操作。torch_npu 的 ProcessGroupHCCL 已在 C++ 层实现 addEphemeralTimeout(torch_npu/csrc/distributed/ProcessGroupHCCL.cpp,累加 ephemeralTimeoutActive_ 并计入 assignTimeoutToWork 的 opTimeout_),因此该功能无需 torch_npu 侧 patch,直接使用上游实现即可在 NPU 生效。 2. 从 torch_npu/_init/patches/distributed_patches.py 的 _INTERNAL_REPLACEMENTS 中删除 distributed.distributed_c10d._add_ephemeral_timeout_for_all_pgs → distributed.distributed_c10d._hccl_add_ephemeral_timeout_for_all_pgs 替换项(低版本支持改由 compat 层按版本提供,见第 5 条)。 3. 删除 torch_npu/distributed/distributed_c10d.py::_hccl_add_ephemeral_timeout_for_all_pgs 函数及其不再使用的 timedelta 导入(实现内联至 torch_npu/_compat/distributed.py)。 4. 更新 test/test_torch_npu_init.py::test_07_distributed_patch_behavior:移除"patch 身份"断言(该断言验证被删除的 patch 存在)。 **测试策略**:新增 NPU UT(test/distributed/test_c10d_add_ephemeral_timeout.py),参考上游原生用例 test_c10d_nccl.py::ProcessGroupNCCLGroupTest::test_extend_nccl_pg_timeout 编写,核心语义(扩展生效)在 NPU 上实测;重置语义由上游测试在 NCCL 后端看护。测试通过 c10d._add_ephemeral_timeout_for_all_pgs 调用(与用户代码一致);低版本 torch(2.13、2026-08-04 前 nightly)由 compat 层保证 API 可用,测试照常执行。 5. 新增低版本兼容层(torch_npu/_compat/distributed.py,仿照现有 _mm_like_strategy 版本分支模式): - **版本判断**(CURRENT_VERSION >= (2, 14))+ **上游支持判断**(上游源码含 pg._add_ephemeral_timeout,即 backend-generic,2026-08-04 nightly 起); - 上游支持 NPU 时:直接 from torch.distributed.distributed_c10d import _add_ephemeral_timeout_for_all_pgs 复用上游实现; - 上游不支持时:将原 _hccl_add_ephemeral_timeout_for_all_pgs 函数体内联到 compat 层,**按上游接口名声明为 _add_ephemeral_timeout_for_all_pgs**(分支内懒加载 torch/dist_c10d/timedelta 等依赖); - 两种情况下均将实现**挂载回 torch.distributed.distributed_c10d 命名空间**(通用版赋值无变化;低版本覆盖 CUDA/NCCL-only 上游),__all__ 仅声明 _add_ephemeral_timeout_for_all_pgs; - torch_npu/_init/patches/distributed_patches.py 头部 import torch_npu._compat.distributed 确保随 torch_npu 初始化加载。 6. 测试适配(test/distributed/test_c10d_add_ephemeral_timeout.py、ephemeral_timeout_base.py): - API 调用保持 c10d._add_ephemeral_timeout_for_all_pgs(...)(低版本由 compat 提供实现,测试在 2.13 / 早期 2.14 / 当前 2.14 上均完整执行,无 skip); # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 **测试环境**:torch 2.14.0.dev20260809+cpu,CANN 9.1.0-beta.3,Ascend 910B2 **上游测试参考**(原生用例): test_c10d_nccl.py::ProcessGroupNCCLGroupTest::test_extend_nccl_pg_timeout 验证了 _add_ephemeral_timeout_for_all_pgs 的完整语义: - 临时超时扩展生效:_set_default_timeout(3s) 后调用 _add_ephemeral_timeout_for_all_pgs(10s),work.timeout 变为 13s(base + ephemeral); - 扩展被 watchdog 重置:再次调用 _add_ephemeral_timeout_for_all_pgs(5s) 并等待 watchdog 重置首个扩展后,work.timeout 变为 8s。 新增 NPU UT(test/distributed/test_c10d_add_ephemeral_timeout.py)按上述用例语义编写,并补充返回值/异常参数/gloo 忽略等维度覆盖。 **本地验证**(NPU 实测): > 测试运行方式:PYTHONPATH 指向源码树(master 分支,含本次修改),源码树内以软链复用 wheel 版编译产物(_C.so、lib/ 等,本改动为纯 Python 层,不影响 C++ 行为);验证加载路径为源码树且 patch 不存在后执行测试。 | 用例 | 结果 | |---|---| | test_c10d_add_ephemeral_timeout.py(新增,2 用例) | PASS(base 3s + 扩展 10s,挂起集合体存活 5.00s > base 3s;gloo 后端忽略调用返回 None) | | test_torch_npu_init.py::test_07_distributed_patch_behavior(已更新,验证 patch 不再替换上游函数) | PASS | | test_dist_all_reduce_int64(分布式回归) | PASS | | patch 消除前同一场景基线(对比验证) | 行为一致(挂起集合体同样存活 6.00s) | **CI 报错分析**: | 报错 | 是否本 PR 引起 | 处理 | |---|---|---| | test_c10d_add_ephemeral_timeout.py:扩展不生效,集合体 3000ms 超时(torch 2.14.0.dev20260719) | 是(上游 _add_ephemeral_timeout_for_all_pgs 的 backend-generic 化(pg._add_ephemeral_timeout,NPU 生效)于 **2026-08-04** nightly(#191980)才合入,该 nightly 之前实现仅支持 CUDA/NCCL,NPU 上 no-op) | 已通过 compat 层解决:低版本由 torch_npu._compat.distributed 提供 torch_npu 实现(挂载回 c10d 命名空间),测试照常执行(mock 验证通过),不再 skip | | test_distributed.py::test_DistributedDataParallel_SyncBatchNorm_2D_Input 超时 300s(torch 2.14.0.dev20260719) | 否(SyncBatchNorm 与本次改动功能无关;第二轮 CI 同用例通过(191.5s),确认属偶发超时/环境问题) | 无需改动 | **说明**: - 与上游测试的差异(NPU 限制):① 上游依赖 work.timeout 属性断言,torch_npu 的 WorkHCCL 不暴露该属性(NCCL 特有),改为行为验证(挂起集合体存活时长);② torch_npu 阻塞模式(HCCL_BLOCKING_WAIT=1)下 watchdog 线程不创建,扩展重置语义无法在 NPU 上验证——该语义由上游测试在 NCCL 后端看护,NPU 侧 C++ 实现(ProcessGroupHCCL::addEphemeralTimeout)为既有特性,本次仅移除 Python 层 patch 替换,不改变 NPU 行为。 **静态检查**:lintrunner(FLAKE8/CODESPELL/SPACES/TABS/IMPORT_LINTER/NEWLINE 等)对本次变更文件全部通过。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!44917 | 1 个月前 |