如何避免PyTorch中的CUDA内存不足 [英] How to avoid "CUDA out of memory" in PyTorch
本文介绍了如何避免PyTorch中的CUDA内存不足的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我认为对于低GPU内存的PyTorch用户来说,这是一个非常常见的信息:
RuntimeError: CUDA out of memory. Tried to allocate 😊 MiB (GPU 😊; 😊 GiB total capacity; 😊 GiB already allocated; 😊 MiB free; 😊 cached)
我想为我的课程研究对象检测算法。而且许多深度学习架构需要大容量的GPU内存,所以我的机器无法训练这些模型。我试图通过将每个层加载到GPU,然后再将其加载回来来处理图像:
for m in self.children():
m.cuda()
X = m(X)
m.cpu()
torch.cuda.empty_cache()
但它似乎不是很有效。我想知道有什么技巧和诀窍可以在使用少量GPU内存的情况下训练大型深度学习模型。提前感谢!
编辑:我是深度学习的初学者。如果这是一个虚假的问题,请道歉:)
推荐答案
虽然,
import torch
torch.cuda.empty_cache()
为清除已占用的CUDA内存提供了一个很好的选择,我们还可以使用,
手动清除不使用的变量 import gc
del variables
gc.collect()
但在使用这些命令之后,错误可能会再次出现,因为pytorch实际上并不清除内存,而是清除对变量占用的内存的引用。
因此,在重新启动内核后减小Batch_Size并找到最佳的Batch_Size是最好的选择(但有时不是非常可行)。
更深入地了解GPU中内存分配的另一种方法是使用:
torch.cuda.memory_summary(device=None, abbreviated=False)
其中,这两个参数都是可选的。这提供了可读的内存分配摘要,并允许您找出CUDA内存不足的原因,并重新启动内核以避免再次发生错误(就像我在本例中所做的那样)。
反复传递数据可能会有所帮助,但更改网络层的大小或分解它们也会被证明是有效的(因为有时模型也会占用大量内存,例如,在进行迁移学习时)。
这篇关于如何避免PyTorch中的CUDA内存不足的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文