在CPU

时间:2017-05-05 10:55:45

标签: python tensorflow

我正在尝试使用train_image_classifier.py Tensorflow slim image classification library对网络进行微调,并且我想并行运行一个评估脚本,我更改了eval_image_classifier.py脚本以便它使用evaluation_loop()代替evaluate_once()

这一切似乎都很好,直到我同时运行培训和评估过程。评估过程一旦尝试恢复检查点,GPU内存就会耗尽,评估过程崩溃(培训过程似乎冻结。)

通过this page about using GPUs中的docomentationI查看:

  

默认情况下,TensorFlow几乎映射了进程可见的所有GPU(受CUDA_VISIBLE_DEVICES影响)的所有GPU内存。这样做是为了通过减少内存碎片来更有效地使用设备上相对宝贵的GPU内存资源。

我知道这一点以及我可以将其关闭以希望减少内存占用的事实,但是因为评估不需要像培训一样快(并且考虑到大量的CPU内核和RAM在我的机器上可用)我想在CPU上运行评估,完全留下GPU进行培训。

我天真的做法是编辑main(_)的{​​{1}}功能,如下所示:

eval_image_classifier.py

唉,天真不够好,eval过程仍然在GPU和崩溃上肆虐。 如何强制计算仅在CPU上运行?

更新

寻找替代解决方案,我发现this inception-v3 model在docstring的示例中有:

def main(_):
    # flag validity checks
    with tf.device('/cpu:0'): # Run evaluation on the CPUs
        # all my code that was previously in main()

我想在我的代码中尝试这一点,所以我将# Force all Variables to reside on the CPU. with slim.arg_scope([slim.variables.variable], device='/cpu:0'): ... 修改为:

main(_)

可悲的是,当脚本从检查点恢复模型时,它仍会将其加载到GPU上。

1 个答案:

答案 0 :(得分:2)

经过一些更多的研究后,我通过evaluation_loop()传递session_configuration device_count={'GPU':0}个实例来解决问题:

  config = tf.ConfigProto(device_count={'GPU':0}) # mask GPUs visible to the session so it falls back on CPU
  slim.evaluation.evaluation_loop(
      master=FLAGS.master,
      checkpoint_dir=FLAGS.checkpoint_dir,
      logdir=FLAGS.eval_dir,
      num_evals=num_batches,
      eval_op=list(names_to_updates.values()),
      variables_to_restore=variables_to_restore,
      summary_op=tf.summary.merge_all(),
      eval_interval_secs=FLAGS.eval_interval,
      session_config=config) # <---- the actual fix