为什么训练速度与批次大小不成比例?

luk*_*kas 7 object-detection tensorflow

令我惊讶的是,增加批处理大小并不会提高GPU的总处理速度。我的测量:

  • batch_size = 1:0.33秒/步
  • batch_size = 2:0.6秒/步
  • batch_size = 3:0.8秒/步
  • batch_size = 4:1.0秒/步

我的期望是,由于GPU上的并行化,该步骤的时间将(几乎)保持不变。但是,它几乎与批量大小成线性比例关系。为什么?我误会了吗?

我正在使用Tensorflow Object Detection API,重新训练了预先训练的fast_rcnn_resnet101_coco模型,预定义的batch_size为1,我们的GPU(Nvidia 1080 Ti)最多可以处理4张图像,因此我想利用它来加快训练速度。

ITi*_*ger 3

人们经常错误地提到批量学习与在线训练一样快或更快。事实上,批量学习是在将完整的数据集(批次)呈现给网络后改变权重。因此,权重更新频率相当慢。这解释了为什么测量中的处理速度与您观察到的一样。

要进一步了解训练技术,请查看 2003 年的论文《梯度下降学习的批量训练的一般低效率》。它涉及批量学习和在线学习的比较。

编辑:

关于您的评论:

我认为单个 GPU 上不会发生模型或数据并行化。GPU并行化训练算法中涉及的向量和矩阵运算,但批量学习算法仍然计算如下:

loop maxEpochs times
  for each training item
    compute weights and bias deltas for curr item
    accumulate the deltas
  end for
  adjust weights and bias deltas using accumulated deltas
end loop
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,虽然权重调整仅对整个批次应用一次,但仍然必须为批次中的每个元素计算权重和偏差增量。因此,恕我直言,与在线学习相比,批量学习算法没有很大的性能优势。

  • @lukas:我认为你错了。即使是矩阵运算,每个行列乘法也可能发生在一个 GPU 核心上。因此,全矩阵乘法被划分到尽可能多的核心上。对于一个矩阵 mul,每个 GPU 核心都需要一些时间,当您添加更多图像时,时间会增加,执行更多行。如果批量大小为 4,您的 GPU 已达到全部性能,即所有核心都在运行,那么增加批量大小不会带来任何优势。您添加的数据仅位于 GPU 内存中,并在 nvidia 骰子摆脱之前的操作时进行处理。 (6认同)