【问题标题】:Pytorch DataLoader memory is not releasedPytorch DataLoader 内存未释放
【发布时间】:2018-08-25 07:25:26
【问题描述】:

我想在google collaboratory的pythorch上实现SRGAN,但是DataLoader的内存好像被释放了,所以如果转epoch,就会出现内存错误。 如果您告诉我如何做到这一点以释放每个批次的内存,我们将不胜感激。 这是代码的github链接 https://github.com/pacifinapacific/Hello-World/blob/master/Untitled0.ipynb

它变成了 48 并且在 1 个 echoch 上发生了内存错误, 如果您将批量大小设置为 8 的 1/6,您将在大约 6 个 epoch 时收到错误。

我正在使用以下代码读取高分辨率和低分辨率图像。扩展图像文件夹

但是例如,即使执行学习时发生错误,GPU的内存也不会被释放

class DownSizePairImageFolder(ImageFolder):
def __init__(self, root, transform=None, large_size=256, small_size=64, **kwds):
    super().__init__(root, transform=transform, **kwds)
    self.large_resizer = transforms.Scale(large_size)
    self.small_resizer = transforms.Scale(small_size)

def __getitem__(self, index):
    path, _ = self.imgs[index]
    img = self.loader(path)
    large_img = self.large_resizer(img)
    small_img = self.small_resizer(img)
    if self.transform is not None:
        large_img = self.transform(large_img)
        small_img = self.transform(small_img)
    return small_img, large_img


train_data = DownSizePairImageFolder('./lfw-deepfunneled/train',   transform=transforms.ToTensor())
test_data = DownSizePairImageFolder('./lfw-deepfunneled/test',    transform=transforms.ToTensor())
batch_size = 8
train_loader = DataLoader(train_data, batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size, shuffle=False)

【问题讨论】:

    标签: python machine-learning deep-learning pytorch


    【解决方案1】:

    每次您在模型中传播时,Pytorch 都会构建一个计算图。该图通常会保留,直到输出变量G_loss 超出范围,例如当循环中的新迭代开始时。

    但是,您将此损失附加到列表中。因此,python 仍然知道该变量并且未释放图形。您可以使用.detach() 将变量与当前图形分离(这比我之前提出的.clone() 更好,因为它也会复制张量的数据)。

    作为一个小节点:在您的train() 函数中,您在for 循环中返回D_loss,G_loss,而不是在它之后;所以你总是只使用第一批。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 2019-02-11
      • 2020-12-10
      • 2020-11-18
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多