pytorch 优化显存

读到了这篇文章:
https://zhuanlan.zhihu.com/p/527143823

对显存的占用说的很详细:

只有一种情况需要使用 torch.cuda.empty_cache(),就是当你想要释放缓存以便让其他人也可以一起使用当前显卡,否则不需要调用这个方法。

所以这篇博客就图一乐

比 nvidia-smi 更好的监控程序:
pip install gpustat
gpustat -i 0.1


参考(这里面有各种方法):
https://cloud.tencent.com/developer/article/2374407

最近训一个程序,发现训了一半突然 out of memory 了。

正常来说, out of memory 第一个 batch 就应该出现了,而不是训练一半再报错,感觉有些中间变量没有回收的锅。

然后重新开始训练,也跑不起来了,哎

清除中间变量

通常情况下,数据先存在内存上,然后把每个 batch 的数据移到 cuda 上,丢进模型。

移到 cuda 上的数据 input, lables, 还包括一些中间的 loss 和 和 output,都是可以清除的,即 del 掉。

但是会发现一个问题,即使把它 del 掉了,用 nvidia-smi 查看,会发现显存占用还是没变化,这个时候需要

torc
h.cuda.empty_cache()

来手动让 pytorch 去回收一遍显存,当然由于显存的特性,这样也不一定能保证能够回收干净。

在临时用完了一些很大的临时变量时,就可以这样回收一下。

下面是一个例子:
一开始:


运行

a = torch.randn(n, m)
b = a.cuda()
print(torch.cuda.memory_allocated())

输出:

1600126976


运行

del b
print(torch.cuda.memory_allocated())

输出:

0

但:


运行

torch.cuda.empty_cache()
print(torch.cuda.memory_allocated())

输出:

0

此时:


关闭程序后:

posted @ 2024-03-23 16:49  Cold_Chair  阅读(41)  评论(0编辑  收藏  举报