深度学习框架作为基础软件,不只促成了深度学习技术的飞速提高,更为人工智能技术的宽泛运行铺设了松软的基础。
深度学习框架为开发者提供了方便易用的开发接口,这些接口对数据和操作启动了高度形象,使得开发者能够更专一于算法和模型的设计,而不用深陷底层数据的处置细节。经过这些接口,开发者无需间接感知和应答复杂的配件底层开发细节,从而极大地优化了开发效率和体验。其次深度学习框架还提供了智能微分这一弱小性能,开发者通常只要要编写前向流传网络的代码,而繁琐的反向流传网络则交由框架智能成功。
飞桨作为中国首个自主研发、性能丰盛、开源放开的深度学习平台,从自动经常使用静态图的1.0版本,到自动驳回灵活图并可成功动态一致与训推一体的2.0版本颁布,飞桨框架曾经可以完美融合灵活图的灵敏性与静态图的高效性,并允许模型的混兼并行训练;再到近日,为大模型时代而锻炼的3.0版本的正式出炉!飞桨正式开启了新一代框架技术翻新之路!
深度学习框架的设计关于推进人工智能技术的开展至关关键,其**设计指标是让深度学习技术的翻新与运行更方便。
框架须要充沛思考开发者和配件厂商的需求。
从用户角度登程,一个低劣的深度学习框架应当为开发者提供极致的开发体验。这不只仅象征着提供一个用户友好的开发环境,更关键的是要能够大幅度缩小开发者的学习老本和期间老本,同时清楚优化开发的便利性。为此,飞桨框架提出了“动态一致、训推一体、智能并行”的理念,极大地提高了开发效率。
从配件适主角度登程,现代深度学习运行往往须要在多样化的配件平台上运转,因此,框架必定能够兼容并适配各种不同的配件设备。这要求框架能够智能地隔离不同配件接口之间的差异,成功宽泛的配件适配性。同时,为了充散施展配件的性能,框架还须要具有软配件协同上班的才干,确保在应用配件资源时能够到达最优的性能体现。
与此同时,好的框架还须要思考到 AI 技术开展的全体趋向、产业的实践落地运行的需求。
技术开展层面,大言语模型(Large Language Model,简称LLM)、 MOE(Mixture of Experts)、多模态以及迷信智能(AI for Science)等前沿技术逐渐成为新的钻研热点。随着模型复杂性的参与,计算瓶颈、存储瓶颈、访存瓶颈以及通讯瓶颈等疑问逐渐凸显,对散布式训练和通用性能优化的需求日益迫切。
在产业化层面,框架又须要具有允许训练、紧缩、推理一体化的全流程才干。这象征着,从模型的训练到优化,再到实践部署和推理,框架应当提供一套完整、高效的处置打算,才干满足产业界关于深度学习技术的实践需求。
只要跟得上趋向、经得住打磨的框架,才干为产学研各界开发者提供继续稳固的允许。
飞桨框架3.0的设计理念和关键特征
综上需求,飞桨将为开发者提供一个“动态一致、训推一体、智能并行、智能优化、宽泛配件适配”的深度学习框架,开发者可以像写单机代码一样写散布式代码,无需感知复杂的通讯和调度逻辑,即可成功大模型的开发;可以像写数学公式一样用 Python 言语写神经网络,无需经常使用配件开发言语编写复杂的算子内核代码,即可成功高效运转。
飞桨框架 3.0 版本应运而生,间断了2.x 版本动态一致、训推一体的设计理念,其开发接口片面兼容2.x 版本。这象征着,经常使用2.x 版本开发的代码,在绝大少数状况下无需修正,即可间接在3.0版本上运转。着重推出了动态一致智能并行、编译器智能优化、大模型训推一体、大模型多配件适配四大新个性。这些个性在飞桨框架2.6版本或更早版本时就曾经开局开发,目前已到达外部可试用的阶段。这些新个性在经常使用体验、性能、二次开发便利度以及配件适配才干等方面带来了清楚优化,飞桨正式颁布3.0版本。此版本蕴含了对框架2.x 版本局部已有性能的改良,并且在不经常使用新个性的状况下,体现成熟稳固。
为了成功深度学习框架的上述个性,必定对框架的架构启动精心设计,确保其能够允许各种复杂的模型构建,同时与多样化的芯片成功无缝对接。接上去,将经过直观的架构图,详细展现飞桨新一代框架内所涵盖的性能模块,以及这些模块之间的相互作用与咨询。以下为飞桨框架3.0的架构图。
丰盛接口:飞桨框架对外提供了丰盛的深度学习相关的各种开发接口,如张量示意、数学计算、模型组网、优化战略等。经过这些接口,开发者能够方便地构建和训练自己的深度学习模型,无需深化究竟层的技术细节中去。
在开发接口之下,飞桨框架可以划分为4个档次:示意层、调度层、算子层和适配层。
示意层:专一于计算图的表白与转换,经过高可扩大两边示意 PIR,为动转静(灵活图转为静态图)、智能微分、智能并行、算子组合以及计算图优化等内围性能提供松软撑持。
调度层:担任对代码或计算图启动智能编排与高效调度,并且能够依据实践需求启动显存和内存的治理优化,允许灵活图和静态图高效口头。无论开发者选用经常使用灵活图还是静态图启动模型开发,飞桨框架都能提供高效的口头环境,同时确保资源应用的最优化。
算子层:由神经网络编译器 CINN 和算子库 PHI 独特造成,涵盖了张量定义、算子定义、算子智能融合和算子内核成功等关键性能。
适配层:则用于成功与底层芯片适配,包括设备治理、算子适配、通讯适配以及编译接入等性能。
上方将重点引见飞桨3.0版本架构全新严重更新,这次更新关键蕴含以下模块:
1)高扩大两边示意 PIR,经过打造全架构一致的两边示意,打破框架层各模块壁垒,优化飞桨在迷信计算、编译优化、大模型畛域的后劲;
2)神经网络编译器智能优化,经过智能融合和战略调优,大幅优化模型端到端体现;
3)智能并行,降落大模型场景模型开发和性能优化的老本,大幅优化大模型场景的用户体验。
计算图两边示意(Intermediate Representation,即 IR)是深度学习框架性能优化、推理部署、编译器等方向的关键基石。近些年来,越来越多的框架和钻研者将编译器技术引入到深度学习的神经网络模型优化中,并在此基础上借助编译器的理念、技术和工具对神经网络启动智能优化和代码生成。在大模型时代,对 IR 在灵敏性、扩大性、完备性有了更高的要求。
因此在3.0版本下,飞桨在基础架构层面规范了两边示意 IR 定义,成功全架构一致示意,成功高低游各个方向共享开发成绩。飞桨的新一代 IR 架构聚焦于高度灵敏和高扩大性两个关键维度,经过愈加完备且鲁棒的语义表白才干、训推全架构一致示意和高效可插拔的性能优化战略(Pass)开发机制,成功复杂语义允许,更方便地撑持大模型智能并行下丰盛的切分战略,无缝对接神经网络编译器成功智能性能优化和多配件适配。
飞桨两边示意(PIR)在底层形象了一套高度可扩大的基础组件,涵盖 Type、Attribute、Op、Trait 和 Interface,并引入了 Dialect 的概念,赋予开发者灵敏扩大与自在定制的才干,从而提供了片面且持重的语义表白才干。在模型示意层,经过多 Dialect 的模块化治理和一致多端示意,成功了训练与推理一体化的全架构一致示意,成功了算子和编译器的无缝衔接,允许智能优化和多配件适配。在图变换层,经过一致底层模块并简化基础概念,向用户提供了低老本、易用且高性能的开发体验,以及丰盛且可插拔的 Pass 优化机制。飞桨 PIR 据守静态单赋值(SSA)准则,确保模型等价于一个有向无环图,并驳回 Value 和 Operation 对计算图启动形象,其中 Operation 代表节点,Value 代表边。
Operation 示意计算图中的节点:每个 Operation 示意一个算子,并蕴含零个或多个 Region。Region 示意一个闭包,它外部可以蕴含零个或多个 Block。而 Block 则代表一个合乎静态单赋值(SSA)准则的基本块,其中蕴含零个或多个 Operation。这三者之间经过循环嵌套的方式,能够构建出恣意复杂的语法结构。
Value 示意计算图中的有向边:它用于衔接两个 Operation,从而形容了程序中的 Use-Define 链(即 UD 链)。其中,OpResult 作为定义端,用于定义一个 Value;而 OpOperand 则作为经常使用端,形容了对某个 Value 的经常使用状况。
飞桨提供了 PatternRewriter 和 Declarative Rewrite Rule(简称 DRR)这两种 Pass 开发机制,统筹了自定义的灵敏性与开发的易用性。驳回三段式的 Pass 开发方式,使开发者能够愈加专一于 Pass 逻辑的处置,而无需关注底层IR的细节。应用 PIR 的 Pass 开发机制,成功了 Pass 开发老本降落58%;运行于推理场景,超越84%的模型推理减速超10%。
神经网络编译器智能优化
为什么咱们要研发编译器技术,有3个维度的要素:
1)配件开展趋向:联合配件开展历史和技术演进特点,算力开展速度远大于访存性能、CPU 性能和总线带宽;其中访存性能影响访存密集型算子(norm 类,activation 等)性能,CPU 性能和总线带宽影响调度性能。基于编译器的智能融合的通用优化技术,可以将多个算子融分解一个大算子,经过缩小访存量和算子数量,能够大幅优化模型性能,编译器技术会成为深度学习框架标配组件。
2)模型开展趋向:模型结构存在多样性的特点,多样性的需求十分依赖编译器的通用优化。
3)多配件优化:市面存在有多款配件,不同的配件平台有不同的个性和优化需求,每个配件均须要投入少量的人力启动优化,借助编译器技术,能够大幅降落这类优化技术老本。
让咱们经过一个实例来阐释这一点。咱们以 Llama 模型中经常经常使用的 RMS Normalization (Root Mean Square Layer Normalization)为例,其计算公式相对方便明了。
假定咱们须要是成功 RMS Normalization 的计算,最方便的方法是,咱们可以经常使用飞桨框架提供的张量运算开发接口,调用平方、求和、除法、开根号等操作来成功,代码如下:
上述代码开发方便,然而性能较差,且显存占比拟多;开发者可以启动 FusedRMSNorm 的成功,然而关于开发者要求更高,老本也更高。
借助神经网络编译器技术,咱们能够在维持高度灵敏性和易用性的基础上,成功性能的清楚优化。以下 A100平台上 RMSNorm 算子的性能测试结果便是一个明证:相较于驳回 Python 开发接口组分解功的方式,经过编译优化后的算子运转速度优化了 4 倍;即使与手动算子融合的方式相比,也成功了 14%的性能优化。这一成绩充沛展现了飞桨框架在灵敏性与性能之间寻觅到的现实平衡点。
为此,飞桨把神经网络编译器技术作为一个关键的研发方向,上方是飞桨编译器的全体架构图。
在示意层,借助 PIR 的扩大才干,成功 CINN 前端模块,处置图层相关变换,蕴含算子拆分、重计算、子图划分、维度推导模块等模块,最终获取多个可被编译器后端生成优化的子图。在编译器后端,关于这些可融合的子图,编译器会进一步伐用Compute 函数,将它们转换为由形象语法树(AST)造成的低层两边示意(IR),并在此基础上启动循环的融合,确保能融分解一个 kernel;在 CINN 底层 IR 上,会启动性能的调优剖析,获取最优性能;最后底层 IR 会被进一步精心转换成详细的代码成功。
在生成式大言语模型 Llama 和文生图模型 Stable Diffusion 上的试验结果显示,经过经常使用编译器的优化技术,相较于未驳回手动性能优化的基础版本,推理速度区分成功了 36%和 30%的优化。
为什么咱们要做智能并行?
大模型干流训练方式,会用到多种并行战略,这些并行战略基于灵活图形式成功的“手动”并行方式,即在单卡的基础上,手工处置切分(切分 Tensor、计算图)、通讯(参与通讯算子)、显存优化(显存共享、Re-Compute)、调度优化(流水线编排、计算和通讯异步)等战略,开发者既要熟知模型结构,也要深化了解并行战略和框架调度逻辑, 使得大模型的开发和性能优化门槛十分高。除了要有专门算法团队担任模型算法翻新,还必定有专门担任模型并行优化的团队配合,这给大模型的翻新和迭代带来了诸多阻碍。
咱们举一个方便的例子,来阐释下大模型开发和单卡逻辑的差异,因为并行战略会惹起 Tensor 运转时 shape 出现变动,所以跟 shape 处置相关算子均需思考能否会遭到并行战略的影响。如上方 reshape 的处置,切分战略造成输入 shape 出现了变换,所以输入的 shape 须要依据切分战略启动正当的调整:
为此,咱们提出了动态一致的智能并行打算。开发者仅需大批的张量切分标注,框架便能智能推导出一切张量和算子的散布式切分形态,并参与适合的通讯算子,保证结果正确性;最后会依据模型结构和集群信息,联合显存、调度层优化,智能寻觅最高效的散布式并行战略。
在智能并行设计中,开发者仅需大批的张量切分标注,咱们将切分方式启动形象,共需两类切分方式:切分张量(参数,输入)和切分计算图(流水线)。为成功这两类切分方式,框架须要一种机制来形容散布式张量和计算设备之前的映射相关,为此咱们引入 ProcessMesh 和 Placements 两个散布式概念,其中 ProcessMesh 将一块 GPU 卡映射为一个进程,将多个设备映射为多个进程组成的一维或多维数组,下图展现了由 8 个设备造成的两种不同 ProcessMesh 形象示意。
Placements 是由 Replicate、Shard、Partial 三种散布式标志组成的列表,长度和 ProcessMesh 的维度分歧,用于示意散布式张量在对应计算设备的维度上,依照哪种散布式标志做切分,这三种散布式标志的详细形容如下:
如下图所示,Replicate 示意张量在不同设备上会以复制的方式存在;Shard 示意依照特定的维度在不同设备上启动切分;Partial 示意设备上的张量不完整,须要启动 Reduce Sum 或许 Reduce Mean 等不同方式的操作后,才干获取完整的形态。
在成功散布式标志形象后,咱们经过调用 paddle.distributed.shard_tensor()接口,成功对张量切分的标志。经过张量切分的标志和智能推导,咱们可以示意复杂的散布式混兼并行,下图展现了一个详细的数据并行、张量模型并行、流水线并行组成的混兼并行的例子。
以下代码展现了混兼并行的详细例子。
经过驳回智能并行的开发方式,开发者无需再思考复杂的通讯逻辑。以 Llama 义务为例,散布式训练**代码量缩小了50%,从而大大降落了开发的难度;从咱们的一些试验可知,借助全局的剖析等优化,性能也优于灵活图手动并行的性能。
未来,咱们将进一步探求无需经常使用张量切分标志的全智能并行,让开发者可以像写单机代码一样写散布式代码,进一步优化大模型的开发体验。
总的来说,飞桨新一代框架——飞桨框架3.0-Beta 是面向大模型、异构多芯启动专属设计,向下适配异构多芯,充沛监禁配件潜能;向上一体化撑持大模型的训练、推理。同时具有动态一致智能并行、编译器智能优化、大模型训推一体、大模型多配件适配四大才干,片面地优化了服务产业的才干。
动态一致智能并行:这一性能大幅度降落了产业开发和训练的老本。用户只要在单卡基础上启动大批的张量切分标志,飞桨框架便会智能成功散布式切分信息的推导,并参与通讯算子以确保逻辑的正确性。同时,依据模型结构和集群信息,联合显存和调度层的优化,飞桨能智能寻觅最高效的散布式并行战略,从而大幅降落混兼并行训练的开发老本,使开发者能够更专一于模型和算法的翻新。
编译器智能优化:这一性能清楚降落了性能优化的老本。飞桨的编译器驳回与框架一体化的设计,能够允许生成式模型、迷信计算模型等多种模型的高效训练与可变形态推理,为计算灵敏性与高性能之间提供了良好的平衡点。经过算子的智能融合和代码生成技术,Llama2和 Stable Diffusion 等生成式模型的推理性能获取了超越30%的优化。
大模型训推一体:这一个性为产业提供了极致的开发体验。它使训练和推理的才干能够相互复用,为大模型的全流程提供了一致的开发体验和极致的训练效率。经过动转静的上班,训练和推理的上班得以无缝衔接。在 RLHF(人类反应强化学习)训练环节中的生成计算可以复用推理优化,成功2.1倍的减速。同时,推理量化场景复用训练的散布式智能并行战略,效率优化了3.8倍。
大模型多配件适配:飞桨的关键特征之一是适配异构多芯并充沛监禁配件潜能。在接入机制上,飞桨提供了繁复高效的形象接口和基础算子体系,降落了适配老本。在运转机制上,它优化了调度编排和存储共享等机制,优化了调度效率。从算子内核角度,飞桨提供了编译器智能融合调优打算,以优化端到端的性能。同时,飞桨还为新配件厂商树立了代码合入、继续集成、模型回归测试等研发基础设备。这些机制保证了新配件被归入飞桨的反常发版体系中,用户无需编译即可间接装置试用。飞桨这种性能完善、低老本接入的机制吸引了配件厂商独特为飞桨奉献了3,456个PR,共蕴含25,000多个 commits。
这就是飞桨的新一代框架 3.0 ,目前3.0-Beta 版本已面向开发者放开,并且一切的开发接口跟2.0齐全兼容,十分欢迎广阔的开发者去经常使用和反应。
如今飞桨框架3.0技术地下课已在7月30日正式开讲,**工程师团队倾囊相授,无论是想深化了解框架技术,还是宿愿探求产业落地通常,都能在课上找到答案。报名课程:返回飞桨AI Studio,搜查【飞桨框架3.0片面解析】学习课程。这个夏天,飞桨与你一同执桨造浪!