Память Pytorch DataLoader не освобождается - PullRequest
0 голосов
/ 25 августа 2018

Я бы хотел реализовать SRGAN на pythorch в google сотрудник, но память DataLoader, похоже, высвобождается, поэтому, если вы включите эпоху, произойдет ошибка памяти. Буду очень признателен, если вы скажете мне, как это сделать, чтобы освободить память для каждой партии. Это ссылка на github кода https://github.com/pacifinapacific/Hello-World/blob/master/Untitled0.ipynb

Оказалось 48, и ошибка памяти произошла в 1 эхо, Если вы установите размер партии 1/6 из 8, вы получите ошибку примерно в 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 Ответ

0 голосов
/ 25 августа 2018

Pytorch строит вычислительный граф каждый раз, когда вы распространяетесь по своей модели.Этот график обычно сохраняется до тех пор, пока выходная переменная G_loss не выходит из области видимости, например, когда начинается новая итерация цикла.

Однако вы добавляете эту потерю в список.Следовательно, переменная все еще известна python, а график не освобожден.Вы можете использовать .detach(), чтобы отделить переменную от текущего графика (что лучше, чем .clone(), который я предлагал ранее, поскольку он также будет копировать данные тензора).

Как маленький побочный узел: в вашей функции train() вы возвращаете D_loss,G_loss в цикле for, а не после него;поэтому вы всегда используете только первую партию.

...