python - 如何避免 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 内存不足的原因并重新启动内核以避免再次发生错误(就像我在我的案例中所做的那样)。
迭代地传递数据可能会有所帮助,但改变网络层的大小或将它们分解也会被证明是有效的(因为有时模型也会占用大量内存,例如,在进行迁移学习时)。
推荐阅读
- algorithm - 任务调度算法
- javascript - 读取通过文件输入选择的巨大本地视频文件的最有效方法
- python - 为什么 cv2.imencode('jpg', ...) 似乎会改变图像的颜色?
- mysql - SELECT 语句从具有可变数据的结果集中删除空列
- javascript - 如何在 NodeJS 中获取所有 HTTP 方法
- javascript - 在 Django 模板中创建变量
- html - “视图宽度”属性无法正常工作
- java - 我是否在复合键中正确定义了多对一?
- express - 如何将对象数组添加到 mongoDB 模型
- javascript - 有没有办法将 ref {useRef} 绑定到提交函数/变量