Pull Request已成功合入, 合并人@ascend-robot
(感谢 xiaoqi-zhou 的贡献)变更摘要
本次 PR 主要修复 HCCLWatchdog 状态保存(hcclwatchdog_save_status)功能的若干问题:将状态保存从「抛异常」改为「仅记录日志」的辅助模式,支持嵌套目录创建;通过深拷贝避免 unordered_map 扩容导致的脏读;将写入改为先写临时文件再重命名的原子化方式;并将原先模块级全局变量替换为动态获取,同时将 StatusMapmutex_ 改为 static 全局锁。
主要改动
-
checkAndMakePath重写为不抛异常的辅助函数:使用std::filesystem::create_directories支持嵌套目录创建,所有错误仅通过ASCEND_LOGI/ASCEND_LOGW和std::cout输出详细日志,不再抛出std::runtime_error。 -
StatusMapmutex_改为static全局锁:将ProcessGroupHCCL的std::mutex StatusMapmutex_从实例成员改为static类成员,确保跨多个ProcessGroupHCCL实例写入时锁定同一把锁。 -
recordHcclStatus采用深拷贝避免脏读,并改为原子写入:读取时对StatusOutput_做深拷贝到局部变量statusSnapshot,防止unordered_map扩容导致的内存地址变化引发脏读;写入时先写入.tmp临时文件,成功后再rename为正式文件,避免写入过程中断导致 JSON 文件损坏。整个函数包裹在 try-catch 中,异常仅记录日志不再向上抛。 -
移除模块级全局变量
status_save_enable和status_save_path:改为在runLoop()、WorkHCCL 构造等处动态调用c10_npu::option::OptionsManager::CheckStatusSaveEnable()和GetStatusSavePath(),避免静态初始化阶段读取配置带来的时序问题。


代码审查
审查完成 — 总结
| 优先级 | 数量 | 说明 |
|---|---|---|
| P0 | 0 | — |
| P1 | 0 | — |
| P2 | 0 | — |
| P3 | 3 | 死代码参数、冗余 stdout 输出 (两处) |
逐文件审查结果
-
torch_npu/csrc/distributed/ProcessGroupHCCL.cpp— 发现 3 个 P3 问题:checkAndMakePath中未使用的errormessage参数(死代码)checkAndMakePath中std::cout与ASCEND_LOG双重输出recordHcclStatus中std::cout与ASCEND_LOGW双重输出
-
torch_npu/csrc/distributed/ProcessGroupHCCL.hpp— 无问题(仅StatusMapmutex_从实例成员改为 static,与.cpp定义一致)。
整体风险评估
低风险。本次变更的核心修复方向正确:
checkAndMakePath不再抛异常,改为仅日志输出,从根本上解决了 issue #3334 中状态保存失败导致程序退出的问题。StatusMapmutex_改为 static 正确修复了原代码中多个 PG 实例共享StatusOutput_时的锁粒度不一致问题。recordHcclStatus增加 try-catch 兜底、先写 tmp 再 rename、深拷贝 snapshot 等改进均合理。- 报告的 3 个 P3 问题均为次要改进项(死代码清理、冗余日志),不影响运行时正确性。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
issue:https://gitcode.com/Ascend/pytorch/issues/3334
【修改方案】
1.状态保存是辅助功能不抛异常仅打印详细日志,支持嵌套创建目录。
2.加锁全局进行写入时,锁改成全局变量;写入时先写入tmp文件,写入成功后再改成正式文件;未防止Hash扩容导致读取脏数据,读取存数据变量的深拷贝变量。
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
本地自验证通过:


python集成测试:
C++单例测试:
【CheckList】