我正在尝试使用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上。
答案 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