Neural network Pytorch卷积网络内存使用详细信息

Neural network Pytorch卷积网络内存使用详细信息,neural-network,gpu,conv-neural-network,cudnn,Neural Network,Gpu,Conv Neural Network,Cudnn,我正在尝试为一个非常大的输入(5*100000000)训练一个神经网络,它需要比预期多得多的内存。 以下是一些最简单的示例: import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import time class Net(nn.Module): def __init__(self): super(Net, self).__init_

我正在尝试为一个非常大的输入(5*100000000)训练一个神经网络,它需要比预期多得多的内存。 以下是一些最简单的示例:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import time

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv1d(in_channels=5, out_channels=1, kernel_size=100000000, stride=10)

    def forward(self, x):
        x = self.conv1(x)
        x = torch.sigmoid(x)
        return x

model = Net().cuda()

optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = torch.nn.BCELoss()

data = torch.normal(torch.zeros(1,5,100000000),torch.ones(1,5,100000000))
data = data.cuda()
label = torch.ones(1,1,1)
label = label.cuda()

for epoch in range(10):
    output = model(data)
    loss = criterion(output, label)
   
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    print("Epoch :", epoch)
输入是一些随机数据,它使用大约2Gb,正如预期的那样(32位*5*100000000=1.86Gb)。此变量没有梯度。 该网络由单个卷积层组成,其中一个滤波器的大小与输入相同,因此它有500米的权重,即另一个2Gb。 在向前传球后,使用另一个2Gb。 在
loss之后,使用backprop()
8Gb,在
optimizer.step()之后使用12GB,这就是所有可用内存

在第二个历元期间,正向传递运行正常,但在反向传播期间,我得到RuntimeError:CUDA error:内存不足

在新纪元期间,GPU内存中到底保存了什么?优化步骤完成后,为什么不释放内存?在这种情况下,如何减少内存使用

UPD:看来我的问题与这个问题类似


UPD2:从pytorch开发人员那里得到了一个答案,但它只是说这不是pytorch的问题,而是cuDNN的问题。

因为你想调用
loss.backprop()
,pytorch必须计算梯度,这会导致大量内存分配。 如果要删除渐变,请对变量调用
.detach()

要释放未使用的内存,可以调用
torch.cuda.empty\u cache()
如果你想深入了解细节,
可能是一个起点。

您不能分配一个特定百分比的内存,允许pytorch一次使用吗?我这样问是因为我在tensorflow中做过。除了使用torch.cuda中的一些方法,比如empty_cache(),我不太确定。看起来pytorch不能限制GPU内存的使用。我尝试过空缓存,但没有效果空缓存()不起作用。据我所知,当我不再需要变量的梯度时,你建议分离变量,对吗?我已经尝试过了,但没有效果。有一段时间我处理了一个非常类似的问题,我不记得解决方案。老实说,这更多的是尝试和错误,而不是认真理解pytorch分配cuda内存的方式。不幸的是,我现在没有一台电脑在roght身边,可以尝试一些东西。根据情况,可以分离或删除张量。在此操作后调用empty_cache()将释放内存。我可以问你为什么用卷积吗?应用核大小等于输入大小的卷积与应用例如nn.Linear(即完全连接的层)大致相同,除了填充等副作用。问题中的示例纯粹是人为设计的,以显示我正在处理的问题。我尝试过线性层与卷积等效,但它在这种输入下运行良好,即使增加输入大小也不会导致与卷积相同的行为,副作用是一个值得探索的好主意。我真的很想知道记忆的去向。输入是2gb,权重是2gb,渐变多2gb,也就是6gb,剩下的6gb是什么用的,我们能不能去掉其中的一些部分?你有没有尝试过更小的输入,比如0.2gb?我这样问是因为可能有内存泄漏。如果cuda在10+个纪元后内存不足,即使有这么小的输入,这将是一个类似这样的提示。否则,我们必须进一步探索卷积类的实现。