如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?

Posted

技术标签:

【中文标题】如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?【英文标题】:How to perform gradient accumulation WITH distributed training in TF 2.0 / 1.14.0-eager and custom training loop (gradient tape)? 【发布时间】:2019-11-09 15:31:01 【问题描述】:

背景: 我有一个模型,我正在尝试将它移植到TF 2.0 以获得一些甜蜜的渴望执行,但我似乎无法弄清楚如何进行分布式训练(4 个 GPU)并同时执行梯度累积.

问题:

我需要能够使用带有梯度磁带的自定义训练循环,因为我有一个复杂的多模型问题(几个输入模型和输出模型一起训练),我不需要二阶梯度

对于我的模型的大小(中等,类似于中型变压器),我无法使用 4 个 GPU 获得大于 ~32 的批量大小,这是我可以获得的最大实例,遗憾的是,这些确实是 11GB K80 的旧款,因为 Azure 似乎认为 Google 甚至不再免费赠送的 GPU 已经足够好............

我有一个需要非常大批量的数据集,因为我必须考虑一个非常大的不平衡(我也在使用 c 的加权和焦点损失),因此我需要执行 4-8 步的梯度累积来平滑渐变。

我已阅读分布式训练循环指南并设法实现它: https://www.tensorflow.org/beta/tutorials/distribute/training_loops

我还在 TF 2.0 中为自定义训练循环和tf.keras 实现了梯度累积: https://colab.research.google.com/drive/1yaeRMAwhGkm1voaPp7EtFpSLF33EKhTc

【问题讨论】:

如果你的批次真的很小,那会让你的模型适合吗?非常大的不平衡可以通过只对最差的样本应用反向传播来处理。我在此视频youtube.com/watch?v=pglJizzJsD4 中介绍了一篇非常好的论文,它将同时处理您的不平衡和批量大小。 以下是 Nvidia 为 BERT 做的事情,如果有帮助的话:github.com/NVIDIA/DeepLearningExamples/blob/… 你读过https://www.tensorflow.org/tutorials/distribute/custom_training吗? 【参考方案1】:

阅读https://www.tensorflow.org/tutorials/distribute/custom_training,如果您仍有任何问题,请更新您的问题。

【讨论】:

这似乎不是问题的答案。请访问 tour 和 how to answer 了解 Stack Overflow 上的 Answers 是如何工作的。另见Your answer is in another castle: when is an answer not an answer?

以上是关于如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?的主要内容,如果未能解决你的问题,请参考以下文章

在TF 2.0中使用tf.keras,如何定义依赖于学习阶段的自定义层?

如何在 tensorboard 中显示 Tensorflow 2.0 中的 tf.data.Dataset.map 子图?

如何从tensorflow 2.0中的tf.function获取图形?

如何将稀疏张量传递给 TF 2.0 中的密集层?

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

建议在 tensorflow 2.0 中调试 `tf.data.Dataset` 操作