Ошибка памяти при одновременной итерации двух загрузчиков данных в pytorch

Я пытаюсь обучить свою модель, используя 2 загрузчика данных из 2 разных наборов данных.

Я нашел, как настроить это, используя cycle() and zip(), потому что мои наборы данных не такой же длины отсюда: Как выполнить итерацию по двум загрузчикам данных одновременно с помощью pytorch?

  File "/home/Desktop/example/train.py", line 229, in train_2
    for i, (x1, x2) in enumerate(zip(cycle(train_loader_1), train_loader_2)):
  File "/home/.conda/envs/3dcnn/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 346, in __next__
    data = self.dataset_fetcher.fetch(index)  # may raise StopIteration
  File "/home/.conda/envs/3dcnn/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "/home/.conda/envs/3dcnn/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 80, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "/home/.conda/envs/3dcnn/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 80, in <listcomp>
    return [default_collate(samples) for samples in transposed]
  File "/home/.conda/envs/3dcnn/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 56, in default_collate
    return torch.stack(batch, 0, out=out)
RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 154140672 bytes. Error code 12 (Cannot allocate memory)

Я попытался решить эту проблему, установив num_workers=0, уменьшив размер пакета, используя pinned_memory=False и _5 _... Но ничего из этого не сработало ... У меня 256 ГБ ОЗУ и 4 графических процессора NVIDIA TESLA V100.

Я попытался запустить его, просто не тренируясь в двух загрузчиках данных одновременно, а по отдельности, и это сработало. Однако для моего проекта мне нужно это параллельное обучение с двумя наборами данных ...


person afroditi    schedule 11.09.2019    source источник
comment
Вы должны случайно вызвать что-то, что материализует все ваши данные в памяти. Можете ли вы поделиться фрагментом кода?   -  person Jindřich    schedule 11.09.2019
comment
Спасибо за ответ, я нашел решение этого: cycle () и zip () может создать проблемы с утечкой памяти. Это решает проблему: github.com/pytorch/pytorch/issues/1917#issuecomment- 433698337   -  person afroditi    schedule 11.09.2019
comment
Затем опубликуйте ответ на свой вопрос, чтобы другим людям было легче его найти ;-) И вы также получите за него бронзовую партию.   -  person Jindřich    schedule 11.09.2019
comment
Сделал так, еще раз спасибо за попытку помочь!   -  person afroditi    schedule 11.09.2019


Ответы (1)


На основе этого обсуждения вместо cycle() и zip() я избегаю ошибок используя:

  try:
     data, target = next(dataloader_iterator)
  except StopIteration:
     dataloader_iterator = iter(dataloader)
     data, target = next(dataloader_iterator)

Престижность @ srossi93 из этого сообщения pytorch!

person afroditi    schedule 11.09.2019