谷歌开源效率怪兽 GPipe,速度提升 25 倍,CIFAR-10 精度达到 99%

300 阅读6分钟

【新智元导读】 加速 DNN 模型训练速度方法中,数据并行受到单个加速器可支持模型大小的限制;而模型并行因为 DNN 顺序性导致大量算力浪费。目前 Google 推出 GPipe,将两种方法的优势进行结合,解决了两者的劣势,成功提升训练速度。

深度神经网络(DNN)已经推动了许多机器学习任务,比如语音识别,视觉识别和语言处理。

BigGAN、BERT 和 GPT2.0 的最新进展表明,越大的 DNN 模型,越能带来更好的性能。

而视觉识别任务的过去进展也表明,模型大小和分类准确性之间,存在很强的相关性。

例如 2014 年 ImageNet 视觉识别挑战赛中,获胜者 GoogleNet 使用 400 万参数,精确度达到了 74.8%。

而 2017 年 ImageNet 挑战赛的获胜者 Squeeze-and-Excitation Networks,使用 1.5 亿参数,精确度达到了 82.7%。

仅仅 3 年,数据处理能力翻了 36 番。而在同一时期,GPU 内存仅增加了约 3 倍。

当前最先进的图像模型,已经达到了云 TPUv2 内存的可用上限。因此,迫切需要一种更高效、可扩展的基础设施,以实现大规模深度学习,并克服当前加速器的内存限制。

ImageNet 精度和模型大小之间的强相关性

基于以上目的,Google 推出了 GPipe

GPipe 是什么,效果如何?

GPipe 是一个分布式机器学习、可扩展的管道并行库,可以学习巨型深度神经网络。

使用同步随机梯度下降和管道并行性进行训练,适用于由多个连续层组成的任何 DNN。

GPipe 允许研究人员轻松部署更多加速器来训练更大的模型,并在不调整超参数的情况下,达到提升性能的效果。

GPipe 将跨加速器和管道执行的网络层进行分区,以便实现对硬件更高的利用率,同时利用重新计算来将激活的内存使用降至最低。

例如,使用 8 个加速器的分区,GPipe 就可以训练 25 倍大神经网络。

而 GPipe 也几乎实现了线性加速。使用 4 倍数量的加速器,处理同一个模型的速度提升了 3.5 倍;16 倍加速器速度提升 11 倍。

同时它也要保证计算的梯度和分区的数量保持一致,从而在不对模型的参数做任何改动的前提下,都能保持线性加速。

目前,核心 GPipe 库已在 Lingvo 框架下开源。

为什么要对跨加速器的模型进行分区?

有两种标准方法可以加速 DNN 模型:

  1. 数据并行方法,使用更多的机器并将输入数据分开
  2. 模型并行性。将模型移动到如 GPU 或 TPU 等具有加速模型训练的特殊硬件

然而加速器的内存、与主机的通信带宽均有限。因此模型并行性就需要将模型进行分割,将不同的分区分配给不通过的加速器。

可是由于由于 DNN 的顺序性,这种朴素的策略可能导致在计算期间,只有一个加速器处于激活状态,导致大量算力的浪费。

而标准数据并行方法是允许在多个加速器上,同时训练不同输入数据的相同模型,但每个加速器可支持模型大小又有限制。

GPipe 的做法是将模型分割,并划分给不同的加速器,自动将小 Batch 拆分为更小的微 Batch,这样就实现了跨多个加速器的高效训练。

此外,因为梯度一直在微批次中累积,所以分区数量不会影响模型质量。

Time 部分:由于网络的连续性,幼稚模型并行策略导致严重的未充分利用。 一次只有一个加速器处于活动状态

Bubble 部分:GPipe 将输入小批量分成较小的微批次,使不同的加速器可以同时在单独的微批次上工作

使用 GPipe 和不使用,之间的差异有多大?

一个 TPUv2 有 8 个加速器核心和 64GB 内存(每个加速器 8GB),由于内存限制,单个加速器可以训练的参数量上限是 8200 万。

借助反向传播和批量分割中的重新计算,GPipe 将中间激活内存从 6.26GB 减少到 3.46GB,将单个加速器参数处理上限提升至 3.18 亿个。

我们还看到,通过管道并行性,最大模型大小与分区数成正比,如预期的那样。

通过 GPipe,AmoebaNet 能够在云 TPUv2 的 8 个加速器上加入 18 亿个参数,比没有 GPipe 的情况下多 25 倍。

Google 测量了 GPipe 对 AmoebaNet-D 模型吞吐量的影响。效率和加速器的数量几乎是呈线性加速,8 个加速器 + 8 个分区,比 2 个加速器 + 2 个分区快 2.5 倍。

TPUv3 效果更好。在 1024 个令牌句子上启用了 80 亿个参数 Transformer 语言模型,16 个加速器将速度提升了 11 倍.

使用 GPipe 加速 AmoebaNet-D,这种模型不适合一个加速器

基线 naive-2 是将模型拆分为两个分区时本机分区方法的性能

Pipeline-k 指的是 GPipe 的性能,它将模型分成带有 k 个加速器的 k 个分区

GPipe 还可以通过使用更多加速器来扩展训练,而无需更改超参数。因此,它可以与数据并行性相结合,以互补的方式使用更多的加速器来扩展神经网络训练。

GPipe 精确度能达到多少?

前面我们提到,处理的数据量越大,获得的精度就越高。

Google 在 ImageNet ILSVRC-2012 数据集上,使用 Cloud TPUv2 训练了一个有 5.57 亿参数、480 x 480 输入图像尺寸的 AmoebaNet-B 模型。

该网络被分成 4 个分区,这个巨型模型在多个流行数据集上表现良好,在没有任何外部数据的情况下,精度达到了最先进的 84.3% top-1,以及 97% top-5 的 single-crop 验证准确度。

大型神经网络不仅适用于 ImageNet 等数据集,还通过迁移学习,与其他数据集息息相关。

目前我们已知 ImageNet 模型越好,迁移就越好。Google 在 CIFAR10 和 CIFAR100 数据集上进行了迁移学习实验,将最佳公布的 CIFAR-10 精度提高到 99%,将 CIFAR-100 精度提高到 91.3%。

哪里能获取到 GPipe?

Github:

github.com/tensorflow/…

参考链接:

ai.googleblog.com/2019/03/int…


新智元·AI_era

每日推送 AI 领域前沿学术解读、AI 产业最新资讯

戳右上角【+ 关注】↗↗

喜欢请分享、点赞吧