torch.cuda.empty_cache() 释放显存及其应用
·
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回收显存

- 可用场景,资源紧张的情况下,轮流推理

更多推荐
所有评论(0)