为什么在运行具有足够GPU内存的PyTorch模型时会出现CUDA内存不足?

7
我之所以提出这个问题是因为我在8GB VRAM的笔记本电脑上成功地训练了一个分割网络,我使用了完全相同的代码和完全相同的软件库,在我的配备有GTX 1080TI的台式PC上仍然会出现内存不足的问题。
考虑到以下事实,为什么会出现这种情况:
  1. 笔记本电脑和台式PC都安装了相同的 Windows 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia Driver 418.96(随CUDA 10.1一起安装)。

  2. 使用 TensorFlow 2.3 在我的PC的GPU上训练顺利,但只有在使用 PyTorch 时,内存分配失败。

  3. 通过命令print(torch.cuda.get_device_name(0)),PyTorch 可识别GPU(打印 GTX 1080 TI)。

  4. 运行此命令时,PyTorch 会分配内存:torch.rand(20000, 20000).cuda() #分配了1.5GB的VRAM。

解决方案是什么?

1
谢谢您的投票。我希望在您的评论中能够看到您下投票的原因,这样我也可以从中了解我的问题/假设中的错误。 - Timbus Calin
1
这很有趣。不应该发生,也似乎不是“减少批量大小”用例 :) 你是否使用了某种自定义的Dataset/Sampler/DataLoader?你是否在这些组件中将数据移动到GPU上?你尝试过创建一个最小可重现的示例吗?我可以尝试复制问题并调查解决方案的原因,但是目前这个问题缺少所需的信息。如果您还有,请问您能否发布完整的堆栈跟踪信息? - Berriel
是的,我正在使用这个jupyter笔记本生成问题。请注意,在我的笔记本电脑上没有发生错误,但在PC上却有(完全相同的配置),无论是PyTorch [1.2,1.6]还是等效的torchvision版本。https://github.com/qubvel/segmentation_models.pytorch/blob/master/examples/cars%20segmentation%20(camvid).ipynb。由于通过减少DataLoader中的工作线程数来解决了这个问题,我认为它与处理器或线程有关? - Timbus Calin
你有检查过使用无数据增强(augmentation=None)是否仍然会导致问题吗?除此之外,一切似乎都没问题。稍后我会试一下。 - Berriel
在我自己尝试之前,最后一个问题,我保证 :) 你有试过从get_preprocessing中删除albu.Lambda(image=preprocessing_fn)吗?虽然我不认为这是问题所在,但是preprocessing_fn中有一个复制操作,所以你可以尝试一下。 - Berriel
显示剩余2条评论
1个回答

11
大多数人(即使在下面的帖子中)都会建议减少batch_size来解决这个问题。实际上,在这种情况下并不是这样。例如,考虑到没有其他应用程序消耗11GB VRAM系统上的视频内存,并且安装和使用完全相同的配置,网络在8GB VRAM上进行训练却无法在11GB VRAM上进行训练是不合逻辑的。

在我的情况下,发生这种情况的原因是在使用DataLoader对象时,我为workers参数设置了非常高的(12)值。将该值从4减小到4可以解决我的问题。

实际上,尽管在线程底部,Yurasyk在https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646提供的答案指引了我正确的方向。

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


你的工人是否已将张量加载到GPU上了呢?使用多个工人时,我认为一般应该将张量固定到CPU上,然后在迭代循环中将张量加载到GPU上,然后在其上运行模型。我猜如果你有4个工作人员,并且你的批次不太占用GPU内存的话,这也可以,但对于某些模型/输入类型,多个工作人员都将信息加载到GPU上会导致OOM错误,这可能会让新手在不必要的情况下减少批处理大小。 - IntegrateThis
将工人数量减少为1,但仍然存在问题 :( - JiratPasuksmit
你把工人数量减少到1个,同时也大幅缩小了批量大小吗? - Timbus Calin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接