【问题标题】:Loss and learning rate scaling strategies for Tensorflow distributed training when using TF Estimator使用 TF Estimator 时 Tensorflow 分布式训练的损失和学习率缩放策略
【发布时间】:2020-09-11 14:28:47
【问题描述】:

对于那些不想阅读整个故事的人:

TL; DR:当使用TF Estimator 时,我们是否必须通过增加批量大小的因素来缩放学习率(我知道这是正确的方法,我不确定 TF 是否在内部处理这个问题)?同样,我们是否必须按全局批量大小(batch_size_per_replica * 副本数)来缩放每个示例损失?

有关 TensorFlow 分布式学习的文档令人困惑。我需要澄清以下几点。

  1. 现在可以理解,如果将批大小增加k 的系数,则需要将学习率增加k(参见thisthis 论文)。但是,关于分布式学习的 Tensoflow 官方页面没有对此做出澄清评论。他们确实提到 here 需要调整学习率。他们自己处理学习率缩放吗?更复杂的是,Keras 和 tf.Estimator 的行为是不同的(见下一点)。当我使用tf.Estimator时,我是否应该将 LR 增加 K 倍?

  2. 普遍认为,每个示例的损失应该按global_batch_size = batch_size_per_replica * number of replicas 缩放。 Tensorflow 提到了它here,但是当说明如何使用 tf.Estimator 实现这一点时,他们要么忘记了,要么不需要通过 global_batch_size 进行缩放。见here,在sn-p代码中,loss定义如下。

loss = tf.reduce_sum(loss) * (1. / BATCH_SIZE)

据我所知,BATCH_SIZE 是根据副本批量大小在上面定义的。

更复杂的是,如果您使用 Keras,缩放会自动处理(出于我永远无法理解的原因,最好保持一切一致)。

【问题讨论】:

  • 我不知道分布式,但非分布式确实是缩放的,我可以链接源代码。但是,您可以自己很容易地验证这种缩放:1)修复所有随机种子; 2)喂N个相同个样本,记录权重变化; 3)重启训练(重启Python内核); 4)喂2 * N 相同个样本,记录权重变化。如果 (2) == (4),它会自动缩放。
  • 另外,最低限度可重现的代码会更容易检查。

标签: python tensorflow keras deep-learning distributed


【解决方案1】:
  1. 学习率不会自动按全局步长缩放。正如您所说,他们甚至建议您可能需要调整学习率,但仅在某些情况下才需要调整,因此这不是默认设置。我建议你手动提高学习率。

  2. 如果我们看一下简单的tf.Estimatortf.estimator.DNNClassifier (link),默认的loss_reductionlosses_utils.ReductionV2.SUM_OVER_BATCH_SIZE。如果我们得到Reduction (found here),我们会看到它是如何将单个样本的损失组合在一起的策略。在一台机器上,我们只使用tf.reduce_mean,但你不能在分布式设置中使用它(如下一个链接所述)。 Reduction 将我们引向 here,它向您展示了 1) 如何实现全局步骤的实现,以及 2) 解释原因。正如他们告诉你的,你应该自己实现它,这意味着它不是由tf.Estimator 处理的。另请注意,您可以在Reduction 页面上找到一些解释,它们说明了KerasEstimators 关于这些参数的区别。

【讨论】:

  • 总结一下,1.我们应该自己修改LR。 2. 损失应该按全局批量大小缩放,因为默认减少是添加来自不同机器的损失。关于第 2 点,您知道吗?或者您能否指出一个代码 sn-p,其中提到了 MultiWorkerMirroredStrategy 的减少政策?他们一直说RINGNCCL,但我找不到该政策的明确实施。
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 2019-05-22
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多