Prhub

#1731 Fix CUDA IPC cache leaks during weight updates

THUDM/slime · 作者 zhuzilin · 合并时间 2026-03-17 10:37

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

执行摘要

修复权重更新中的 CUDA IPC 缓存泄漏,防止 GPU 内存累积。

根据PR body的描述,根因是ForkingPickler调用storage.share_cuda()创建了CUDA IPC缓存中的永久条目,这些条目持有GPU内存的强引用,只有通过torch.cuda.ipc_collect()检测到消费者关闭IPC句柄时才释放,导致内存泄漏。修复旨在避免此问题,确保内存回收。

对于涉及GPU内存管理或权重更新模块的工程师,建议精读此PR以学习CUDA IPC泄漏的修复技巧;对于一般读者,可关注变更点以规避类似的内存管理问题。

讨论亮点

本PR没有review评论或讨论,表明变更可能较为紧急或已被作者内部验证后直接合并。

实现拆解

实现集中在slime/backends/megatron_utils/update_weight/update_weight_from_tensor.py文件的update_weights函数中:1. 在循环中添加del long_lived_tensors, hf_named_tensors来释放GPU张量;2. 在每次ray.get()后调用torch.cuda.ipc_collect()以释放已完成chunk的IPC缓存条目;3. 在dist.barrier后再次调用torch.cuda.ipc_collect()以释放最后一个chunk的IPC条目。这些步骤共同确保内存泄漏被及时清理。

文件 模块 状态 重要度
slime/backends/megatron_utils/update_weight/update_weight_from_tensor.py megatron_utils update_weight modified 7.0

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

关键符号

update_weights

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

主要风险在于引入的torch.cuda.ipc_collect()调用可能带来轻微性能开销,特别是在高频率权重更新场景中。此外,修改依赖PyTorch CUDA IPC机制,需确保与现有torch版本的兼容性。由于变更集中在内存管理逻辑,有潜在的回归风险,但修复了已知泄漏,总体风险可控。

对用户而言,显著减少GPU内存泄漏,提升系统稳定性和可预测性;对系统,改善了GPU内存管理效率,允许内存块重用;对团队,这是一个针对性的bugfix,影响范围有限,但为处理类似内存问题的工程师提供了参考。

性能开销风险 核心内存管理变更

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

修复了SLIME中权重更新过程中的CUDA IPC缓存泄漏,通过添加内存释放和CUDA IPC收集调用,避免GPU内存累积,提升系统长期运行的稳定性。

功能与动机

本PR旨在解决一个特定场景下的GPU内存泄漏问题。根据PR body,根因在于使用ForkingPickler时,GPU张量通过storage._share_cuda_()创建了CUDA IPC缓存条目,这些条目在消费者未关闭句柄前不会释放,导致内存累积。修复动机是确保内存能被及时回收,防止资源浪费。

实现拆解

修改集中在update_weight_from_tensor.py文件的update_weights函数中:

  • 在循环中添加del long_lived_tensors, hf_named_tensors来明确释放GPU张量。
  • 调用torch.cuda.ipc_collect()两次:一次在每次chunk处理后,释放已完成chunk的IPC缓存条目;一次在所有chunk完成后(barrier后),释放最后一个chunk的IPC条目。
    代码块示例:
for hf_named_tensors in self._hf_weight_iterator.get_hf_weight_chunks(megatron_local_weights):
    refs, long_lived_tensors = self._send_hf_params(hf_named_tensors)
    ray.get(refs)
    del long_lived_tensors, hf_named_tensors
    torch.cuda.ipc_collect()
    dist.barrier(group=get_gloo_group())
    torch.cuda.ipc_collect()

评论区精华

本PR未经过review讨论,直接由作者提交并合并,表明变更可能较为紧急或已在内部验证,无需额外争议。

风险与影响

风险: 引入的torch.cuda.ipc_collect()调用可能带来轻微性能开销,尤其是在高频率权重更新场景中。此外,依赖PyTorch CUDA IPC机制,需确保与现有环境的兼容性。
影响: 对用户透明地减少内存泄漏,改善系统稳定性;对开发团队,提供了一个针对CUDA内存管理的修复案例,有助于规避类似问题。

关联脉络

与近期PR 1765(涉及megatron_utils update_weight模块的优化)相关,表明团队正持续改进权重更新相关的性能和稳定性。建议结合阅读以理解该模块的整体演进方向。

参与讨论