2022年2月22日 极链AI云
官网地址 点击注册
更多AI小知识,关注《极链AI云》公众号
人工智能从学术理论研究到生产应用的产品化开发过程中通常会涉及到多个不同的步骤和工具,这使得人工智能开发依赖的环境安装、部署、测试以及不断迭代改进准确性和性能调优的工作变得非常繁琐耗时也非常复杂。为了简化、加速和优化这个过程,学界和业界都作了很多的努力,开发并完善了多个基础的平台和通用工具,也被称会机器学习框架或深度学习框架。
哪一个深度学习框架是最好用呢?哪一个深度学习框架更适合自己呢?这真是一个十分让人纠结的问题。不过,在你选择站队之前,不妨和我一起来了解一下各个框架的来龙去脉,先看一看哪一个框架更能激发起你的兴趣,有了兴趣,剩下的问题就变得简单了,我们能够透过浮躁的排名和对比,深入研究这些框架背后的设计思想与技术本质。让每一个框架的优点都能为我所用。
当前主流的深度学习框架列表:
TensorFlow、Keras、PyTorch、MXNet、Caffe、Caffe2、Theano、FastAI、CNTK、Gluon、Torch、Deeplearning4j、Chainer。
看起来我们好像有很多很多选择,但其实如果我们进一步进行细分,就会发现我们的选择也并不是很多,没有巨头背书的框架就只能面临被淘汰和边缘化的命运了,其实顶级深度学习框架只有四大阵营,分别为:
每一个前端上层轻量级框架又都对应一个最适合的基础底层框架,这样就出现了深度学习框架的四大技术方向,每一个技术方向背后又都有一个巨头在背书和推动。
下面我们对每个主流框架的来龙去脉都来做一个详细的梳理与了解。
Google在2015年11月正式开源发布TensorFlow,TensorFlow由Google大脑团队开发,其命名来源于本身的运行原理。由于Google的巨大影响力和巨大支持,很快就成为深度学习领域占据绝对统治地位的框架。很多企业都在基于TensorFlow 开发自己的产品或将 TensorFlow整合到自己的产品中去,如Airbnb、Uber、Twitter、英特尔、高通、小米、京东等。
TensorFlow的编程接口支持C++和Python,Java、Go、R和Haskell API也将被支持,是所有深度学习框架中对开发语言支持的最全面的,TensorFlow可以在AWS和Google Cloud中运行,支持Windows 7、Windows 10、Windows Server 2016,TenserFlow使用C++ Eigen库,可以在ARM架构上编译和优化,使其可以在各种服务器和移动设备上部署自己的训练模型,也是在所有深度学习框架中支持运行平台最多的。
TensorFlow追求对运行平台和开发语言最广泛的支持,力求统一深度学习领域,但是这也带来了过于复杂的系统设计。
Keras是第二流行的深度学习框架,但并不是独立框架。Keras由纯Python编写而成,以TensorFlow、Theano或CNTK为底层引擎。Keras是在Tensorflow上层封装的高级API层,提升易用性。Keras的目标是只需几行代码就能让你构建一个神经网络。
Keras的创造者是谷歌AI研究员Francois Chollet,也同时参与TensorFlow的开发,最初创建Keras是为了自己有一个好的工具来使用RNNs。在研究LSTM在自然语言处理中的应用时用Theano做了一个可重用的开源实现,逐渐变成了一个框架,并命名为Keras。Keras在2015年3月开源,最初因为同时支持CNN和RNN,可以通过Python代码而不是通过配置文件来定义模型等特点而逐渐流行起来。2017年,Keras成为第一个被Google添加到TensorFlow核心中的高级别框架,这让Keras变成Tensorflow的默认API,使Keras + TensorFlow的组合成为Google官方认可并大力支持的平台。
学习使用Keras很容易,但是大多数时间都在学习如何调用接口,难以真正学习到深度学习的内容,Keras层层封装让用户在新增操作或获取底层的数据信息时过于困难,存在过度封装导致缺乏灵活性的问题,性能也存在瓶颈。Keras有助于快速入门,但是不应该依赖它,需要进一步学习使用TensorFlow。
PyTorch是Facebook开发的用于训练神经网络的Python包,也是Facebook倾力打造的首选深度学习框架,在2017年1月首次推出,Facebook人工智能研究院(FAIR)在GitHub上开源了PyTorch,迅速占领了GitHub热度榜榜首,Facebook用Python重写了基于Lua语言的深度学习库Torch。
PyTorch不是简单的封装Torch提供Python接口,而是对Tensor上的全部模块进行了重构,新增了自动求导系统,使其成为最流行的动态图框架,这使得PyTorch对于开发人员更为原生,与TensorFlow相比也更加年轻更有活力,PyTorch继承了Torch灵活、动态的编程环境和用户友好的界面,支持以快速和灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不妨碍其性能,即支持动态图形等尖端AI模型的能力,是快速实验的理想选择。
PyTorch专注于快速原型设计和研究的灵活性,很快就成为AI研究人员的热门选择,流行度的增长十分迅猛,现在已经是第二流行的独立框架。PyTorch的社区迅速发展起来。PyTorch 现在是GitHub 上增长速度第二快的开源项目,在过去的12个月里,贡献者增加了2.8倍。这个增速是十分可怕的,意味着PyTorch成为现在最受关注的深度学习框架,能够挑战TensorFlow的霸主地位。
Theano最早始于2007,以一个希腊数学家的名字命名,早期开发者是蒙特利尔大学的Yoshua Bengio 和 Ian Goodfellow。Theano是最老牌和最稳定的库之一,是第一个有较大影响力的Python深度学习框架,早期的深度学习库不是Caffe就是Theano。
Theano是一个比较底层的Python库,这一点上和TensorFlow类似,专门用于定义、优化和求值数学表达式,效率高,非常适用于多维数组,所以特别适合做机器学习。Theano可以被理解为一个数学表达式的编译器,Theano框架会对用符号式语言定义的程序进行编译,来高效运行于 GPU 或 CPU上。但是Theano不支持分布式计算,这使其更适合于在实验室的学习入门,并不适用于大型的工业界的项目,这可能是其技术上落后的一个重要原因。
Theano来自学界,它最初是为学术研究而设计,这使得深度学习领域的许多学者至今仍在使用 Theano,但Theano在工程设计上有较大的缺陷,有难调试,构建图慢的缺点,开发人员在它的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras上层接口封装框架。但随着 Tensorflow 在谷歌的大力支持下强势崛起,使用Theano的人已经越来越少了。基于 Theano 的前端轻量级的神经网络库,如 Lasagne和Blocks也同样没落了。但我们可以说,Theano作为第一个主要的Python深度学习框架,已经完成了自己的使命,为早期的研究人员提供了强大的工具和很大的帮助,为后来的深度学习框架奠定了以计算图为框架核心 ,采用GPU加速计算的基本设计理念。
Caffe的全称是Convolutional Architecture for Fast Feature Embedding,意为“用于特征提取的卷积架构”,它是一个清晰、高效的深度学习框架,核心语言是C++。Caffe是一款十分适合深度学习入门的开源框架,它的代码和框架都比较简单,代码易于扩展,运行速度快,也适合深入学习分析。在Caffe之前,深度学习领域缺少一个完全公开所有的代码、算法和各种细节的框架,导致很多的研究人员和博士需要一次又一次重复实现相同的算法,所以说Caffe对于深度学习开源社区的贡献非常大,Caffe是学术界和业界公认的最老牌的框架之一,是很多人入门的基础。
Caffe不支持分布式,与其它更新的深度学习框架相比,Caffe确实不够灵活,文档也不够用,Caffe的安装也比较复杂,安装需要解决大量的依赖包。大家会发现套用原有模型很方便,但个性化就要读源代码,灵活性明显不足,为模型做调整常常需要用 C++ 和 CUDA编程,虽然使用Python 和Matlab 也能做一些小调整。与Keras过度封装导致缺乏灵活性不同,Caffe缺乏灵活性主要是由于其自身的设计,在Caffe中最主要的抽象对象是层,每实现一个新层,必须要利用C++实现其前向传播和反向传播代码,如果需要新层在GPU上运行,还需要同时用CUDA实现这一层的前向传播和反向传播,这让不熟悉C++和CUDA的用户扩展Caffe非常困难。
2017年4 月 18 日,Facebook 开源了 Caffe2,Facebook 的AI双平台定位已经清晰了,Caffe2 的开发重点是性能和跨平台部署,PyTorch 则专注于快速原型设计和研究的灵活性。Caffe2一开始的定位就是工业界产品级别的一个轻量化的深度学习算法框架,更注重模块化,支持大规模的分布式计算,支持跨平台,如同 TensorFlow,Caffe2 使用 C++ Eigen 库,支持 ARM 架构。并且为移动端实时计算做了很多优化,支持移动端iOS, Android, 服务器端Linux, Mac, Windows, 甚至一些物联网设备如Raspberry Pi, NVIDIA Jetson TX2等平台部署。
Caffe2将AI生产工具标准化,目前全球各地的Facebook服务器和超过10亿部手机通过Caffe2运行神经网络,其中包含了最新的iPhone和Android手机。
虽然Facebook的Caffe2和PyTorch两个团队一直在独立的发展,但是二者的组件已经被大量共享,双方也意识到将各自的优势特性整合到一个包中的重要性,实现从快速原型到快速部署执行的平稳过渡是有重要意义的,这样也可以轻松地使用共享工具提高开发效率。最终可以将 PyTorch 前端的灵活用户体验与 Caffe2 后端的扩展、部署和嵌入式功能相结合。在2018年12月的 NeurIPS 大会上,Facebook 正式发布 PyTorch 1.0稳定版,支持AWS、谷歌云、微软Azure等云平台。贾扬清发文介绍PyTorch 1.0 = Caffe2 + PyTorch,至此,Facebook的AI深度学习框架正式统一。Caffe, Caffe2, Torch, PyTorch的用户们都不用再纠结了,有了统一明确的技术架构与技术路线,就是PyTorch 1.0。2018年3月底,Caffe2并入PyTorch。
Torch在2002年诞生于纽约大学Torch,后续加入了深度学习的内容,是一个著名开源深度学习框架,是BSD3协议下的开源项目。由Facebook的Ronan Collobert和Soumith Chintala,Twitter的Clement Farabet,DeepMind的Koray Kavukcuoglu共同开发和维护,所以Torch7自然也成为Facebook和DeepMind一开始使用的深度学习工具,Twitter和英伟达也都使用定制版的Torch用于人工智能研究,DeepMind在被Google收购后转向了TensorFlow。
Torch的编程语言为1990 年代诞生于巴西的 Lua,Lua相当于一个小型加强版的C,支持类和面向对象,运行效率极高,所以需要先学习Lua语言然后才能使用Torch,在开发人员没有熟练掌握Lua之前,使用Torch很难提高开发的整体生产力。其实Lua和Python都属于比较容易入门的语言,但Python很明显已经抢先统治了机器学习领域,大多数开发人员都不愿意为了使用一个框架而学习一门新语言,相反,一些开发人员在学习并掌握一门新语言后才会愿意使用基于这门语言的框架,这一点使Torch的进一步发展受到了限制,并导致Torch推广的困难。
FastAI不是一个独立的深度学习框架,而是一个基于PyTorch的上层封装的高级API层,提升PyTorch的易用性,目标是只需几行代码就能让你构建一个神经网络。FastAI并不是简单意义上的将PyTorch封装了一遍,而是类似于Keras与TensorFlow的关系,充分借鉴了Keras,将PyTorch的强大性易用化。
FastAI的作者Jeremy Howard,Jeremy Howard也是Kaggle的主席,写过一篇Introducing Pytorch for fast.ai,讨论为何FastAI从使用Keras转向创建自己的框架。FastAI的出品方是fast.ai,提供大量免费机器学习课程,有业界有一定的影响力,fast.ai也是美国军方的合作伙伴,研究如何加速人工智能技术的发展。
FastAI最初的版本在2018年9月发布,FastAI 1.0版本在2018年10月Facebook开发者大会上和Facebook的PyTorch 1.0 rc1预览版一起发布,在实验和测试比拼中,用5行代码就可以完成Keras用31行才能解决的事情,因此,在Hacker News上关注度比PyTorch 1.0还高,FastAI基于PyTorch 1.0框架,也被Facebook官方重点宣传。
MXNet是一个轻量级、可移植、灵活的分布式的开源深度学习框架,也是Amazon官方主推的深度学习框架,MXNet 支持卷积神经网络(CNN)、循环神经网络(RNN)和长短时间记忆网络(LTSM),为图像、手写文字和语音的识别和预测以及自然语言处理提供了出色的工具。
目前主流的深度学习系统一般采用命令式编程(imperative programming,比如 Torch)或声明式编程(declarative programming,比如 Caffe,theano 和 TensorFlow)两种编程模式中的一种,而 MXNet 尝试将两种模式结合起来,在命令式编程上 MXNet 提供张量运算,而声明式编程中 MXNet 支持符号表达式。用户可以根据需要自由选择,同时,MXNet 支持多种语言的 API 接口,包括 Python、C++(并支持在 Android 和 iOS 上编译)、R、Scala、Julia、Matlab 和 JavaScript。
MXNet的优势是分布式支持和对内存、显存的明显优化,同样的模型,MXNet往往占用更小的内存和显存,在分布式环境下,MXNet的扩展性能也显示优于其他框架。Keras作Francois Chollet认为除了TensorFlow,MXNet和它的高级API接口Gluon也很有前景,与TensorFlow一样,MXNet是为数不多的具有实际生产级和可扩展性的框架。亚马逊有一个庞大的团队在很认真的支持MXNet,成为了MXNet背后强大的工程力量。
2017年10月20日,Amazon和 Microsoft 联合发布了Gluon,Gluon是一种新的动态计算图的开源深度学习框架的高级接口,简而言之,是一个基于MXNet深度学习框架的类似Keras和FastAI的上层API接口,但其最大的特点是Gluon同时支持灵活的动态图和高效的静态图,支持符号式和命令式编程的API,支持高度可扩展的训练,能够高效的评估模型,可帮助开发人员更轻松、更快速地构建机器学习模型,而不牺牲任何性能。Gluon现已在Apache MXNet 中可用,后续将支持Microsoft Cognitive Toolkit及其他架构。微软Azure的所有服务、工具和基础结构也将全面支持Gluon。
微软的人工智能工具包是CNTK,CNTK 全名为Computational Network Toolkit,2016年1月26日宣布在GitHub上开源,10月份又更命名为微软认知工具包Microsoft Cognitive Toolkit。CNTK最初是面向语音识别的框架,早在2014年,黄学东博士和他的团队正在对计算机能够理解语音的能力进行改进,但是手上的工具却延缓了他们的进度,一组自发组成的团队构想设计了一个全新的方案,由此诞生了CNTK,微软语音识别研究团队在语音识别上不断打破世界纪录并逼近人类水准,使得微软的技术受到广泛关注,在处理图像、手写字体和语音识别问题上,它都是很好的选择。
Cognitive Toolkit工具包在微软内部被广泛使用,微软的人工智能工具包跟其他工具包最大的不同在于数据,Cognitive Toolkit的数据都来自于微软自己的大规模生产数据。包括Cortana、Bing以及Cognitive Services中的Emotion API,这些都是用Cognitive Toolkit创建出来的
CNTK基于C++架构,Python或C++编程接口,CNTK 支持 64 位的 Linux 和 Windows 系统,在 MIT 许可证下发布。支持跨平台的CPU/GPU 部署。CNTK 在 Azure GPU Lab 上显示出最高效的分布式计算性能。但CNTK现在还不支持ARM 架构,使其在移动设备上的功能受到了限制。
Deeplearning4J,简称DL4J,是一个基于Java和Scala的开源的分布式深度学习库,开发语言是Java,由Skymind于2014年6月发布,DeepLearning4j的目标是提供一个即插即用的面向生产环境和商业应用的高成熟度深度学习开源库,可以方便的与Hadoop和Spark集成。DL4J选择Java作为其开发语言的原因在于目前基于Java的分布式计算、云计算、大数据的生态和开发者群体非常庞大。用户可能拥有大量的基于Hadoop和Spark的集群,因此在这类集群上搭建深度学习平台的需求便很容易被DL4J满足。同时JVM的生态圈内还有很多的Library的支持,DL4J也创建了ND4J,依靠ND4J进行基础的线性代数运算,其处理大矩阵乘法的速度比NumPy更快,可以说是JVM中的NumPy,支持大规模的矩阵运算。
Deeplearning4j为多芯片运行而优化,支持采用CUDA C的x86和GPU。DL4J的并行运行是自动化的,实现了从节点(worker nodes)和连接的自动化设置,可以与Hadoop及Spark自动整合,同时可以方便地在现有集群(包括但不限于AWS,Azure等)上进行扩展,同时DL4J的并行化是根据集群的节点和连接自动优化,不像其他深度学习库那样可能需要用户手动调整。
Chainer是由日本深度学习创业公司Preferred Networks于2015年6月发布的深度学习框架。最大的特点是支持动态图,曾经是动态计算图的首选框架,特别适用于自然语言处理。Chainer是用Python开发的,支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)。前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度。
2019年12月,Preferred Networks宣布将其开发工作由Chainer转至PyTorch,而Chainer在v7版本后仅仅提供维护补丁。
下面要重点介绍一下诞生于中国本土深度学习框架,他们正在崛起:
2018年10月10日,华为在上海全联接大会上首次发布华为AI战略与全栈全场景AI解决方案,包括Ascend(昇腾)系列AI芯片以及CANN算子库、MindSpore深度学习框架、AI开发平台ModelArts。华为MindSpore支持端、边、云独立的和协同的统一训练和推理框架。但是目前仍然在开发中,以华为在中国科技界地位和研发投入,自然是最受大家期待的。华为云虽然可以支持其它所有主流的深度学习框架,但就如同Amazon选择MXNet一样,这不是一个可以讨论的问题,为了不受制于人,是一定要有的。我相信为了与其它主流框架进行竞争,MindSpore将来也一定会开源的。
2016年8月底百度开源了内部使用多年的深度学习平台PaddlePaddle,PaddlePaddle 100% 都在Github上公开,没有内部版本。PaddlePaddle能够应用于自然语言处理、图像识别、推荐引擎等多个领域,其优势在于开放的多个领先的预训练中文模型。PaddlePaddle的2013年版本是百度杰出科学家徐伟主导设计和开发的,其设计思路是每一个模型的表示方式都是“一串Layers”, Caffe的作者贾扬清称赞了百度的 PaddlePaddle,并说“整体的设计感觉和 Caffe 心有灵犀”。三年后,百度AI团队在徐伟的指导下作了两次升级,2017年4月推出PaddlePaddle v2,v2参考TensorFlow增加了Operators的概念,把Layers打碎成更细粒度的Operators,同时支持更复杂的网络拓扑图而不只是“串”。2017 年底推出PaddlePaddleFluid。Fluid类似PyTorch,提供自己的解释器甚至编译器,所以不受限于 Python 的执行速度问题。
2018年11月,阿里巴巴宣布,其大数据营销平台阿里妈妈将把其应用于自身广告业务的算法框架XDL (X-Deep Learning)进行开源,正式加入开源学习框架的激烈竞争。XDL主要是针对特定应用场景如广告的深度学习问题的解决方案,是上层高级API框架而不是底层框架。XDL需要采用桥接的方式配合使用 TensorFlow 和 MXNet 作为单节点的计算后端,XDL依赖于阿里提供特定的部署环境。
2018年6月28日,小米首席架构师、人工智能与云平台副总裁崔宝秋宣布正式开源小米自研的移动端深度学习框架(MACE) Mobile AI Compute Engine。它针对移动芯片特性进行了大量优化,目前在小米手机上已广泛应用,如人像模式、场景识别等。该框架采用与 Caffe2 类似的描述文件定义模型,因此它能非常便捷地部署移动端应用。目前该框架为 TensorFlow 和 Caffe 模型提供转换工具,并且其它框架定义的模型很快也能得到支持。
旷视天元MegEngine是Brain++的最为核心组件,也是全新一代的工业级深度学习开源框架。天元可帮助开发者用户借助友好的编程接口,进行大规模深度学习模型训练和部署。架构上天元具体分为计算接口、图表示、优化与编译、运行时管理和计算内核五层,可极大简化算法开发流程,实现了模型训练速度和精度的无损迁移,支持动静态的混合编程和模型导入,内置高性能计算机视觉算子,尤其适用于大模型算法训练。
进入深度学习领域,基础是学习Python。可以说现在进入深度学习领域是相对容易的,在5年前,研究深度学习需要用C++或Matlab来编写大量的低级算法,这需要研究生教育甚至是博士的教育。现在不一样了,你只需要学习Python,就很容易上手,虽然深度学习正在支持越来越多的编程语言,但Python最简单而且应用最广泛的一个,Python最厉害的地方在于其生态系统非常好,有社区的强大支持,比如要装Python,有方便的Anaconda;要用Python visualization,有Matplotlib可以用;要Numerical computation有NumPy和SciPy可以选择,要做图像处理,还有Scikit-image。有很多现成的工具可以使用,可以节省自己大量的时间,这正是工程师所需要的。
在对所有主流深度学习框架有一个了解后,我想是时候舍弃开发语言(基本都支持Python和C++,Java和Lua面向特定社区)、接口简易、文档完善、运算速度、性能、安装部署方便等方面的纯技术比较了,可能在这些框架诞生的初期我们更看重这些方面,但是随着各个框架的不断的完善与大企业的支持与不断的投入,各个框架之间也在不断的相互借鉴,最后的结果就是大家都差不多,各有千秋,我们现在要进入深一层维度的比拼,应该至少考虑下面几个维度:
分布式:TensorFlow、MXNet、PyTorch、CNTK、Caffe2、DL4J
不支持分布式:Caffe、Theano、Torch
目前使用动态计算图的框架有PyTorch、MXNet、Chainer。
目前使用静态计算图框架有TensorFlow、Keras、CNTK、Caffe/Caffe2、Theano等,其中TensorFlow主要使用了静态计算图,TensorFlow在2018年10月宣布了一个动态计算选项Eager Execution,但该特性还比较新颖可能并不是很成熟,并且 TensorFlow 的文档和项目依然以静态计算图为主。MXNet同时具有动态计算图和静态计算图两种机制。
那么在这四大阵营中又如何选择呢?这就要看具体项目的需要了,看重Google无与伦比的巨大影响力的开发者并不需要太过纠结,TensorFlow会支持最广泛的开发语言与最多的运行平台,开发者很难逃出Google的覆盖范围,更多的开发者会被收编,AlphaGo已经帮助Google证明了Google在人工智能上技术领先地位,Keras+TensorFlow的方案已经被Google官方认可,Google的TensorFlow2.0将带来的新技术与突破;喜欢学习新事物和追求完美的开发者一定不能错过Facebook的PyTorch,PyTorch正在强势崛起,是动态图技术的最佳代表,是当前最活跃最有生命力的深度学习框架,这一次Google遇到了真正的对手;Amazon在云计算和云服务上的领先地位带给开发者更大的信心,选择Amazon人工智能背后的技术一定没有错;微软的技术正在不断挑战人类语音识别和图像识别的极限,长期受益于微软阵营的开发人员对于微软开源其核心技术是非常兴奋的,Cognitive Toolkit (CNTK)可以被Keras和Gluon同时支持,这太棒了,确实带给开发者更多的选择。
学习框架其实只是一个工具和平台,虽然分为四大阵营和四大技术路线,但是得益于这些主流框架之间的不停的比拼与互相借鉴,最后会发现其实大家都差不多,最棒的是这些主流的深度学习框架都是基于Python的,只要掌握了Python和深度学习算法的设计思想,每一种框架都是一个可用的库或工具集,我们是工程师,工程师需要善于学习并善于选择使用最优的工具。初学者可以从上层高级API框架开始学习,如Keras、Gluon和FastAI,但是不能依赖这些层层封装高级API,不然是无法真正掌握深度学习的技术本质的。深入学习并熟练掌握一种顶级深度学习框架是非常重要的,比如PyTorch,然后再跑一跑TensorFlow和MXNet,我们可以在对比中学习,在深度学习领域,可以深刻理解什么是“纸上得来终觉浅”,我觉得学习深度学习及人工智能技术,一定要动手实践,只有动手做过了才是自己的,不然,一切都还是书本上的。