【发布时间】:2019-03-16 15:51:30
【问题描述】:
我正在尝试为非常大的输入 (5*100,000,000) 训练神经网络,它需要比预期更多的内存。 这是一些最小的例子:
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 * 100,000,000= 1.86Gb)。这个变量没有梯度。
该网络由一个卷积层和一个与输入大小相同的滤波器组成,因此它具有 500M 的权重,即另外 2Gb。
在前向传递之后,另一个 2Gb 得到使用。
使用loss.backprop() 8Gb 后,使用optimizer.step() 12 Gb 后,就是所有可用内存。
在第二个 epoch 前向传递运行正常,但在反向传播期间我得到 RuntimeError: CUDA error: out of memory。
在 epoch 期间,GPU 内存中究竟保存了什么?为什么优化步骤完成后内存没有释放?这种情况下如何减少内存使用?
UPD:看起来我的问题与这个问题类似https://discuss.pytorch.org/t/how-to-free-gpu-memory-and-delete-memory-allocated-variables/20856
UPD2:在这里得到了 pytorch 开发人员的回答 https://github.com/pytorch/pytorch/issues/12651,但它只是说这不是 pytorch,而是 cuDNN 问题。
【问题讨论】:
-
你不能用pytorch分配一个允许一次使用的特定百分比的内存吗?我问是因为我在 tensorflow 中做过这个。除了使用 torch.cuda 中的一些方法,比如 empty_cache() 我不太确定。
-
看起来 pytorch 无法限制 GPU 内存使用 stackoverflow.com/questions/49529372/…。我试过empty_cache,没有效果
标签: neural-network gpu conv-neural-network cudnn