如图所示,PS架构将计算节点分为server与worker,其中,worker用于执行网络模型的前向与反向计算。而server则对各个worker发回的梯度进行合并并更新模型参数,对深度学习模型参数中心化管理的方式,非常易于存储超大规模模型参数。
但是随着模型网络越来越复杂,对算力要求越来越高,在数据量不变的情况下,单个GPU的计算时间是有差异的,并且网络带宽之间并不平衡,会存在部分GPU计算得比较快,部分GPU计算得比较慢。这个时候如果使用异步更新网络模型的参数,会导致优化器相关的参数更新出现错乱。而使用同步更新则会出现阻塞等待网络参数同步的问题。
GPU 强大的算力毋庸置疑可以提升集群的计算性能,但随之而来的是,不仅模型规模会受到机器显存和内存的制约,而且通信带宽也会由于集群网卡数量降低而成为瓶颈。
这个时候百度基于PS架构之上提出了Ring-All-Reduce新的通讯架构方式。
如图所示,通过异步流水线执行机制,隐蔽了 IO 带来的额外性能开销,在保证训练速度的同时,使训练的模型大小不再受制于显存和内存,极大提升模型的规模。而 RPC&NCCL 混合通信策略可以将部分稀疏参数采用 RPC 协议跨节点通信,其余参数采用卡间 NCCL 方式完成通信,充分利用带宽资源。
集合通讯模式
04
- PipeDream: Fast and Efficient Pipeline Parallel DNN Training.
微软研究院宣布了Fiddle项目的创立,其包括了一系列的旨在简化分布式深度学习的研究项目。PipeDreams是Fiddle发布的第一个侧重于深度学习模型并行训练的项目之一。其主要采用“流水线并行”的技术来扩展深度学习模型的训练。在 PipeDream 中主要克服流水线并行化训练的挑战,算法流程主要如下。首先,PipeDream 必须在不同的输入数据间,协调双向流水线的工作。然后,PipeDream 必须管理后向通道里的权重版本,从而在数值上能够正确计算梯度,并且在后向通道里使用的权重版本必须和前向通道里使用的相同。最后,PipeDream 需要流水线里的所有 stage 都花费大致相同的计算时间,这是为了使流水线得到最大的通量。
- GPipe: Easy Scaling with Micro-Batch Pipeline Parallelism.
GPipe是Google发明的论文,专注于通过流水线并行扩展深度学习应用程序的训练负载。GPipe 把一个L层的网络,切分成 K个 composite layers。每个composite layer 运行在单独的TPU core上。这K个 core composite layers只能顺序执行,但是GPipe引入了流水并行策略来缓解这个顺序执行的性能问题,把 mini-batch细分为多个更小的macro-batch,提高并行程度。GPipe 还用recomputation这个简单有效的技巧来降低内存,进一步允许训练更大的模型。
- Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism.
- Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM.
出自NVIDIA,虽然这两篇文章都是在讲Megatron网络模型,实际上里面展开的都是模型并行等多维度并行的相关的技术点。其中第一篇论文共有两个主要的结论:1,利用数据和模型并行的分布式技术训练了具有3.9B参数的BERT-large模型,在GLUE的很多数据集上都取得了SOTA成绩。同时,还训练了具有8.3B参数的GPT-2语言模型,并在数据集Wikitext103,LAMBADA,RACE都上取得SOTA成绩。这篇论文,一方面体现了算力的重要性,另一方面体现了模型并行和数据并行技术关键性。这两项优化技术在加速模型训练和推断过程中至关重要。
05
- Attention is all you need.
Google首创的Transformer大模型,是现在所有大模型最基础的架构,现在Transformer已经成为除了MLP、CNN、RNN以外第四种最重要的深度学习算法架构。谷歌在arxiv发了一篇论文名字教Attention Is All You Need,提出了一个只基于attention的结构来处理序列模型相关的问题,比如机器翻译。传统的神经机器翻译大都是利用RNN或者CNN来作为encoder-decoder的模型基础,而谷歌最新的只基于Attention的Transformer模型摒弃了固有的定式,并没有用任何CNN或者RNN的结构。该模型可以高度并行地工作,所以在提升翻译性能的同时训练速度也特别快。
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.
Google发布的首个预训练大模型BERT,从而引爆了预训练大模型的潮流和趋势,这个不用介绍大家肯定有所听闻啦。BERT的全称为Bidirectional Encoder Representation from Transformers,是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的masked language model(MLM),以致能生成深度的双向语言表征。BERT论文发表时提及在11个NLP(Natural Language Processing,自然语言处理)任务中获得了新的state-of-the-art的结果,令人目瞪口呆。
- An Image is Worth 16x16 Words: transformer for Image Recognition at Scale.
ViT Google提出的首个使用Transformer的视觉大模型,基本上大模型的创新算法都是出自于Google,不得不服。ViT作为视觉转换器的使用,而不是CNN或混合方法来执行图像任务。结果是有希望的但并不完整,因为因为除了分类之外的基于视觉的任务:如检测和分割,还没有表现出来。此外,与Vaswani等人(2017年)不同,与CNN相比,transformer 性能的提升受到的限制要大得多。作者假设进一步的预训练可以提高性能,因为与其他现有技术模型相比,ViT具有相对可扩展性。
- GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding.
好像G开头的模型都是Google的了一样魔性。在 ICLR 2021 上,Google 的进一步将 MoE 应用到了基于 Transformer 的神经机器翻译的任务上。GShard 将 Transformer 中的 Feedforward Network(FFN)层替换成了 MoE 层,并且将 MoE 层和数据并行巧妙地结合起来。在数据并行训练时,模型在训练集群中已经被复制了若干份。GShard 通过将每路数据并行的 FFN 看成 MoE 中的一个专家来实现 MoE 层,这样的设计通过在多路数据并行中引入 All-to-All 通信来实现 MoE 的功能。
具有里程碑意义性的大模型
- GPT-3: Language Models are Few-Shot Learners.
OpenAI发布的首个百亿规模的大模型,应该非常具有开创性意义,现在的大模型都是对标GPT-3。GPT-3依旧延续自己的单向语言模型训练方式,只不过这次把模型尺寸增大到了1750亿,并且使用45TB数据进行训练。同时,GPT-3主要聚焦于更通用的NLP模型,解决当前BERT类模型的两个缺点:对领域内有标签数据的过分依赖:虽然有了预训练+精调的两段式框架,但还是少不了一定量的领域标注数据,否则很难取得不错的效果,而标注数据的成本又是很高的。对于领域数据分布的过拟合:在精调阶段,因为领域数据有限,模型只能拟合训练数据分布,如果数据较少的话就可能造成过拟合,致使模型的泛华能力下降,更加无法应用到其他领域。
- T5: Text-To-Text Transfer Transformer.
Google把T5简单的说就是将所有 NLP 任务都转化成Text-to-Text(文本到文本)任务。对于T5这篇论文,很Google的一篇文章啦,让我也很无力,毕竟财大气粗之外,还有想法,这就是高富帅。回到论文本身,T5意义不在烧了多少钱,也不在屠了多少榜,其中idea创新也不大,它最重要作用是给整个NLP预训练模型领域提供了一个通用框架,把所有任务都转化成一种形式。
- Swin Transformer: Hierarchical Vision Transformer using Shifted Windows.
微软亚研提出的Swin Transformer的新型视觉Transformer,它可以用作计算机视觉的通用backbone。在两个领域之间的差异,例如视觉实体尺度的巨大差异以及与文字中的单词相比,图像中像素的高分辨率,带来了使Transformer从语言适应视觉方面的挑战。
超过万亿规模的稀疏大模型
- Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts.
Google发布的多任务MoE。多任务学习的目的在于用一个模型来同时学习多个目标和任务,但常用的任务模型的预测质量通常对任务之间的关系很敏感(数据分布不同,ESMM 解决的也是这个问题),因此,google 提出多门混合专家算法(Multi-gate Mixture-of-Experts)旨在学习如何从数据中权衡任务目标(task-specific objectives)和任务之间(inter-task relationships)的关系。所有任务之间共享混合专家结构(MoE)的子模型来适应多任务学习,同时还拥有可训练的门控网路(Gating Network)以优化每一个任务。
- Switch transformers: Scaling to trillion parameter models with simple and efficient sparsity.
Google重磅推出首个万亿参数的超大规模稀疏语言模型Switch Transformer。声称他们能够训练包含超过一万亿个参数的语言模型的技术。直接将参数量从GPT-3的1750亿拉高到1.6万亿,其速度是Google以前开发的语言模型T5-XXL的4倍。
06
AdaFactor,一个由Google提出来的新型优化器,AdaFactor具有自适应学习率的特性,但比RMSProp还要省显存,并且还针对性地解决了Adam的一些缺陷。说实话,AdaFactor针对Adam所做的分析相当经典,值得我们认真琢磨体味,对有兴趣研究优化问题的读者来说,更是一个不可多得的分析案例。
- ZeRO: Memory Optimization Towards Training A Trillion Parameter Models Samyam.
微软提出很经典很经典的一个算法了,为了这个算法还基于Pytroch开发了一个分布式并行DeepSpeed框架。现有普遍的数据并行模式下的深度学习训练,每一台机器都需要消耗固定大小的全量内存,这部分内存和并不会随着数据的并行而减小,因而,数据并行模式下机器的内存通常会成为训练的瓶颈。这篇论文开发了一个Zero Redundancy Optimizer (ZeRO),主要用于解决数据并行状态下内存不足的问题,使得模型的内存可以平均分配到每个gpu上,每个gpu上的内存消耗与数据并行度成反比,而又基本不影响通信效率。
- Mixed precision training.
混合精度的文章,参考ZOMI酱写得全网最全-混合精度训练原理啦,里面的内容都在文章中。
- Parameter Server for Distributed Machine Learning.
亚马逊首席科学家李沐在读书时期发表的文章。工业界需要训练大型的机器学习模型,一些广泛使用的特定的模型在规模上的两个特点:1. 深度学习模型参数很大,超过单个机器的容纳能力有限;2. 训练数据巨大,需要分布式并行提速。这种需求下,当前类似Map Reduce的框架并不能很好适合。于是李沐大神在OSDI和NIPS上都发过文章,其中OSDI版本偏向于系统设计,而NIPS版本偏向于算法层面。关于深度学习分布式训练架构来说是一个奠基性的文章。
- More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server.
- GeePS: Scalable deep learning on distributed GPUs with a GPU-specialized parameter server.
分布式深度学习可以采用BSP和SSP两种模式。1为SSP通过允许faster worker使用staled参数,从而达到平衡计算和网络通信开销时间的效果。SSP每次迭代收敛变慢,但是每次迭代时间更短,在CPU集群上,SSP总体收敛速度比BSP更快,但是在GPU集群上训练,2为BSP总体收敛速度比SSP反而快很多。
- Bandwidth Optimal All-reduce Algorithms for Clusters of Workstations.
- Bringing HPC Techniques toDeep Learning.
百度在17年的时候联合NVIDIA,提出了ring-all-reduce通讯方式,现在已经成为了业界通讯标准方式或者是大模型通讯的方式。过去几年中,神经网络规模不断扩大,而训练可能需要大量的数据和计算资源。为了提供所需的计算能力,我们使用高性能计算(HPC)常用的技术将模型缩放到数十个GPU,但在深度学习中却没有充分使用。这种ring allreduce技术减少了在不同GPU之间进行通信所花费的时间,从而使他们可以将更多的时间花费在进行有用的计算上。在百度的硅谷AI实验室(SVAIL)中,我们成功地使用了这些技术来训练最先进的语音识别模型。我们很高兴将Ring Allreduce的实现发布为TensorFlow的库和补丁程序,并希望通过发布这些库,我们可以使深度学习社区更有效地扩展其模型。
MindSpore官方资料
GitHub : https://github.com/mindspore-ai/mindspore
Gitee : https : //gitee.com/mindspore/mindspore
官方QQ群 : 486831414