训练一个130亿参数的模型要用几个GPU?微软:一个就够

文|蛋酱、张倩
源|机器之心

现在的模型动辄数百、数千亿参数,普通人训不动怎么办?

前不久,谷歌发布了参数量为 1.6 万亿的语言模型Swith Transformer,将 GPT-3 创下的参数量记录(1750 亿)推至新高。这些大模型的出现让普通研究者越发绝望:没有「钞能力」、没有一大堆 GPU 就做不了 AI 研究了吗?

在此背景下,部分研究者开始思考:如何让这些大模型的训练变得更加接地气?也就是说,怎么用更少的卡训练更大的模型?

为了解决这个问题,来自微软、加州大学默塞德分校的研究者提出了一种名为ZeRO-Offload的异构深度学习训练技术,可以在单个 GPU 上训练拥有 130 亿参数的深度学习模型**,让普通研究者也能着手大模型的训练。与 Pytorch 等流行框架相比,ZeRO-Offload 将可训练的模型规模提升了 10 倍,而且不需要数据科学家对模型做出任何改变,也不会牺牲计算效率。

论文链接:
https://arxiv.org/pdf/2101.06840.pdf

ZeRO-Offload 通过将数据和计算卸载(offload)至 CPU 来实现大规模模型训练。为了不降低计算效率,它被设计为最小化与 GPU 之间的数据往来,并在尽可能节省 GPU 内存的同时降低 CPU 的计算时间。因此,对于一个参数量为 100 亿的模型,ZeRO-Offload 可以在单个 NVIDIA V100 GPU 上实现 40 TFlops/GPU。相比之下,使用 PyTorch 训练一个参数量为 14 亿的模型仅能达到 30TFlops,这是在不耗尽内存的情况下所能训练的最大模型。ZeRO-Offload 还可以扩展至多 GPU 设置并实现线性加速,最多可在 128 个 GPU 上实现近似线性加速。

此外,ZeRO-Offload 还可以和模型并行一起使用,在一个 DGX-2 box AI 服务器上训练参数量超 700 亿的模型。与单独使用模型并行相比,这一参数量实现了 4.5 倍的规模提升。

在下文中,我们将结合 Medium 博主 LORENZ KUHN 的一篇博客来详细了解这篇论文。

ZeRO-Offload 是什么?

ZeRO-Offload 是一种通过将数据和计算从 GPU 卸载到 CPU,以此减少神经网络训练期间 GPU 内存占用的方法,该方法提供了更高的训练吞吐量,并避免了移动数据和在 CPU 上执行计算导致的减速问题。

借助 ZeRO-offload,使用相同的硬件能训练以往 10 倍大的模型,即使在单个 GPU 上也是如此。比如在一个 32GB RAM 的 V100 GPU 上训练百亿参数的 GPT-2。

此外,ZeRO-offload 还能实现在多 GPU 设置中的近似线性扩展。

对于研究者来说,ZeRO-offload 适用的情况包括:

  • 想训练更大的模型,或者想更快地训练现在的模型,因为 ZeRO-offload 允许训练更大的 batch size;

  • 你正在使用 PyTorch,并且愿意 / 能够使用微软的 DeepSpeed 库(ZeRO-offload 的其他实现形式暂未推出),你也可以尝试根据官方实现自行调整;

  • 愿意接受一些建模时的限制,比如当前版本的 ZeRO-Offload 需要搭配使用 Adam 的混合精度训练。

如何使用?

ZeRO-Offload 在微软的 DeepSpeed 库中实现,官方实现地址:
https://github.com/microsoft/DeepSpeed/blob/6e65c2cc084ecfc393c67a2f64639e8d08d325f6/deepspeed/runtime/zero/stage2.py

在 DeepSpeed 中设置完毕后,使用 ZeRO-Offload 就不需要太多额外的工作了,只需要修改一些标志和配置文件。

目前,Hugging Face 的 transformers 库与 DeepSpeed 进行了实验性集成,使用方法和基准测试结果参见:
https://huggingface.co/blog/zero-deepspeed-fairscale

Facebook 研究院的 fairscale 有 ZeRO 的部分实现,ZeRO-Offload 正是基于 ZeRO 这一多 GPU 内存优化方法构建的。目前还不支持 CPU 卸载。

ZeRO-Offload 的工作原理

ZeRO-Offload 是基于 Zero Redundancy Optimizer (ZeRO) 构建的。ZeRO 是微软在 2020 年 2 月提出的一种万亿级模型参数训练方法,用于数据并行和模型并行训练中的内存优化,其中梯度、参数和优化器状态分布在多 GPU 内存中,没有任何冗余。这使得 GPU 之间的通信开销保持在比较低的状态。

▲与标准数据并行基准相比,ZeRO 在三个阶段中节省的内存和通信用量

让我们来回顾一下 ZeRO:

为了解决数据并行和模型并行存在的问题,ZeRO 提供了三阶段的优化方法,分别为优化器状态分割、梯度分割、参数分割,三个阶段按顺序实施。

  1. 在优化器分割状态:ZeRO 降低了 3/4 的内存,通信量和数据并行相同;

  2. 加入梯度分割:降低了 7/8 的内存,通信量和数据并行相同;

  3. 加入参数分割:内存减少与数据并行度呈线性关系。例如,在 64 个 GPU 上进行分割的时候,可以将内存降至 1/64。在通信量上有 50% 的提升。

在去年 9 月份的博客中,微软这么介绍 ZeRO-Offload:

ZeRO-Offload 继承了 ZeRO-2 的优化器状态和梯度分割。但与 ZeRO-2 不同的是,ZeRO-Offload 不在每块 GPU 上保持优化器状态和梯度的分割,而是将二者卸载至主机 CPU 内存。在整个训练阶段,优化器状态都保存在 CPU 内存中;而梯度则在反向传播过程中在 GPU 上利用 reduce-scatter 进行计算和求均值,然后每个数据并行线程将属于其分割的梯度平均值卸载到 CPU 内存中(参见下图 g offload),将其余的抛弃。一旦梯度到达 CPU,则每个数据并行线程直接在 CPU 上并行更新优化器状态分割(参见下图 p update)。
之后,将参数分割移回 GPU,再在 GPU 上执行 all-gather 操作,收集所有更新后的参数(参见下图 g swap)。ZeRO-Offload 还利用单独的 CUDA 流来穷尽通信与计算中的重叠,从而最大化训练效率。

▲ZeRO-Offload 概览

值得注意的是,ZeRO-Offload 专为使用 Adam 的混合精度训练而设计。也就是说,当前版本的 ZeRO-Offload 使用 Adam 的优化版本 DeepCPUAdam。其主要原因是避免 CPU 计算成为整个过程中的瓶颈。DeepCPUAdam 的速度是 Adam PyTorch 实现的 6 倍。

实验结果

最后来看一下 ZeRO-Offload 论文中提供的一些实验结果。

下图 7 展示了利用 ZeRO-Offload 技术在 1 个、4 个或 16 个 GPU(一个 DGX-2)上可以训练的最大模型情况。

下图 11 展示了每个 GPU 的吞吐量随 GPU 数量增加而呈现的变化情况。可以看出,在 GPU 数量逐渐增加至 128 个的过程中,ZeRO-Offload 几乎可以实现吞吐量的线性加速。

下图 8 展示了使用 PyTorch、L2L 和 ZeRO-Offload 实现的每个 GPU 吞吐量差异。从中可以看出,利用 ZeRO-Offload 实现的每个 GPU 吞吐量比 L2L 平均高出 14%(最多高出 22%)。


后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

 

[1]https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650806702&idx=1&sn=09c8b424faa9c80a902f746c38afd7c5&scene=21#wechat_redirect

[2]https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650780231&idx=4&sn=2442d9bd2eb90943bbcc77966ac581dd&chksm=871a7639b06dff2f9018e05093c2b9437928b23d61719dd56c11e7188abc49d2c65bfc21ccae&scene=21#wechat_redirect

[3]https://efficientdl.com/an-introduction-to-zero-offloading/

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

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

相关文章

技术年货:美团技术沙龙合辑大放送——85个演讲,70+小时视频

你好,2019 再见,2018 又到了一年辞旧迎新的时候,大家应该也和美美一样,在忙着总结回顾和展望规划吧。 按老惯例,我们该献上技术年货了。今年首先出场的,是我们的技术沙龙大套餐! 美团技术沙龙是…

LeetCode 442. 数组中重复的数据

1. 题目 给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗? 示例:输入:…

如何恢复在 PyCharm 中误删的整个项目文件

如何恢复在 PyCharm 中误删的整个项目文件 方案1: 在误删项目的原始文件地址下新建相同文件名的空文件夹,即新文件夹与被误删项目的路径相同. 在 PyCharm 中打开该新文件夹,右键文件夹,点击 Local History 下的 Show History. 页面左侧为删除的文件信息(时间等),点击文件名右…

征稿 | ​2020年全国知识图谱与语义计算大会

China Conference on Knowledge Graph and Semantic Computing(CCKS 2020)www.sigkg.cn/ccks2020征稿启事(第二轮)2020年8月15日-18日,南昌征稿截止: 2020年5月21日第十四届全国知识图谱与语义计算大会(CCKS: China Conference o…

新手福利:百度官方中文教程,过年也要深度学习!

很多小伙伴在后台给我留言,零基础如何入门深度学习?想要做算法工程师,自学了python基础,现在还来得及吗?这个问题很大。很难说一篇文章几句话就能解决这个问题。今天我给大家说一下自己的一些个人经验,比较…

LeetCode 232. 用栈实现队列(双栈法-队列)

1. 题目 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 来源:力扣(LeetCode) 链接:https://le…

论文浅尝 | Tree-to-sequence 学习知识问答

论文笔记整理:谭亦鸣,东南大学博士生,研究兴趣:知识图谱问答。来源:Neurocomputing 372: 64-72 (2020)链接:https://sciencedirect.xilesou.top/science/article/abs/pii/S0925231219312639对于知识图谱问答…

别再搞纯文本了!多模文档理解更被时代需要!

文 | Ryan都已经2021年了,互联网已经今非昔比,20年前纯文本的日子已经一去不复返,文字已经满足不了网页、文章的需求,绝大部分都会有着精心设计的表格、图片,甚至视频。PDF文档这种富文本格式拥有更加复杂的结构信息&a…

iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久。如果在开发、测试阶段能够提前暴露问题,就有助于避免线上事故的发生。代码覆盖率检测正是帮助开发、测试同学提前发现问题,保证代码质量…

LeetCode 199. 二叉树的右视图(DFS 按层queue)

文章目录1. 题目2. 解题2.1 DFS2.2 queue按层从右边遍历1. 题目 给定一棵二叉树&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例:输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释:1 <--…

论文浅尝 | 中科院百度微软等学者最新综述论文40+最新方法阐述知识图谱提升推荐系统准确性与可解释性...

本文转载自公众号&#xff1a;先知。【导读】近来&#xff0c;知识图谱用于推荐系统是关注的焦点&#xff0c;能够提升推荐系统的准确性与可解释性。如何将知识图谱融入到推荐系统呢? 最近中科院计算所百度微软等学者最新综述论文《A Survey on Knowledge Graph-Based Recomm…

美团酒旅起源数据治理平台的建设与实践

背景 作为一家高度数字化和技术驱动的公司&#xff0c;美团非常重视数据价值的挖掘。在公司日常运行中&#xff0c;通过各种数据分析挖掘手段&#xff0c;为公司发展决策和业务开展提供数据支持。 经过多年的发展&#xff0c;美团酒旅内部形成了一套完整的解决方案&#xff0c;…

LeetCode 1103. 分糖果 II

1. 题目 排排坐&#xff0c;分糖果。 我们买了一些糖果 candies&#xff0c;打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果&#xff0c;第二个小朋友 2 颗&#xff0c;依此类推&#xff0c;直到给最后一个小朋友 n 颗糖果。 然后&#xff0c;我…

计算广告与推荐系统有哪些区别?

文 | King James本文已获作者授权&#xff0c;禁止二次转载计算广告和推荐系统总感觉有千丝万缕的关系&#xff0c;但是它们之间又有什么异同呢&#xff1f;话不多说&#xff0c;上图&#xff01;计算广告和推荐系统有交集&#xff0c;但是不能说推荐系统是计算广告的一部分。因…

解决cuda版本与pytorch版本不兼容问题

解决PyTorch与CUDA版本不匹配&#xff1a; 2 pytorch官网查看安装命令 https://pytorch.org/get-started/locally/ 如果你发现你的版本与上面的都不符合&#xff0c;可以点击 进入以前版本页面&#xff1a;https://pytorch.org/get-started/previous-versions/的安装命令&am…

论文浅尝 | 重新实验评估知识图谱补全方法

论文作者&#xff1a;Farahnaz Akrami&#xff0c;美国德州大学阿灵顿分校&#xff0c;博士生。笔记整理&#xff1a;南京大学&#xff0c;张清恒&#xff0c;硕士生。链接&#xff1a;https://arxiv.org/pdf/2003.08001.pdf代码&#xff1a;https://github.com/idirlab/kgcomp…

Android组件化方案及组件消息总线modular-event实战

背景 组件化作为Android客户端技术的一个重要分支&#xff0c;近年来一直是业界积极探索和实践的方向。美团内部各个Android开发团队也在尝试和实践不同的组件化方案&#xff0c;并且在组件化通信框架上也有很多高质量的产出。最近&#xff0c;我们团队对美团零售收银和美团轻收…

我,大学没毕业,在OpenAI搞AI,想教教你如何提升“研究品味”

文 | 蒋宝尚源 | AI科技评论在AI圈里有这么一个人&#xff0c;虽然大学没有毕业&#xff0c;但却做过谷歌大脑研究员&#xff0c;担任过OpenAI团队的领导人。他被人称作“怪胎”&#xff0c;也被人称作神童。他的名字叫做Chris Olah。在众人眼里&#xff0c;他的成长树在一开始…

LeetCode 889. 已知前序后序 求二叉树(不唯一)

1. 题目 返回与给定的前序和后序遍历匹配的任何二叉树。 pre 和 post 遍历中的值是不同的正整数。 示例&#xff1a;输入&#xff1a;pre [1,2,4,5,3,6,7], post [4,5,2,6,7,3,1] 输出&#xff1a;[1,2,3,4,5,6,7]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

论文浅尝 | TANDA: Transfer and Adapt Pre-Trained Transformer Models

论文笔记整理&#xff1a;王春培&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/1911.04118.pdf动机这篇文章聚焦的是问答系统&#xff08;Q&A&#xff09;中的一个问题&#xff1a;回答句子选择&#xff08;Answer Sentence Selection&#xff0c;AS2&…