torch.cuda.empty_cache() 是 PyTorch 中用于 释放 GPU 显存缓存 的函数,它不会释放已经被模型占用的显存,只是清除 PyTorch 分配器中未使用但保留的缓存显存,以便其他 GPU 程序(如其他进程)使用这部分内存。

作用总结

  • 不会影响已分配的 Tensor,它们仍然保留在 GPU 上;
  • 仅清理 PyTorch allocator 的缓存池
  • ✅ 在多模型轮流推理或显存紧张时可以尝试释放一下;

示例代码

import torch
import time

# 创建一个大张量,分配一些显存
x = torch.randn(1024, 1024, 512, device='cuda')  # 占用大量显存
print(f"Allocated: {torch.cuda.memory_allocated() / 1024**2:.2f} MB")
time.sleep(5)

# 删除变量
del x

# 此时显存依然占用一部分(缓存)
print(f"Allocated after del: {torch.cuda.memory_allocated() / 1024**2:.2f} MB")
print(f"Cached before empty_cache: {torch.cuda.memory_reserved() / 1024**2:.2f} MB")

time.sleep(5)
print('start empty_cache')
# 释放缓存
torch.cuda.empty_cache()

# 查看释放后的显存
print(f"Cached after empty_cache: {torch.cuda.memory_reserved() / 1024**2:.2f} MB")

在这里插入图片描述
可以看到 删除 x 并没有回收显存,torch.cuda.empty_cache 将显存腾出来了。

可用场景

在资源受限的环境下,例如单张显卡显存不足的情况下,需要同时部署两个大模型服务
但如果它们同时驻留在 GPU 上,会导致显存溢出(OOM)。
为了解决这个问题,我们采用模型轮流加载与卸载的策略

  • 每次推理时,仅加载当前所需模型到 GPU;
  • 推理完成后,立即将模型从显存中卸载,并手动释放缓存;
  • 这样两个服务可轮流占用 GPU 资源,避免 OOM。

这种方式虽会带来 模型反复加载的延迟开销,但可以在 极端资源紧张场景下,实现两个大模型服务的共存与轮流推理

最后用两张图来结束:

  • torch.cuda.empty_cache 回收显存
    在这里插入图片描述
  • 可用场景,资源紧张的情况下,轮流推理
    在这里插入图片描述
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐