已合并
[feat] add ~mempool() with emptyCache #39221
xuyun15创建于 6月24日
[feat] add ~mempool() with emptyCache #39221
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 xuyun15 的贡献)ascend-robot
6月24日 评论:
6月24日 评论:
6月24日 添加了label:ascend-cla/yes
ascend-robot
6月24日 评论:
6月24日 评论:
Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-Ascend/pytorch | ✅ liujunzhu, hbhu_bin (2/2) | ✅ liujunzhu (1/1) |
| test | ✅ liujunzhu, hbhu_bin (2/2) | ✅ liujunzhu (1/1) |
| torch_npu/npu | ✅ liujunzhu, hbhu_bin (2/2) | ✅ liujunzhu (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
xuyun15, thanks for your pull request. All authors of the commits have signed the CLA. 👍


此处折叠了50条消息 查看更多
6月29日 添加了label:lgtm
6月29日 合入了pull request
ascend-robot
6月29日 评论:
6月29日 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


ascend-robot
6月29日 评论:
6月29日 评论:
流水线 pytorch_gitcode_PR_multiVersion#11539 [ commitID:9138bb45 ] 已完成


【合入来源】
【修改方案】
目标模块 / Feature: MemPool 析构与指定池内存释放
该改动的核心目标是:实现 MemPool 对象析构时自动释放其关联的内存池资源,解决 MemPool 缺少析构函数导致的内存泄漏问题。
1. feature 核心工作机制
该改动实现了 MemPool 的 RAII 析构机制:
device_,生成唯一池 IDid_releasePool(device_, id_)减少引用计数并标记可释放,再调用emptyCache(id_)精确释放该池的缓存内存mempool_id参数,支持只释放指定池的缓存,避免影响其他池pool过滤参数,支持只同步特定池的事件,减少不必要的同步开销2. 核心调用路径
3. 核心数据结构
MemPool:新增device_成员(c10::DeviceIndex),新增析构函数、device()方法、graph_pool_handle()静态方法MempoolId_t:std::pair<CaptureId_t, CaptureId_t>,{0,0} 表示"未指定池"PrivatePool:持有use_count(图引用计数)和npuMalloc_count(未释放分配数)graph_pools_freeable:ska::flat_hash_map<MempoolId_t, PrivatePool*>,记录可释放的池4. 推荐阅读顺序
device()、graph_pool_handle()实现releasePool引用计数管理emptyCache设备级实现release_cached_blocks指定池释放synchronize_and_free_events池过滤graph_pool_handle()改用静态方法5. 可能存在的API一致性以及ABI兼容性问题
NPUAllocator基类新增虚函数emptyCache(bool, bool, MempoolId_t),所有继承该基类的第三方代码需重新编译device_成员改变了sizeof(MemPool),直接操作 MemPool 对象的已编译代码需重新编译device()和graph_pool_handle()方法未绑定到 Python,Python 用户无法调用mempool_id的emptyCache仅打印警告,使用可插拔分配器时 MemPool 析构不会释放内存torch.npu.empty_cache()仍只调用无参版本,用户无法从 Python 手动释放指定池的缓存6、注意特性:
1、torch_npu/csrc/npu/MemPool.cpp : 参考cuda,pyblind过程初始化npu。解决mempool初始化未识别device的问题
2、torch_npu/csrc/core/npu/NPUCachingAllocator.cpp: 参考cuda,新增createOrIncrefPool
3、torch_npu/npu/memory.py :参考cuda,新增torch_npu._C._npu_releasePool(device_index, pool.id),解决第2点会带来use_count+1的问题
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
新增ut,库上为去掉print的版本:


优化前:
优化后:
【CheckList】