与TensorFlow并行在多个小批处理上训练GPU

时间:2018-08-06 12:57:05

标签: tensorflow

我正在具有3 GB内存的NVIDIA GPU上使用TensorFlow 1.9。我的迷你批次的大小为100 MB。因此,我可以同时在我的GPU上安装多个迷你批处理。所以我的问题是,这是否可能以及这是否是标准做法。

例如,当我训练TensorFlow模型时,我会在每个时期运行类似的内容:

loss_sum = 0
for batch_num in range(num_batches):
    batch_inputs = get_batch_inputs()
    batch_labels = get_batch_labels()
    batch_loss, _ = sess.run([loss_op, train_op], feed_dict={inputs: batch_inputs, labels: batch_labels})
    loss_sum += batch_loss
loss = batch_loss / num_batches

这会遍历我的迷你批,并为每个迷你批执行一次重量更新。但是image_datalabel_data的大小仅为100 MB,因此大部分GPU未被使用。

一种选择是仅增加小批量的大小,以便小批量更接近3 GB的GPU容量。但是,我希望保持相同的小批量生产尺寸,以帮助优化。

因此,另一个选择可能是通过GPU并行发送多个小批处理,并为每个小批处理执行一次权重更新。能够并行发送迷你批处理将大大减少培训时间。

有可能吗?

2 个答案:

答案 0 :(得分:2)

“迷你批处理”方法的目标是在处理完每个批处理后更新网络的权重,并在下一个迷你批处理中使用更新后的权重。如果您做一些巧妙的技巧并分批处理多个迷你批次,它们将有效地使用相同的旧砝码。

我唯一看到的潜在好处是,该模型在较大的迷你批次上是否可以更好地工作,例如big_batches * more_epochsmini_batches * less_epochs好。我不记得“小批量梯度下降”背后的理论,但我记得有一个原因,您应该使用小批量而不是每次迭代使用整个训练集。另一方面,最小批量大小是hyperparameter,无论如何都必须对其进行调整,因此可能值得对其进行调整。

答案 1 :(得分:0)

我想指出的是,就模型的泛化而言,任意增大批处理大小(当您有大量内存时)有时会很糟糕。

参考:

Train longer, generalize better

On Large-Batch Training for Deep Learning