一文解决 RuntimeError: CUDA out of memory. 全网最全

Pytorch解决 RuntimeError: CUDA out of memory.

一、问题:

RuntimeError: CUDA out of memory. Tried to allocate 50.00 MiB (GPU 0; 4.00 GiB total capacity; 682.90 MiB already allocated; 1.62 GiB free; 768.00 MiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

二、分析

这是GPU内存不足引起的

三、解决

方法一:调整batch_size 一般为2的n次方,一般为4,如果不行,则pass

方法二:清除pytorch无用缓存,在代码总加入如下代码,亲测有效

import torch, gc

gc.collect()
torch.cuda.empty_cache()

方法三:在测试阶段和验证阶段前插入代码 with torch.no_grad()(目的是该段程序不计算参数梯度),如下:

def test(model,dataloader):
   model.eval()
   with torch.no_grad(): #插在此处
       for batch in tqdm(dataloader):
   			……

方法四: 使用别人代码时

如果怎么修改,都会出现题中bug,甚至跑了几轮之后突然出现 cuda out of
memory,查看代码中是否存在一下代码(通常出现在main.py 或者数据加载的py文件中:

kwargs = {'num_workers': 6, 'pin_memory': True} if torch.cuda.is_available() else {}

将"pin_memory": True改为False,具体原因查看 原博主:

关于什么是锁页内存:
pin_memory就是锁页内存,创建DataLoader时,设置pin_memory=True,则意味着生成的Tensor数据最开始是属于内存中的锁页内存,这样将内存的Tensor转义到GPU的显存就会更快一些。
主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内存就是硬盘),而不锁页内存在主机内存不足时,数据会存放在虚拟内存中。显卡中的显存全部是锁页内存,当计算机的内存充足的时候,可以设置pin_memory=True。当系统卡住,或者交换内存使用过多的时候,设置pin_memory=False。因为pin_memory与电脑硬件性能有关,pytorch开发者不能确保每一个炼丹玩家都有高端设备,因此pin_memory默认为False。

方法五: 环境变量中加入export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32

vim ~/.bashrc

export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32

保存并退出
source ~/.bashrc

具体参考一文读懂 PyTorch 显存管理机制

你可能感兴趣的:(pytorch,深度学习,pytorch,人工智能)