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
此时:
关闭程序后:
转载注意标注出处:
转自Cold_Chair的博客+原博客地址