Prhub

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

vllm-project/vllm · 作者 aaab8b · 合并时间 2026-03-23 21:07

分析状态 已生成
文件变更 1提交数 2 · 评论 3
代码增减 +22 / -0
bugfix rocm performance

执行摘要

修复 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

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

关键符号

unmap_and_release

评论区精华

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

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 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

此 PR 修复了在 ROCm 平台上睡眠模式无法释放 GPU 内存的问题,通过在 unmap_and_release 函数中添加虚拟地址循环操作强制物理内存释放,影响 ROCm 用户的内存管理功能,但可能存在性能优化空间。

功能与动机

在 ROCm 上,hipMemRelease 不会将物理 VRAM 返回空闲池,导致睡眠模式下 GPU 内存保持占用,阻止其他应用使用释放的内存。PR body 明确指出此问题,并提供脚本复现和验证。

实现拆解

仅修改 csrc/cumem_allocator.cpp 文件中的 unmap_and_release 函数,针对 ROCm 路径添加以下代码块:

if (first_error == no_error) {
    first_error = cuMemAddressFree(d_mem, size);
    if (first_error == no_error) {
        CUdeviceptr d_mem_new = 0;
        first_error = cuMemAddressReserve(&d_mem_new, size, 0, d_mem, 0);
        // 错误处理逻辑...
    }
}

该实现确保释放物理页并保留相同虚拟地址,以兼容后续唤醒操作。

评论区精华

review 中,gemini-code-assist[bot] 指出:

此工作区对睡眠路径正确,但由于 unmap_and_release 也被 my_free 调用,在普通释放路径中会导致不必要的内存操作,建议重构以隔离工作区到仅睡眠路径。
tjtanaa 批准 PR 但未采纳此建议,表明设计权衡未完全解决。

风险与影响

  • 性能风险:在 my_free 路径中增加额外内存操作,可能影响普通张量释放效率。
  • 兼容性风险:仅针对 ROCm 路径,CUDA 路径不受影响,但错误处理依赖特定地址返回。
  • 影响范围:使用 ROCm 平台并启用睡眠模式的用户将受益于正确内存释放,提升系统资源利用率。

关联脉络

与此 PR 相关的历史 PR 如 #36100 和 #36505 均涉及 ROCm 平台的错误修复和性能优化,揭示 vLLM 仓库对 ROCm 支持的持续演进,尤其是在内存管理和内核优化方面。

参与讨论