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

Kar*_*rus 4 tensorflow

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

例如,当我训练我的 TensorFlow 模型时,我在每个 epoch 上运行这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

这将迭代我的小批量并为每个小批量执行一次权重更新。但规模image_datalabel_data只有100 MB,所以多数GPU的不被使用。

一种选择是增加 minibatch 大小,使 minibatch 更接近 3 GB GPU 容量。但是,我想保持相同的小 minibatch 大小以帮助优化。

因此,另一种选择可能是通过 GPU 并行发送多个小批量,并为每个小批量执行一次权重更新。能够并行发送小批量将显着减少训练时间。

这是可能的并推荐吗?

sta*_*an0 5

Mini Batch 方法的目标是在处理每个批次后更新网络的权重,并在下一个 mini-batch 中使用更新后的权重。如果你做一些聪明的技巧并批处理几个小批量,他们将有效地使用相同的旧权重。

我能看到的唯一潜在好处是,如果模型在更大的小批量下工作得更好,例如big_batches * more_epochsmini_batches * less_epochs. 我不记得 Mini Batch Gradient Descent 背后的理论,但我记得有一个原因,你应该在每次迭代中使用 minibatches 而不是整个训练集。另一方面,hyperparameter无论如何都必须调整小批量大小,因此可能值得稍微调整一下。