Tensorflow对象检测训练被杀,资源饥饿?

时间:2017-07-17 18:01:25

标签: tensorflow linux-kernel protocol-buffers object-detection training-data

这个问题部分被问到herehere没有后续行动,所以也许这不是提出这个问题的地方,但我已经找到了更多的信息我希望可以得到这些问题的答案。

我一直试图在我自己的大约1k张照片库上训练object_detection。我一直在使用提供的管道配置文件" ssd_inception_v2_pets.config"。 我相信,我已正确设置了培训数据。该计划似乎开始训练就好了。当它无法读取数据时,它会发出错误警告,我修复了这个问题。

我的train_config设置如下,但我已经更改了一些数字,以便尝试让它以更少的资源运行。

train_config: {
  batch_size: 1000 #also tried 1, 10, and 100
  optimizer {
    rms_prop_optimizer: {
      learning_rate: {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.04  # also tried .004
          decay_steps: 800 # also tried 800720. 80072
          decay_factor: 0.95
        }
      }
      momentum_optimizer_value: 0.9
      decay: 0.9
      epsilon: 1.0
    }
  }
  fine_tune_checkpoint: "~/Downloads/ssd_inception_v2_coco_11_06_2017/model.ckpt" #using inception checkpoint
  from_detection_checkpoint: true
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
  data_augmentation_options {
    ssd_random_crop {
    }
  }
}

基本上,我认为正在发生的事情是计算机很快就会缺乏资源,我想知道是否有人进行了优化,需要更多时间来构建,但使用的资源更少?

或者我错了为什么这个过程会被杀死,有没有办法让我从内核那里获得更多相关信息?

这是我在杀死进程后得到的Dmesg信息。

[711708.975215] Out of memory: Kill process 22087 (python) score 517 or sacrifice child
[711708.975221] Killed process 22087 (python) total-vm:9086536kB, anon-rss:6114136kB, file-rss:24kB, shmem-rss:0kB

5 个答案:

答案 0 :(得分:2)

我遇到了和你一样的问题。实际上,内存已完全使用是由data_augmentation_options ssd_random_crop引起的,因此您可以删除此选项并将批量大小设置为8或更小,即2,4。当我将批量大小设置为1时,我也遇到了由于nan丢失导致的一些问题。

另一个问题是参数epsilon应该是一个非常小的数字,例如1e -6 根据"深度学习"书。因为epsilon用于避免零分母,但此处的默认值为1,我认为将其设置为1是正确的。

答案 1 :(得分:1)

好吧,所以在看了之后,尝试了一些事情,问题最终出现在我发布的Dmesg信息中。

培训占用了超过8 GB的内存,因此解决方案最终成为using Swap空间,以增加模型必须从中获取的内存量。

答案 2 :(得分:1)

这是一个问题many people face。有多种建议的解决方案:

  • 减少批量大小 - 并不总是相关的,特别是如果你在GPU上训练(你应该)
  • 增加内存 - 通过添加更多内容或使用swap,如您所建议的那样。但是,如果你使用交换注释,它比RAM慢约10-100倍,所以一切都可能需要更长的时间
  • 最佳: decrease queue sizes - 注意到通常此问题与模型没有直接关联,而是与配置直接关联。默认队列大小有点太大,因为模型计算量很大,并且不会以高速率处理示例。

我相信第三种解决方案对您来说是最好的,因为您的 CPU 内存(RAM)已用完。它不会减慢培训速度,也不会影响您的模型。

引用该问题,并附上我的意见:

  

新配置中的部分如下所示:

     

train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pet_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/pet_label_map.pbtxt" queue_capacity: 500 # change this number min_after_dequeue: 250 # change this number (strictly less than the above) }

您也可以为eval_input_reader设置这些内容。对于这个,我正在使用20, 10而对于train我使用400, 200,虽然我认为我可以降低。我的训练需要不到8Gb的RAM。

答案 3 :(得分:0)

一段时间以来,我一直在遭受这个问题的困扰。我同意@Ciprian的一系列步骤。我跟踪了所有这些,结果发现我的情况类似于@Derek的情况。扩展交换空间解决了我的问题。

仅停留在此问题上的人员仅需注意几点,因为很难调试它在对象检测API中的发生,因为该过程可能由于多种原因而被终止。

  1. 使用以下bash脚本监视CPU和交换空间的使用情况。您将发现,经过一定数量的步骤之后,交换空间被耗尽,导致进程被杀死。
  

观看-n 5个免费-m

  1. 通过以下内容监控GPU的使用情况,以确保GPU不会被完全消耗。
  

nvidia-smi

  1. 如果您在上述任何一个步骤中均未发现问题,建议您不仅减少 queue_capacity min_after_dequeue ,而且还要更改 num_readers train_input_reader eval_input_reader 中将em>设置为1。与此同时,我建议使用 batch_queue_capacity num_batch_queue_threads prefetch_queue_capacity 来进一步减轻CPU的负担,如{{3 }}。

答案 4 :(得分:0)

将配置文件中的批处理大小从32更改为8甚至2。这肯定有助于培训,并且不会终止该过程。