使用inception-resnet& amp;训练TensorFlow对象检测API时出现OOM错误NASnet(尤其)作为主干

时间:2018-01-25 16:26:58

标签: tensorflow object-detection-api

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

当我尝试使用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错误

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

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

并且代码运行了一段时间(the following is "top" screenshot)。但是,在运行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 :基于issue #2668issue #3014,我们还可以通过添加{{{}来执行一项无需OOM错误即可运行代码的操作1}}(默认为50)在配置文件的模型部分。因此,该文件应如下所示

second_stage_batch_size: 25

希望这可以提供帮助。

1 个答案:

答案 0 :(得分:1)

我想指出你耗尽的内存是GPU中的一个,所以我担心这些100GB只对训练目的之外的数据争用有用。此外,如果没有代码,很难找出错误的来源。

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