【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

快手八卦!突破 TensorFlow、PyTorch 并行瓶颈的开源分布式训练框架来了!

  • 2021-07-16
  • 本文字数:6345 字

    阅读完需:约 21 分钟

快手八卦!突破TensorFlow、PyTorch并行瓶颈的开源分布式训练框架来了!

近日,快手和苏黎世理工宣布开源分布式训练框架 Bagua(八卦),相比于 PyTorch、TensorFlow 等现有深度学习开源框架仅针对系统层面进行优化,Bagua 突破了这一点,专门针对分布式场景设计了特定的优化算法,实现了算法和系统层面的联合优化,性能较同类提升 60%。

研发背景


随着摩尔定律的失效,单个计算单元的能力已经远远无法满足数据的指数级增长。比如,快手每天上传的新视频超过千万条,即便训练简单的分类模型(比如 ResNet),使用单机单卡的算力,训练快手日内新增视频都需要超过一百天的时间。因此,在数据爆炸性增长的互联网行业,多机多卡的并行训练成为了大数据时代的必然。随着深度学习模型功能的日益强大,分布式训练任务的通信成本和所需算力也随之急剧增长。


然而,由于多机多卡并行带来的额外通讯成本,加速比(speedup)经常让大家失望,从而形成了大厂“堆资源”,没资源的“干瞪眼”的局面。比如,Google 的 Downpour 框架 [1] 使用 80 个 GPU 训练 ImageNet,加速比却只有 12/80=15%。因此如何提升多机多卡中训练的通讯效率成为了并行训练乃至解决数据爆炸性增长的核心问题之一。


项目 GitHub 地址:https://github.com/BaguaSys/bagua


现有的深度学习开源框架(PyTorch,TensorFlow)主要针对系统层面优化,把已有的单机单卡优化算法扩展到多机多卡的场景。虽然系统层面的优化使得并行效率不断提升,但是边际效益却越来越明显。针对这个问题,快手和苏黎世理工(ETH Zürich)联合开发了一款名为“Bagua”的分布式训练框架,突破单纯的系统层面优化,专门针对分布式的场景设计特定的优化算法,实现算法和系统层面的联合优化,极致化分布式训练的效率。用户只需要添加几行代码,便能把单机单卡训练扩展到多机多卡训练并得到非常可观的加速比。

Bagua 设计思路


从单机单卡的训练到多机多卡训练的核心,是每个卡把自己的计算结果进行累加和传播。这个过程好比每个人把自己知道的信息传递给他人,然后又从其他人那里获取信息,最后完成全局的信息同步。如果把计算单元之间的信息同步类比为人与人之间的信息同步,那么社会实践经验告诉我们,“八卦”可能是消息传递最高效的模式。“八卦”消息传播具有去中心化、异步通讯、信息压缩的特点,这与 Bagua 里面实现的通讯算法刚好一一呼应。


为了提升分布式训练效率,Bagua 实现了自研以及前沿的算法,包括去中心化/中心化、同步/异步以及通讯压缩等基础通讯组件,通过软硬结合的设计极致优化了这些组件的效率,并且灵活支持这些算法的组合,以及更复杂的算法设计。


Bagua 将通信过程抽象成了如下的算法选项:


  • 中心化或是去中心化(Centralized or Decentralized):在中心化的通讯模式中,梯度或模型的同步过程需要所有的工作节点进行参与,因此,较高的网络延时往往会导致训练效率的降低。去中心化的通信模式 [5,6] 往往可以有效的解决这一问题:在该模式下,工作节点可以被连接成特定的拓扑结构(例如环),在通信过程中,每一个工作节点只与和它相邻的节点进行通信。


  • 同步或是异步(Synchronous or Asynchronous):同步模式中,在每一次迭代过程中,所有工作节点都需要进行通信,并且下一步迭代必须等待当前迭代的通信完成才能开始。反之,异步式分布算法 [2] 则不需要等待时间:当某个节点完成计算后就可直接传递本地梯度,进行模型更新。


  • 完整精度模式或信息压缩模式(Full-Precision or Low-Precision):完整精度模式,会使用与本地模型相同的 32 位浮点数(float32)进行传输。另一方面,在通讯存在瓶颈的情况下,基于大量已有研究通过量化 (quantization [3]) 或稀疏化 (sparsification [4]) 等方法压缩梯度,再用压缩后的梯度更新参数。在很多场景下,可以达到和完整精度相同的精度,同时提升通讯效率。


虽然为了提升通讯效率,Bagua 没有依照传统的方式同步所有计算节点的结果,甚至每次同步的信息还有偏差,但是得益于最新理论上的进展,这几种通讯策略以及他们的组合最终收敛解的正确性和效率仍然能得到充分保证,而且计算复杂度跟同步中心化和信息无损的方法相当,但是通讯效率更高 [10]。



值得注意的是,在实践中,分布式训练算法往往会使用不止一种上述的优化方法,从而适配更为极端的网络环境 [7,8,9]。对于分布式算法感兴趣的读者,我们在这里推荐一份最新的完整综述报告 [10]。Bagua 提供了一套详尽的通信模式来支持用户在上述模式中任意选择组合,我们将这一分布式训练系统对于上述算法选项的支持情况总结在下表中:



从表格中不难看出,现有框架的优化只是针对较为通用的算法(中心化同步完整精度),对于其他的算法组合,这些系统的支持非常有限。对于中心化同步进行信息压缩,这些系统往往只能支持较为简单的 float32->float16 压缩,相较而言,Bagua 则可以支持更为复杂的 ByteGrad,QAdam 等算法。对于其他的算法组合,现有的框架通常无法支持,而 Bagua 则可以自由支持。


然而,简单地支持这项算法选项并不能直接在大规模集群上带来性能的提升。Bagua 的核心优势在于,为了追求极致化的性能,而实现算法和实现的联合优化。具体来讲,基于上述的通信层抽象,用户既可以方便得选择系统提供的各种算法组合从而获得性能提升,又能灵活得实现新的分布式 SGD 算法 —— Bagua 将自动为这一算法实现提供系统层优化。这些系统优化包含:


  • 将通讯时间隐藏在计算时间中:为了降低通信开销,Bagua 能够将部分通信时间隐藏在计算时间中。具体来讲,在反向梯度的计算过程中,部分已经完成的梯度可以在剩余梯度的计算过程中同时进行通信——通过这种流水的处理方式,部分通信时间可以被有效地“隐藏”在反向梯度的计算过程中,从而减小数据并行带来的通信开销。


  • 参数分桶及其内存管理:频繁的传输碎片化数据,会降低通信的效率。因此,Bagua 将模型参数分割成桶,并且分配连续的内存空间来对每一个桶进行管理,这样通讯的单位就变成了桶,从而能够更高效地利用通信模型。此外,由于支持了信息压缩算法,对于压缩和解压的函数,其操作的基本单位也是桶,这样也能使得这些操作的开销降低。


  • 分层化的通信实现:由于工业级别的分布式训练往往需要多机多卡,而不同物理连接方式所带来的延时和带宽也有较大差异,因此,通讯的有效抽象也对性能的提升至关重要。Bagua 将涉及多机的通信抽象成:“机内”和“机间”,并对于相应的通信抽象做了优化。例如,对于信息压缩传输,分层化通讯将会把这一算法解读成“机内”完整精度,“机间”信息压缩,从而为不同的物理链接提供最合适的通信算法。



我们想要强调的是,这些系统实现层面的优化是对于各种算法组合广泛适用,而非局限在某一特定的算法设置上。因此,所有的系统优化都可以被灵活的复用到各种算法实现中去,这在保证“端到端”的性能提升的同时,也为开发新的分布式算法提供了良好的平台。


经过实验,Bagua 的特点如下:


  • 并行性能显著提高:在 ImageNet 数据集上,相较当前开源分布式框架(PyTorch-DDP,Horovod,BytePS),当配置同样的算力(128GPU)与通信网络(100Gbps),达到相同的训练精度,Bagua 只需其他框架 80% 左右的时间;


  • 对网络环境更鲁棒:由于有效的支持了各类算法优化(信息压缩,异步,和去中心化),Bagua 在各类网络环境下(包括不同延时和带宽)都体现出了良好的适配性。尤其是在高延迟低带宽的情况下,Bagua 体现出比其他框架更优的加速比,比如:在 10Gbps 网络带宽环境下,同样的 ImageNet 任务,Bagua 只需其他框架 50% 左右的训练时间来达到同样的训练精度;


  • “一键式”使用:Bagua 对于端用户非常友好,现有利用 PyTorch 的模型都可以作为 Bagua 的输入,Bagua 将自动为其提供丰富的并行方案——只需增加几行代码,训练就可以运行在分布式集群上;


  • 分布式通讯算法易拓展性:Bagua 提供了针对算法的高拓展性,对于分布式优化算法的开发者,Bagua 提供了有效的通讯抽象,开发者实现的新算法也可以直接复用 Bagua 的系统优化;


  • 可用于工业级场景大规模使用:Bagua 为 Kubernetes 实现了定制化的 operator,支持云原生部署,同时考虑机器资源和故障问题,有机结合 PyTorch Elastic 和 Kubernetes 实现了容灾功能和动态训练扩缩容。用户可以通过使用 Bagua ,在少量机器空闲时就开始训练,在更多机器资源释放的情况下,训练任务自动扩容到更多机器。同时机器节点损坏时,自动剔除坏节点继续训练。方便工业级训练场景使用,也方便与机器学习平台结合使用;


  • 安全、故障易排查:Bagua 通讯后端由注重内存安全、速度和并发性的 Rust 语言实现,在编译期就排除了大量的内存安全问题。同时基于 tracing 实现了分模块、分层级的 log 输出,使得实际场景中故障排查更加轻松。


此外,Bagua 在快手内部也经过了工业级任务的实践检验,Bagua 已经在快手内部多个核心业务场景投入使用,相较其他开源框架取得了显著的性能提升:


  • 大规模自然语言处理(GPT2-xl 量级大小的模型),提升效率 65%

  • 大规模图像识别(10+ 亿图像 / 视频),提升效率 20%~30%

  • 大规模语音识别(TB 级别语音资料),提升效率 20%~30%

  • 大规模推荐系统(万亿级别参数模型训练,支持亿级别 DAU 的应用),提升效率 100% 以上


Bagua 和其他开源方案的性能对比


快手选用了包括图像,文本,语音,图像文本混合等多个训练任务对 Bagua 的性能进行测试,并与 PyTorch-DDP,Horovod,BytePS 进行比较。得益于 Bagua 系统的高效性和算法的多样性,Bagua 可以在不同任务中选用相应最优的算法,从而保证在训练精度和其他系统持平的前提下,训练速度明显提高。值得注意的是,当网络状况不佳时,Bagua 系统的优势将更加明显。下面我们选取 GPT2-XL,BERT-Large 和 VGG16 三个典型的通信密集型任务进行对比说明,更多结果可在 Bagua 论文和网站中(https://github.com/BaguaSys/bagua)进一步了解。


1. End-to-end 训练时间对比


下图展示了在 128 个 V100 GPU 上 fine-tune BERT-Large (SQuAD 数据集),模型 F1 精度随训练时间的变化曲线。Bagua 使用 QAdam-1bit 算法加速,机器之间采用 100Gbps TCP/IP 网络互联。我们可以看到,即使在高速网络下,达到相同的训练精度,Bagua 需要的时间仅为其他系统的 60%。



2. 扩展性对比


下图展示了各个系统在 VGG16 模型(ImageNet 数据集)上的训练速度与 GPU 数量之间的关系。在测试中分别使用了 1,8,16,32,64,128 个 V100 GPU 进行测试。该任务中 Bagua 使用 8bitsGrad 算法加速。可以看出 Bagua 的扩展效率相比其他系统有较明显的提升。



下图展示了各个系统在 GPT2-XL 模型上的训练速度与 GPU 数量之间的关系。GPT2-XL 模型有 1.5 billion 参数,在大模型中具有一定代表性。Bagua 使用 8bitsGrad 算法加速。在测试中分别使用了 8,16,32,64,80 个 V100 GPU 进行测试。同样可以看出 Bagua 的扩展效率相比其他系统有较明显的提升。



3. 不同网络环境对比


算法是 Bagua 的灵魂。当网络环境变化时,不同的算法会表现出不同的性能特点。在下图中,我们以 BERT-Large fine-tune 为例,调整机器之间网络的带宽和延迟,对比 Bagua 中各个算法的 epoch 时间。可以看出,随着带宽降低,压缩算法的优势会越来越明显,且和压缩程度相关;当延迟逐渐升高,去中心化算法逐渐展现出优势。除此之外,当网络环境不佳时,Bagua 对比其他系统的优势也进一步扩大。



Bagua 使用实例


在已有的训练脚本中使用 Bagua 非常简单,在代码中算法使用者只需要增加如下几行代码对已有模型进行初始化操作即可。以使用 GradientAllReduce 算法为例:


首先,我们需要 import 一下 bagua


import bagua.torch_api as bagua
复制代码


随后,我们可以初始化 Bagua 的进程组:


torch.cuda.set_device(bagua.get_local_rank())bagua.init_process_group()
复制代码


对于数据集的初始化,Bagua 完全兼容 PyTorch 的实现:


train_dataset = ...test_dataset = ...train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset,    num_replicas=bagua.get_world_size(), rank=bagua.get_rank())train_loader = torch.utils.data.DataLoader(    train_dataset,    batch_size=batch_size,    shuffle=(train_sampler is None),    sampler=train_sampler,)test_loader = torch.utils.data.DataLoader(test_dataset, ...)
复制代码


最后,用户只需要选择要训练的模型和优化器即可以使用 bagua:


# 定义模型model = ...model = model.cuda()# 定义优化器optimizer = ...# 选择 Bagua 算法来使用from bagua.torch_api.algorithms import gradient_allreduce# 实例化 Bagua 算法algorithm = gradient_allreduce.GradientAllReduceAlgorithm()# 对现有模型启用 Bagua 算法model = model.with_bagua(    [optimizer], algorithm)
复制代码


这样,使用 Bagua 的多机多卡训练算法就实现完成了。完整例子和更多场景,欢迎参考 Bagua Tutorial 文档(https://github.com/BaguaSys/bagua)。


论文: https://arxiv.org/abs/2107.01499


项目 GitHub 地址:https://github.com/BaguaSys/bagua


参考文献


[1] Dean, Jeffrey, Greg S. Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Quoc V. Le, Mark Z. Mao et al. “Large scale distributed deep networks.” (2012).


[2] Zhengyuan Zhou, Panayotis Mertikopoulos, Nicholas Bambos, Peter Glynn, Yinyu Ye, Li-Jia Li, and Li Fei-Fei. 2018. Distributed asynchronous optimization with unbounded delays: How slow can you go?. In International Conference on Machine Learning. PMLR, 5970–5979.


[3] DanAlistarh, DemjanGrubic, JerryLi, RyotaTomioka, and MilanVojnovic. 2016. QSGD: Communication-efficient SGD via gradient quantization and encoding. arXiv preprint arXiv:1610.02132 (2016).


[4] Dan Alistarh, Torsten Hoefler, Mikael Johansson, Sarit Khirirat, Nikola Konstanti- nov, and Cédric Renggli. 2018. The convergence of sparsified gradient methods. In Proceedings of the 32nd International Conference on Neural Information Processing Systems. 5977–5987.


[5] Anastasia Koloskova, Sebastian Stich, and Martin Jaggi. 2019. Decentralized stochastic optimization and gossip algorithms with compressed communication. In International Conference on Machine Learning. PMLR, 3478–3487.


[6] Xiangru Lian, Ce Zhang, Huan Zhang, Cho-Jui Hsieh, Wei Zhang, and Ji Liu. 2017. Can decentralized algorithms outperform centralized algorithms? a case study for decentralized parallel stochastic gradient descent. In Proceedings of the 31st International Conference on Neural Information Processing Systems. 5336–5346.


[7] Christopher De Sa, Matthew Feldman, Christopher Ré, and Kunle Olukotun. 2017. Understanding and optimizing asynchronous low-precision stochastic gradient descent. In Proceedings of the 44th Annual International Symposium on Computer Architecture. 561–574.


[8] Xiangru Lian, Wei Zhang, Ce Zhang, and Ji Liu. 2018. Asynchronous decentral- ized parallel stochastic gradient descent. In International Conference on Machine Learning. PMLR, 3043–3052.


[9] Hanlin Tang, Shaoduo Gan, Ce Zhang, Tong Zhang, and Ji Liu. 2018. Com- munication compression for decentralized training. In Proceedings of the 32nd International Conference on Neural Information Processing Systems. 7663–7673.


[10] Ji Liu, Ce Zhang, et al. 2020. Distributed Learning Systems with First-Order Methods. Foundations and Trends® in Databases 9, 1 (2020), 1–100.

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2021-07-16 14:004069

评论

发布
暂无评论
发现更多内容

80 行代码实现简易 RxJS

CRMEB

java培训:Java类加载机制的理解

@零度

JAVA开发 类加载机制

混合编程:如何用pybind11调用C++

华为云开发者联盟

c++ Python API 混合编程 pybind11

web前端培训:vue3源码中细节知多少

@零度

Vue 前端开发

一个关于 += 的谜题

AlwaysBeta

Python 编程语言

混合云管平台哪家强?采购时候需要注意什么?

行云管家

混合云 云管平台

移动开发er,10万奖金等你来战!

Speedoooo

活动 前端开发 移动开发 黑客马拉松 黑客松

乘冬奥之风:北京2022年冬奥会用户信息获取偏好专题分析

易观分析

冬奥会用户分析

产品经理:「点这里,我要跳到任何我想跳的页面」—— 解耦提效神器「统跳路由」

百瓶技术

ios 前端 客户端 路由

7大迹象,表明你的DevOps 做对了!

SoFlu软件机器人

2022重磅:增长法则-巧用数字营销 突破企业困局

博文视点Broadview

郑州轻工业大学——HarmonyOS宠物健康系统的开发分享

HarmonyOS开发者

HarmonyOS 健康检查

基于 Kafka 的实时数仓在搜索的实践应用

vivo互联网技术

kafka 服务器 搜索 数据舱

ModStartCMS模块化建站系统 v3.3.0 组件功能升级,事件触发增强

ModStart开源

“pip不是内部或外部命令,也不是可运行的程序或批处理文件” 到底有多么神秘

华为云开发者联盟

Python pip 批处理 scripts pip install

鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭

阿里巴巴云原生

阿里云 开源 RocketMQ 云原生 开源消息队列

Hudi Bucket Index 在字节跳动的设计与实践

字节跳动数据平台

数据库 字节跳动 数据湖 Hudi

oracle数据库审计用什么数据库审计软件好?可以用什么方式部署?

行云管家

数据库 IT运维 数据库审计

大数据培训:Flink的提交模式

@零度

大数据 flink

理论+实践,带你掌握动态规划法

华为云开发者联盟

AI 算法 动态规划法 子问题

模块八作业

黄秀明

「架构实战营」

Android技术分享| 【你画我猜】Android 快速实现

anyRTC开发者

音视频 移动开发 互动白板 Andriod 你画我猜

优化| 手把手教你学会杉数求解器(COPT)的安装、配置与测试

杉数科技

线性规划 求解器 优化求解器 混合整数规划 杉数科技

分享两个常见的搜索算法:BFS和DFS

华为云开发者联盟

算法 DFS 深度优先搜索 BFS 搜索算法

喜报!龙蜥操作系统&龙蜥社区双双荣登2021“科创中国”开源创新榜!

OpenAnolis小助手

开源 操作系统 创新

互联网人的命运,就是活到30岁都难?

码农参上

人生 互联网人 打工人

云效发布策略指南|滚动、分批、灰度怎么选?

阿里云云效

云计算 阿里云 云原生 持续交付 发布策略

2022年中国智慧医疗行业洞察

易观分析

智慧医疗

边缘计算场景下Service Mesh的延伸和扩展

华为云原生团队

开源 边缘计算 边缘技术 边缘 边缘云

如何通过 draftjs 设计留言框

全象云低代码

前端 低代码 留言 draftjs 留言框

极致用云,数智护航

阿里云云效

阿里云 DevOps 运维 云原生 运维安全

快手八卦!突破TensorFlow、PyTorch并行瓶颈的开源分布式训练框架来了!_AI&大模型_快手AI平台_InfoQ精选文章