摘要:现在的模型以及其参数愈加复杂,仅仅一两张的卡已经无法满足现如今训练规模的要求,分布式训练应运而生。

本文分享自华为云社区《分布式训练Allreduce算法》,原文作者:我抽签必中。

现在的模型以及其参数愈加复杂,仅仅一两张的卡已经无法满足现如今训练规模的要求,分布式训练应运而生。

分布式训练是怎样的?为什么要使用Allreduce算法?分布式训练又是如何进行通信的?本文就带你了解大模型训练所必须的分布式训练Allreduce算法。

通信概念

我们理解计算机的算法都是基于一个一个函数操作组合在一起得到的,那么我们在讲解分布式算法之前,我们必须先了解一下组成这种算法所应用于硬件的函数操作——集合通信的基本概念,

Broadcast(广播):将根服务器(Root Rank)上的数据分发广播给所有其他服务器(Rank)

 

如图所示,当一台服务器计算完成了自己部分的参数数据,在分布式训练中想要把自己这部分数据同时发送给其他所有服务器,那么这种操作方式就叫做广播(broadcast)。

Scatter(散射):将根服务器上的数据散射为同等大小的数据块,每一个其他服务器得到一个数据块

 

如图所示,当一台服务器计算完成自己部分的参数数据,但是因为有时候服务器上全部的参数数据过大,于是我们想要把这台服务器上的数据切分成几个同等大小的数据块(buffer),再按照序列(rank index)向其他服务器发送其中的一个数据块,这就叫做散射(Scatter)。

Gather(聚集):将其他服务器上的数据块直接拼接到一起,根服务器(Root Rank)获取这些数据

 

如图所示,当服务器都做了散射之后,每个服务器获得了其他服务器的一个数据块,我们将一台服务器获得的数据块拼接在一起的操作就叫做聚集(Gather)。

AllGather(全聚集):所有的服务器都做上述Gather的操作,于是所有服务器都获得了全部服务器上的数据

 

如图所示,所有的服务器都将自己收到的数据块拼接在一起(都做聚集的操作),那么就是全聚集(AllGather)。

Reduce(规约):对所有服务器上的数据做一个规约操作(如最大值、求和),再将数据写入根服务器

如图所示,当所有服务器都做广播或散射的时候,我们作为接收方的服务器收到各服务器发来的数据,我们将这些收到的数据进行某种规约的操作(常见如求和,求最大值)后再存入自己服务器内存中,那么这就叫规约(Reduce)

AllReduce(全规约):对所有服务器上的数据做一个规约操作(如最大值、求和),再将数据写入根服务器

 

如图所示,同样每一个服务器都完成上述的规约操作,那么就是全规约(Allreduce)。这也就是分布式训练最基础的框架,将所有的数据通过规约操作集成到各个服务器中,各个服务器也就获得了完全一致的、包含原本所有服务器上计算参数的规约数据。

ReduceScatter(散射规约):服务器将自己的数据分为同等大小的数据块,每个服务器将根据index得到的数据做一个规约操作即,即先做Scatter再做Reduce。

概念中,我们也常常遇到散射规约(ReduceScatter)这样的名词,简单来讲,就是先做散射(Scatter),将服务器中数据切分成同等大小的数据块,再按照序列(Rank Index),每一个服务器所获得的参数数据做规约(Reduce)。这就类似于全聚集,只不过我们将数据不是简单拼接到一起而是做了规约操作(求和或最大值等操作)。

理解各种硬件测的基本概念以后,我们对于分布式训练也应该有有一些理解了,即是分布式通过切分训练数据,让每一台服务器计算他所属的min-batch数据,再通过上述的reduce等操作进行同步,从而使得每个服务器上的参数数据都是相同的。

分布式通信算法

Parameter Server(PS)算法:根服务器将数据分成N份分到各个服务器上(Scatter),每个服务器负责自己的那一份mini-batch的训练,得到梯度参数grad后,返回给根服务器上做累积(Reduce),得到更新的权重参数后,再广播给各个卡(broadcast)。


这是最初的分布式通信框架,也是在几卡的较小规模的训练时,一种常用的方法,但是显而易见的当规模变大模型上则会出现严重问题:

  1. 每一轮的训练迭代都需要所有卡都将数据同步完做一次Reduce才算结束,并行的卡很多的时候,木桶效应就会很严重,一旦有一张卡速度较慢会拖慢整个集群的速度,计算效率低。
  2. Reducer服务器任务过重,成为瓶颈,所有的节点需要和Reducer进行数据、梯度和参数的通信,当模型较大或者数据较大的时候,通信开销很大,根节点收到巨量的数据,从而形成瓶颈。

Halving and doubling(HD)算法:服务器间两两通信,每步服务器都可以获得对方所有的数据,从而不断进行,使得所有服务器全部数据。


这种算法规避了单节点瓶颈的问题,同时每个节点都将它的发送、接受带宽都运用起来,是目前极大大规模通信常用的方式,但是它也有着它的问题,即是在最后步数中会有大量数据传递,使得速度变慢。

如果服务器数为非二次幂的情况下,如下图13台服务器,多出的5台会在之前与之后做单向全部数据的通信,其余服务器按照二次幂HD的方式进行通信,详情请参考Rabenseifner R.的Optimization of Collective Reduction Operations论文。但是在实用场景下,最后是将HD计算后含有所有参数数据的最大块的数据直接粗暴地向多出来的那几台服务器发送,导致这步的通信时间占比极大。


Ring算法:以环形相连,每张卡都有左手卡和右手卡,一个负责接收,一个负责发送,循环完成梯度累积,再循环做参数同步。分为Scatter Reduce和All Gather两个环节。

更为详细的图解

Ring算法在中等规模的运算中非常有优势,较小的传输数据量,无瓶颈,带宽完全利用起来。
缺点则是在大型规模集群运算中,巨大的服务器内数据,极长的Ring环,Ring的这种切分数据块的方式就不再占优势。

参考:

  1. http://research.baidu.com/bringing-hpc-techniques-deep-learning/
  2. https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/usage/collectives.html
  3. https://zhuanlan.zhihu.com/p/79030485
  4. Rabenseifner R. (2004) Optimization of Collective Reduction Operations. In: Bubak M., van Albada G.D., Sloot P.M.A., Dongarra J. (eds) Computational Science - ICCS 2004. ICCS 2004. Lecture Notes in Computer Science, vol 3036. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-540-24685-5_1

点击关注,第一时间了解华为云新鲜技术~

带你认识大模型训练关键算法:分布式训练Allreduce算法的更多相关文章

  1. MXNet源码分析 | Gluon接口分布式训练流程

    本文主要基于MXNet1.6.0版本,对Gluon接口的分布式训练过程进行简要分析. 众所周知,KVStore负责MXNet分布式训练过程中参数的同步,那么它究竟是如何应用在训练中的呢?下面我们将从G ...

  2. 图神经网络之预训练大模型结合:ERNIESage在链接预测任务应用

    1.ERNIESage运行实例介绍(1.8x版本) 本项目原链接:https://aistudio.baidu.com/aistudio/projectdetail/5097085?contribut ...

  3. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  4. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)

    转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章   从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...

  5. TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化

    线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...

  6. 如何高效的通过BP算法来训练CNN

    < Neural Networks Tricks of the Trade.2nd>这本书是收录了1998-2012年在NN上面的一些技巧.原理.算法性文章,对于初学者或者是正在学习NN的 ...

  7. Splunk 会议回想: 大数据的关键是机器学习

    作者 Jonathan Allen ,译者 张晓鹏 Splunk的用户大会已经接近尾声.三天时间的会议里,共进行了160多个主题研讨.涵盖了从安全.运营到商业智能.甚至包含物联网,会议中一遍又一遍出现 ...

  8. zz从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

    从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得.那为什么 ...

  9. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  10. 千亿参数开源大模型 BLOOM 背后的技术

    假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...

随机推荐

  1. Util应用框架核心(三) - 服务注册器

    本节介绍服务注册器的开发. 如果你不需要扩展Util应用框架,直接跳过. 当你把某些功能封装到自己的类库,并希望启动时自动执行初始化代码进行配置时,定义服务注册器. 服务注册器概述 服务注册器是Uti ...

  2. 【re】[NISACTF 2022]string --linux下的随机数

    附件下载,查壳 发现是ELF程序,64位,ida打开分析 flag函数点进去 前面一堆代码其实都不重要,直接看主要代码:  puts("The length of flag is 13&qu ...

  3. Grafana新手教程-实现仪表盘创建和告警推送

    前言 最近在使用Grafana的时候,发现Grafana功能比想象中要强大,除了配合Prometheus使用之外,他自身都可以做很多事情,可视化和监控平台,还可以直接根据用户自定义的告警规则完成告警和 ...

  4. (Good topic)哈希表:拼写单词 (3.17 leetcode每日打卡)

    给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌 ...

  5. CSS 尺寸单位概述

    在本文中,我们将探讨 CSS 尺寸单位的四大类别.我们将了解这些尺寸单位的用途.它们的最佳工作原理,以及如何在每种情况下选择最佳尺寸单位,从而在各种媒体和设备尺寸下优化我们的布局. 关于 CSS 尺寸 ...

  6. Windows文件句柄无效

    今天我用FreeFileSync从移动硬盘复制一个名为Con的文件夹到本地硬盘,复制失败. 通过文件夹资源管理器Explorer直接访问文件夹则提示"禁止访问",右键属性切换到安全 ...

  7. Python输入一行字符,分别统计出其中大小写英文字母、空格、数字和其它字符的个数。

    import string def SlowSnail(s): up = 0 low = 0 space = 0 digit = 0 others = 0 for c in s: if c.isupp ...

  8. 23C新特性:True Cache的介绍

    我们的文章会在微信公众号"Oracle恢复实录"和博客网站"https://www.cnblogs.com/www-htz-pw/" 同步更新 ,欢迎关注收藏, ...

  9. Netty内置的http报文解码流程

    netty解码 netty通过内置处理器HttpRequestDecoder和HttpObjectAggregator对Http请求报文进行解码之后,Netty会将Http请求封装成一个FullHtt ...

  10. DFT与ATE IP TEST

    IP的DFT设计测试与ATE IP TEST是一个设计,测试活动吗? 不是. 这两个设计对于前端工农村很容易搞混,认为是同一个人负责,同一个活动.实际情不是. DFT主要空DSC控制器对IP进行扫描, ...