【问题标题】:Why do I get CUDA out of memory when running PyTorch model [with enough GPU memory]?为什么在运行 PyTorch 模型 [具有足够 GPU 内存] 时 CUDA 内存不足?
【发布时间】:2020-12-06 11:32:44
【问题描述】:

我问这个问题是因为我在我的 GTX 2070 上成功地在具有 8GB VRAM 的笔记本电脑上训练了一个分段网络,并且我在我的台式电脑上使用完全相同的代码和完全相同的软件库使用 GTX 1080TI,它仍然会内存不足。

为什么会发生这种情况,考虑到:

  1. 相同的 Windows 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia 驱动程序 418.96(随 CUDA 10.1 一起提供)在笔记本电脑和 PC 上。

  2. 使用 TensorFlow 2.3 进行训练可以在我 PC 上的 GPU 上流畅运行,但它无法为仅使用 PyTorch 进行训练分配内存。

  3. PyTorch 通过以下命令识别 GPU(打印 GTX 1080 TI):print(torch.cuda.get_device_name(0))

  4. PyTorch 在运行此命令时分配内存:torch.rand(20000, 20000).cuda()#allocated 1.5GB of VRAM.

解决办法是什么?

【问题讨论】:

  • 感谢反对者表达您的选择。我想在您的评论中看到投反对票的原因,以便了解我的问题/假设中的错误。
  • 这很有趣。不应该发生,它似乎不是“减少批量大小”用例 :) 您是否使用了某种自定义数据集/采样器/数据加载器?您是否在这些组件之一中将数据移动到 GPU 上?您是否尝试过创建一个最小的可重现示例?我将能够尝试重现该问题并调查解决方案为何有效,但事实上,该问题没有任何必需的信息。如果你还有它,你介意发布完整的堆栈跟踪吗?
  • 是的,我正在使用这个会产生问题的 jupyter 笔记本。请注意,无论 PyTorch[1.2,1.6] 和等效的 torchvision 版本如何,该错误不会发生在我的笔记本电脑上,但会发生在 PC 上(完全相同的配置)。 github.com/qubvel/segmentation_models.pytorch/blob/master/…。既然是通过减少DataLoader中worker的数量来解决的,我假设它与处理器或线程有关?
  • 您是否检查过不使用增强 (augmentation=None) 是否仍然会导致问题?除此之外,一切似乎都很好。我稍后会试一试。
  • 它仍然会导致问题,因为我在两种情况下(PC 和笔记本电脑)从一开始就将其设置为 None

标签: python tensorflow pytorch out-of-memory


【解决方案1】:

大多数人(甚至在下面的线程中)都跳到建议减少 batch_size 将解决这个问题。事实上,在这种情况下并非如此。例如,考虑到在具有 11GB VRAM 的系统上没有其他应用程序消耗视频内存并且安装了完全相同的配置和用过。

在我的案例中发生这种情况的原因是,在使用 DataLoader 对象时,我为 workers 参数设置了一个非常高的 (12) 值。在我的例子中,将此值减小到 4 解决了这个问题。

事实上,虽然在帖子的底部,Yurasyk 在https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 提供的答案为我指明了正确的方向。

解决方案:减少 PyTorch DataLoaderworkers 的数量。虽然我不完全理解为什么这个解决方案有效,但我认为它与在幕后产生的用于数据获取的线程有关;在某些处理器上,可能会出现这样的错误。

【讨论】:

  • 您的工作人员是否将张量加载到 GPU 上?当使用多个worker时,我认为您通常假设将张量固定到cpu,然后在迭代循环中,将张量加载到gpu,然后在它们上运行模型。我想如果你有 4 个工人,而且你的批次不是太占用 GPU 内存,这也可以,但是对于某些模型/输入类型,多个工人都将信息加载到 GPU 会导致 OOM 错误,这可能会导致新来者在不需要时减小批量大小。
  • 将工人减少到 1 人,但仍然有问题 :(
  • 您是否将工作人员减少到 1 并且批量大小也大大减少了?
猜你喜欢
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2021-12-16
  • 2021-06-12
  • 1970-01-01
  • 2020-12-31
相关资源
最近更新 更多