代码之家  ›  专栏  ›  技术社区  ›  Karnivaurus

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

  •  1
  • Karnivaurus  · 技术社区  · 6 年前

    我正在使用TensorFlow1.9,在一个3 GB内存的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_data label_data 只有100MB,所以大部分GPU都没有被使用。

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

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

    这是可能的并且是推荐的吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   stan0    6 年前

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

    我能看到的唯一潜在好处是,如果模型能更好地与更大的小批量,例如。 big_batches * more_epochs mini_batches * less_epochs . 我不记得小批量梯度下降背后的理论,但我记得有一个原因,你应该使用小批量,而不是每次迭代的整个训练集。另一方面,最小批量大小是 hyperparameter 不管怎样,它必须被调整,所以它可能值得一点点的调整。

        2
  •  0
  •   thushv89    6 年前

    我想我可能会指出,任意地使批处理大小变大(当您有大量内存时)有时对模型的泛化来说是不好的。

    参考:

    Train longer, generalize better

    On Large-Batch Training for Deep Learning .