python - 为什么在运行 PyTorch 模型 [具有足够 GPU 内存] 时 CUDA 内存不足?
问题描述
我问这个问题是因为我成功地在具有 8GB VRAM 的笔记本电脑上的 GTX 2070 上训练了一个分段网络,并且我使用完全相同的代码和完全相同的软件库安装在带有 GTX 1080TI 的台式 PC 上,它仍然抛出记忆。
为什么会发生这种情况,考虑到:
相同的 Windows 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia 驱动程序 418.96(与 CUDA 10.1 一起提供)在笔记本电脑和 PC 上都有。
事实上,使用 TensorFlow 2.3 进行的训练在我 PC 上的 GPU 上运行流畅,但它无法为仅使用 PyTorch 的训练分配内存。
PyTorch 通过以下命令识别 GPU(打印 GTX 1080 TI):
print(torch.cuda.get_device_name(0))
PyTorch 在运行此命令时分配内存:
torch.rand(20000, 20000).cuda()
#allocated 1.5GB of VRAM.
解决方案是什么?
解决方案
大多数人(甚至在下面的线程中)都跳到建议减少 batch_size 将解决这个问题。事实上,在这种情况下并非如此。例如,考虑到在具有 11GB VRAM 的系统上没有其他应用程序消耗视频内存并且安装了完全相同的配置和用过的。
在我的情况下发生这种情况的原因是,在使用DataLoader
对象时,我为参数设置了一个非常高的 (12) 值workers
。在我的情况下,将此值减小到 4 解决了这个问题。
事实上,尽管在线程的底部,Yurasyk 在https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646提供的答案为我指明了正确的方向。
解决方案:减少workers
PyTorch 中的数量DataLoader
。虽然我不完全理解为什么这个解决方案有效,但我认为它与在幕后产生的用于数据获取的线程有关;在某些处理器上,可能会出现这样的错误。
推荐阅读
- javascript - 使用 Malsup Ajax 表单提交后重定向到另一个操作
- angular - Angular PWA 应用程序基本问题
- sql - 按子句分组,我是否必须调用我在 Select 中使用的所有行?
- python - 有没有办法使用 python Telegram-Bot 获取个人资料图片更新?
- python - apache beam python sdk可以进行状态处理吗?
- c# - 实体框架 - 使用 Fluent API 配置获取相关项目而无需显式引用
- javascript - 我可以在 js 中使用类似 file_get_content 的东西吗?
- javascript - 注销时保留动态添加的 DOM 元素
- node.js - 开发服务器返回响应错误码:500 - running React Native project
- ios - 显示地图的 Sygic 问题