智造讲堂:典型深度学习框架

文摘   2024-08-14 08:14   北京  

引自:《深度学习模型与算法基础》(作者:许庆阳、宋勇、张承进)

该书已出版,详细信息请见文末~



对于早期小型神经网络的程序设计,通常采用命令式编程语言实现。在21世纪初,可以用来描述和开发神经网络的工具主要是以原始编程语言为主,包括 MATLAB、OpenNN、Torch、Lua 等,这些编程语言要么不是专门为神经网络模型开发定制的,要么拥有复杂的用户API,缺乏GPU支持。但是对于当前的大型或超大规模神经网络,由于网络复杂度高,并且在计算过程中需要利用GPU等硬件进行加速。因此,开发人员在使用这些编程语言时,不得不做很多繁重的工作。随着深度神经网络的提出以及蓬勃发展,为了帮助深度学习开发者更加快速、方便地开发各种深度学习算法,神经网络编程方法也发生了根本性的转变,各种针对深度学习算法开发的编程库被提出,因此大型神经网络模型的设计通常都会采用深度网络编程框架,神经网络编程由底层开发逐渐转变为高层架构的开发。图1展示了一般的深度学习编程库的层次。

 

1 深度学习框架结构示意图


深度学习框架最上层为编程库提供的编程接口,程序员通过调用编程接口来描述算法的计算过程。对于开发者来说,编程接口具有易用以及表达能力强的特性,对算法的描述最终会映射到计算图上,对计算图进行优化和调度后,图中的每一个算子会调用硬件的计算接口,如Nvidia厂商发布的、在其GPU设备上处理深度学习算法的高性能库——cuDNN。最后,这些硬件调用接口(高性能库)进一步生成硬件指令,以便在硬件设备上运行。比如,TensorFlow编程接口是基于图的,源文件是一个python文件,而Caffe基于层的框架采用自定义的prototxt文件构建神经网络。同时,神经网络编程框架也在不断地发展。早期主要以理论研究及验证为主,并不断改善其性能,随着人工智能技术的发展以及应用落地的需求,深度学习编程框架逐渐向全场景发展,新的编程框架不但能够进行理论设计及验证,还便于算法的移植和落地,图2为深度学习编程框架发展示意图。

 

2 深度学习框架发展示意图


「 1. 国外深度学习框架 


1)Torch


Torch在2002年诞生于纽约大学,是基于BSD3协议下的开源项目,后续加入了深度学习相关内容,是著名的开源深度学习框架。由Facebook的Ronan Collobert和Soumith Chintala、Twitter的Clement Farabet、DeepMind的Koray Kavukcuoglu共同开发和维护,因此Torch自然也成为Facebook和DeepMind研究深度学习时使用的工具,Twitter和英伟达也都使用定制版的Torch用于人工智能研究,DeepMind在被Google收购后才转向了TensorFlow。


Torch的编程语言为Lua,Lua在1990年诞生于巴西,相当于一个小型加强版的C,支持类和面向对象,运行效率极高。开发人员使用Torch提高机器学习算法开发的效率,需要熟练掌握Lua。Torch是命令式的开发方式,具有更高的灵活度,而TensorFlow和Theano是陈述式的,必须先声明一个计算图。Torch 适用于卷积神经网络的开发,Torch具有更自然的原生交互界面。


Lua和Python都属于比较容易入门的语言,但Python很明显已经抢先统治了机器学习领域,大多数开发人员在学习并掌握一门新语言后才会愿意使用基于这门语言的框架,而不愿意为了使用一个框架而学习一门新语言,这一点使Torch的进一步发展受到了限制、推广变得困难。


2)Theano


Theano以一位希腊数学家的名字命名,最早始于2007,由蒙特利尔大学的Yoshua Bengio 和 Ian Goodfellow主持开发的一个基于图的Python机器学习库。Theano是最老牌和最稳定的机器学习库之一,也是第一个有较大影响力的Python深度学习框架,因此早期的深度学习库的开发不是Caffe就是Theano。


Theano是一个比较底层的Python库,用于定义、优化和求值数学表达式,效率高,适用于多维数组运算。Theano可以被理解为一种数学表达式的编译器,对符号式语言定义的程序进行编译,然后高效运行于GPU或CPU上。当数据量较大时,Theano可以获得与手工优化的C代码相媲美的运行速度。Theano来自学界,因此其主要用于学术研究,许多深度学习领域的学者至今仍在使用 Theano,但Theano在工程设计上有一定的局限性,有难以调试、计算图构建速度慢、不支持分布式计算的缺点。因此Theano适合于实验室研究,而不适用于大型的工业项目,这可能是影响其发展的一个重要原因。开发人员在Theano的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras上层接口封装框架。但随着谷歌Tensorflow的强势崛起,使用Theano的人已经越来越少了,尤其是其创始者之一的 Ian Goodfellow 放弃Theano转去谷歌开发Tensorflow,而另一位创始人Yoshua Bengio于2017年09月宣布不再维护Theano。基于Theano的前端轻量级的神经网络库,如 Lasagne和Blocks也同样没落了。但Theano作为第一个基于Python的深度学习框架,为早期的研究人员提供了强大的工具和帮助,为后来的深度学习框架的设计奠定了以计算图为框架核心、采用GPU加速计算的基本设计理念。


3)Caffe


Caffe意为用于特征提取的卷积架构,它是一个清晰、高效的深度学习框架,核心语言是C++。作者是本科和硕士毕业于清华大学的贾扬清,他曾在Google Brain工作,参与过TensorFlow的开发。贾扬清在2013年9月利用NVIDIA学术捐赠的一块K20 GPU,搭建了一台用于深度学习训练的机器,然后用大概两个多月的时间编写了Caffe架构各个模块的实现,12月份正式在Github上发布开源。在Caffe之前,深度学习领域缺少一个完全公开源代码、算法和各种细节的框架,导致很多的研究人员和博士需要一次又一次重复实现相同的算法,所以说Caffe对于深度学习开源社区的贡献非常大,Caffe是学术界和业界公认的最老牌的框架之一。


Caffe也是一款十分适合深度学习入门的开源框架,其源代码和框架都比较简洁,易于扩展、运行速度快。正是由于Caffe有着更小的系统框架,使得一些探索性的实验更加便于实现。即使在Google工作时,贾扬清仍然会经常使用Caffe来做一些快速的原型实验。但其他更新的深度学习框架相比,Caffe不支持分布式计算、灵活性不足,模型的修改往往需要C++和CUDA编程。与Keras过度封装导致缺乏灵活性不同,Caffe缺乏灵活性主要是由于Caffe中最主要的抽象对象是层,每添加和实现一个新层,必须要利用C++编写其前向传播和反向传播代码,如果需要新层在GPU上运行,还需要同时利用CUDA实现这一层的前向传播和反向传播,这使得不熟悉C++和CUDA的用户难以扩展Caffe。


与Theano的没落与终结不同,随着贾扬清在2016年2月加入Facebook,2016年11月贾扬清在 Facebook 官网发文,介绍了基于Unix理念构建的轻量级、模块化框架Caffe2go,可以附加多个模块。Caffe2go规模更小、训练速度更快、对计算性能要求较低,能够在手机等移动平台上运行神经网络模型,实时获取、分析、处理像素。Caffe2go是Facebook继Torch后的第二个AI平台,因为其大小、速度和灵活性上的优势,Facebook曾将Caffe2go推上了战略地位,和Torch研究工具链一起组成了Facebook 机器学习产品的核心。2017年4月18日,Facebook开源了定位于工业界产品级别的一个轻量化的深度学习算法框架Caffe2,Caffe2更注重模块化、支持大规模的分布式与跨平台计算。如同TensorFlow,Caffe2使用C++ Eigen库,支持ARM架构,并且为移动端实时计算做了很多优化,支持移动端iOS、Android、服务器端Linux、Mac、Windows,甚至可以在一些物联网设备如Raspberry Pi、NVIDIA Jetson TX2等平台部署。因此,Caffe2的开发重点是性能和跨平台部署,PyTorch则专注于快速原型设计和研究的灵活性。Caffe2将AI生产工具标准化,目前全球各地的Facebook服务器和超过10亿部手机通过Caffe2运行神经网络,其中包含了最新的iPhone和Android手机。


4)MXNet


MXNet项目诞生于2015年9月,是当时在卡耐基梅隆大学在读的博士李沐提出的,MXNet在2016年11月被亚马逊选为官方开源平台,2017年1月23日,MXNet项目进入Apache基金会,成为Apache的孵化器项目。Amazon和Apache的双重认可使其生命力更加强大,成为能够与Google的TensorFlow、Facebook的PyTorch和微软的CNTK相竞争的顶级深度学习框架。值得一提的是,MXNet的很多作者都是中国人,其最大的贡献组织为百度。MXNet是一个轻量级、可移植、灵活的分布式的开源深度学习框架,MXNet支持卷积神经网络、循环神经网络和长短时间记忆网络,为图像、手写文字和语音的识别和预测以及自然语言处理提供了出色的工具。MXNet的优势是分布式支持和对内存、显存的优化,同样的模型,MXNet往往占用更小的内存和显存;在分布式环境下,MXNet的扩展性能也显著优于其他框架。


5)TensorFlow


Google在2015年11月正式开源由Google大脑团队开发的TensorFlow,其命名来源于本身的运行原理。由于Google的巨大影响力和支持,TensorFlow很快成为深度学习领域占据绝对统治地位的框架。很多企业都在基于TensorFlow 开发自己的产品,如Airbnb、Uber、Twitter、英特尔、高通、小米、京东等。Google在2014年1月收购了英国的DeepMind公司,DeepMind成为谷歌大脑之外另一个研究人工智能方向的团队。在Google的大力支持下,AlphaGo横空出世,使人工智能第一次战胜人类职业围棋高手,轰动世界,以一己之力推动人工智能应用到了一个新的高度。2016年4月,DeepMind宣布将来所有的研究使用TensorFlow。这样Google的两大人工智能团队在统一的深度学习框架TensorFlow进行研究工作。


TensorFlow同样基于计算图实现自动微分系统,使用数据流图进行数值计算,图中的节点代表数学运算,图中的线条则代表在这些节点之间传递的张量(多维数组)。TensorFlow的编程接口支持C++和Python,Java、Go、R和Haskell API也将被支持,是所有深度学习框架中对开发语言支持最全面的一个,支持Windows 7、Windows 10、Windows Server 2016,TenserFlow使用C++ Eigen库,可以在ARM架构上进行编译和优化,使其可以在各种服务器和移动设备上部署自己的训练模型,也是在所有深度学习框架中支持运行平台最多的。TensorFlow追求对运行平台和开发语言最广泛的支持,但这也使得系统设计过于复杂,同一个功能又提供了多种实现,频繁的接口变动也导致了向后兼容性的问题。由于直接使用TensorFlow编程过于复杂,包括Google官方在内的很多开发者尝试构建高级API作为TensorFlow的开发接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等,其中Keras在2017年成为第一个被Google添加到TensorFlow核心中的高级别框架,称为TensorFlow的默认API。


2017年底Google发布针对移动和嵌入式设备的轻量级解决方案TensorFlow Lite,TensorFlow在移动设备上运行机器学习的跨平台解决方案,实现TensorFlow在 Android、iOS、Raspberry Pi 以及其他基于 Linux 的物联网设备间的无缝工作。具有低延迟、运行时库 (runtime library) 极小等特性,此外还有一系列的模型转换、调试和优化工具。


6)PyTorch


PyTorch是Facebook在2017年1月首次推出,用于神经网络训练的Python包,也是Facebook倾力打造的首选深度学习框架。Facebook采用Python重写了基于Lua语言的深度学习库Torch。PyTorch不是简单的封装Torch提供Python接口,而是对基于Tensor运算的全部模块进行了重构,新增了自动求导系统,使其成为最流行的动态图计算框架,对于开发人员而言PyTorch编程更为原生,与TensorFlow相比也更加具有活力。PyTorch继承了Torch灵活、动态编程环境和用户界面友好的优点,支持以快速和灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不妨碍其性能,便于模型的快速验证。因此,PyTorch专注于快速原型设计和研究的灵活性,很快就成为AI研究人员的热门选择,不断挑战TensorFlow的霸主地位。


2018年12月8号Facebook在NeurIPS大会上正式发布PyTorch 1.0稳定版,PyTorch 1.0将即时模式和图执行模式融合在一起,拥有能在命令式执行模式和声明式执行模式之间无缝转换的混合式前端,这样就无需开发人员重写代码来优化性能或从Python迁移,将用于原型设计的即时模式和用于生产环境的图执行模式之间的大部分代码实现共享。既具备研究的灵活性,也具备生产所需的最优性能。PyTorch 1.0重构和统一了Caffe2和PyTorch 0.4框架的代码库,删除了重复的组件并共享上层抽象,得到了一个统一的框架,支持高效的图模式执行、移动部署等,使得开发人员同时拥有PyTorch和Caffe2的优势,同时做到快速验证和性能优化。


「 2. 国内深度学习框架 


1)百度Paddle


2016年8月百度开源了内部使用多年的深度学习平台Paddle(飞桨),这是我国首个功能完备的自研深度学习开源框架。Paddle能够应用于自然语言处理、图像识别、推荐引擎等多个领域,拥有多个领先的预训练中文模型。Paddle的设计思路类似于Caffe,将每一个模型表达为不同层的堆叠。接下来百度AI团队对Paddle作了两次升级,2017年4月推出Paddle v2,该版本参考TensorFlow增加了Operators的概念,将层拆解为细粒度的Operators,同时支持更复杂的网络拓扑图而不只是“串”;2017 年底推出了类似PyTorch的Paddle Fluid,提供自己的解释器甚至编译器,不受限于Python的执行速度问题。


2)腾讯优图NCNN/TNN


2017年,腾讯优图实验室公布了成立以来的第一个开源项目NCNN,这是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖、跨平台、运行于手机端 CPU。2020年6月10日,腾讯优图实验室正式开源新一代移动端深度学习推理框架TNN,是对2017年开源的NCNN框架进行了重构升级,通过底层技术优化实现在多个不同平台的轻量部署落地,性能优异、简单易用。TNN将移动端高性能融入核心理念,基于TNN的深度学习算法能够轻松移植到手机端高效的执行,开发出人工智能 APP。通过GPU深度调优、ARM SIMD深入汇编指令调优、低精度计算等技术手段,在性能上取得了进一步提升。低精度计算的运用对TNN的性能提升发挥了重要作用。在神经网络计算中,浮点精度在许多研究和应用落地中都被证明存在一定的冗余,而在计算、内存资源都极为紧张的移动端,消除这部分冗余极为必要。TNN引入了INT8、FP16、BFP16等多种计算低精度的支持,相比于仅提供INT8支持的移动端框架,不仅能灵活适配不同场景,还让计算性能大大提升。TNN通过采用8bit整数代替float进行计算和存储,模型尺寸和内存消耗均减少至1/4,在计算性能上提升50%以上。同时引入ARM平台BFP16的支持,相比浮点模型,BFP16使模型尺寸、内存消耗减少50%,在中低端机上的性能也提升约20%。


3)华为MindSpore


2018年10月10日华为在上海全联接大会首次提出支持端、边、云独立和协同的统一训练和推理框架MindSpore。与其他深度学习开发框架类似,MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并在按需协同的基础上,实现更加友好的AI算法开发,减少模型开发时间,降低模型开发门槛。通过MindSpore自身的技术创新及MindSpore与华为昇腾AI处理器的协同优化,实现了运行态的高效,大大提高了计算性能;MindSpore也支持GPU、CPU等其他处理器。


全栈全场景AI解决方案,全场景是指包括公有云、私有云、各种边缘计算、物联网行业终端以及消费类终端等部署环境,如图3所示。

 

3 华为全栈全场景AI解决方案


全栈是从技术功能视角出发,包括Ascend(昇腾)系列人工智能芯片、基于芯片使能的技术框架CANN算子库和训练与推理深度学习框架MindSpore、以及应用使能的AI开发平台ModelArts。华为全栈全场景AI解决方案实现一次性算子开发、一致的开发和调试体验,以此帮助开发者实现一次开发,在所有设备上平滑迁移能力。


MindSpore总体框架分为MindSpore前端表示层、MindSpore计算图引擎和MindSpore后端运行时三层,如图4所示。

 

4 MindSpore总体框架


MindSpore前端表示层部分包含Python API、MindSpore IR(intermediate representation)、计算图高级别优化(graph high level optimization,GHLO)三部分。Python API向用户提供统一的模型训练、推理、导出接口,以及统一的数据处理、增强、格式转换接口;MindSpore IR提供统一的中间表示,并基于IR进行优化;GHLO包含硬件无关的优化(如死代码消除等)、自动并行和自动微分等功能。MindSpore计算图引擎GE(graph engine)部分包含计算图低级别优化(graph low level optimization,GLLO)、图执行等组成部分。GLLO包含硬件相关的优化,以及算子融合、Buffer融合等软硬件结合相关的深度优化。图执行提供离线图执行、分布式训练所需要的通信接口等功能。MindSpore后端运行部分包含云、边、端上不同环境中的高效运行环境。从整体架构来看,MindSpore包含如上部分。如果从技术处理细节角度看,MindSpore具备基于源码转换的通用自动微分、自动实现分布式并行训练、数据处理、以及图执行引擎等功能特性。


神经网络计算架构(compute architecture for neural networks,CANN)是是一种高度自动化的芯片算子库与开发工具。根据官方数据,CANN可以3倍提升开发效率。除了效率之外,也兼顾算子性能,以适应学术和行业应用的迅猛发展。针对异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。


Ascend(昇腾)人工智能芯片是基于统一、可扩展架构的系列化AI IP和芯片,包括Max、Mini、Lite、Tiny和Nano等五个系列。全场景包括云、服务器、终端、穿戴设备等对应的平台。在华为的芯片计划中,除了Max系列的昇腾910主要用于云端,所属Mini系列昇腾310和其他的Lite、Tiny、Nano系列,主要用于物联网、行业终端、智能手机、智能穿戴等消费终端,以IP方式与其他芯片结合服务于各个产品。


Ascend-Max昇腾910(功耗310W)用于云服务器,是当时全球已发布的单芯片计算密度最大、算力最强、训练速度最快的AI芯片,其算力是国际顶尖AI芯片的2倍,相当50个当时最新最强的CPU,其训练速度比当时最新最强的芯片提升了50%~100%。与AI开源计算框架MindSpore相配合,更易于AI科学家和工程师使用,提升效率。该计算框架可满足终端、边缘计算、云平台全场景的需求,更好地保护数据隐私,可开源形成广阔应用生态。昇腾310(功耗8W)已经落地商用,广泛应用于摄像机、无人机、机器人等产品形态,并提供AI云服务;边缘计算场景的智能设备上使用,目前面向边缘计算场景提供强算力的支持。TINY主要应用于麒麟990、NANO计划应用于穿戴设备。


AscendCL是昇腾硬件的统一编程接口,包含了编程模型、硬件资源抽象、AI任务及内核管理、内存管理、模型和算子调用、媒体预处理接口、加速库调用等一系列功能,充分释放昇腾系统多样化算力,使能开发者快速开发AI应用。TBE算子开发工具预置丰富API接口,支持用户自定义算子开发和自动化调优,缩短工期,节省人力。算子库是基于昇腾处理器,深度协同优化的高性能算子库。


ModelArts提供AI应用开发的全流程服务,包括分层API和预集成方案,满足不同开发人员的需求,加快AI应用开发和部署,促进AI的应用。AI开发的核心流程主要包括前期准备(方案设计)、数据准备、算法选择与开发、模型训练、模型评估与调优、应用生成/评估与发布、应用维护子流程。各个子流程都涉及众多复杂工作,存在成本、门槛、效率和可信等多方面的挑战。ModelArts提供大量的预置算法和框架,以及WorkFlow编排能力,最大化地降低AI应用开发的门槛,加速AI应用开发和部署流程。


4)阿里巴巴XDL


2018年11月,阿里巴巴宣布将其应用于自身广告业务开发的算法框架(X-deep learning,XDL)进行开源,正式加入开源学习框架的激烈竞争。XDL主要是针对特定应用场景,如广告问题的深度学习解决方案。XDL是上层高级API框架而不是底层框架。XDL需要采用桥接的方式配合使用TensorFlow和MXNet作为单节点的计算后端,XDL依赖于阿里提供特定的部署环境。


5)小米MACE


2018年6月28日,小米首席架构师、人工智能与云平台副总裁崔宝秋宣布正式开源小米自研的移动端深度学习框架(mobile AI compute engine,MACE)。它针对移动芯片特性进行了大量优化,目前在小米手机上已广泛应用,如人像模式、场景识别等。该框架采用与Caffe2类似的描述文件定义模型,因此能够便捷地部署移动端应用。目前该框架为TensorFlow和Caffe模型提供转换工具,并且其他框架定义的模型很快也能得到支持。


6)旷视MegEngine


2020年3月25日,中国的初创公司旷视科技(Megvii Technology)将其深度学习框架MegEngine开源。MegEngine是旷视AI 生产力平台 Brain++的核心组件,可以用于训练计算机视觉算法,并帮助世界各地的开发人员构建商业和工业用途的AI解决方案。MegEngine倾向于提升网络的训练和推理的速度,加快算法的落地周期,在这个基础上向体验方面优化。旷视作为一家AI初创公司,算法交付速度快、对需求灵活机动是重中之重。因此,确保模型训练完后可以直接使用SDK成为最重要的目标,MegEngine的训练和推理是完全相同的核心,也就是说所有训练时会做的图优化在推理时也会进行,从而容易做到精度对齐,而缺点就是所有代码在编写时需要考虑的问题更多了。


7)清华计图Jittor


2020年3月20日,首个国内高校自研的深度学习框架计图由清华大学发布。计图(just in time,Jittor)是一个采用元算子表达神经网络计算单元、完全基于动态编译的深度学习框架,其主要特性为元算子和统一计算图。Jittor通过元算子再优化的思路,与 torch相比更偏向科研,或者说是框架本身的科研,而如何做推理、甚至多卡的使用考虑较少。基于这一点,Jittor能更方便的与各种不同的科研场景相结合,验证的方案,从而有效地推进科研。在编程语言上,Jittor采用了灵活而易用的 Python。用户可以使用Python编写元算子代码,然后 Jittor将其动态编译为C++,实现高性能运算。



版权归原作者所有

编辑:刘杨

编审:辛召



——————————————————————


购买链接

点击我购买 




相关阅读推荐(点击文章标题跳转)↓

1. 2021清华大学出版社智能制造图书推荐:新年智造书单

2. 清华大学出版社2022年上半年智能制造图书推荐:最新智造书单出炉
3.一篇文章带你了解智能制造课程怎么开
4.清华大学出版社智能制造知识服务平台试用邀请函
5.“智能制造系列丛书及知识服务平台”发布仪式顺利举办
6.国家出版基金项目暨“十三五”国家重点图书出版规划项目
——“智能制造系列丛书及知识库”圆满结项
7.新书推荐丨“图像图形智能处理理论与技术前沿”系列丛书《场景建模与机器人感知》正式出版
8.新书推荐丨“图像图形智能处理理论与技术前沿”系列丛书之《刑侦红外图像免疫智能处理理论与技术》正式出版


智造苑
欢迎加入,秉承“先进制造、制造强国”的理念,为大家提供专业的知识服务!
 最新文章