GPipe:微批量流水线并行

news2024/11/24 12:35:31

论文标题:GPipe: Easy Scaling with Micro-Batch Pipeline Parallelism
论文链接:https://arxiv.org/abs/1811.06965
论文来源:Google

一、概述

如下图所示,近过去十年中,由于开发了促进神经网络有效容量扩大的方法,深度学习取得了巨大进步。这种趋势在图像分类中表现得尤为明显,就像ImageNet的模型容量增加带来的精度提升一样。在自然语言处理的背景下也可以观察到类似的现象,简单的浅层句子表示模型被其更深更大的对应模型超越。

7503833279d557410dc20f2ec9b0650f.jpeg
现象

然而,虽然更大的模型为许多领域带来了显著的质量提升,但扩大神经网络也带来了重大的实践挑战。包括内存限制和加速器(GPU或TPU)的通信带宽在内的硬件约束,迫使用户将更大的模型划分为多个部分,并将不同的部分分配给不同的加速器。然而,高效的模型并行算法非常难以设计和实现,这通常要求实践者在扩大容量、灵活性(或特定于特定任务和架构)和训练效率之间做出艰难的选择。结果,大多数高效的模型并行算法都是针对特定架构和任务的。随着深度学习应用的不断增多,人们对可靠且灵活的基础设施的需求也在不断增长,这些基础设施可以让研究者轻松地将神经网络扩大到大量的机器学习任务。

为了解决这些挑战,我们引入了GPipe,这是一个灵活的库,可以实现大型神经网络的有效训练。通过在不同的加速器上分割模型并在每个加速器上支持re-materialization,GPipe可以扩大任意深度神经网络架构,超越单个加速器的内存限制。在GPipe中,每个模型都可以被定义为一系列的层,连续的层群可以被分割成单元。每个单元然后被放置在一个单独的加速器上。基于这种划分设置,我们提出了一个新的流水线并行算法,通过批量分割。我们首先将训练样例的一个小批量划分为更小的微批量,然后将每组微批量的执行在各个单元中流水线化。我们采用同步的小批量梯度下降方法进行训练,其中的梯度在一个小批量的所有微批量中累积,并在小批量结束时应用。因此,使用GPipe的梯度更新不会因为划分的数量不同而不同,这使得研究者可以通过部署更多的加速器来轻松训练越来越大的模型。GPipe还可以与数据并行结合,进一步扩大训练规模。

我们在图像分类和机器翻译上展示了GPipe的灵活性和效率。对于图像分类,我们在ImageNet 2012数据集上,训练了AmoebaNet模型,并将输入调整为480×480。通过增加模型的宽度,我们将参数数量扩大到5.57亿,并实现了84.4%的最高验证精度。在机器翻译上,我们训练了一个有128层、60亿参数的多语言Transformer模型,支持103种语言(102种语言到英语)。我们展示了该模型能够超越单独训练的3.5亿参数的双语Transformer Big模型在100个语言对上的表现。

二、方法

GPipe开源库是以Lingvo框架为基础实现的,不过它的核心设计思路是通用的,可以与其他框架结合。

  1. 接口

一个深度神经网络可以被定义为层的一个序列,每一层包括一个前向传播计算函数和参数集合。GPipe额外允许用户为每一层指定一个可选的计算花销评估函数。对于一个给定的划分数量,这个神经网络的层序列可以被划分为个复合层(或者叫做单元)。我们用来代表从到之间的连续层。对应于的参数集合为的并集,其前向传播函数为,相应的反向传播函数可以通过从使用自动符号微分获得,另外花销估计函数为。

GPipe的接口非常地简单和直观,只需要用户指定:①模型划分的数量;②微批量的数量;③模型的层的序列与定义。

  1. 算法

在GPipe中,用户定义他们网络中的层序列,包括模型参数,前向计算函数和成本估计函数。然后,GPipe将网络分割成个单元,并将第个单元放在第个加速器上。在分割的边界,GPipe自动插入了通信原语,允许邻近分割之间的数据传输。分割算法会试图最小化所有单元的估计成本的差异,从而通过同步所有分割的计算时间,以最大化流水线的效率。

在前向传播过程中,GPipe首先将大小为的每个小批量(mini-batch)划分为个相等的微批量(micro-batch),并通过个加速器进行流水线传输。在反向传播过程中,每个微批量的梯度都基于用于前向传播的相同模型参数来计算。在每个小批量结束时,所有个微批量的梯度都被累积起来,并用于更新所有加速器上的模型参数。这个过程如下图(c)所示。

f261b9b48cec2aea958a89a314cce851.jpeg
GPipe

如果在网络中使用了批量归一化(batch normalization),那么在训练期间,输入的充分统计量将在每个微批量以及在必要的情况下的复制品(replica)上计算。我们还会跟踪整个小批量的充分统计量的移动平均值,以供在评估期间使用。

  1. 性能优化

为了减少激活(activation)的内存需求,GPipe支持re-materialization。在前向计算的过程中,每个加速器只保存在单元边界处的输出激活。在反向传播的过程中,第个加速器重新计算复合前向传播函数。在这样的处理下,峰值激活内存需求减少到了,这里的是微批量大小,是每个单元的层数。作为对比,没有re-materialization的情况下内存需求为,这是因为在计算梯度需要上层梯度以及缓存的激活。

上图(c)中所示的分割过程会引入一些加速器的空闲时间,被称为气泡开销(bubble overhead)。这个气泡时间在每个微批量上的平摊开销为。在实验中,当微批量数时,我们发现气泡开销可以忽略不计。这部分原因是在反向传播期间可以提前调度re-materialization,而无需等待来自前面层的梯度。

GPipe引入了较低的通信开销,因为我们只需要在加速器之间的分割边界传递激活张量。因此,即使在没有高速互联的加速器上,我们也可以实现高效的扩展性性能。

上图(c)假设分割是均衡的。然而,不同层的内存需求和计算量通常是不均衡的。在这种情况下,不完美的分割算法可能导致负载不平衡。更好的分割算法有可能改善我们启发式方法的性能。

这一部分关于这一系列复杂度是如何得到的,可以参看李沐视频(https://www.bilibili.com/video/BV1v34y1E7zu)。

三、实验

1aee297546b7b6f65946c70a59e984b2.jpeg
实验
6067f7fe738353306e34fa76d8b879d8.jpeg
实验
1fe4453388eef76b1d2248eb3b71a1f8.jpeg
实验
fb356c3083328d17ded11594d9cac90f.jpeg
实验
5c0f779df34ec81955d92c1993120b6c.jpeg
实验
4424207d308b36978bdeeb24764c8aa1.jpeg
实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity3D】伽马校正

1 伽马相关概念 1.1 人眼对亮度变化的感知 人眼对亮度变化的感知不是线性的,如下图,人眼对亮区的亮度变化不太敏感,对暗区的亮度变化较敏感。另外,我们可以想象一下,在一个黑暗的房间里,由 1 根蜡烛到 2 根…

【改进粒子群优化算法】基于惯性权重和学习因子动态调整的粒子群算法【期刊论文复现】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

面试题之MySQL事物的特性

在关系性数据库管理系统配置,一个逻辑工作要成为事物,必须要满足4个特性,即所谓的ACID:原子性(Atomicity),一致性(Consistency)、隔离性(lsolation)和持久性(Durability)。 原子性: 原子性:事物作为一个整体被执行,包含在其中对…

Redis - 为什么我要来安利你学习 Redis ?

目录 前言 一、Redis 的特性(优点) 1. Redis 是在内存中存储数据的 2.可编程性 3.可扩展性 4.持久化 5.支持集群 6.高可用 二、Redis 为什么快? 三、 Redis 使用场景 优势场景 1.将 Redis 当作数据库 2.作为缓存和存储 session …

【数据分享】1929-2022年全球站点的逐日平均压力数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

【LeetCode每日一题合集】2023.7.10-2023.7.16(dfs 换根DP)

文章目录 16. 最接近的三数之和排序 双指针 1911. 最大子序列交替和解法——动态规划 2544. 交替数字和(简单模拟)931. 下降路径最小和(线性DP)979. 在二叉树中分配硬币⭐⭐⭐⭐⭐(dfs)算法分析补充&#…

PWM呼吸灯+流水灯设计

完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: module pwm_led_change(input wire …

软件测试人员和程序开发人员是死对头吗?

这两天闲来无事刷知乎,看到有些朋友问到关于测试与开发的关系,在这里想和大家稍微来聊一聊这个事儿。 有的人说呢,测试和开发是死对头;也有人说测试和开发是处在对立面的;还有人说测试与开发两者都不能互相理解。当然&…

再战算法-奋进

再战算法-奋进 算法入门痛苦经历总结收获 算法入门 在大学期间我直至觉得【算法】是很重要的一项,最开始接触的是c语言,算是第一门接触的,给了我很大的惊喜🥰,大二下的时候开始接触到Java语言,通过Java的入…

【C++进阶】C++11基础

文章目录 一、C11简介二、统一的列表初始化1. {}初始化2、std::initializer_list 三、 声明1.auto2. decltype3.nullptr 三、范围for 一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C…

Python3实现画小提琴图(包含分组)

说在前面 Python如何画一个小提琴图呢?先看下必备的数据集合(自己构建,样式参考) 默认必有X列、Y列(数值),画分组需要包含分组的列group等数据参数准备 可以参考下面的数据样例: 除此之外,对于画图使用的参数,提前准备的知识如下: sns.violinplot所必备的参数…

数据结构-堆排序代码实现(详解)

内容:堆排序的代码实现及注解,思路详解 代码实现: 交换函数: void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; } 堆排序函数: 1 向下调整建堆函数:这里建立大堆,小堆思路也…

Litedram仿真验证(三):AXI接口完成仿真(FPGA/Modelsim)

日常唠嗑 不知不觉,从开始接触Litedram已经过去了4个月,期间断断续续做了好多其他任务,导致进度比较慢,直到前天才把Litedram完全仿真起来。(坑很多,很多东西需要注意) 目录 日常唠嗑一、AXI用…

C—数据的储存(下)

文章目录 前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四 🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数&#x…

快速入门java微服务架构SpringBoot之一

Springboot概念: Springboot提供了一种快速使用Springboot的方式,基于约定优于配置的思想。 可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编辑中,从而大大提高了开发的效率,…

matlab主成分分析算法在人脸识别的具体应用

主成分析(Principal Component Analysis,简称PCA)是一种常用的降维算法,可以将高维数据转化为低维数据,同时保留原始数据的最重要特征。PCA算法在人脸识别中有广泛的应用,可以提取人脸图像中的主要特征&…

《啊哈算法》第二章--队列 栈 链表

文章目录 前言一、数据结构基础知识(衔接知识)二、队列三、栈四、链表总结 前言 上一节我们学习了排序算法当中的快速排序 冒泡排序 桶排序 ,那么本节得主要学习内容是队列 栈 链表得相关数据结构得知识 一、数据结构基础知识(衔接知识) 基于学习这本书得都是一些…

《英雄联盟》丢失d3dcompiler_47.dll怎么办,推荐这个修复方案

不知道大家有么有遇到过,在打开《英雄联盟》的时候,计算机提示丢失d3dcompiler_47.dll,无法继续执行此代码。d3dcompiler_47.dll是一个动态链接库文件,它是与Direct3D编译器相关的组件之一。像是photoshop等软件,英雄联…

IEEE754 标准是如何制定浮点数的存储的

1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准,由国际电工委员会(IEEE)制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则,旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …

c#使用ThreadPool

说到ThreadPool,都知道是线程池。在c#中,有很多方式可以实现线程。从时间上来排序,大概是这样的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2种是最新的&#xff…