【PTA】torch_npu 中 streamevent未清理weakref导致core dump问题修复经验

📅 发布时间:2026/9/6 3:05:58
【PTA】torch_npu 中 streamevent未清理weakref导致core dump问题修复经验
​作者​昇腾实战派​知识地图​https://blog.csdn.net/Lumos_Lovegood/article/details/161601003背景概述在单机多卡训练场景下使用 TorchNPU 2.10.0 版本结合整图模式npugraph_ex、编译缓存及多流Multi-stream功能时模型在第二次带缓存运行并退出时发生了 core dump。经排查该问题仅在同时开启多流和编译缓存时出现关闭多流后问题不复现。问题场景环境配置单机多卡TorchNPU 2.10.0整图模式npugraph_ex启用编译缓存启用多流。触发条件第二次带缓存运行用例进程退出时发生 core dump。关键特征关闭多流功能后core dump 不再出现。定位流程通过对比历史测试记录发现 TorchNPU 2.8.0 版本在相同配置整图npugraph_ex 多流下未出现 core dump。进一步分析报错信息确认问题与 TorchNPU 版本相关。具体测试结果如下表所示TorchNPU 版本图模式编译缓存多流Core Dump2.10.0整图npugraph_ex是否否2.10.0GE是是否2.10.0整图npugraph_ex是是是2.8.0整图npugraph_ex是是否由上表可见core dump 仅在 TorchNPU 2.10.0 整图npugraph_ex 编译缓存 多流的组合下出现。问题根因该问题源于上游 PyTorch 的一个已知缺陷PR #183403。具体分析如下在 PyTorch 2.8 中官方为stream/event的父类THPStream/THPEvent添加了弱引用weakref支持并在析构函数中增加了PyObject_ClearWeakRefs()调用以清理弱引用资源。各硬件后端如 CUDA、XPU、NPU实现的子类如THNPStream覆写了tp_dealloc()方法以处理硬件特有资源但未显式调用父类的tp_dealloc()导致PyObject_ClearWeakRefs()等弱引用清理逻辑未被执行。由于 CPython 对静态类型不会链式调用父类的析构函数子类中缺乏弱引用清理逻辑造成资源泄漏。在 PyTorch 2.10 中模型在 NPU 上运行时底层dynamo组件会将 NPU 的Stream/Event以弱引用的形式缓存到index_to_externel_object_weakref字典中。进程正常退出后Stream对象的强引用消失在Py_FinalizeEx模块清理阶段释放torch._dynamo的 weakref 时由于弱引用未清理导致wr_object悬空指向已释放内存从而触发段错误。注意该问题属于 debug build 的 assert 检查及 weakref 清理顺序问题不影响推理结果的正确性。修复结果该问题已在以下 PR 中修复https://gitcode.com/Ascend/pytorch/pull/41596修复方式为在子类的tp_dealloc()中显式调用父类的弱引用清理函数确保Stream/Event对象销毁时正确清理所有弱引用避免悬空指针导致的 core dump。