Prhub

#37533 [ROCm] fix sleep mode not releasing GPU memory problem on ROCm

原始 PR 作者 aaab8b 合并时间 2026-03-23 21:07 文件变更 1 提交数 2 评论 3 代码增减 +22 / -0

执行摘要

修复 ROCm 平台上睡眠模式无法释放 GPU 内存的问题。

根据 PR body,在 ROCm 上,hipMemRelease 不会将物理 VRAM 返回空闲池,导致睡眠模式下 GPU 内存保持占用,阻止其他应用(如 RL 训练框架)使用释放的内存。

对于从事 ROCm 平台开发或内存管理的工程师,值得精读此 PR,了解针对 ROCm 的内存释放变通方法。关注虚拟地址保持的设计决策,以及 review 中提到的潜在重构点。

讨论亮点

review 中,gemini-code-assist[bot] 指出此变通方法对睡眠路径正确,但由于 unmap_and_release 函数也被 my_free 调用,在普通张量释放路径中会导致不必要的 cuMemAddressReserve 和后续 cuMemAddressFree 调用,引入低效,建议重构以隔离工作区到仅睡眠路径。tjtanaa 批准了 PR,未处理此建议。

实现拆解

修改了 csrc/cumem_allocator.cpp 文件中的 unmap_and_release 函数,仅在 ROCm 路径(#else 分支)添加了代码块:先调用 cuMemAddressFree 释放内存,再调用 cuMemAddressReserve 重新保留相同虚拟地址,强制释放物理页。错误处理确保地址重新保留成功,否则记录错误并返回。

文件 模块 状态 重要度
csrc/cumem_allocator.cpp 内存分配器子系统 modified 9.0

关键符号

unmap_and_release

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

变通方法在共享函数中的效率问题 设计

gemini-code-assist[bot] 指出 `unmap_and_release` 函数也被 `my_free` 调用,导致在普通释放路径中引入不必要的 `cuMemAddressReserve` 和后续 `cuMemAddressFree` 调用,建议重构以隔离变通方法到仅睡眠路径。

结论:PR 被批准而未实施重构,建议未处理。 · suggestion_not_addressed

风险与影响

风险包括:

1) 在 my_free 路径中引入性能损耗,增加了额外的内存操作。
2) 如果 cuMemAddressReserve 返回不同地址,代码会记录错误并返回,可能导致后续内存管理问题。
3) 仅针对 ROCm 路径,不影响 CUDA 路径。

对使用 ROCm 平台并启用睡眠模式的用户,GPU 内存将正确释放,提升多应用共享 GPU 的能力。系统层面,内存管理更健壮。团队需注意此平台特定问题,以及未来可能的代码重构以优化性能。

共享函数变更 潜在性能损耗 平台特定依赖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论