Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误
Posted
技术标签:
【中文标题】Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误【英文标题】:Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , No error when using CPU 【发布时间】:2019-04-28 21:19:08 【问题描述】:我正在训练一个全卷积网络 (FCN32),用于在内存超过 11G 的 Tesla K80 上进行语义分割。
输入图像非常大:352x1216。网络结构如下图所示。我使用了 batch_size=1,但仍然遇到 out_of_memory 错误。
标准是 nn.BCEWithLogitsLoss()
当我在 CPU 上运行时,网络工作正常。
Layer (type) Output Shape # Param
Conv2d-1 [-1, 64, 352, 1216] 1,792
Conv2d-2 [-1, 64, 352, 1216] 36,928
MaxPool2d-3 [-1, 64, 176, 608] 0
Conv2d-4 [-1, 128, 176, 608] 73,856
Conv2d-5 [-1, 128, 176, 608] 147,584
MaxPool2d-6 [-1, 128, 88, 304] 0
Conv2d-7 [-1, 256, 88, 304] 295,168
Conv2d-8 [-1, 256, 88, 304] 590,080
Conv2d-9 [-1, 256, 88, 304] 590,080
MaxPool2d-10 [-1, 256, 44, 152] 0
Conv2d-11 [-1, 512, 44, 152] 1,180,160
Conv2d-12 [-1, 512, 44, 152] 2,359,808
Conv2d-13 [-1, 512, 44, 152] 2,359,808
MaxPool2d-14 [-1, 512, 22, 76] 0
Conv2d-15 [-1, 512, 22, 76] 2,359,808
Conv2d-16 [-1, 512, 22, 76] 2,359,808
Conv2d-17 [-1, 512, 22, 76] 2,359,808
MaxPool2d-18 [-1, 512, 11, 38] 0
Conv2d-19 [-1, 4096, 11, 38] 102,764,544
Conv2d-20 [-1, 4096, 11, 38] 16,781,312
Conv2d-21 [-1, 1, 11, 38] 4,097 ConvTranspose2d-22 [-1, 1, 352, 1216] 4,096
错误信息:
----------------------------------- ---------------------------- RuntimeError Traceback(最近调用 最后)在() 36打印(丢失) 37 #torch.cuda.empty_cache() ---> 38 loss.backward() 39 优化器.step() 40
/anaconda/envs/py35/lib/python3.5/site-packages/torch/tensor.py 在 向后(自我,梯度,retain_graph,create_graph) 91 种产品。默认为
False
。 92 """ ---> 93 torch.autograd.backward(自我,渐变,retain_graph,create_graph) 94 95 def register_hook(self, hook):/anaconda/envs/py35/lib/python3.5/site-packages/torch/autograd/init.py 在向后(张量,grad_tensors,retain_graph,create_graph, 毕业变量) 88 变量._execution_engine.run_backward( 89 张量,grad_tensors,retain_graph,create_graph, ---> 90 allow_unreachable=True) #allow_unreachable 标志 91 92
RuntimeError: CUDA 错误:内存不足
【问题讨论】:
【参考方案1】:我找到了原因……它与硬件有关。我换了另一台机器,错误消失了。
【讨论】:
【参考方案2】:这通常是因为 GPU 上的内存。如果您有更强大的 GPU,您的问题可能会得到解决(正如您在回答中提到的那样)。
但是,如果您没有,您可以缩小图像到大约256*x
大小。
这也是性能的好习惯。
【讨论】:
我使用的是 Microsoft Azure,它为我提供了内存超过 11G 的 Tesla K80。当我只使用~2G 时会发生错误。会不会和我被分配到同一个 GPU 的云有关? 这取决于您使用的 Azure 版本。我不知道 Azure,但它可能是相关的。 我也会选择简单地调整图像大小的路线。网络中的某一点有 102,764,544 个参数,很可能是 OOM 错误的原因以上是关于Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch:RuntimeError:输入、输出和索引必须在当前设备上
PyTorch - RuntimeError:后端 CPU 的预期对象,但为参数 #2 'weight' 获得了后端 CUDA
RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch
PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR