1

请帮助我找到解决问题的方法。首先要说明的是,我已经成功地创建了自己的自定义数据集,并且我已经在自己的计算机(16GB RAM 和 4GB NVIDIA 980)上使用 resnet101 成功地训练了该数据集,这对我来说很重要。

当我尝试使用 inception-resnet 和 nasnet 切换主干网时出现问题。我收到以下错误

"ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape ..."

而且我认为我的计算机上没有足够的资源,所以我在 AWS EC2 上创建了具有 60GB RAM 和 12GB NVIDIA Tesla K80 的实例(我的工作场所只提供这项服务)并在那里训练了网络。

inception-resnet 的训练效果很好,但 nasnet 的情况并非如此。即使有 100GB 内存,我仍然会收到 OOM 错误

我在问题 #1817的 github tensorflow 模型网页上找到了一种解决方案 ,我按照说明将以下代码行添加到 nasnet 配置文件中

train_config: {
  batch_size: 1
  batch_queue_capacity: 50
  num_batch_queue_threads: 8
  prefetch_queue_capacity: 10
...

并且代码运行了一段时间(以下是“顶部”屏幕截图)。但是,我在运行大约 6000 步后仍然出现 OOM 错误

INFO:tensorflow:global step 6348: loss = 2.0393 (3.988 sec/step)
INFO:tensorflow:Saving checkpoint to path /home/ubuntu/crack-detection/structure-crack/models/faster_rcnn_nas_coco_2017_11_08/train/model.ckpt
INFO:tensorflow:global step 6349: loss = 0.9803 (3.980 sec/step)
2018-01-25 05:51:25.959402: W tensorflow/core/common_runtime/bfc_allocator.cc:273] Allocator (GPU_0_bfc) ran out of memory trying to allocate 79.73MiB.  Current allocation summary follows.
...

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[64,17,17,4032]
     [[Node: MaxPool2D/MaxPool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 1, 1, 1], padding="VALID", strides=[1, 1, 1, 1], 
...

我还能做些什么来顺利运行它而不会出现任何 OOM 错误?谢谢你的帮助


编辑#1:错误现在更频繁地出现,它将在 1000-1500 步后显示。

编辑 #2:基于问题 #2668问题 #3014,我们还可以通过second_stage_batch_size: 25在配置文件的模型部分添加(默认为 50)来运行代码而不会出现 OOM 错误。因此,该文件应如下所示

model{
  faster_rcnn {
    ...
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
    second_stage_batch_size: 25
  }
}

希望这能有所帮助。

4

1 回答 1

1

我想指出,您用完的内存是 GPU 的内存,所以恐怕那些 100GB 仅用于训练目的之外的数据争吵。此外,如果没有代码,真的很难弄清楚错误来自哪里。

话虽如此,如果您可以使用权重初始化神经网络架构,训练 6000 次迭代并突然用完 GPU 内存,那么我猜您要么以某种方式将值存储在 GPU 内存中,或者如果您有可变长度的输入,您可能在那个迭代中传递一个序列,这在内存方面太大了。

于 2018-01-25T16:53:38.800 回答