对象检测训练在时间上变得更慢。随着训练的进行,使用比 GPU 更多的 CPU

Posted

技术标签:

【中文标题】对象检测训练在时间上变得更慢。随着训练的进行,使用比 GPU 更多的 CPU【英文标题】:object detection Training becomes slower in time. Uses more CPU than GPU as the training progresses 【发布时间】:2018-05-28 04:25:26 【问题描述】:

系统信息

你正在使用的模型的顶层目录是什么:research/object_detection 我是否编写了自定义代码(而不是使用 TensorFlow 中提供的股票示例脚本):是的(只是 Faster RCNN 的 VGG-16 实现) 操作系统平台和发行版(例如,Linux Ubuntu 16.04):Ubuntu 16.04 TensorFlow 版本(使用下面的命令):1.4.0 CUDA/cuDNN 版本:8 和 6 GPU 型号和内存:NVIDIA-1060 6GB

我正在尝试使用 VGG-16 作为特征提取器(paper) 使用 API 在我的自定义数据集上训练一个 Faster-RCNN。

训练参数与论文中描述的相同,除了,我只运行 15k 步并将图像大小调整为 1200x1200,批量大小 = 1。 训练运行良好,但随着时间的推移,训练变得更慢。它在 CPU 和 GPU 之间切换。

在 GPU 上运行大约 1 秒的时间和在 CPU 上运行大约 20 秒的其他高数字的步骤我使用“top”和“nvidia-smi”交叉验证了它们。为什么它在中间的 CPU 和 GPU 之间切换?我可以理解保存模型和日志时的转变,但我不明白为什么。

PS:我只运行 Train 脚本。我没有运行 eval 脚本

更新: 随着时间的推移,情况会变得更糟。 秒/步正在增加,从而影响检查点和日志的存储速度

它的运行速度应该低于 1 秒/步,因为这是我开始训练前 2k 步时的速度。而且我的数据集非常小(300 张图像用于训练)。

【问题讨论】:

【参考方案1】:

根据我的经验,输入图像的尺寸可能太大。当您在训练期间查看 tensorboard 时,您会发现所有的 reshape 计算都在 GPU 上运行。因此,也许您可​​以编写一个 python 脚本来调整输入图像的大小而不改变纵横比,同时您可以将批量大小(可能是 4 或 8)设置得更高一点。然后你可以更快地训练你的数据集,也可以获得相对好的结果(mAP)

【讨论】:

我真的想通了。瓶颈在队列中。我有一个四核 16GB 内存和 NVIDIA-GTX-1060 6GB。默认情况下,input_reader 通过炸毁内存将 1000 个图像排队到 Ram 中,其中最多 2000 个图像。由于某些进程(如 NMS)在 CPU 上运行,这会产生瓶颈。因此,通过减少队列,我能够为每个步骤实现几乎恒定的时间 @AbhijitBalaji 你能解释一下你是如何减少队列的吗?我面临同样的问题。谢谢

以上是关于对象检测训练在时间上变得更慢。随着训练的进行,使用比 GPU 更多的 CPU的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 单机多GPU训练时间比单卡更慢/没有很大时间上提升

如何对经过训练的目标检测模型进行剪枝?

在自己的数据集上训练 TensorFlow 对象检测

使用 GPU 在 colab 上使用 Turicreate 训练对象检测模型

与标准卷积相比,为啥在训练网络时瓶颈结构更慢且占用更多内存?

使用重新训练的 Tensorflow 对象检测模型使用 snpe 进行 pb 到 dlc 转换失败