训练 GPT-3,为什么原有的深度学习框架吃不消?
本文梳理了深度学习框架在支持大规模预训练模型时面临的技术挑战,以及当前各类框架的基本解决思路,帮助算法工程师对业界各类框架的分布式训练能力有更清晰的认知。
作者 | 一流科技CEO袁进辉
头图 | 下载于ICphoto
近年来,深度学习被广泛应用到各个领域,包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中,一个共同的特点就是模型规模越来越大,比如GPT-3模型的参数量达到1750亿,即便拥有1024张80GB A100, 那么完整训练GPT-3的时长都需要1个月。大规模预训练模型及其训练成为业界尤为关注的热点。
那么,模型规模变大带来了哪些挑战?首先是硬件发展水平导致的内存墙问题。单一设备的算力及内存容量,受限于物理定律,持续提高芯片的集成越来越困难,难以满足大模型规模扩大的需要。为了解决算力增速不足的问题,人们考虑通过使用多节点集群进行分布式训练来提升算力,分布式训练则势在必行。
大型Transformer模型参数量和计算设备内存最近5年的增长速度
但是,简单的机器堆叠并不一定可以获取算力的增长,因为内存的带宽增长速率也大大落后于算力增长,跨计算设备之间的网络带宽更低,使得数据搬运成为整个训练的瓶颈,进而导致训练效率大大下降。
Transformer及计算机视觉、自然语言处理、语音识别模型算力增长速度
问题的核心是分布式编程门槛。大模型兴起时间较晚,原有的主流深度学习框架只支持数据并行,为了支持大模型的训练,人们可以对已有框架定制化地开发,针对解决某个特定领域内的分布式训练问题,如针对点击率预测的HugeCTR,这降低了特定领域内算法工程师的门槛,但同时却削弱了通用性。
主流深度学习框架也正在增加对大模型分布式训练的支持,但用户接口仍不够友好。在模型更大或者神经网络拓扑更复杂时,原有的主流深度学习通用框架的易用性和效率会大打折扣,对开发者在分布式训练上的相当一部分重点需求仍未被满足。
无论是对已有框架做定制开发,还是让已有框架通用的支持大模型训练,都非易事。分布式训练涉及到性能调优、软硬件资源调度、通信带宽等工程问题,这些复杂的问题纠结在一起,造成开展超大规模预训练语言模型方面的突破式算法研究难度极高,长期以来被资金雄厚和具有扎实基础架构研发团队的科技巨头“垄断”。
在保证训练效率的前提下,降低技术门槛,让更多的算法工程师参与到大模型预训练模型中,创造更多价值,分布式训练因此成为包括OneFlow在内的业界深度学习框架的共同追逐目标。
如何在各显神通的分布式并行模式中做出选择
依据网络在分布式集群中的切分方式,深度学习框架目前主要的分布式训练模式包括数据并行、模型并行和流水并行,乃至同时使用数据并行和模型并行的混合并行方法。
诚然,分布式训练通常会比单机单卡更快,且能支持更大规模的模型训练。然而,分布式训练的不同模式之间也会有优劣。在内存墙及网络墙的影响下,数据传输量成为影响分布式训练的速度以及收敛性的关键因素。
具体而言,目前不同框架对数据并行的支持也趋于成熟,性能差异不大。数据并行与模型并行相比各有优劣,简单来说,为了减少传输量,只要是训练时每个批次数据的中间结果的数量较大而参数数量少则选择数据并行,反之,若每个批次数据的计算中模型参数的数量较大而中间结果相对更少则选择模型并行。(数据并行相对于模型并行还有另外一个特别的优势,数据并行中的通信较容易和计算重叠,而模型并行中的通信不易被计算掩盖)。
一般来说,同一个神经网络的不同算子可能适合不同的并行模式,某个特定的算子只使用一种并行模式,例如在模型参数量大的地方使用模型切割,在模型参数量少的地方使用数据切割。相比于一个算子只使用单一的并行模式,一个算子也可以同时使用多样的并行模式可能进一步地减少传输量,譬如在隐藏层比较大的地方,就可能同时对数据矩阵切割以及对模型矩阵切割。
数据并行与模型并行都是让设备执行同一个层次的计算,而流水并行则是把任务划分为几个有明确先后顺序的阶段,把不同的阶段分给不同的计算设备,使得单设备只负责网络中部分层的计算。在这种多设备接力完成一个网络计算的模式下,可以支持更大的模型或者支持更大的 Batch Size。
为了应对数据并行与模型并行在内存及通信量上的局限,微软提出了ZeRO-DP的方式来解决,但并不能完全取代模型并行。2016年,陈天奇团队提出亚线性内存优化、“gradient/activation checkpointing” 技术,旨在系统性减少深度学习训练中的内存占用,核心在于 “以时间换空间”,也可以大幅降低显存占用。
总的来说,流水并行在通常大模型训练情况下具有优势。流水并行的数据传输量少,仅为阶段之间需要传输的数据量之和,不像数据并行与模型并行那样大,传输量与整个计算图都有关,因此对于带宽较小的机器,会趋于使用流水并行。但某些情况下,流水并行与模型并行的结合则会优于单一的模型并行与流水并行。同时,在数据并行与模型并行中也存在计算时间掩盖传输时间的优化。
因此,对于每一个任务选择最优的并行模式是一个非常复杂的问题,需要具体情况具体分析。
支持大模型分布式训练的深度学习框架有何不同
既然分布式训练是大模型的核心,随着模型规模的扩大,原来不支持分布式训练的老牌深度学习框架通过增量式的逐步加入分布式训练功能,而OneFlow等框架则尝试通过重新设计新框架来系统解决分布式训练的难点。
考虑到老牌主流深度学习框架的影响力与市场积淀,目前一大部分方案是基于TensorFlow与PyTorch开发。
一些框架研究中,会关注如何设计并实现针对分布式的 API 接口,以求用更通用的方式满足各种复杂的分布式策略,如 Mesh-TensorFlow、 GShard。Mesh-TensorFlow 是一种用于描述分布式任务的特定领域语言(DSL),使用 Mesh-TensorFlow 需要深度修改模型代码和训练过程,有一定上手门槛。GShard 作为 XLA 编译器的扩展插件,借鉴了数据库技术中将大数据表切分(sharding)到不同物理设备上保存的思想。提供了 API(replicate、split、shard),用户通过它们注解张量,再由编译器完成张量到硬件设备上的映射。
还有一些工作,关注超大规模预训练模型(如 Transformer)带来的并行挑战,对模型并行、流水并行等并行策略的实现重点发力。如基于 Lingvo 开发的神经网络训练库 GPipe(Lingvo 是基于 TensorFlow 二次开发的重点针对序列模型的框架)、微软等的研究成果 PipeDream(早期版本基于 Caffe,目前基于 PyTorch 二次开发)、英伟达的 Megatron-LM(目前作为 PyTorch 的插件工作)、FaceBook 的 FairScale(PyTorch 的插件)、微软的DeepSpeed等。其中Megatron-LM和DeepSpeed是已开源方案中最成熟的两个,都是为大规模预训练模型高度定制的系统,不足之处在于,这些定制的功能难以应用到预训练模型之外的应用和算法上去。
此外,每个模型的并行策略候选集合是指数级的,纯手工从中挑出一种合适的并行策略,需要耗费算法工程师大量的时间以及计算资源。如何从框架层次自动解决并行策略选择问题,又称为自动并行技术,也是最近的研究热点。自动并行通过建立代价模型来预测并挑选一个较优的并行策略(暂时无法保证是最优的策略,因为挑出最优的策略是个NP-Hard的问题),有希望将算法工程师从并行策略的选择和配置中解放出来。
某些框架,如FlexFlow就进行了自动并行的尝试。FlexFlow提供了一套简单可行的代码替换方案,使得PyTorch和TensorFlow Keras的用户只需要少量修改代码,就可以运行 FlexFlow。
OneFlow通过重新设计和开发,试图系统地解决分布式训练的效率、易用性等问题。OneFlow在系统设计之初就通过 Actor 模型将数据搬运作为整体计算图的一部分,方便全局优化;OneFlow 还发明了 SBP 概念(与Google GShard有一些重叠,但是GShard的超集),让算子的数学逻辑与分布式训练时物理设备的分配解耦,将分布式集群抽象成逻辑上的“超级计算机”,使算法科学家可以像操作单机单卡设备那样完成分布式训练。
同时,OneFlow的自动并行完全不需要用户去做复杂的配置,也允许用户对某几个计算节点定制并行模式。(技术详情请查看《GPT-3模型为何难以复现?这也许是分布式AI框架的最优设计》)
OneFlow致力于解决大模型分布式训练的难题
不同于原有的深度学习框架以一种增量式、渐进的方式迭代自己的设计,逐步从支持单设备,到支持数据并行,再试图支持模型并行、流水并行等更挑战的问题,作为新一代深度学习框架,OneFlow自成立的第一天就致力于以一种通用的方式解决大数据、大计算和大模型的难题,自设计之初就纳入了支持数据并行、模型并行和流水并行的想法。
我们相信,OneFlow的技术路线是解决深度学习横向扩展难题的必由之路。实际上,在OneFlow走通这条路径之后,其他一些技术社区的团队已经开始沿着这个方向进发。我们获得的经验是,创新和创造是我们最可依赖的法宝,仅仅跟随已有框架走过的路是不可能实现超越的,唯有创新才有机会。
《新程序员001:开发者黄金十年》
2001 年创刊,20 年技术见证
人人都是开发者 家家都是技术公司
扫描下方二维码,添加小助手
即刻加入 AI 科技大本营「读者群」
群内将不定期放送福利
快快加入吧!
相关文章:

ImageMagick简单记录
一、安装 mac下的安装非常简单 brew search ImageMagick brew install xxx 安装后,可验证 magick logo: logo.gif identify logo.gif display logo.gif 更多安装方式参考:http://www.imagemagick.org/script/download.php 二、命令介绍 命令概览convert&…

低代码、RPA 和 AI,有什么区别
来源 | LowCode低码时代头图 | 下载于视觉中国在To B领域,低代码、RPA和AI可谓是“流量担当”,它们自带To B基因,搭载快速发展的企业服务赛道,在企业级IT服务这一细分市场崭露头角。以这三者为代表的前沿理念和科技引领IT产业升级…

C# 获取 IE 临时文件
大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 <Drives>:/Documents and Settings/<user>/Local Settings/Temporary Internet Files访问。但是可能我们都没有想…

wifidog接口文档(转)
目录(?)[-] 网关心跳协议 请求信息 回复格式 例子用户状态心跳协议 请求格式 注意 回复格式 状态码 例子跳转协议 请求格式 例子注册协议 请求格式 例子wifidog是搭建无线热点认证系统的解决方案之一,他比nocat更适合互联网营销思路。目前支持openwrt系统ÿ…

Oracle XQuery 过滤XML查询SQL
Oralce 支持SQL XQuery查询 一个简单示例: SELECT XMLQuery(for $i in /Videogame return $i/Type passing by value X RETURNING CONTENT) FROM (SELECT XMLTYPE(<Videogame><Type>Racing</Type><Name>NFS Most Wanted</Name><…

C#2.0匿名函数
C# 2.0中提供了通过delegate实现匿名函数功能,能有效地减少用户记代码工作,例如 以下为引用: ... button1.Click new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button…

第三届北京智源大会开幕,全球最大智能模型“悟道2.0”重磅发布
6月1日,由北京智源人工智能研究院(以下简称智源研究院)主办的2021北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。 北京智源大会是智源研究院主办的年度国际性人工智能高端学术交流活动,定位于“AI内行顶级盛会”…

Cloneable接口和循环冗余校验算法
1 Cloneable 接口 实现该接口的类可以调用clone()方法合法地对该类实例进行按字段复制。按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的) 2 循环冗余校验算法 循环冗余校验(英语:Cyclic redu…

IOS自定义表格UITableViewCell
在UITableView中,自定义表格,最原始是继承UITableViewCell,然后通过写代码方式去搞,但是这个费事了。 1.在storyboard中 给一个ViewController的tabieview增加自定义的UITableViewCell,可以直接从 object Library里面选…

postfix邮件服务器搭建
项目环境:一台server ip:192.168.1.100 一台mail ip:192.168.1.200 一台win7 ip:192.168.1.222项目需求:1:在DNS Master上搭建DNS,能够解析mail.sw.com2:在Mail Server上部署邮件服务器,和webmail软件3…

从DataView中生成Excel报表的方案(C#)
正文: 一、首先要引用一个Excel的组件,我一开始是在Office XP下尝试的,不 成功,后来把XP给干掉,装2k,就成功了,所以这里分享的是Office 2k下 引用相关组件来实现功能的,在工程中引…

被Python「苦虐」的日子太惨了!
Python因为其优越的特性广泛应用于数据分析、人工智能、Web开发、后端开发、自动化测试/运维、爬虫等领域,也得到了很多企业的青睐。甚至连BATZJ的技术大牛,都无可否认Python现在对于一个程序员发展的重要性!最近一两年,我身边也有…

BeanUtils威力和代价
2019独角兽企业重金招聘Python工程师标准>>> BeanUtils: 威力和代价(转载综合) Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使…

C# 线程无法开启窗口的原因
在 C# 里面, 主窗口拥有主线程, 主线程产生子线程监控 Socket 埠, 子线程一收到数据流就会给主线程发送一个事件, 创建一个窗口. 现在的情况是子线程能够收到数据流, 主窗口能够收到子线程发送过来的事件, 能够创建一个窗口. 这个窗口有问题: 窗口状态像死掉程序的窗口一样, 反…

给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资
作者 | 伍杏玲出品 | AI 科技大本营(ID:rgznai100)上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮。随后“中国 Linux 第一人”宫敏博士用手提肩背的方式将 20 盒磁带背回中国࿰…

root密码忘记怎么办
开机按e进入系统的紧急求援模式依次输入一下命令:mount -o remount,rw /sysrootchroot /sysrootecho "输入新密码" | passwd --stdin rootexitreboot转载于:https://blog.51cto.com/11552940/1971850

C#内容分页简单实现代码及祥解
//定义变量 int i,start,stop,t,stat,statt,pp,pagecount,pagesize; //变量初始值 stat0; statt0; start0;//开始查询的字符串位置,初始为0 stop0; pagesize2000;//定义每页至少显示字符串数 pagecount0; //获得当前的页数 paRequest.Params["page&qu…

灵活越障、花样空翻,腾讯轮腿式机器人亮相机器人顶会 ICRA
6月3日,腾讯轮腿式机器人Ollie(奥利)正式亮相。它像一个灵活的“轮滑小子”,能完成跳跃、360度空翻等高难度动作。 轮腿式机器人(wheel-legged robot)是近年来机器人研究的前沿领域。Ollie兼具轮式结构和腿…

android学习笔记之十服务(Service)
2019独角兽企业重金招聘Python工程师标准>>> Service拥有一个单独进程的模块. 1,继承自Service类,须实现public IBinder onBind(Intent intent) 2,通过startServie触发运行,stopService终止运行 生命周期: onCreate(如果是第一次运行) -> onStart -> onDest…

宝塔Linux常用命令
https://www.bt.cn/bbs/thread-1186-1-1.html 2017年3月8日发布全新架构的宝塔Linux 面板3.1Beta版,到现在的5.2.0正式版,历经100多天打磨,宝塔研发工程师做了大量优化适配,从最开始的只支持CentOS到现在支持CentOS、Ubuntu、Debi…

EMAIL发送系统(C#+基于SMTP认证) 2.0
这个是对于 EMAIL发送系统(C#基于SMTP认证) 1.0 的改版这个第一版是2002年11月写的,过了一年半了,才有人提意见,就修正了一下,因为后来做的项目一直用不上,也就没有注意到 前段时间有网友反馈了一些问题,这…

“奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”
6月3日,腾讯Robotics X实验室的新成员——轮腿式机器人Ollie(奥利)正式亮相,它是机器狗Jamoca、Max和自平衡自行车之后,实验室又一创新成果。轮腿式机器人(wheel-legged robot)是近年来机器人研…

如何写一篇好的技术博客
在工作过程中,发现对很多东西都一知半解,不是很透澈,到头来很容易模糊,如果有一篇好的技术博客予以总结,一来即使忘记了,回国头来再看,仍然能 够从自己的思路中恢复;二来总结一下&am…

使用react心得
为什么80%的码农都做不了架构师?>>> 在使用react中,总会碰到这样那样的问题,如何解决这些问题,希望能够随着时间的积累,慢慢成熟! 在react中的renden函数里,不能使用setState这个方法,不然会死循环,原因:是因为setState会触发render,而render后又触发se…

将Byte数组转化为String
FCL得很多方法的返回值都是包含字符的Byte数组而不是返回一个String,这样的方法包含在如下的类中: System.Net.Sockets.Socket.Receive System.Net.Sockets.Socket.ReceiveFrom System.Net.Sockets.Socket.BeginReceive System.Net.Sockets.Socket.B…

[题解]UVA10054 The Necklace
链接:http://vjudge.net/problem/viewProblem.action?id18806 描述:给出一堆珠子,每个珠子有两种颜色,有一端颜色相同的珠子可以串在一起,问是否可以把所有珠子串在一起,并求其中一种方案。 思路ÿ…

程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章
为什么程序员都需要学算法?程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测。在面试中…

专有云到混合云,是云计算的下半场?
查获案件案值达数十亿,为国家挽回近十亿元税款,是海关情报系统在全国应用一年后交出的答卷。 海关情报系统是海关总署与阿里云专有云共同搭建海关大数据云平台后推出的首个应用。 专有云的使命:激发政企大脑潜能 十年前,自己动手D…

C# 2.0 的partial
partial 关键字的作用是将你的 class 分为多个部分,编译器会将多个部分拼到一起去。 public partial class SampleClass ...{ public void MethodA() ...{ } } public partial class SampleClass ...{ public void MethodB() ...{ } } 和 public class Sa…

findbugs:may expose internal representation by ret
2019独角兽企业重金招聘Python工程师标准>>> findbugs:1. *** getXXX() may expose internal representation by returning ***.getXXX 2. *** setXXX(DATE )may expose internal representation by storing an externally mutable object into setXXX *…