使用TensorFlow并行训练多个小批量的GPU

4
我正在使用TensorFlow 1.9,配备有3GB显存的NVIDIA GPU。我的迷你批量大小为100MB。因此,我可能可以同时在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的大小仅为100MB,因此大部分GPU没有被使用。
一种选择是增加小批次的大小,使小批次更接近3GB的GPU容量。然而,为了帮助优化,我想保持相同的小批次大小。
因此,另一个选择可能是并行发送多个小批次到GPU,并每个小批次执行一次权重更新。能够并行发送小批次将显著减少训练时间。
这种做法有没有可能并且值得推荐呢?

2
如果您将多个小批次进行反向传播并将它们的更新聚合成一个单一的批次,则相当于反向传播一个大批次。如果您想在每个小批次之后应用更新,则无法并行地对它们进行反向传播。 - jdehesa
但是我不能只并行计算每个小批量的权重更新,然后按顺序迭代这些权重更新,以便在每个小批量之后有效地应用更新吗? - Karnivaurus
2
这仍然基本上与使用一个大批次相同(如果有的话,使用缩放的学习率)。所有权重更新都是基于初始权重值计算的,因此实际上您将从一个权重配置中采取一个更大的步骤,而不是多个较小的顺序更新。 - jdehesa
2个回答

5
Mini Batch方法的目标是在每个batch处理完之后更新网络的权重,并在下一个mini-batch中使用更新后的权重。如果您做一些聪明的技巧,并批量多个mini-batches,它们将有效地使用相同的旧权重。
我唯一能看到的潜在好处是,如果模型使用更大的mini-batches效果更好,例如big_batches * more_epochsmini_batches * less_epochs更好。我不记得Mini Batch梯度下降背后的理论,但我记得有一个理由,你应该使用mini batches而不是每次迭代的整个训练集。另一方面,mini-batch大小是一个需要调整的超参数,所以可能值得稍微调整一下。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接