首页 文章 精选 留言 我的

精选列表

搜索[阿里巴巴],共6865篇文章
优秀的个人博客,低调大师

阿里巴巴大数据实践之数据建模

随着DT时代互联网、智能设备及其他信息技术的发展,数据爆发式增长,如何将这些数据进行有序、有结构地分类组织和存储是我们面临的一个挑战。 为什么需要数据建模 如果把数据看作图书馆里的书,我们希望看到它们在书架上分门别类地放置;如果把数据看作城市的建筑,我们希望城市规划布局合理;如果把数据看作电脑文件和文件夹,我们希望按照自己的习惯有很好的文件夹组织方式,而不是糟糕混乱的桌面,经常为找一个文件而不知所措。 数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。Linux的创始人Torvalds有一段关于“什么才是优秀程序员”的话:“烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系”,其阐述了数据模型的重要性。有了适合业务和基础数据存储环境的模型,那么大数据就能获得以下好处。 性能:良好的数据模型能帮助我们

优秀的个人博客,低调大师

阿里巴巴 BladeDISC 深度学习编译器正式开源

作者:朱凯 - 机器学习PAI团队 随着深度学习的不断发展,AI模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对计算框架的持续迭代。深度编译器就成了应对以上问题广受关注的技术方向,让用户仅需专注于上层模型开发,降低手工优化性能的人力开发成本,进一步压榨硬件性能空间。阿里云机器学习PAI开源了业内较早投入实际业务应用的动态shape深度学习编译器 BladeDISC,本文将详解 BladeDISC的设计原理和应用。 BladeDISC是什么 BladeDISC是阿里最新开源的基于MLIR的动态shape深度学习编译器。 主要特性 多款前端框架支持:TensorFlow,PyTorch 多后端硬件支持:CUDA,ROCM,x86 完备支持动态shape语义编译 支持推理及训练 轻量化API,对用户通用透明 支持插件模式嵌入宿主框架运行,以及独立部署模式 开源地址 https://github.com/alibaba/BladeDISC 深度学习编译器的背景 近几年来,深度学习编译器作为一个较新的技术方向异常地活跃,包括老牌一些的TensorFlow XLA、TVM、Tensor Comprehension、Glow,到后来呼声很高的MLIR以及其不同领域的延伸项目IREE、mlir-hlo等等。能够看到不同的公司、社区在这个领域进行着大量的探索和推进。 AI浪潮与芯片浪潮共同催生——从萌芽之初到蓬勃发展 深度学习编译器近年来之所以能够受到持续的关注,主要来自于几个方面的原因: 框架性能优化在模型泛化性方面的需求。深度学习还在日新月异的发展之中,创新的应用领域不断涌现,复杂多变的场景下如何有效的将硬件的算力充分发挥出来成为了整个AI应用链路中非常重要的一环。在早期,神经网络部署的侧重点在于框架和算子库,这部分职责很大程度上由深度学习框架、硬件厂商提供的算子库、以及业务团队的手工优化工作来承担。 上图将近年的深度学习框架粗略分为三代。一个趋势是在上层的用户API层面,这些框架在变得越来越灵活,灵活性变强的同时也为底层性能问题提出了更大的挑战。初代深度学习框架类似 Caffe 用 sequence of layer 的方式描述神经网络结构,第二代类似 TensorFlow 用更细粒度的 graph of operators 描述计算图,到第三代类似 PyTorch,TensorFlow Eager Mode 的动态图。我们可以看到框架越来越灵活,描述能力越来越强,带来的问题是优化底层性能变得越来越困难。业务团队也经常需要补充完成所需要的手工优化,这些工作依赖于特定业务和对底层硬件的理解,耗费人力且难以泛化。而深度学习编译器则是结合编译时图层的优化以及自动或者半自动的代码生成,将手工优化的原理做泛化性的沉淀,以替代纯手工优化带来的各种问题,去解决深度学习框架的灵活性和性能之间的矛盾。 AI框架在硬件泛化性方面的需求。表面上看近些年AI发展的有目共睹、方兴未艾,而后台的硬件算力数十年的发展才是催化AI繁荣的核心动力。随着晶体管微缩面临的各种物理挑战越来越大,芯片算力的增加越来越难,摩尔定律面临失效,创新体系结构的各种DSA芯片迎来了一波热潮,传统的x86、ARM等都在不同的领域强化着自己的竞争力。硬件的百花齐放也为AI框架的发展带来了新的挑战。 而硬件的创新是一个问题,如何能把硬件的算力在真实的业务场景中发挥出来则是另外一个问题。新的AI硬件厂商不得不面临除了要在硬件上创新,还要在软件栈上做重度人力投入的问题。向下如何兼容硬件,成为了如今深度学习框架的核心难点之一,而兼容硬件这件事,则需要由编译器来解决。 AI系统平台对前端AI框架泛化性方面的需求。当今主流的深度学习框架包括Tensoflow、Pytorch、Keras、JAX等等,几个框架都有各自的优缺点,在上层对用户的接口方面风格各异,却同样面临硬件适配以及充分发挥硬件算力的问题。不同的团队常根据自己的建模场景和使用习惯来选择不同的框架,而云厂商或者平台方的性能优化工具和硬件适配方案则需要同时考虑不同的前端框架,甚至未来框架演进的需求。Google利用XLA同时支持TensorFlow和JAX,同时其它开源社区还演进出了Torch_XLA,Torch-MLIR这样的接入方案,这些接入方案目前虽然在易用性和成熟程度等方面还存在一些问题,却反应出AI系统层的工作对前端AI框架泛化性方面的需求和技术趋势。 什么是深度学习编译器 传统编译器是以高层语言作为输入,避免用户直接去写机器码,而用相对灵活高效的语言来工作,并在编译的过程中引入优化来解决高层语言引入的性能问题,平衡开发效率与性能之间的矛盾。而深度学习编译器的作用相仿,其输入是比较灵活的,具备较高抽象度的计算图描述,输出包括CPU、GPU及其他异构硬件平台上的底层机器码及执行引擎。 传统编译器的使命之一是减轻编程者的压力。作为编译器的输入的高级语言往往更多地是描述一个逻辑,为了便利编程者,高级语言的描述会更加抽象和灵活,至于这个逻辑在机器上是否能够高效的执行,往往是考验编译器的一个重要指标。深度学习作为一个近几年发展异常快速的应用领域,它的性能优化至关重要,并且同样存在高层描述的灵活性和抽象性与底层计算性能之间的矛盾,因此专门针对深度学习的编译器出现了。而传统编译器的另外一个重要使命是,需要保证编程者输入的高层语言能够执行在不同体系结构和指令集的硬件计算单元上,这一点也同样反应在深度学习编译器上。面对一个新的硬件设备,人工的话不太可能有精力对那么多目标硬件重新手写一个框架所需要的全部算子实现,深度学习编译器提供中间层的IR,将顶层框架的模型流图转化成中间层表示IR,在中间层IR上进行通用的图层优化,而在后端将优化后的IR通用性的生成各个目标平台的机器码。 深度学习编译器的目标是针对AI计算任务,以通用编译器的方式完成性能优化和硬件适配。让用户可以专注于上层模型开发,降低用户手工优化性能的人力开发成本,进一步压榨硬件性能空间。 距离大规模应用面临的瓶颈问题 深度学习编译器发展到今天,虽然在目标和技术架构方面与传统编译器有颇多相似之处,且在技术方向上表现出了良好的潜力,然而目前的实际应用范围却仍然距离传统编译器有一定的差距,主要难点包括: 易用性:深度学习编译器的初衷是希望简化手工优化性能和适配硬件的人力成本。然而在现阶段,大规模部署应用深度学习编译器的挑战仍然较大,能够将编译器用好的门槛较高,造成这个现象的主要原因包括: 与前端框架对接的问题。不同框架对深度学习任务的抽象描述和API接口各有不同,语义和机制上有各自的特点,且作为编译器输入的前端框架的算子类型数量呈开放性状态。如何在不保证所有算子被完整支持的情况下透明化的支持用户的计算图描述,是深度学习编译器能够易于为用户所广泛使用的重要因素之一。 动态shape问题和动态计算图问题。现阶段主流的深度学习编译器主要针对特定的静态shape输入完成编译,此外对包含control flow语义的动态计算图只能提供有限的支持或者完全不能够支持。而AI的应用场景却恰恰存在大量这一类的任务需求。这时只能人工将计算图改写为静态或者半静态的计算图,或者想办法将适合编译器的部分子图提取出来交给编译器。这无疑加重了应用深度学习编译器时的工程负担。更严重的问题是,很多任务类型并不能通过人工的改写来静态化,这导致这些情况下编译器完全无法实际应用。 编译开销问题。作为性能优化工具的深度学习编译器只有在其编译开销对比带来的性能收益有足够优势的情况下才真正具有实用价值。部分应用场景下对于编译开销的要求较高,例如普通规模的需要几天时间完成训练任务有可能无法接受几个小时的编译开销。对于应用工程师而言,使用编译器的情况下不能快速的完成模型的调试,也增加了开发和部署的难度和负担。 对用户透明性问题。部分AI编译器并非完全自动的编译工具,其性能表现比较依赖于用户提供的高层抽象的实现模版。主要是为算子开发工程师提供效率工具,降低用户人工调优各种算子实现的人力成本。但这也对使用者的算子开发经验和对硬件体系结构的熟悉程度提出了比较高的要求。此外,对于新硬件的软件开发者来说,现有的抽象却又常常无法足够描述创新的硬件体系结构上所需要的算子实现。需要对编译器架构足够熟悉的情况下对其进行二次开发甚至架构上的重构,门槛及开发负担仍然很高。 鲁棒性:目前主流的几个AI编译器项目大多数都还处于偏实验性质的产品,但产品的成熟度距离工业级应用有较大的差距。这里的鲁棒性包含是否能够顺利完成输入计算图的编译,计算结果的正确性,以及性能上避免coner case下的极端badcase等。 性能问题:编译器的优化本质上是将人工的优化方法,或者人力不易探究到的优化方法通过泛化性的沉淀和抽象,以有限的编译开销来替代手工优化的人力成本。然而如何沉淀和抽象的方法学是整个链路内最为本质也是最难的问题。深度学习编译器只有在性能上真正能够代替或者超过人工优化,或者真正能够起到大幅度降低人力成本作用的情况下才能真正发挥它的价值。 然而达到这一目标却并非易事,深度学习任务大都是tensor级别的计算,对于并行任务的拆分方式有很高的要求,但如何将手工的优化泛化性的沉淀在编译器技术内,避免编译开销爆炸以及分层之后不同层级之间优化的联动,仍然有更多的未知需要去探索和挖掘。这也成为以MLIR框架为代表的下一代深度学习编译器需要着重思考和解决的问题。 BladeDISC主要技术特点 项目最早启动的初衷是为了解决XLA和TVM当前版本的静态shape限制,内部命名为 DISC (DynamIc Shape Compiler),希望打造一款能够在实际业务中使用的完备支持动态shape语义的深度学习编译器。 从团队四年前启动深度学习编译器方向的工作以来,动态shape问题一直是阻碍实际业务落地的严重问题之一。彼时,包括XLA在内的主流深度学习框架,都是基于静态shape语义的编译器框架。典型的方案是需要用户指定输入的shape,或是由编译器在运行时捕捉待编译子图的实际输入shape组合,并且为每一个输入shape组合生成一份编译结果。 静态shape编译器的优势显而易见,编译期完全已知静态shape信息的情况下,Compiler可以作出更好的优化决策并得到更好的CodeGen性能,同时也能够得到更好的显存/内存优化plan和调度执行plan。然而,其缺点也十分明显,具体包括: 大幅增加编译开销。引入离线编译预热过程,大幅增加推理任务部署过程复杂性;训练迭代速度不稳定甚至整体训练时间负优化。 部分业务场景shape变化范围趋于无穷的,导致编译缓存永远无法收敛,方案不可用。 内存显存占用的增加。编译缓存额外占用的内存显存,经常导致实际部署环境下的内存/显存OOM,直接阻碍业务的实际落地。 人工padding为静态shape等缓解性方案对用户不友好,大幅降低应用的通用性和透明性,影响迭代效率。 在2020年夏天,DISC完成了仅支持TensorFlow前端以及Nvidia GPU后端的初版,并且正式在阿里内部上线投入实际应用。最早在几个受困于动态shape问题已久的业务场景上投入使用,并且得到了预期中的效果。即在一次编译且不需要用户对计算图做特殊处理的情况下,完备支持动态shape语义,且性能几乎与静态shape编译器持平。对比TensorRT等基于手工算子库为主的优化框架,DISC基于编译器自动codegen的技术架构在经常为非标准开源模型的实际业务上获得了明显的性能和易用性优势。 从2020年第二季度开始至今,DISC持续投入研发力量,针对前文提到的从云端平台方视角看到的深度学习编译器距离大规模部署和应用的几个瓶颈问题,在性能、算子覆盖率和鲁棒性、CPU及新硬件支持、前端框架支持等方面逐渐完善。目前在场景覆盖能力和性能等方面,已经逐渐替换掉团队过往基于XLA和TVM等静态shape框架上的工作,成为PAI-Blade支持阿里内部及阿里云外部业务的主要优化手段。2021年后,DISC在CPU及GPGPU体系结构的后端硬件上的性能有了显著的提升,同时在新硬件的支持上面投入了更多的技术力量。2021年底,为了吸引更多的技术交流和合作共建需要,以及更大范围的用户反馈,正式更名为BladeDISC并完成了初版开源。 BladeDISC关键技术 BladeDISC的整体架构,及其在阿里云相关产品中的上下文关系如下图所示: MLIR基础架构 MLIR是由Google在2019年发起的项目,MLIR 的核心是一套灵活的多层IR基础设施和编译器实用工具库,深受 LLVM 的影响,并重用其许多优秀理念。这里我们选择基于MLIR的主要原因包括其比较丰富的基础设施支持,方便扩展的模块化设计架构以及MLIR较强的胶水能力。 动态shape编译 上图为BladeDISC的主体Pass Pipeline设计。对比目前主流的深度学习编译器项目,主要技术特点如下: 图层IR设计 BladeDISC选择基于HLO作为核心图层IR来接入不同的前端框架,但是HLO是原本为XLA设计的纯静态shape语义的IR。静态场景下,HLO IR中的shape表达会被静态化,所有的shape计算会被固化为编译时常量保留在编译结果中;而在动态shape场景下,IR本身需要有足够的能力表达shape计算和动态shape信息的传递。BladeDISC从项目建立开始一直与MHLO社区保持紧密的合作,在XLA的HLO IR基础上,扩展了一套具有完备动态shape表达能力的IR,并增加了相应的基础设施以及前端框架的算子转换逻辑。这部分实现目前已经完整upstream至MHLO社区,确保后续其它MHLO相关项目中IR的一致性。 运行时Shape计算、存储管理和Kernel调度 动态shape编译的主要挑战来自于需要在静态的编译过程中能够处理动态的计算图语义。为完备支持动态shape,编译结果需要能够在运行时做实时的shape推导计算,不仅要为数据计算,同时也需要为shape计算做代码生成。计算后的shape信息用于做内存/显存管理,以及kernel调度时的参数选择等等。BladeDISC的pass pipeline的设计充分考虑了上述动态shape语义支持的需求,采用了host-device联合codegen的方案。以GPU Backend为例,包括shape计算、内存/显存申请释放、硬件管理、kernel launch运行时流程全部为自动代码生成,以期得到完备的动态shape端到端支持方案和更为极致的整体性能。 动态shape下的性能问题 在shape未知或者部分未知的情况下,深度学习编译器在性能上面临的挑战被进一步放大。在大多数主流硬件backend上,BladeDISC采用区分计算密集型部分和访存密集型部分的策略,以期在性能与复杂性和编译开销之间获取更好的平衡。 对于计算密集型部分,不同的shape要求更加精细的schedule实现来获得更好的性能,pass pipeline在设计上的主要考虑是需要支持在运行时根据不同的具体shape选择合适的算子库实现,以及处理动态shape语义下的layout问题。 而访存密集型部分的自动算子融合作为深度学习编译器主要的性能收益来源之一,同样面临shape未知情况下在性能上的挑战。许多静态shape语义下比较确定性的问题,例如指令层的向量化,codegen模版选择,是否需要implicit broadcast等等在动态shape场景下都会面临更大的复杂性。针对这些方面的问题,BladeDISC选择将部分的优化决策从编译时下沉到运行时。即在编译期根据一定的规则生成多个版本的kernel实现,在运行时根据实际shape自动选择最优的实现。这一机制被称作speculation,在BladeDISC内基于host-device的联合代码生成来实现。此外,在编译期没有具体shape数值的情况下,会很容易在各个层级丢失掉大量的优化机会,从图层的线性代数简化、fusion决策到指令层级的CSE、常数折叠等。BladeDISC在IR及pass pipeline的设计过程中着重设计了shape constraint在IR中的抽象和在pass pipeline中的使用,例如编译期未知的不同dimension size之间的约束关系等。在优化整体性能方面起到了比较明显的作用,保证能够足够接近甚至超过静态shape编译器的性能结果。 大颗粒度算子融合 团队在开启BladeDISC项目之前,曾经基于静态shape编译器在大颗粒度算子融合及自动代码生成方面有过若干探索[3][4],其基本思想可以概括为借助于GPU硬件中低访存开销的shared memory或CPU中低访存开销的Memory Cache,将不同schedule的计算子图缝合进同一个kernel内,实现多个parallel loop复合,这种codegen方法称之为fusion-stitching。这种访存密集型子图的自动代码生成打破了常规的loop fusion,input/output fusion对fusion颗粒度的限制。在保证代码生成质量的同时,大幅增加fusion颗粒度,同时避免复杂性及编译开销爆炸。且整个过程完全对用户透明,无需人工指定schedule描述。 在动态shape语义下实现fusion-stitching对比静态shape语义下同样需要处理更大的复杂性,动态shape语义下的shape constraint抽象一定程度上简化了这一复杂性,使整体性能进一步接近甚至超过手工算子实现。 多前端框架支持 AICompiler框架在设计时也包含了扩展支持不同前端框架的考虑。PyTorch侧通过实现一个轻量的Converter将TorchScript转换为DHLO IR实现了对PyTorch推理作业的覆盖。MLIR相对完备的IR基础设施也为Converter的实现提供了便利。BladeDISC包含Compiler以及适配不同前端框架的Bridge侧两部分。其中Bridge进一步分为宿主框架内的图层pass以及运行时Op两部分,以插件的方式接入宿主框架。这种工作方式使BladeDISC可以透明化的支持前端计算图,可以适配用户各种版本的宿主框架。 运行时环境适配 为将编译的结果能够配合TensorFlow/PyTorch等宿主在各自的运行环境中执行起来,以及管理运行时IR层不易表达的状态信息等等,我们为不同的运行时环境实现了一套统一的Compiler架构,并引入了运行时抽象层,即RAL(Runtime Abstraction Layer)层。 RAL实现了多种运行环境的适配支持,用户可以根据需要进行选择,具体包括: 全图编译,独立运行。当整个计算图都支持编译时,RAL提供了一套简易的runtime以及在此之上RAL Driver的实现,使得compiler编译出来结果可以脱离框架直接运行,减少框架overhead。 TF中子图编译运行。 Pytorch中子图编译运行。 以上环境中在诸如资源管理,API语义等上存在差异,RAL通过抽象出一套最小集合的API ,并清晰的定义出它们的语义,将编译器与运行时隔离开来,来达到在不同的环境中都能够执行编译出来的结果的目的。此外RAL层实现了无状态编译,解决了计算图的编译之后,编译的结果可能被多次执行时的状态信息处理问题。一方面简化了代码生成的复杂度,另一方面也更容易支持多线程并发执行(比如推理)的场景,同时在错误处理,回滚方面也更加容易支持。 应用场景 BladeDISC的典型应用场景可以不太严格的分为两类:其一是在主流的硬件平台上(包括Nvidia GPU,x86 CPU等)上作为通用、透明的性能优化工具,降低用户部署AI作业的人力负担,提高模型迭代效率;另一个重要的应用场景是帮助新硬件做AI场景的适配和接入支持。 目前BladeDISC已经广泛应用在阿里内部和阿里云上外部用户的多个不同应用场景下,覆盖模型类型涉及NLP、机器翻译、语音类ASR、语音TTS、图像检测、识别、AI for science等等多种典型AI应用;覆盖行业包括互联网、电商、自动驾驶、安全行业、在线娱乐、医疗和生物等等。 在推理场景下,BladeDISC与TensorRT等厂商提供的推理优化工具形成良好的技术互补,其主要差异性优势包括: 应对动态shape业务完备的动态shape语义支持 基于compiler based的技术路径的模型泛化性在非标准模型上的性能优势 更为灵活的部署模式选择,以插件形式支持前端框架的透明性优势 下图为Nvidia T4硬件上几个真实的业务例子的性能收益数字: 在新硬件支持方面,目前普遍的情况是除了积累比较深厚的Nvidia等头部厂商之外,包括ROCM等其它GPGPU硬件普遍存在的情况是硬件的指标已经具备相当的竞争力,但厂商受制于AI软件栈上的积累相对较少,普遍存在硬件算力无法发挥出来导致硬件落地应用困难的问题。如前文所述,基于编译器的技术路径下天然对于硬件的后端具备一定的泛化能力,且与硬件厂商的技术储备形成比较强的互补。BladeDISC目前在GPGPU和通用CPU体系结构上的储备相对比较成熟。以GPGPU为例,在Nvidia GPU上的绝大部分技术栈可以迁移至海光DCU和AMD GPU等体系结构相近的硬件上。BladeDISC较强的硬件泛化能力配合硬件本身较强的通用性,很好的解决了新硬件适配的性能和可用性问题。 下图为海光DCU上几个真实业务例子上的性能数字: 某识别类模型 推理 不同batchsize下 2.21X ~ 2.31X 某检测类模型A 推理 不同batchsize下 1.73X ~ 2.1X 某检测类模型B 推理 不同batchsize下 1.04X ~ 1.59X 某分子动力学模型 训练 2.0X 开源生态:构想和未来 我们决定建设开源生态主要有如下的考虑: BladeDISC发源于阿里云计算平台团队的业务需求,在开发过程中与MLIR/MHLO/IREE等社区同行之间的讨论和交流给了我们很好的输入和借鉴。在我们自身随着业务需求的迭代逐渐完善的同时,也希望能够开源给社区,在目前整个AI编译器领域实验性项目居多,偏实用性强的产品偏少,且不同技术栈之间的工作相对碎片化的情况下,希望能够将自身的经验和理解也同样回馈给社区,希望和深度学习编译器的开发者和AI System的从业者之间有更多更好的交流和共建,为这个行业贡献我们的技术力量。 我们希望能够借助开源的工作,收到更多真实业务场景下的用户反馈,以帮助我们持续完善和迭代,并为后续的工作投入方向提供输入。 后续我们计划以两个月为单位定期发布Release版本。BladeDISC近期的Roadmap如下: 持续的鲁棒性及性能改进 x86后端补齐计算密集型算子的支持,端到端完整开源x86后端的支持 GPGPU上基于Stitching的大颗粒度自动代码生成 AMD rocm GPU后端的支持 PyTorch训练场景的支持 此外,在中长期,我们在下面几个探索性的方向上会持续投入精力,也欢迎各种维度的反馈和改进建议以及技术讨论,同时我们十分欢迎和期待对开源社区建设感兴趣的同行一起参与共建。 更多新硬件体系结构的支持和适配,以及新硬件体系结构下软硬件协同方法学的沉淀 计算密集型算子自动代码生成和动态shape语义下全局layout优化的探索 稀疏子图的优化探索 动态shape语义下运行时调度策略、内存/显存优化等方面的探索 模型压缩与编译优化联合的技术探索 图神经网络等更多AI作业类型的支持和优化等 BaldeDISC项目地址:https://github.com/alibaba/BladeDISC 更多开源项目合集:https://www.aliyun.com/activity/bigdata/opensource_bigdata__ai 参考文献 1."DISC: A Dynamic Shape Compiler for Machine Learning Workloads", Kai Zhu, Wenyi Zhao, Zhen Zheng, Tianyou Guo, Pengzhan Zhao, Feiwen Zhu, Junjie Bai, Jun Yang, Xiaoyong Liu, Lansong Diao, Wei Lin 2. Presentations on MLIR Developers' Weekly Conference:1,2 3. "AStitch: Enabling A New Multi-Dimensional Optimization Space for Memory-Intensive ML Training and Inference on Modern SIMT Architectures", Zhen Zheng, Xuanda Yang, Pengzhan Zhao, Guoping Long, Kai Zhu, Feiwen Zhu, Wenyi Zhao, Xiaoyong Liu, Jun Yang, Jidong Zhai, Shuaiwen Leon Song, and Wei Lin. The 27th ACM International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS), 2022. [to appear] 4."FusionStitching: Boosting Memory Intensive Computations for Deep Learning Workloads", Zhen Zheng, Pengzhan Zhao, Guoping Long, Feiwen Zhu, Kai Zhu, Wenyi Zhao, Lansong Diao, Jun Yang, and Wei Lin. arXiv preprint

优秀的个人博客,低调大师

Serverless 如何在阿里巴巴实现规模化落地?

作者 | 赵庆杰(卢令) 来源 | Serverless 公众号 一、Serverless 规模化落地集团的成果 2020 年,我们在 Serverless 底层基建上做了非常大的升级,比如计算升级到了第四代神龙架构,存储上升级到了盘古 2.0,网络上进入了百 G 洛神网络,整体升级之后性能提升两倍;BaaS 层面也进行了很大的拓展,比如支持了 Event Bridge、Serverless Workflow,进一步提升了系统能力。 除此以外,我们还与集团内十几个 BU 进行了合作共建,帮助业务方落地 Serverless 产品,其中包含 双11 核心的应用场景,帮助其顺利通过 双11 流量峰值大考,证明了 Serverless 在核心的应用场景下,依然表现得非常稳定。 二、两大背景,两大优势 – 加速 Serverless 落地 1. Serverless 两大背景 为什么在集团内部能快速实现规模化地落地 Serverless?首先我们有两大前提背景: 第一个背景是上云,集团上云是重要的前提,只有上云才能享受到云上的弹性红利,如果还是自己内部的一朵云,后续的起效降本其实非常难达成,所以 2019 年双十一阿里实现了核心系统 100% 上云,有了上云前提,Serverless 才有了发挥非常作用的空间。 第二个背景是全面云原生化,打造了一个强大的云原生产品的云家族,对集团内部业务进行赋能,帮助业务达成了在上云基础上的两个主要目标:提高效能和降低成本, 2020 年天猫双十一核心系统全面云原生化,效率提升 100%,成本降低 80%。 2. Serverless 两大优势 提高效能 一个标准的云原生应用,从研发到上线到运维,需要完成上图中所有标橙色的工作项,才能完成正式的微服务应用上线,首先是 CI/CD 代码构建,另外是系统运维的可视化工作项目,不仅要配置、对接,还需对整体数据链路进行流量评估、安全评估、流量管理等,这显然对人力门槛要求已经非常高。除此以外,为了提升资源利用率,我们还需要对各个业务进行混部,门槛会进一步的提高。 可以看出,整体的云原生传统应用,要实现微服务上线所需要完成的工作项,对于开发者来说非常艰难,需要由多个角色进行完成,但是如果到 Serverless 时代,开发者只要完成上图中标蓝色的框 coding,后续剩下的所有工作项,Serverless 的研发平台可以直接帮助业务完成上线。 降低成本 提高效能主要指的是人力成本的节省,而降低成本则针对的是应用的资源利用率。普通应用我们需要为峰值预留资源,但波谷就会造成极大浪费。在 Serverless 场景下,我们只需要按需付费,拒绝为峰值预留资源,这是 Serverless 降低成本的最大优势。 以上两大背景和两大优势,符合技术上云的趋势,所以集团内部的业务方一拍即合,一些大的 BU 已经把 Serverless 落地升级为战役层面,加速业务落地的 Serverless 场景。目前在集团落地的 Serverless 场景已经非常丰富,涉及到了核心的一些应用、个性化推荐、视频处理,还有 AI 推理、业务巡检等等。 三、Serverless 落地场景 – 前端轻应用 目前,集团内前端场景是应用 Serverless 最快、最广的场景,包含淘系、高德、飞猪、优酷、闲鱼等 10+ 以上 BU。那为什么前端场景适合 Serverless 呢? 上图是全栈工程师的能力模型图,一般的微应用中需要有三个角色:前端工程师、后端开发工程师,运维工程师,三者共同完成应用的上线发布。为了提高效能,最近几年出现了全栈工程师的角色,作为全栈工程师,他要具备这三个角色的能力,不仅需要前端的应用开发技术,还需要后端系统层面的开发技能,并且要关注底层的内核、系统资源管理等,这对于前端工程师来说门槛显然非常高。 最近几年 Node.js 技术兴起,能够替代后端开发工程师角色,前端工程师只要具备前端开发能力,就可以充当两个角色,即前端工程师和后端开发工程师,但运维工程师仍然无法被取代。 而 Serverless 平台,解决的就是上图三角形结构中的底部三层,极大降低了前端工程师转变为全栈工程师的门槛,这对前端业务开发者来说非常有诱惑力。 另外一个原因是业务特性符合,大部分的前端应用具有流量洪峰的特性,需要业务评估前置,存在评估成本;同时前端场景更新迭代快,快上快下,运维成本高;且缺乏动态扩缩能力,存在资源碎片及资源浪费。而如果使用 Serverless,平台会自动帮你解决以上所有的后顾之忧,所以 Serverless 对前端场景的诱惑力非常大。 1. 前端落地场景 上图列举了前端落地的几个主要场景和技术点: BFF 转换成 SFF 层:BFF 主要是 Backend For Frontend,前端工程师做主要运维,但到了 Serverless 时代,运维完全交于 Serverless 平台,前端工程师只需要写业务代码,就可以完成这项工作。 瘦身:把前端的业务逻辑下沉到 SFF 层,由 SFF 层去做逻辑的复用,把运维的能力也交给 Serverless 平台,实现客户端轻量化,提效功能下沉。 云端一体化:一处代码多端应用,这是非常流行的开发框架,同样需要 SFF 作为支撑。 CSR/SSR:通过 Serverless 满足服务端渲染、客户端渲染等,来实现前端首屏的快速展现,Serverless 结合 CDN 整体可以作为前端加速的解决方案。 NoCode:相当于在 Serverless 平台上做了封装,只需拖拽几个组件,就可以搭建一个前端页面,每个组件都可以用 Serverless 进行包装、功能聚合等,达到 NoCode 的效果。 中后台场景:主要是单体的富应用场景,单体应用可以完全用 Serverless 模式进行托管,完成中后台应用上线,这同样也可以节省运维能力、减少成本。 2. 前端 Coding 变化 在前端场景应用 Serverless 之后,coding 有哪些变化呢? 对前端有一定了解的都知道,前端一般分三层:State、View 和 Logic Engine,同时会把一些抽象的业务逻辑下沉到 FaaS 层云函数上,然后用云函数作为 FaaS API 来提供服务,在代码编写上可以抽象各类 Aaction,每个 Aaction 可以有 FaaS 函数 API 提供服务。 以一个简单的页面为例,页面左侧是一些渲染接口,可以获取商品详情、收货地址等,这是基于 Faas API 实现的;右侧的是一些交互逻辑,比如购买、添加等,这也是 Faas API 可以继续完成的任务。 页面设计中,所有的 Faas API 不是只能为一个页面所使用,它可以为多个页面复用。复用这些 API 或者进行拖拽之后,就可以完成前端页面的组装,这对于前端来说是非常方便的。 3. 前端轻应用研发提效:1-5-10 在前端应用 Serverless 之后,我们把 Serverless 对前端的研发效能的提效简单总结为 1-5-10,其含义是: 1 分钟的快速开始:我们把各类主要场景做一个总结,将其归类为应用模板,每个用户或者业务方新起一个业务时,只需要选择相应的应用启动模板,就会帮助用户快速生成业务代码,用户只需要写自己的业务函数代码就可以快速开始。 5 分钟上线应用:完全复用 Serverless 的运维平台,利用平台天然能力,帮助用户完成灰度发布等能力;并且配合前端网关、切流等完成金丝雀测试等功能。 10 分钟排查问题:基于上线之后的 Serverless 函数,提供业务指标或系统指标的展示,通过指标不仅可以设置报警,还可以在控制台上给用户推送错误日志等,帮助用户快速定位问题、分析问题,10 分钟内掌握整个 Serverless 函数的健康状态。 4. 前端落地 Serverless 效果 前端实现 Serverless 的场景后效果如何?我们将 3 款 APP 在传统应用研发模式下所需要的性能和工时与应用 Faas 场景之后进行对比,可以明显看到,在原有的云原生基础上,效能还能提升 38.89%,这对于 Serverless 应用或前端应用来说效果非常可观,目前 Serverless 场景已经几乎覆盖整个集团内部,帮助业务方实现 Serverless 化,实现提高效能和降低成本两个主要目标。 四、技术输出,拓展新场景 在集团的 Serverless 落地过程中,我们发现了很多新的业务诉求,比如存量业务如何快速实现迁移并节省成本?执行时间是否可以调大或者调长?资源配置是否可以调高?等等,针对这些问题我们提出了一些解决方案,基于这些解决方案我们抽象出了产品的一些功能,接下来介绍几个比较重要的功能: 1. 自定义镜像 自定义镜像主要目的是实现存量业务的无缝迁移,帮助用户实现零代码改造,并且把业务代码完全迁移到 Serverless 平台上。 存量业务的迁移是非常大的痛点,在一个团队内,不可能长期存在两种研发模式,这会造成极大内耗。想让业务方迁移到 Serverless 研发体系下,必须推出彻底的改造方案,帮助用户实现 Serverless 体系改造,不仅需要支持新业务使用 Serverless,还要帮助存量业务实现零成本快速迁移,所以我们推出了自定义容器功能。 传统 Web 单体应用场景特性: 应用现代化细粒度责任拆分、服务治理等运维负担; 历史包袱不易 Serverless 化:云上云下业务代码,依赖、配置不统一; 容量规划,自建运维、监控体系; 资源利用率低 (低流量服务独占资源)。 函数计算 + 容器镜像优势: 低成本迁移单体应用; 免运维; 无需容量规划,自动伸缩; 100% 资源利用率,优化闲置成本。 自定义容器功能,可以让传统 Web 单体应用(比如 SpringBoot、Wordpress、Flask、Express、Rails 等框架)不需任何改造,就可以以镜像的方式迁移到函数计算上,避免低流量业务独占服务器造成资源浪费。同时也可以享受到无需为应用做容量规划、自动伸缩、免运费等效益。 2. 性能实例 高性能实例,减少使用限制,拓展更多场景。比如:代码包从原来的 50M 上升到 500M,执行时间从原来的 10 分钟提高到 2 小时,性能规格比原先提升 4 倍多,能够最大支持 16G 和 32G 的大规格实例,来帮助用户运行一些非常耗时的长任务等等。 函数计算服务了很多场景,在服务过程中我们收到了很多诉求,比如约束条件多、使用门槛高、计算场景资源不足等问题。所以针对这些场景,我们推出了性能实例功能,目标是减少函数计算应用场景的使用限制,降低使用门槛,并且在执行时长上、各种指标上,用户可以灵活配置、按需配置。 目前我们支持的 16 核 32G 完全具备与同规格 ECS 一模一样的计算能力,可以适用于高性能的业务场景如 AI 推理、音视频转码等。这个功能对后续拓展应用场景来说非常重要。 挑战: 弹性实例约束条件多,有一定使用门槛,如执行时长、实例规格等; 传统单体应用、音视频等重计算场景下,业务需要拆分改造,增加负担; vCPU、内存、带宽等资源维度,弹性实例未给出明确承诺。 目标: 减小函数计算的使用限制,降低企业使用门槛; 兼容传统应用和重计算场景; 给用户明确的资源承诺。 做法: 推出更高规格、资源承诺更明确的性能实例; 未来,性能实例将具备更高的稳定性 SLA、更丰富的功能配置。 主打场景: 计算型任务、long-running 任务、弹性伸缩不敏感任务。 音视频转码处理; AI 推理; 其它需求高规格的计算场景。 优势: 性能实例除放宽限制外,仍保留当前函数计算产品所具备的所有能力:按量付费、预留模式、单实例多请求、多种事件源集成、多可用区容灾、自动伸缩、应用的构建部署及免运维等。 3. 链路追踪 链路追踪功能包括:链路还原、拓扑分析、问题定位。 一个正常的微服务,不是一个函数就能完成所有工作,需要依赖上下游服务。在上下游业务都是正常的情况下,一般不需要链路追踪,但是如果下游服务出现了异常,如何定位问题?这时就可以依赖链路追踪功能,迅速分析上下游的性能瓶颈或者定位问题的发生点等。 函数计算也调研了很多集团内外的开源技术方案,目前已经支持 X-trace 功能,并且兼容了开源方案,拥抱开源,提供了兼容 OpenTracing 的产品能力。 上图是链路追踪的 Demo 图,通过计算 tracing 可以可视化看到后端服务的数据库访问开销,避免大量服务间的复杂校验关系增加问题排查的难度等。函数计算还支持函数代码级的链路分析能力,帮助用户优化冷启动、关键代码实现等。 Serverless 产品在业务角度上带来了巨大收益,但是封装也带来了一个阶段性难题——黑盒问题。当我们向用户提供链路追踪技术,同时也把黑盒问题暴露给用户,用户也可以通过这些黑盒问题提升自身的业务能力。这也是 Serverless 未来提高用户体验的方向,后续我们会在这方面继续加大投入,降低用户使用 Serverless 的成本。 挑战: Serverless 产品在业务角度有巨大收益,但封装带来黑盒问题; Serverless 连接云生态,大量的云服务造成调用关系复杂; Serverless 开发者依然有链路还原、拓扑分析、问题定位等需求。 FC + x-trace 主要优势: 函数代码级链路分析,帮助优化冷启动等关键代码实现; 服务调用级链路追踪,帮助串联云生态服务,分布式链路分析。 4. 异步配置 在 Serverless 场景下,我们提供了离线任务处理、消息对立消费等功能,在函数计算中这类功能的使用率占比 50% 左右。在大量消息消费中,存在很多异步配置问题经常被业务方挑战,比如,这些消息是从哪里来?又去到哪里?被什么服务消费?消费的时间?消费的成功率如何?等等。这些问题的可视化/可配置,是目前需要主要解决的重要课题。 上图为异步配置的工作原理,首先从用户指定的事件源开始触发异步调用,函数计算立即返回请求 ID,同时也可以调用执行函数,返回执行结果到函数计算或者消息队列 MNS 里面。然后通过事件源可配置触发器等等,这些效果或者主题消费,可以进行消息的再次消费。比如,如果一个消息处理失败了,可以配置一下进行二次处理。 典型的应用场景: 一是事件闭环,比如对投递结果(如收集监控指标、报警配置)进行结果分析;生产事件上客户不仅可以利用 FC 消费事件,也可以利用 FC 主动生产事件。 二是日常的异常处理,比如失败处理、重试策略等。 三是资源回收,用户可以自定义存货时间,及时丢弃无用消息,节省资源,这是异步场景非常大的优化。 作者简介: 赵庆杰(卢令),目前就职于阿里云云原生 Serverless 团队,专注于 Serverless 、PaaS,分布式系统架构等方向,致力于打造新一代的 Serverless 技术平台,把平台技术做到更加普惠。曾就职于百度,负责内部最大的 PaaS 平台,承接了 80% 的在线业务,在 PaaS 方向,后端分布式系统架构等领域有丰富的经验。 本文整理自【Serverless Live 系列直播】1 月 26 日场 直播回看链接:https://developer.aliyun.com/topic/serverless/practices

优秀的个人博客,低调大师

全站上云 | 阿里巴巴 Zookeeper 的上云实践

前言 微服务引擎 MSE ,是阿里集团配置中心和服务注册中心的云上版本,在集团内广泛应用于分布式一致性协调,注册中心,分布式配置中心等场景。以 2019 年天猫双十一为例,由于 MSE 在稳定性和性能方面持续投入,单集群最大超过 30W 长链接,对于业务团队而言,运维成本大幅下降一倍,管控体验大幅提升。MSE 产品出色的稳定性和性能,获得了标杆客户的高度认可,交出了一份漂亮的成绩单! 双十一战绩 1、MSE1.0 托管了阿里集团大部分 ZooKeeper 线上集群,覆盖的产品包括集团的多种核心基础组件;2、双十一当天,所有集群整体运行稳定,容量水位,各项指标正常, 0 故障, 0 例问题反馈;3、在高峰期间,MSE 托管的最大容量集群 Blink 集群,各项指标符合预期,平稳渡过,各项指标详趋势如下: 链接数 平均请求延时 2.0 架构升级,融合云原生赋能产品竞争力 MSE 2.0 的架构升级,是和云原生技术体系的无缝融合;从另一个角度理解,能够依托云原生带来的技术红利,给自己的产品带来技术创新,效率提升,性能提升,就是一种云原生能力。 1、MSE 1.0 采用的是集团部署模式,Sigma +集团内部网络+集团组件: 在 1.0 的架构下,在产品平台能力,运维效率方面都比较低效,受限于平台,产品自身能力无法突破质的提升: MSE1.0 的集群交付模式,是在用户需要部署的机房申请机器资源,然后人工在机器上面部署集群,部署完成之后,需要去配置中心上面维护一套节点IP的映射关系,整个流程下来,最少要 3 个小时,经常会因为资源交付的问题,协调多方。 集团内部用户申请 ZooKeeper 资源,很多场景下是独立需求,也就是,需要一个独立的集群即可,这种情况下,如果每个用户给一个,维护的成本非常高,因此需要用户单独邮件说明场景,判断是否可交付公共集群,这个流程让用户难以达到快速安全接入的目的。 集团内部支持的独立集群有非常多,每月集群宕机,物理机迁移后,需要人工恢复节点,由于 ZooKeeper 是有状态应用,服务端的配置文件状态依赖于服务器的地址,集群之间需要数据同步,无法做到和业务应用一样自动拉起。 集群的扩缩容,需要手动修改每台节点的配置,每台都需要重启才能生效,由于涉及到 ZAB 协议规则,不能出现多主的情况,否则会出现数据丢失等严重后果,需要严格控制重启顺序和配置内容,具有较高的运维技术复杂度。 用户在集群的地址发现服务时,有依赖到多种配置组件,有些为了降低依赖,就直连集群节点 IP ,在出现节点更换或者扩缩容时,需要额外去维护这份映射关系,如果出现纰漏,会导致服务不可用。 服务端的配置,由手动进行修改同步,也没有机制保证每次人工操作的正确性,导致 ZooKeeper 集群在重启加载了不一致的配置,出现数据丢失,选主失败等问题。 2019年 5 月份,我们将 MSE 1.0 进行了平台级别的架构升级改造,希望能够解决目前所遇到的问题,同时在支持集团内部的同时,能将产品能力对外输出(基于公有云上引擎的存量调研数据,市场是非常大的),在技术选型时,充分考虑了底座基于K8S的云原生架构,未来是云时代,各种云上能力,未来一定是都会主动对接到标准云原生架构中的,MSE 需要借助这些云原生标准能力,将 MSE 产品的平台能力整体提升,也为后续云原生战役做好技术铺垫。 2、MSE 2.0 ,基于 ACK+ 云能力多位一体组合( VPC,DNS,SLB,高效云盘,ARMS ) MSE 2.0 架构,底层容器资源通过 ACK 进行统一管理,完全兼容开源K8s标准,因此也获得了K8s的多种高级特性支持: 集群交付能力效率提升 100 倍K8s 的 POD 拉起,加上云盘, SLB 等资源分配, 3 分钟即可交付一套集群,对比 1.0 流程,资源申请,配置同步等,最少需要半天,效率提升了百倍。 集群节点多可用区部署,具备多机房容灾能力MSE 每个 Region 都支持最少 2 个可用区,在集群节点分配时,已配置的 K8s亲和性调度,会将节点打散至多个可用区部署。 压力负载均衡完美,后端稳定性大大提升SLB是一款成熟的产品,得到了市场的检验,MSE 依托它的4层负载均衡能力,客户端能够均匀的分布在每台节点上面,避免了用户使用IP直连的情况下,出现负载不均衡的情况。 机器宕机,自动迁移重建降低了运维成本,同时提高了可用性,以往需要自己申请机器,由于需要状态同步,需要人工修改配置手动重启每一台节点,复杂度非常高,同时频繁的手工操作也给线上稳定性带来了风险隐患 监控指标丰富在监控方案选型上,采用了云原生标准的监控体系方案-普罗米修斯,由于和开源兼容一致,在 MSE 业务监控指标数据的采集组件上,完全复用了 ZooKeepper 开源组件的上报能力,研发效率得到了翻倍的提升。 普罗米修斯监控,提供了强大的后台交互大盘,同时MSE 前端可通过数据查询接口,按需重新绘制监控指标趋势图。 技术能力产品化,满足客户多层次需求 相比 MSE 1.0 ,MSE 2.0 将许多技术上的能力,进行了产品化改造,提升产品竞争力外,同时也将技术能力赋予了用户,满足了客户多层次的需求。 1、集群交付方式支持域名交付用户在客户端连接 MSE 集群时,填写域名,在集群的实例变化后 ,客户端不需要修改地址,会自动解析到新地址,降低用户使用时的切换成本。 2、集群节点健康状态可视化通过状态页面,客户可以看到每个节点的健康情况以及节点角色。 3、MSE 运行时参数优化,支持更高的链接性能及降低运维成本用户自维护的 64 核物理机,在迁移到 MSE 后,评估了容量及性能要求,使用了 12 核, CPU 利用率最后能够稳定保持在 15% 左右,GC 频率降低 80% ,同等业务规模下,只需要 1/5 的机器资源就满足了业务需求,节省了客户的机器资源。 4、数据节点编辑功能MSE 提供了集群数据管理视图,贴合业务场景,可以方便的对数据进行白屏化操作。 5、版本升级,MSE 一键滚动升级升级MSE版本时,只需要更新镜像 ,然后在控制台点击升级,即可让MSE集群所有节点逐台滚动升级 6、集群监控指标趋势图可以查看当前集群监控指标的实时值,也可以查看历史趋势,例如集群的链接数变化情况, 7 天历史变化趋势 7、用户侧自定义报警可以针对不同的监控指标,设置对应的报警阀值,支持短信,钉钉群,邮件。 新征程,新挑战 产品技术高度融合,基于 Nacos 内核,统一内部多款配置中心,服务注册心, Nacos 产品基于 MSE 平台商业化,集团内部集群全部上云,整体节省机器成本 50% ,人效提升 3 倍。 商业化,意味着对产品的可用性和性能有着更苛刻的要求, 需要满足更高的SLA,99.99%读服务可用,99.9% 写服务可用,平均请求延时 小于50ms 99.99%。 云原生技术体系的深度融合,支持弹性伸缩,服务 ServerLess 化,资源成本最少降至 50% ,配合产品配置修改不重启的能力,做到 MSE 服务永远在线 求贤若渴 目前团队在高速发展,求贤若渴,职位详情见: 有想一起搞事的同学可以尽快联系我们!!!

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册