米兰·(milan)中国官方网站-OpenAI:训练大型神经网络的四种基本方法

来历 | OpenAI
编译 | 黄楠
编纂 | 陈彩娴年夜型神经收集是当前人工智能范畴的热点话题之一,那末,怎样练习年夜模子?
近来,曾经推出年夜范围预练习模子 GPT-3 的 OpenAI 发表了一篇博文,先容了基在 GPU 的四种节省内存的并行练习要领,别离是:
数据并行——于差别的 GPU 上运行统一批次的差别子集;
流水线并行——于差别的 GPU 上运行模子的差别层;
张量并行——分化单个运算的数学运算,例如将矩阵乘法拆分到 GPU 上;
专家混淆(MOE)——仅经由过程每一层的一小部门处置惩罚每一个示例。

图注:三层模子上各类并行计谋,每一种颜色代表一层,虚线分开差别的 GPU。
1数据并行「数据并行练习」象征着将不异的参数复制到多个 GPU(凡是称为“workers”),并为每一个 GPU 分配差别的示例以同时处置惩罚。
单单的数据并行要求模子匹配单个 GPU 内存,但当你使用多个 GPU 计较时,价钱是存储参数的多个副本。不外,话虽云云,有一些计谋可以增长 GPU 可用的有用 RAM,例如,于两次利用之间,可将参数暂时卸载到 CPU 内存。
跟着每一次数据并行 worker 更新其参数副本,它们需要彼此协调,以确保每一个 worker 都继承具备相似的参数。最简朴的要领是于 worker 之间引入「壅闭通讯」:
步调 1:自力计较每一个worker上的梯度;
步调 2:将差别 worker 的梯度平均;
步调 3:于每一个 worker 上自力计较不异的新参数。
步调 2 是一个壅闭平均值,它需要传输年夜量数据(与 worker 数目乘以参数巨细成正比),这可能会侵害练习的吞吐量。有各类异步同步方案可以消弭这类损耗,但会侵害进修效率;是以于实践中,人们遍及对峙同步要领。
2流水线并行于流水线并行练习中,研究者会将模子的挨次块划分到 GPU 上,每一个 GPU 只生存一小部门参数,是以,不异模子的每一个 GPU 耗损的内存按比例削减。
将年夜型模子拆分为持续层的块很简朴,但因为层的输入及输出之间存于挨次依靠瓜葛,是以,于 worker 等候前一台呆板的输出用作其输入时,一个幼稚的履行可能会致使呈现年夜量余暇时间。这些等候时间块被称为「泡沫」(bubbles),即华侈了本可以由余暇呆板来完成的计较。

图注:一个简朴的流水线并行设置插图,此中,模子被垂直分成 4 个分区。worker 1 主持第一层的模子参数(最靠近输入),而 worker 4 主持第 4 层(最靠近输出)。“F”、“B”及“U”别离代表前向、后向及更新操作。下标会唆使于哪一个 worker 上运行操作。因为挨次依靠性,数据一次由一个 worker 处置惩罚,致使孕育发生了年夜量的余暇时间“泡沫”。
咱们可以重用数据并行的设法,经由过程让每一个 worker 一次只处置惩罚数据元素的一个子集,来降低孕育发生时间泡沫的成本,从而使咱们能巧妙地将新计较与等候时间堆叠。焦点思惟是,将一个批次拆分为多个微批次,每一个微批次的处置惩罚速率都应该成比例地加速,而且每一个 worker 于下一个微批次可历时当即最先事情,从而加速管道履行。有了充足的微批次, worker 可以于年夜部门时间被使用,而且于步调最先及竣事时「泡沫」最小。梯度于微批次之间举行平均,而且只有于所有微批次完成后才会更新参数。
模子拆分的 worker 数目凡是称为「管道深度」(pipeline depth)。
于前向通报时期,worker 只需将其层块的输出(称为「激活」)发送给下一个 worker;于反向通报时期,它仅将这些激活的梯度发送给前一个事情职员。怎样摆设这些通道以和怎样跨微批次聚合梯度有很年夜的设计空间。例如,要领 GPipe 是让每一个事情进程持续向前及向后通报,然后于末了同步聚合来自多个微批次的梯度;而 PipeDream 会摆设每一个 worker 瓜代处置惩罚的前向及后向通道。


图注:GPipe 及 PipeDream 流水线方案的比力,每一批利用 4 个微批次。微批次 1-8 对于应在两个持续的数据批次。图中“number”暗示于哪一个微批次上操作,下标标志 worker ID。留意,PipeDream 经由过程利用陈旧参数履行一些计较来得到更高的效率。
3张量并行管道并行性将模子逐层“垂直”拆分,也能够于一个层内“程度”拆分某些操作,这凡是称为张量练习。
对于在很多现代模子(例如Transformer),计较瓶颈是将激活批处置惩罚矩阵与年夜权重矩阵相乘。矩阵乘法可以认为是成对于的行及列之间的点积;可以于差别的 GPU 上计较自力的点积,或者者于差别的 GPU 上计较每一个点积的部门并总结成果。不管采用哪一种计谋,咱们均可以将权重矩阵支解成巨细匀称的“碎片”,将每一个碎片托管于差别的 GPU 上,并利用该碎片计较整个矩阵乘积的相干部门,然后再举行通讯以组合成果。
一个例子是Megatron-LM,它于 Transformer 的自留意力及 MLP 层内并行化矩阵乘法。PTD-P利用张量、数据及流水线并行,其流水线调理为每一个装备分配了多个不持续的层,以增长收集通讯为价钱来削减泡沫损耗。
有时,收集输入可以跨维度并行化,相对于在交织通讯具备高度的并行计较。序列并行就是如许一种设法,此中输入序列于时间上被分成多个子示例,经由过程答应计较继承举行更细粒度的示例,来按比例削减峰值内存耗损。
4专家混淆 (MoE)利用专家混淆(MoE)要领,只有小部门收集用在计较任何一个输入的输出。
一个示例要领是拥有多组权重,而且收集可于推理时经由过程门控机制选摘要利用的权重组,这能于不增长计较成本的环境下启用更多参数。每一组权重都被称为“专家”,且但愿收集能学会为每一个专家分配专门的计较及技术。差别的专家可以主持差别的 GPU ,从而提供了一种明确的方式来扩展用在模子的 GPU 数目。

图注:门控收集只选择了n个专家中的2个。
GShard 将 MoE Transformer 的参数扩大到 6000 亿个参数,此中仅将 MoE 层拆分到多个 TPU 装备上,其他层则彻底复制。Switch Transformer 经由过程将一个输入路由到单个专家,将模子巨细扩大到数万亿个参数,具备更高的稀少性。
5其他节省内存的设计还有有很多其他的计较计谋,可使练习愈来愈年夜的神经收集更易处置惩罚。例如:
要计较梯度,需要生存原始激活,这会耗损年夜量装备 RAM。查抄点(也称为激活从头计较)存储激活的任何子集,并于反向通报时期,和时从头计较中间的激活,以至多一个分外完备前向通报的计较成本,节省了年夜量内存。人们还有可以经由过程选择性激活从头计较,来不停衡量计较及内存成本,这是对于激活的子集举行查抄,其存储成真相对于较高,但计较成本较低。
混淆精度练习是利用较低精度的数字(最多见的是FP16)来练习模子。现代加快器可使用较低精度的数字到达更高的 FLOP 计数,而且还有能节省装备 RAM。于适量的赐顾帮衬下,孕育发生的模子险些可以不丧失任何精度。
卸载是将未利用的数据姑且卸载到 CPU 或者差别装备之间,于需要时将其读回。幼稚的履行会年夜年夜减慢练习速率,但繁杂的实现方式会预先获取数据,使装备永远不需要等候。这个设法的一个实现是ZeRO,它可将参数、梯度及优化器状况支解到所有可用的硬件上,并按照需要将它们详细化。
Memory Efficient Optimizers已经经提出了内存效率优化器,以削减优化器所维护的运行状况的内存占用,例如Adafactor。
压缩也可用在存储收集中的中间成果。例如,Gist压缩为后向通报而生存的激活;DALL-E于同步梯度以前压缩梯度。
参考链接:
https://openai.com/blog/techniques-for-training-large-neural-networks/
雷峰网(公家号:雷峰网)
雷峰网版权文章,未经授权禁止转载。详情见转载须知。





