已合并
[bugfix]hcclwatchdog_save_status #42727
[bugfix]hcclwatchdog_save_status #42727
已合并
xiaoqi-zhou创建于 26 天前
xiaoqi-zhou成员
26 天前

【合入来源】

issue:https://gitcode.com/Ascend/pytorch/issues/3334

【修改方案】

1.状态保存是辅助功能不抛异常仅打印详细日志,支持嵌套创建目录。
2.加锁全局进行写入时,锁改成全局变量;写入时先写入tmp文件,写入成功后再改成正式文件;未防止Hash扩容导致读取脏数据,读取存数据变量的深拷贝变量。

【资料变更】

不涉及

【接口变更】

不涉及

【功能验证】

本地自验证通过:
python集成测试:
image.png
C++单例测试:
image.png

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 xiaoqi-zhou 的贡献)
Xxiaoqi-zhou成员
26 天前 创建了 pull request,commit 5adc8c57
Xxiaoqi-zhou成员
26 天前 关联了issue:hcclwatchdog在状态保存过程中,抛异常未被捕获导致程序直接退出
atomgit-bot
atomgit-bot
26 天前 评论:

变更摘要

本次 PR 主要修复 HCCLWatchdog 状态保存(hcclwatchdog_save_status)功能的若干问题:将状态保存从「抛异常」改为「仅记录日志」的辅助模式,支持嵌套目录创建;通过深拷贝避免 unordered_map 扩容导致的脏读;将写入改为先写临时文件再重命名的原子化方式;并将原先模块级全局变量替换为动态获取,同时将 StatusMapmutex_ 改为 static 全局锁。

主要改动

  • checkAndMakePath 重写为不抛异常的辅助函数:使用 std::filesystem::create_directories 支持嵌套目录创建,所有错误仅通过 ASCEND_LOGI/ASCEND_LOGWstd::cout 输出详细日志,不再抛出 std::runtime_error

  • StatusMapmutex_ 改为 static 全局锁:将 ProcessGroupHCCLstd::mutex StatusMapmutex_ 从实例成员改为 static 类成员,确保跨多个 ProcessGroupHCCL 实例写入时锁定同一把锁。

  • recordHcclStatus 采用深拷贝避免脏读,并改为原子写入:读取时对 StatusOutput_ 做深拷贝到局部变量 statusSnapshot,防止 unordered_map 扩容导致的内存地址变化引发脏读;写入时先写入 .tmp 临时文件,成功后再 rename 为正式文件,避免写入过程中断导致 JSON 文件损坏。整个函数包裹在 try-catch 中,异常仅记录日志不再向上抛。

  • 移除模块级全局变量 status_save_enablestatus_save_path:改为在 runLoop()、WorkHCCL 构造等处动态调用 c10_npu::option::OptionsManager::CheckStatusSaveEnable()GetStatusSavePath(),避免静态初始化阶段读取配置带来的时序问题。

likedislike
atomgit-bot
atomgit-bot
26 天前 评论:

代码审查

审查完成 — 总结

优先级 数量 说明
P0 0
P1 0
P2 0
P3 3 死代码参数、冗余 stdout 输出 (两处)

逐文件审查结果

  1. torch_npu/csrc/distributed/ProcessGroupHCCL.cpp — 发现 3 个 P3 问题:

    • checkAndMakePath 中未使用的 errormessage 参数(死代码)
    • checkAndMakePathstd::coutASCEND_LOG 双重输出
    • recordHcclStatusstd::coutASCEND_LOGW 双重输出
  2. 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

💬 仅评论

likedislike
此处折叠了132条消息 查看更多
renyujin成员
2 天前 评论:

/lgtm
/approve

likedislike
ascend-robotascend-robot成员
2 天前 添加了label:approvedlgtm
ascend-robotascend-robot成员
2 天前 合入了pull request
ascend-robot
ascend-robot成员
2 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
2 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14171 [ commitID:b6f24328 ] 已完成
likedislike