Home Articles

Pytorch DataLoader内存未发布

Asked
Viewed 15 times
0

我想在google collaboratory上的pythorch上实现SRGAN,但DataLoader的内存似乎已经发布,所以如果你转了纪元,就会发生内存错误 . 如果您告诉我如何执行此操作以释放每批内存,将不胜感激 . 这是代码的github链接https://github.com/pacifinapacific/Hello-World/blob/master/Untitled0.ipynb

它变为48并且在1 echoch上发生了内存错误,如果将批量大小设置为8的1/6,则会在大约6个时期出现错误 .

我正在使用以下代码阅读高分辨率和低分辨率图像 . 扩展ImageFolder

但是,例如,即使执行学习时发生错误,也不会释放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)

1 Answer

  • 1

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

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

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

Related