变压器步进/秒随时间降低至0

时间:2019-03-19 19:54:40

标签: python tensorflow machine-learning tensor2tensor

问题: 使用Transformer模型时的训练步骤/秒反复从20步/秒降至<1步/秒。
这是内部可复制的。 在<1 step / s

的时间段内,GPU使用率暴跌至〜0%

上下文: 我们使用Transformer model进行训练。

Transformer的训练效果较差,但Universal Transformer的训练效果很好。

在两种情况下,我们都使用4倍P100,子词令牌(https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/data_generators/text_encoder.py#L448)和MirroredStrategy Enabled分发策略。

(我们在8x V100上也观察到了相同的行为。)

在1)P100与V100、2)MirroredStrategy与t2t的内置多GPU以及3)Universal Transformer与Transformer进行的烧蚀测试表明,#3是驱动变量。

我们正在使用tensor2tensor的Translator / universal_transformer实现。 使用的hparams是translator_tiny和universal_transformer_tiny。与常规用法的一个值得注意的偏差是,我们的hparams.max_length值很大(2500),而批处理的大小通常很小,因为我们的中间序列长度是750个令牌。

当前行为 借助Transformer,训练运行的步/秒在大约20步/秒和0.5步/秒之间交替。

在最初的3-4个小时中,偏向于20步/秒。接下来的2个小时,它开始更频繁地下降到0.5步/秒,然后才几乎完全下降到0.5步/秒。

如果我们从模型运行缓慢时创建的检查点重新开始训练过程,则行为会以20步/秒的速度重复出现,然后下降到0.5。

下面是两个图第一个是我们在训练过程中模型步/秒降级的图。早期的中值约为20(偶尔下降到5步/秒以下),但是随着训练的进行,我们的性能下降到几乎0步/秒。 注意,垂直轴是对数的 image

第二张图显示了我们模型的3.25个连续运行,其中每次重新启动都会选择一个先前生成的运行检查点。这些重新启动并不是造成错误,而是由于我们的系统会在24小时后自动抢占gpu密集型作业。请注意,每次重新启动后性能都会持续下降。 image

预期的行为

我们的通用变压器运行具有完全平坦的步进/秒曲线。下图以步/秒方差表示红色的预期行为。请注意,模型的步长/秒几乎没有变化,除了归因于评估步长的急剧下降。 Transformer vs Universal Transformer Step_Sec Decrease (2)

其他信息/日志 我们的GPU利用率(由nvidia-smi衡量)与上图紧密相关。在我们的步/秒很高的地方,我们的GPU利用率几乎始终为50%,偶尔一秒下降到0,然后再进行备份。当我们的步/秒持续下降到1以下时,我们的gpu利用率通常为0%。每隔几分钟,它会短暂地升至50%,然后每秒下降至0%。

就auc性能而言,即使步长/秒衰减,我们的变压器模型仍在不断改进。

硬件配置信息:

系统信息

-我是否编写了自定义代码(与使用TensorFlow中提供的股票示例脚本相对):

-操作系统平台和发行版(例如Linux Ubuntu 16.04):

Ubuntu 18.04 -从(源或二进制)安装TensorFlow:

二进制/点安装 -TensorFlow版本

1.13.1 -Python版本:

3.6.7 -CUDA / cuDNN版本:

CUDA = 10 CUDNN_VERSION 7.5

-GPU模型和内存:

8X V100 16 GB

(我们观察到与为CUDA 9.2编译的CUDA 9.2和TF 1.12相同的行为。) Docker Image

相关问题:

https://github.com/tensorflow/tensor2tensor/issues/1484 https://github.com/tensorflow/tensorflow/issues/26635

0 个答案:

没有答案