Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免;“CUDA内存不足”;在皮托克_Python_Deep Learning_Pytorch_Object Detection_Low Memory - Fatal编程技术网

Python 如何避免;“CUDA内存不足”;在皮托克

Python 如何避免;“CUDA内存不足”;在皮托克,python,deep-learning,pytorch,object-detection,low-memory,Python,Deep Learning,Pytorch,Object Detection,Low Memory,我认为对于GPU内存较低的PyTorch用户来说,这是一个非常常见的信息: RuntimeError: CUDA out of memory. Tried to allocate Send the batches to CUDA iteratively, and make small batch sizes. Don't send all your data to CUDA at once in the beginning. Rather, do it as follows: for e in

我认为对于GPU内存较低的PyTorch用户来说,这是一个非常常见的信息:

RuntimeError: CUDA out of memory. Tried to allocate Send the batches to CUDA iteratively, and make small batch sizes. Don't send all your data to CUDA at once in the beginning. Rather, do it as follows:

for e in range(epochs):
    for images, labels in train_loader:   
        if torch.cuda.is_available():
            images, labels = images.cuda(), labels.cuda()   
        # blablabla  

运行时错误:CUDA内存不足。尝试分配以迭代方式将批次发送到CUDA,并生成小批量。不要一开始就将所有数据一次发送到CUDA。相反,请按以下步骤操作:

适用于范围内的e(历元):
对于图像,列车加载器中的标签:
如果torch.cuda.U可用():
images,labels=images.cuda(),labels.cuda()
#喋喋不休
您还可以使用占用较少内存的
d类型。例如,
torch.float16
torch.half

尽管

    import torch
    torch.cuda.empty_cache()
为清除占用的cuda内存提供了一个很好的选择,我们还可以使用

    import gc
    del variables
    gc.collect()
但是在使用这些命令之后,错误可能再次出现,因为pytorch实际上并没有清除内存,而是清除对变量占用的内存的引用。 因此,在重启内核后减少批处理大小并找到最佳批处理大小是最好的选择(但有时不是一个非常可行的选择)

深入了解gpu内存分配的另一种方法是使用:

    torch.cuda.memory_summary(device=None, abbreviated=False)
其中,两个参数都是可选的。这提供了一个可读的内存分配摘要,并允许您找出CUDA内存不足的原因,然后重新启动内核以避免再次发生错误(就像我在本例中所做的那样)


以迭代方式传递数据可能会有所帮助,但更改网络层的大小或将其分解也会被证明是有效的(例如,在进行转移学习时,有时模型也会占用大量内存)。

只需减小批处理大小,就可以了。 当我在训练时,它给出了以下错误:

CUDA内存不足。尝试分配20.00 MiB(GPU 0;10.76 GiB 总容量;已分配4.29 GiB;10.12 MiB空闲;4.46 GiB PyTorch共预留)

我使用的批量大小是32。所以我把它改成了15,它对我有效。

实现:

  • 将图像一批一批地输入gpu

  • 在培训或推理过程中使用小批量

  • 使用较小的图像大小调整输入图像的大小

  • 技术上:

  • 大多数网络都过于参数化,这意味着它们对于学习任务来说太大了。因此,找到合适的网络结构有助于:
  • a。使用模型压缩、网络修剪和量化等技术压缩网络

    b。直接使用更紧凑的网络结构,如MobileNet v1/2/3


    c。网络架构搜索(NAS)。

    最好的方法是降低批量大小。通常是有效的。否则,请尝试以下操作:

    导入gc
    del变量#删除不必要的变量
    gc.collect()
    
    试着不要把你的毕业生拖得太远。

    当我试图总结所有批次的损失时,我也犯了同样的错误

    loss =  self.criterion(pred, label)
    
    total_loss += loss
    
    然后我使用loss.item来代替需要梯度的loss,然后解决了这个问题

    loss =  self.criterion(pred, label)
    
    total_loss += loss.item()
    
    下面的解决方案在

    此错误与GPU内存有关,而不是通用内存=>@cjinny注释可能不起作用
    您使用TensorFlow/Keras还是Pytorch
    尝试使用较小的批量
    如果使用Keras,请尝试减小一些隐藏层的大小
    如果您使用Pytork:
    您是否一直将所有培训数据保存在GPU上
    确保不要将毕业生拖得太远
    检查隐藏层的大小


    有一些方法可以避免,但这当然取决于您的GPU内存大小:

  • 迭代解包数据时,在GPU中加载数据
  • 使用FP_16或单精度浮点数据类型
  • 如果内存不足,请尝试减小批处理大小
  • 使用
    .detach()
    方法从GPU中删除不需要的张量

  • 如果正确使用以上所有内容,PyTorch库已经是高度优化和高效的库。

    我也有同样的错误,但通过使用以下行将我的图像从~600调整到100来修复它:

    导入torchvision.transforms作为变换
    transform=transforms.Compose([
    transforms.Resize((100100)),
    transforms.ToTensor()
    ])
    
    笑脸是怎么回事?英雄联盟另外,减少批量大小和/或在较小的图像上进行训练。查看Apex库中的混合精度训练。最后,当将批处理大小减小到1时,例如,您可能希望在每次迭代后推迟将梯度设置为零,因为它仅基于单个图像。我使用Kaggle时也遇到了同样的问题。它可以很好地处理64个批次,然后我尝试了128个批次,但得到了错误,没有任何效果。即使是64个批次也给了我同样的错误。尝试重置了几次<代码>torch.cuda.empty_cache()
    不起作用。相反,首先禁用GPU,然后重新启动内核,然后重新激活GPU。这对我很有用。减少输入到模型的数据的批量大小。为meI工作如果我运行一个多次开始训练的单元,会在jupyter笔记本中收到此错误消息。重新启动内核修复了这个问题,但是如果我们能够以某种方式清除缓存,那就太好了。。。例如,
    torch.cuda.empty_cache()
    到目前为止没有任何帮助。即使它可能应该…:(
    这提供了一个可读的内存分配摘要,并允许您找出CUDA内存不足的原因
    。我打印了
    torch.CUDA.memory_summary()的结果)
    调用,但似乎没有任何信息会导致修复。我看到了
    分配内存
    活动内存
    GPU保留内存
    ,等等的行。我应该看什么,应该如何采取行动?我有一台带有MX130和16GB ram的小型笔记本电脑。合适的批大小是4。@stack
    features, labels in batch:
       features, labels = features.to(device), labels.to(device)