【问题标题】:Memory error when iterate over two dataloaders simultaneously in pytorch在 pytorch 中同时迭代两个数据加载器时出现内存错误
【发布时间】:2020-01-13 05:43:02
【问题描述】:

我正在尝试使用来自 2 个不同数据集的 2 个数据加载器来训练我的模型。

我找到了如何使用 cycle() and zip() 进行设置,因为我的数据集与此处的长度不同:How to iterate over two dataloaders simultaneously using 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=Falseshuffle=False... 但这些都不起作用……我有 256GB 的 RAM 和 4 个 NVIDIA TESLA V100 GPU。

我尝试通过不同时训练 2 个数据加载器而是单独训练来运行它,并且它有效。但是对于我的项目,我需要使用 2 个数据集进行这种并行训练...

【问题讨论】:

  • 你必须不小心调用了某个东西,它会在内存中实现你的所有数据。可以分享一下sn-p代码吗?
  • 感谢您的回复,我找到了解决方案:cycle() ans zip() 可能会造成内存泄漏问题。这解决了它:github.com/pytorch/pytorch/issues/1917#issuecomment-433698337
  • 然后,发布您的问题的答案,以便其他人可以更轻松地找到它;-) 而且,您还将获得青铜批次。
  • 这样做了,再次感谢您的帮助!

标签: out-of-memory pytorch dataloader


【解决方案1】:

基于this 的讨论,而不是cycle()zip(),我使用以下方法避免了任何错误:

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

感谢这篇 pytorch 帖子中的 @srossi93!

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2015-08-07
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多