CUDA_ERROR_OUT_OF_MEMORY 在 Tensorflow 上#object_detection/train.py

CUDA_ERROR_OUT_OF_MEMORY on Tensorflow#object_detection/train.py

我 运行宁 Tensorflow 对象检测 API 使用 object_detection/train.py 脚本训练我自己的检测器,发现 here。问题是我不断收到 CUDA_ERROR_OUT_OF_MEMORY

我发现了一些减少批量大小的建议,因此训练器消耗的内存更少,但我从 16 减少到 4,但我仍然遇到同样的错误。不同的是,使用batch_size=16时,错误是在~18步抛出的,现在是在~70步抛出的。 编辑: 设置 batch_size=1 没有解决问题,因为我在步骤 ~2700 仍然遇到错误。

在我停止训练过程之前,我该怎么做才能使它 运行 顺利进行?我真的不需要快速训练。

编辑: 我目前为此使用 GTX 750 Ti 2GB。除了训练和提供监控图像外,GPU 不用于任何其他用途。目前,我仅使用 80 张图像进行训练,使用 20 张图像进行评估。

我觉得不是关于batch_size,因为你可以从头开始训练。

打开终端回答 运行

nvidia-smi -l

检查发生此错误时是否有其他进程启动。如果你设置batch_size=16,你可以很快找到。

找到了我的问题的解决方案。 batch_size 不是问题,但更高的 batch_size 会使训练内存消耗增加得更快,因为我使用的是 config.gpu_options.allow_growth = True 配置。此设置允许 Tensorflow 在需要时增加内存消耗并尝试使用直到 100% 的 GPU 内存。

问题是我同时 运行 eval.py 脚本(按照他们的教程中的建议)并且它正在使用 GPU 内存的一部分。当 train.py 脚本尝试使用全部 100% 时,抛出错误。

我通过将训练过程的最大使用百分比设置为 70% 解决了这个问题。也解决了训练时卡顿的问题。这可能不是我的 GPU 的最佳值,但可以使用 config.gpu_options.per_process_gpu_memory_fraction = 0.7 设置进行配置,例如。

另一种选择是将 GPU 专用于训练并使用 CPU 进行评估

  • 缺点:评估会消耗你的大部分CPU,但每次创建训练检查点时只会持续几秒钟,这种情况并不常见。
  • 优点:100%的GPU一直用于训练

要以 CPU 为目标,请在 运行 评估脚本之前设置此环境变量:

export CUDA_VISIBLE_DEVICES=-1

您可以在 pipeline.config 中将评估批处理作业大小显式设置为 1 以消耗更少的内存:

eval_config: {
  metrics_set: "coco_detection_metrics"
  use_moving_averages: false
  batch_size: 1;
}

如果问题仍然存在,TensorFlow 可能不会在训练 运行 之间释放 GPU 内存。尝试重新启动您的终端或 IDE 然后再试一次。此 answer 有更多详细信息。