2016-08-29 10:54:36 oDaiLiDong 阅读数 2205
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30888 人正在学习 去看看 唐宇迪
 CaffeTorchTheanoTensorFlow
LanguageC++, PythonLuaPythonPython
PretrainedYes ++Yes ++Yes (Lasagne)Inception
Multi-GPU: Data parallelYesYesYesYes
Multi-GPU: Model parallelNoYesExperimentalYes (best)
Readable source codeYes (C++)Yes (Lua)NoNo
Good at RNNNoMediocreYesYes (best)
  
  
2019-06-04 18:39:29 weixin_45139605 阅读数 296
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30888 人正在学习 去看看 唐宇迪

一、深度学习框架概述与深度学习技术的四大阵营

人工智能从学术理论研究到生产应用的产品化开发过程中通常会涉及到多个不同的步骤和工具,这使得人工智能开发依赖的环境安装、部署、测试以及不断迭代改进准确性和性能调优的工作变得非常繁琐耗时也非常复杂。为了简化、加速和优化这个过程,学界和业界都作了很多的努力,开发并完善了多个基础的平台和通用工具,也被称会机器学习框架或深度学习框架。有了这些基础的平台和工具,我们就可以避免重复发明轮子,而专注于技术研究和产品创新。这些框架有早期从学术界走出的Caffe、 Torch和Theano,到现在产业界由Google领导的TensorFlow,Amazon选择押注的MXNet,Facebook倾力打造的PyTorch,Microsoft内部开源的CNTK等等。

哪一个深度学习框架是最好用呢?哪一个深度学习框架更适合自己呢?这真是一个十分让人纠结的问题。不过,在你选择站队之前,不妨和我一起来了解一下各个框架的来龙去脉,先看一看哪一个框架更能激发起你的兴趣,有了兴趣,剩下的问题就变得简单了,我们能够透过浮躁的排名和对比,深入研究这些框架背后的设计思想与技术本质。让每一个框架的优点都能为我所用。

当前主流的深度学习框架列表

1.     TensorFlow

2.     Keras

3.     PyTorch

4.     MXNet

5.     Caffe

6.     Caffe2

7.     Theano

8.     FastAI

9.     CNTK

10.   Gluon

11.   Torch

12.   Deeplearning4j

13.   Chainer

其它小众深度学习框架还有如亚马逊曾经使用的深度学习引擎DSSTNE,卡耐基梅隆大学的小众DyNet,Intel开源的基于Spark且只能运行在Intel CPU芯片之上的深度学习库BigDL,Nervana开发的基于Python的深度学习库Neon,简洁无依赖且符合C++11标准的tiny-dnn,基于Theano的轻量级的库Lasagne等。

这其中有几个框架曾经辉煌过,但是现在已经被更新的框架取代了,或者被新一代的版本收编了,我们称他们为没落的贵族,如Torch,基于Python的版本PyTorch已经取代了Torch。Caffe与Caffe2,Facebook已经把Caffe和Caffe2与PyTorch进行了整合,推出了全新的PyTorch 1.0,资历最老的框架之一Theano的创始人已经转投TensorFlow,已经停止更新维护走向没落了。

基于Java和Scala的开源的分布式深度学习库Deeplearning4J在深度学习领域缺少像Python这样强大的社区支持,日本公司Preferred Networks开源的Chainer曾经是动态计算图的首选框架,特别适用于自然语言处理,但后来MXNet,PyTorch等也支持了这个特性,其优势也不复存在了。由于没有巨头的支持,Deeplearning4J和Chainer都只能默默的发展。

看起来我们好像有很多很多选择,但其实如果我们进一步进行细分,就会发现我们的选择也并不是很多,没有巨头背书的框架就只能面临被淘汰和边缘化的命运了,其实顶级深度学习框架只有四大阵营,或者说是四大门派,Google领导的TensorFlow,Amazon选择的MXnet,Facebook倾力打造的PyTorch,Microsoft把内部核心技术开源的CNTK。虽然Keras等框架在深度学习框架中排名很高,但它却不是一个独立框架,而是作为前端对底层引擎进行上层封装的高级API层,提升易用性,此类深度学习框架的目标是只需几行代码就能让你构建一个神经网络,这类框架还有FastAI和Gluon。好在每一个前端上层轻量级框架又都对应一个最适合的基础底层框架,这样就出现了深度学习框架的四大技术方向,每一个技术方向背后又都有一个巨头在背书和推动。

深度学习框架的四大阵营与其技术方向分别为:

(1)TensorFlow,前端框架Keras,背后巨头Google;

(2)PyTorch,前端框架FastAI,背后巨头Facebook;

(3)MXNet,前端框架Gluon,背后巨头Amazon; 

(4)Cognitive Toolkit (CNTK),前端框架Keras或Gluon,背后巨头Microsoft。

二、主流开源深度学习框架的来龙去脉

下面我们对每个主流框架的来龙去脉都来做一个详细的梳理与了解。

image.png

Google在2015年11月正式开源发布TensorFlow,TensorFlow由Google大脑团队开发,其命名来源于本身的运行原理。由于Google的巨大影响力和巨大支持,很快就成为深度学习领域占据绝对统治地位的框架。很多企业都在基于TensorFlow 开发自己的产品或将 TensorFlow整合到自己的产品中去,如Airbnb、Uber、Twitter、英特尔、高通、小米、京东等。

Google大脑一开始是Google X的一个研究项目,2011年,Google大脑的雏形起源于一项斯坦福大学与谷歌公司的联合研究项目,由Google Fellow杰夫·迪恩(Jeff Dean)、研究员格雷科拉多(Greg Corrado)与斯坦福大学人工智能教授吴恩达(Andrew Ng)共同发起,把深度学习技术带到了人工智能问题的解决中,并建立起了第一代大型深度学习软件系统DistBelief,这是一个运行在谷歌云计算平台上的一个服务。随后,Google在其商业产品广泛应用部署了DistBelief的深度学习神经网络,包括搜索、YouTube、语音搜索、广告、相册、地图、街景和Google翻译等。

2013年3月,Google收购了DNNResearch,DNNResearch创始人Geoffrey Hinton也由此进入Google大脑团队工作。Google指派Geoffrey Hinton和Jeff Dean等开始简化和重构DistBelief的代码库,使其变成一个更快、更健壮的应用级别代码库,形成了TensorFlow。对DistBelief 进行了多方面的改进后,使其可在小到一部手机,大到数千台数据中心服务器的各种设备上运行,TensorFlow也成为了基于 DistBelief 进行研发的第二代人工智能学习系统,可被用于语音识别或图像识别等多想机器学习和深度学习领域。一个突破性的成果是在2012年6月Google大脑用16000台电脑模拟人类电脑的活动,并在学习1000万张图像后,成功在YouTube视频中找出了“猫”,这可能意味着机器第一次有了猫的概念。

Google在2014年1月又收购了英国DeepMind,DeepMind成为谷歌大脑之外另一个研究人工智能方向的团队。DeepMind在4年来的首要的人工智能研究平台是开源软件Torch7机器学习库,Torch7非常灵活和快速,能够快速建模。在Google的大力支持下,AlphaGo横空出世,使人工智能第一次战胜人类职业围棋高手,轰动世界,以一己之力推动人工智能应用到了一个新的高度。2016年4月,DeepMind宣布将开始在将来所有的研究中开始使用TensorFlow。这样Google的两大人工智能团队也统一到了统一的深度学习框架TensorFlow上。

TensorFlow的编程接口支持C++和Python,Java、Go、R和Haskell API也将被支持,是所有深度学习框架中对开发语言支持的最全面的,TensorFlow可以在AWS和Google Cloud中运行,支持Windows 7、Windows 10、Windows Server 2016,TenserFlow使用C++ Eigen库,可以在ARM架构上编译和优化,使其可以在各种服务器和移动设备上部署自己的训练模型,也是在所有深度学习框架中支持运行平台最多的。TensorFlow基于计算图实现自动微分系统,使用数据流图进行数值计算,图中的节点代表数学运算,图中的线条则代表在这些节点之间传递的张量(多维数组)。TensorFlow追求对运行平台和开发语言最广泛的支持,力求统一深度学习领域,但是这也带来了过于复杂的系统设计,TensorFlow在GitHub上的总代码数已经超过100万行了,TensorFlow在接口设计中创造了很多新的抽象概念,如图、会话、命名空间和Place-Holder等,同一个功能又提供了多种实现,使用上可能有细微的区别,频繁的接口变动也导致了向后兼容性上的问题。由于直接使用TensorFlow过于复杂,包括Google官方在内的很多开发者尝试构建一个高级API作为TensorFlow更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等,其中Keras在2017年成为第一个被Google添加到TensorFlow核心中的高级别框架,这让Keras变成TensorFlow的默认API,使Keras + TensorFlow的组合成为Google官方认可并大力支持的平台。TensorFlow仍在快速的发展中,是最具野心和最具统治力的深度学习框架,十分期待2019年即将发布的TensorFlow 2.0带来的新技术。

image.png

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。

image.png

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的霸主地位。

2018年12月08号,在 NeurIPS 大会上,Facebook 正式发布 PyTorch 1.0稳定版,目前领导PyTorch 1.0核心开发工作的是Facebook的AI基础设施技术负责人Dmytro Dzhulgakov。Caffe的作者贾扬清发文介绍PyTorch 1.0 = Caffe2 + PyTorch。现在,PyTorch 1.0已经为大量Facebook产品和服务提供了支持,包括每天执行60亿次文本翻译。

根据贾扬清发文介绍,PyTorch 1.0拥有能在命令式执行模式和声明式执行模式之间无缝转换的混合前端,这样就不需要开发人员通过重写代码来优化性能或从Python迁移,能够无缝地共享用于原型设计的即时模式和用于生产环境的图执行模式之间的大部分代码。PyTorch 1.0将即时模式和图执行模式融合在一起,既具备研究的灵活性,也具备生产所需的最优性能。

PyTorch 1.0重构和统一了Caffe2和PyTorch 0.4框架的代码库,删除了重复的组件并共享上层抽象,得到了一个统一的框架,支持高效的图模式执行、移动部署和广泛的供应商集成等。这让开发人员可以同时拥有PyTorch和Caffe2的优势,同时做到快速验证和优化性能。PyTorch的命令式前端通过其灵活而高效的编程模型实现了更快速的原型设计和实验,又吸取了Caffe2和ONNX的模块化以及面向生产的特点,使得深度学习项目能从研究原型快速无缝衔接到生产部署,在一个框架中统一实验研究和生产能力。

image.png

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的人已经越来越少了。标志性的事件就是创始者之一的 Ian Goodfellow 放弃 Theano 转去谷歌开发 Tensorflow了。而另一位创始人Yoshua Bengio 于 2017 年 09 月宣布不再维护 Theano,所以这个项目事实上已经宣告死亡了。基于 Theano 的前端轻量级的神经网络库,如 Lasagne和Blocks也同样没落了。但我们可以说,Theano作为第一个主要的Python深度学习框架,已经完成了自己的使命,为早期的研究人员提供了强大的工具和很大的帮助,为后来的深度学习框架奠定了以计算图为框架核心 ,采用GPU加速计算的基本设计理念。

image.png

Caffe的全称是Convolutional Architecture for Fast Feature Embedding,意为“用于特征提取的卷积架构”,它是一个清晰、高效的深度学习框架,核心语言是C++。作者是贾扬清,贾扬清在清华大学获得本科和硕士学位。在UC Berkeley获得计算机科学博士学位。他曾在Google Brain工作,参与过TensorFlow的开发。贾扬清现在是Facebook AI架构总监,但据2019年3月的最新消息贾扬清可能加入阿里巴巴任VP。Caffe最初发起于2013年9月,从贾扬清用NVIDIA的学术捐赠的一块K20 GPU开始攒了一个机器开始,然后用大概两个多月的时间写了整个架构和ImageNet所需要的各个实现。12月份正式在Github上发布开源。

Caffe是一款十分适合深度学习入门的开源框架,它的代码和框架都比较简单,代码易于扩展,运行速度快,也适合深入学习分析。正是由于Caffe有着更小的系统框架,使得一些探索性的实验更加容易一些。即使在Google工作时,贾扬清仍然会经常使用Caffe来做一些快速的prototype和实验,Google的研究人员通常使用各种自己熟悉的开源框架来进行小规模的研究,然后用DistBelief(Google Brain的大规模的机器学习框架)来作为一个通用的框架实现大规模产品级别的部署。

在Caffe之前,深度学习领域缺少一个完全公开所有的代码、算法和各种细节的框架,导致很多的研究人员和博士需要一次又一次重复实现相同的算法,所以说Caffe对于深度学习开源社区的贡献非常大,Caffe是学术界和业界公认的最老牌的框架之一,是很多人入门的基础。

Caffe不支持分布式,与其它更新的深度学习框架相比,Caffe确实不够灵活,文档也不够用,Caffe的安装也比较复杂,安装需要解决大量的依赖包。大家会发现套用原有模型很方便,但个性化就要读源代码,灵活性明显不足,为模型做调整常常需要用 C++ 和 CUDA编程,虽然使用Python 和Matlab 也能做一些小调整。与Keras过度封装导致缺乏灵活性不同,Caffe缺乏灵活性主要是由于其自身的设计,在Caffe中最主要的抽象对象是层,每实现一个新层,必须要利用C++实现其前向传播和反向传播代码,如果需要新层在GPU上运行,还需要同时用CUDA实现这一层的前向传播和反向传播,这让不熟悉C++和CUDA的用户扩展Caffe非常困难。这也是由于Caffe最初定位在科研上面,并假设说大家都会有一定的时间和精力来读代码。

与Theano的没落与终结不同,随着贾扬清在2016年2月加入Facebook,2016年11月,贾扬清在 Facebook 官网发文,介绍了Caffe2go,它使用Unix理念构建的轻量级、模块化框架,核心架构非常轻量化,可以附加多个模块,是一个在手机上也能运行神经网络模型,可以在移动平台上实时获取、分析、处理像素。Caffe2go规模更小、训练速度更快、对计算性能要求较低。Caffe2go是Facebook继Torch后的第二个AI平台,因为其大小、速度和灵活性上的优势,Facebook曾将Caffe2go推上了战略地位,和研究工具链Torch一起组成了Facebook 机器学习产品的核心。

image.png

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。

image.png

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推广的困难。

Torch是命令式的,因此与TensorFlow和Theano相比,Torch的灵活度更高,而前两者是陈述式的(declarative),必须declare一个计算图。Torch 非常适用于卷积神经网络,Torch的原生交互界面比其他框架用起来更自然、更得心应手。第三方的扩展工具包提供了丰富的递归神经网络RNN模型。

image.png

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官方重点宣传。

image.png

MXNet是一个轻量级、可移植、灵活的分布式的开源深度学习框架,也是Amazon官方主推的深度学习框架,MXNet 支持卷积神经网络(CNN)、循环神经网络(RNN)和长短时间记忆网络(LTSM),为图像、手写文字和语音的识别和预测以及自然语言处理提供了出色的工具。

MXNet项目诞生于2015年9月,作者是当时在卡耐基梅隆大学CMU读博士的李沐,MXNet 在2016年11月被亚马逊选为官方开源平台,2017年1月23日,MXNet项目进入Apache基金会,成为Apache的孵化器项目。Amazon和Apache的双重认可使其生命力更加强大,成为能够与Google的TensorFlow,Facebook的PyTorch和微软的CNTK分庭抗礼的顶级深度学习框架。值得一提的是,其实MXNet的很多作者都是中国人,其最大的贡献组织为百度。

Amazon的AWS虽然支持TensorFlow等主流深度学习框架,但是Amazon不会傻到为Google做嫁衣而依赖Tensorflow,深度学习技术平台太重要了,Amazon不会受制于人。Amazon之所以选择MXNet作为首选开源深度学习框架与平台与李沐在 CMU 的两位博士导师之一的Alex Smola有很大的关系,2015 年Alex从CMU重返工业界,加入亚马逊AWS 担任机器学习 总监。

在2014年NIPS上,同为上海交大校友的陈天奇和李沐在讨论到各自在做深度学习Toolkits的项目时,发现他们都在做很多重复性的工作,如文件加载等,于是他们又拉来几个优秀的C++机器学习系统的开发人员共同成立了DMLC(Distributed (Deep) Machine Learning Community),一个小的机器学习爱好者圈子,号召大家发挥各自所长,一起合作开发,发起了通过配置来定义和训练神经网络的CXXNet和提供类似numpy一样的张量计算接口的Minerva两个深度学习项目,本意是更方便共享各自项目的代码,并给用户提供一致的体验。CXXNet擅长使用卷积神经网络进行图片分类,但它的灵活性不足,用户只能通过配置来定义模型,而无法进行交互式的编程。Minerva则更灵活,但不够稳定,李沐想同时给两个项目做分布式的扩展,后来自然想到把两个项目合并起来,于是就有了MXNet,可以读作“mix net”,其名字来自Minerva的M和CXXNet的XNet。其中Symbol的想法来自CXXNet,而NDArray的想法来自Minerva。

目前主流的深度学习系统一般采用命令式编程(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的生态圈并推广,MXNet先后推出了MinPy,Keras和Gluon等高级API封装接口,但目前前两个高级接口已经停止了开发,Gluon模仿了PyTorch的接口设计,成为李沐和Amazon主推的配套MXNet使用的上层API。

MXNet的优势是分布式支持和对内存、显存的明显优化,同样的模型,MXNet往往占用更小的内存和显存,在分布式环境下,MXNet的扩展性能也显示优于其他框架。Keras作Francois Chollet认为除了TensorFlow,MXNet和它的高级API接口Gluon也很有前景,与TensorFlow一样,MXNet是为数不多的具有实际生产级和可扩展性的框架。亚马逊有一个庞大的团队在很认真的支持MXNet,成为了MXNet背后强大的工程力量。

image.png

2017年10月20日,Amazon和 Microsoft 联合发布了Gluon,Gluon是一种新的动态计算图的开源深度学习框架的高级接口,简而言之,是一个基于MXNet深度学习框架的类似Keras和FastAI的上层API接口,但其最大的特点是Gluon同时支持灵活的动态图和高效的静态图,支持符号式和命令式编程的API,支持高度可扩展的训练,能够高效的评估模型,可帮助开发人员更轻松、更快速地构建机器学习模型,而不牺牲任何性能。Gluon现已在Apache MXNet 中可用,后续将支持Microsoft Cognitive Toolkit及其他架构。微软Azure的所有服务、工具和基础结构也将全面支持Gluon。

image.png

微软的人工智能工具包是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 架构,使其在移动设备上的功能受到了限制。

image.png

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的并行化是根据集群的节点和连接自动优化,不像其他深度学习库那样可能需要用户手动调整。DL4J也被NASA的喷气推进实验室所采用,埃森哲、雪弗兰、博斯咨询和IBM等都是DL4J的客户,DL4J与其它开源深度学习框架的一个明显区别是DL4J有商业版的支持,付费用户可以通过电话咨询寻求技术支持。

image.png

Chainer是由日本深度学习创业公司Preferred Networks于2015年6月发布的深度学习框架。最大的特点是支持动态图,曾经是动态计算图的首选框架,特别适用于自然语言处理。Chainer是用Python开发的,支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)。前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度。

深度学习框架的标准化ONNX

开放神经网络交换(ONNX,全称是“Open Neural Network Exchange”)格式的发布于2017年9月横空出世。ONNX最初由微软和Facebook联合发布,后来亚马逊也加入进来,并在12月发布了V1版本,宣布支持ONNX的公司还有AMD、ARM、华为、 IBM、英特尔、Qualcomm等。ONNX是一个表示深度学习模型的开放格式。它使用户可以更轻松地在不同框架之间转移模型。例如,它允许用户构建一个PyTorch模型,然后使用MXNet运行该模型来进行推理。ONNX从一开始就支持Caffe2,Microsoft Cognitive Toolkit,MXNet和PyTorch,Google虽然目前还不在这个阵营中,但与其他开源项目一样,社区也已经为TensorFlow添加了一个转换器。

三、诞生于中国本土的深度学习框架

下面要重点介绍一下诞生于中国本土深度学习框架,他们正在崛起:

1.  华为MindSpore

2018年10月10日,华为在上海全联接大会上首次发布华为AI战略与全栈全场景AI解决方案,包括Ascend(昇腾)系列AI芯片以及CANN算子库、MindSpore深度学习框架、AI开发平台ModelArts。华为MindSpore支持端、边、云独立的和协同的统一训练和推理框架。但是目前仍然在开发中,以华为在中国科技界地位和研发投入,自然是最受大家期待的。华为云虽然可以支持其它所有主流的深度学习框架,但就如同Amazon选择MXNet一样,这不是一个可以讨论的问题,为了不受制于人,是一定要有的。我相信为了与其它主流框架进行竞争,MindSpore将来也一定会开源的。

2.  百度PaddlePaddle

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 的执行速度问题。

3. 阿里巴巴XDL (X-Deep Learning)

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

4.  小米MACE

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

四、如何做深度学习框架的选型

进入深度学习领域,基础是学习Python。可以说现在进入深度学习领域是相对容易的,在5年前,研究深度学习需要用C++或Matlab来编写大量的低级算法,这需要研究生教育甚至是博士的教育。现在不一样了,你只需要学习Python,就很容易上手,虽然深度学习正在支持越来越多的编程语言,但Python最简单而且应用最广泛的一个,Python最厉害的地方在于其生态系统非常好,有社区的强大支持,比如要装Python,有方便的Anaconda;要用Python visualization,有Matplotlib可以用;要Numerical computation有NumPy和SciPy可以选择,要做图像处理,还有Scikit-image。有很多现成的工具可以使用,可以节省自己大量的时间,这正是工程师所需要的。

在对所有主流深度学习框架有一个了解后,我想是时候舍弃开发语言(基本都支持Python和C++,Java和Lua面向特定社区)、接口简易、文档完善、运算速度、性能、安装部署方便等方面的纯技术比较了,可能在这些框架诞生的初期我们更看重这些方面,但是随着各个框架的不断的完善与大企业的支持与不断的投入,各个框架之间也在不断的相互借鉴,最后的结果就是大家都差不多,各有千秋,我们现在要进入深一层维度的比拼,应该至少考虑下面几个维度:

1.     深度学习框架是否支持分布式计算,是不是分布式框架?

分布式:TensorFlow、MXNet、PyTorch、CNTK、Caffe2、DL4J

不支持分布式:Caffe、Theano、Torch

2.     深度学习框架是否支持移动端部署?

支持:PyTorch、MXNet、TensorFlow、Caffe2

不支持:CNTK

3.     编程接口的设计是命令式编程(imperative programming)还是声明式语言(declarative programing)?

命令式:简单易懂的编程接口PyTorch,NumPy和Torch、Theano

MXNet通过NDarray模块和Gluon高级接口提供了非常类似PyTorch的编程接口。

声明式:TensorFlow、Theano、Caffe

4.     深度学习框架是基于动态计算图还是静态计算图?

目前使用动态计算图的框架有PyTorch、MXNet、Chainer。

目前使用静态计算图框架有TensorFlow、Keras、CNTK、Caffe/Caffe2、Theano等,其中TensorFlow主要使用了静态计算图,TensorFlow在2018年10月宣布了一个动态计算选项Eager Execution,但该特性还比较新颖可能并不是很成熟,并且 TensorFlow 的文档和项目依然以静态计算图为主。MXNet同时具有动态计算图和静态计算图两种机制。

5.     深度学习框架是否有强大的社区和生态支持?

重金打造的TensorFlow,多方押注的MXNet,正在崛起的PyTorh,技术稳重的CNTK,

这四大开源深度学习框架都满足这一点。

6.     深度学习框架背后是否有巨头支持?

Google领导的TensorFlow,Amazon选择的MXNet,Facebook倾力打造的PyTorch,Microsoft把内部核心技术开源的CNTK,这四大开源深度学习框架都满足这一点。

通过对上面六个维度的思考,我想大家应该知道该如何作选择了:首先,静态计算图很好,但是动态图是未来和趋势,对于大多数开发者来说,Python是基础,Python的成熟可用的库、工具和生态与社区的支持太重要了;对于深度学习的商业应用而非纯粹的实验室研究来说,支持分布式和移动端运行平台是必选的,将来一定会用到的;前端的编程接口越灵活超好,我们需要考虑不同的应用场景,因此前端编程接口的设计需要兼容简单高效的命令式和逻辑清晰的声明式;深度学习框架一定要有背后巨头的大力支持和强大的社区,有专业的团队不断的更新并完善代码库。这样来看,只有下面的四大顶级深度学习框架阵营才能够满足我们的要求。

深度学习框架的四大阵营与其技术方向分别为:

(1)TensorFlow,前端框架Keras,背后巨头Google;

(2)PyTorch,前端框架FastAI,背后巨头Facebook;

(3)MXNet,前端框架Gluon,背后巨头Amazon; 

(4)Cognitive Toolkit (CNTK),前端框架Keras或Gluon,背后巨头Microsoft。

那么在这四大阵营中又如何选择呢?这就要看具体项目的需要了,看重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,我们可以在对比中学习,在深度学习领域,可以深刻理解什么是“纸上得来终觉浅”,我觉得学习深度学习及人工智能技术,一定要动手实践,只有动手做过了才是自己的,不然,一切都还是书本上的。

我还想再多谈一点的一个深度学习领域要面对的问题是“我们是否需要自己重新发明轮子?”我们需要自己重新设计并实现一个深度学习的框架吗?

我想这取决于你的兴趣和你的时间,如果你立志成为一个大神级的专家,有充足的时间和强烈的兴趣,那么根据自己对算法和数据结构的独特理解,在设计思想上融入自己的哲学和艺术的思考,自己从头开始设计并实现一个深度学习框架也未尝不可,发起一个开源项目并聚合一群志合道同的小伙伴一起奋斗,是一件十分有挑战并且十分有趣的事情,我认为我们应该大力鼓励有这样志向的年轻人,哪怕只是为了更深入的学习研究也好呀。何况我们中国人已经有了业界最成功的榜样,前有UC伯克利的贾扬清开发了Caffe,后有CMU卡耐基梅隆的李沐创造了MXNet,他们都是在读博士的时候创造了自己的深度学习框架并发起了开源项目,再看看他们今天在行业中的地位,都是Google、Facebook、Amazon、Apple等巨头必抢的顶级人才。对于中小企业来说,快速把商业应用做好并服务于消费者才是最重要的,因此选好一个顶级深度学习阵营和成熟的技术路线才是更重要的,确实没有必要重新发明轮子,但是对于一个严重依赖人工智能基础技术的超大型巨头企业来说,比如华为、阿里巴巴或百度,必须要拥有自己的深度学习框架和平台,这不是一个可以讨论的问题。如同Amazon选择了MXNet,AWS虽然支持TensorFlow,但Amazon不会傻到去依赖于Google。
购买华为云请点击立即购买

2015-10-06 22:03:05 xmdxcsj 阅读数 1291
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30888 人正在学习 去看看 唐宇迪
常用的深度学习框架有theano、caffe、torch7、dl4j,查阅了一些资料,了解了各自的一些特点
caffe:c++,工程性能好,相比theano容易调试,模块集成度高,不易实现神经网络的个性化需求(比如修改loss function),主要是CNN,其他网络的集成不太好
theano:基于python,方便修改神经网络结构,适合研究,学习曲线比较陡峭,symbol compile调试困难
torch7:核心使用c和cuda优化,外层使用lua,有更多的机器学习算法
dl4j:基于java,跟hadoop和spark集成,定位于商用深度学习框架
2018-05-22 16:51:19 weixin_41010198 阅读数 190
  • 深度学习框架Tensorflow案例实战视频课程

    深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习各大神经网络,全程案例代码实战,一步步带大家入门如何使用深度学习框架Tensorflow,玩转Tensorflow模型训练、等所有知识点。

    30888 人正在学习 去看看 唐宇迪


在深度学习领域的五大巨头里,它们都各自力挺一种深度学习框架:像谷歌有自家的TensorFlow、Facebook有Torch、百度有Paddle Paddle、微软有CNTK、而亚马逊的AWS则有MXNet,现在还有支持HADOOP的NL4J深度学习框架。

表1.1 是五大主流深度学习框架概要对比表。每种框架都有其优缺点,选择的时候更加需要根据自身业务的实际需求。例如需要用到对时间序列分析的,那么就会使用循环神经网络RNN,而Caffe、MXNet就是对图像卷积处理非常友善而缺乏循环神经网络,Google的TensorFlow则是支持其他机器学习算法,还支持增强学习Reinforcement learning算法。常言道,欲先攻必先利器,在正式进入深度学习之前,让我们一起来了解一下各大主流深度学习框架之间的关系与其优缺点。

1. Caffe 1.0

Caffe1.0 是第一个主流的工业级深度学习工具。在2013年底由UC Berkely的贾扬清基于C和C++开发的深度学习框架,其特点是具有非常出色的卷积神经网络实现,尤其在13年至16年期间大部分与视觉有关的深度学习论文都采用了caffe框架。而到至今为止Caffe在计算机视觉领域依然是最流行的工具包。可是因为开发早和历史遗留问题,其架构的缺点是不够灵活、缺乏对递归网络RNN和语言建模的支持,因此Caffe不适用于文本、声音或时间序列数据等其他类型的深度学习应用。

2. TensorFlow 0.88

TensorFlow基于python编写,通过C/C++引擎加速,是Google开源的第二代深度学习框架。TensorFlow处理递归神经网RNN非常友好,并且内部实现使用了向量运算的符号图方法,使用图graph来表示计算任务,这样使得新网络的指定变得相当容易,支持快速开发。TensorFlow其用途不止于深度学习,还可以支持增强学习和其他算法,因此扩展性很好。缺点是目前TensorFlow还不支持“内联(inline)”矩阵运算,必须要复制矩阵才能对其进行运算,复制庞大的矩阵会导致系统运行效率降低,并占用部分内存。另外TensorFlow不提供商业支持,仅为研究者提供的一种新工具,因此公司如果要商业化需要考虑开源协议问题。

3. Torch

Torch由Facebook用Lua编写的开源计算框架,支持机器学习算法。其具有有较好的灵活性和速度。实现并且优化了基本的计算单元,可以很简单地在此基础上实现自己的算法,不用浪费精力在计算优化上面。Facebook于2017年1月开放了Torch的Python API ― PyTorch源代码,其支持动态计算图,能处理长度可变的输入和输出,这尤其适用于循环神经网络RNN的应用。缺点是接口为lua语言,需要时间去学习新的编程语言。

4. Theano

Theano是深度学习框架中的元老,使用Python编写。Theano派生出了大量Python深度学习库,最著名的包括Blocks和Keras。其最大特点是非常的灵活,适合做学术研究的实验,且对递归网络和语言建模有较好的支持,缺点是速度较慢。

5. MXNet

MXNet主要由C/C++编写,提供多种API的机器学习框架,面向R、Python和Julia等语言,目前已被亚马逊云服务作为其深度学习的底层框架。由于MXNet是16年新兴的深度学习框架,因此大量借鉴了Caffe的优缺点。其最主要的特定是是分布式机器学习通用工具包DMLC 的重要组成部分,因此其分布式能力较强。MXNet还注重灵活性和效率,文档也非常的详细,同时强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。但是其与Caffe一样缺乏对循环神经网络RNN的支持,相对比使用JAVA实现的NL4J在分布式方面没有JAVA方便。

href="">6. Keras

Keras 是一个基于Theano和TensorFlow的深度学习库,由于受到深度学习元老框架Torch的启发,拥有较为直观的API,有望成为未来开发神经网络的标准Python API。而本书主要采用Keras作为主要代码API,因为其具有简洁的API接口,方便理解深度学习的原理与插入代码片段。

根据笔者的实际开发经验,希望未来的深度学习模型可以应用于大型的服务器和分布式集群里面,建议采用MXNet或者DL4J,如果需要与Hadoop的业务相结合,DL4J或许是最好的选择。如果只懂C或者C++,不懂python,Caffe或许是你最好的选择。如果是非商业开发,可以选择Google的TensorFlow或者是Facebook的Torch,具体需要根据不同的语言进行选择。对于简单的教学和demo实验,我们可以使用Keras去实现简单的深度学习模型。最后可惜的是在2017年下半年,Yoshua Bengio 宣布 Theano 停止更新维护。



深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。
深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlow却杀出重围,在关注度和用户数上都占据绝对优势,大有一统江湖之势。表2-1所示为各个开源框架在GitHub上的数据统计(数据统计于2017年1月3日),可以看到TensorFlow在star数量、fork数量、contributor数量这三个数据上都完胜其他对手。

究其原因,主要是Google在业界的号召力确实强大,之前也有许多成功的开源项目,以及Google强大的人工智能研发水平,都让大家对Google的深度学习框架充满信心,以至于TensorFlow在2015年11月刚开源的第一个月就积累了10000+的star。其次,TensorFlow确实在很多方面拥有优异的表现,比如设计神经网络结构的代码的简洁度,分布式深度学习算法的执行效率,还有部署的便利性,都是其得以胜出的亮点。如果一直关注着TensorFlow的开发进度,就会发现基本上每星期TensorFlow都会有1万行以上的代码更新,多则数万行。产品本身优异的质量、快速的迭代更新、活跃的社区和积极的反馈,形成了良性循环,可以想见TensorFlow未来将继续在各种深度学习框架中独占鳌头。

 

图片描述

 

表2-1 各个开源框架在GitHub上的数据统计

观察表1还可以发现,Google、Microsoft、Facebook等巨头都参与了这场深度学习框架大战,此外,还有毕业于伯克利大学的贾扬清主导开发的Caffe,蒙特利尔大学Lisa Lab团队开发的Theano,以及其他个人或商业组织贡献的框架。另外,可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自R、Julia等语言的竞争压力,但是Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接、爬虫等无所不能,有一个完美的生态环境。仅在数据挖据工具链上,Python就有NumPy、SciPy、Pandas、Scikit-learn、XGBoost等组件,做数据采集和预处理都非常方便,并且之后的模型训练阶段可以和TensorFlow等基于Python的深度学习框架完美衔接。

表2-1和图2-1所示为对主流的深度学习框架TensorFlow、Caffe、CNTK、Theano、Torch在各个维度的评分,本书2.2节会对各个深度学习框架进行比较详细的介绍。

 

图片描述

 

表2-2 主流深度学习框架在各个维度的评分

 

图片描述

 

图2-1  主流深度学习框架对比图

各深度学习框架简介

在本节,我们先来看看目前各流行框架的异同,以及各自的特点和优势。

TensorFlow

TensorFlow是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写C++或CUDA代码。它和Theano一样都支持自动求导,用户不需要再通过反向传播求解梯度。其核心代码和Caffe一样是用C++编写的,使用C++简化了线上部署的复杂度,并让手机这种内存和CPU资源都紧张的设备可以运行复杂模型(Python则会比较消耗资源,并且执行效率不高)。除了核心代码的C++接口,TensorFlow还有官方的Python、Go和Java接口,是通过SWIG(Simplified Wrapper and Interface Generator)实现的,这样用户就可以在一个硬件配置较好的机器中用Python进行实验,并在资源比较紧张的嵌入式环境或需要低延迟的环境中用C++部署模型。SWIG支持给C/C++代码提供各种语言的接口,因此其他脚本语言的接口未来也可以通过SWIG方便地添加。不过使用Python时有一个影响效率的问题是,每一个mini-batch要从Python中feed到网络中,这个过程在mini-batch的数据量很小或者运算时间很短时,可能会带来影响比较大的延迟。现在TensorFlow还有非官方的Julia、Node.js、R的接口支持,地址如下。

Julia: github.com/malmaud/TensorFlow.jl
Node.js: github.com/node-tensorflow/node-tensorflow
R: github.com/rstudio/tensorflow

TensorFlow也有内置的TF.Learn和TF.Slim等上层组件可以帮助快速地设计新网络,并且兼容Scikit-learn estimator接口,可以方便地实现evaluate、grid search、cross validation等功能。同时TensorFlow不只局限于神经网络,其数据流式图支持非常自由的算法表达,当然也可以轻松实现深度学习以外的机器学习算法。事实上,只要可以将计算表示成计算图的形式,就可以使用TensorFlow。用户可以写内层循环代码控制计算图分支的计算,TensorFlow会自动将相关的分支转为子图并执行迭代运算。TensorFlow也可以将计算图中的各个节点分配到不同的设备执行,充分利用硬件资源。定义新的节点只需要写一个Python函数,如果没有对应的底层运算核,那么可能需要写C++或者CUDA代码实现运算操作。

在数据并行模式上,TensorFlow和Parameter Server很像,但TensorFlow有独立的Variable node,不像其他框架有一个全局统一的参数服务器,因此参数同步更自由。TensorFlow和Spark的核心都是一个数据计算的流式图,Spark面向的是大规模的数据,支持SQL等操作,而TensorFlow主要面向内存足以装载模型参数的环境,这样可以最大化计算效率。

TensorFlow的另外一个重要特点是它灵活的移植性,可以将同一份代码几乎不经过修改就轻松地部署到有任意数量CPU或GPU的PC、服务器或者移动设备上。相比于Theano,TensorFlow还有一个优势就是它极快的编译速度,在定义新网络结构时,Theano通常需要长时间的编译,因此尝试新模型需要比较大的代价,而TensorFlow完全没有这个问题。TensorFlow还有功能强大的可视化组件TensorBoard,能可视化网络结构和训练过程,对于观察复杂的网络结构和监控长时间、大规模的训练很有帮助。TensorFlow针对生产环境高度优化,它产品级的高质量代码和设计都可以保证在生产环境中稳定运行,同时一旦TensorFlow广泛地被工业界使用,将产生良性循环,成为深度学习领域的事实标准。

除了支持常见的网络结构[卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurent Neural Network,RNN)]外,TensorFlow还支持深度强化学习乃至其他计算密集的科学计算(如偏微分方程求解等)。TensorFlow此前不支持symbolic loop,需要使用Python循环而无法进行图编译优化,但最近新加入的XLA已经开始支持JIT和AOT,另外它使用bucketing trick也可以比较高效地实现循环神经网络。TensorFlow的一个薄弱地方可能在于计算图必须构建为静态图,这让很多计算变得难以实现,尤其是序列预测中经常使用的beam search。

TensorFlow的用户能够将训练好的模型方便地部署到多种硬件、操作系统平台上,支持Intel和AMD的CPU,通过CUDA支持NVIDIA的GPU(最近也开始通过OpenCL支持AMD的GPU,但没有CUDA成熟),支持Linux和Mac,最近在0.12版本中也开始尝试支持Windows。在工业生产环境中,硬件设备有些是最新款的,有些是用了几年的老机型,来源可能比较复杂,TensorFlow的异构性让它能够全面地支持各种硬件和操作系统。同时,其在CPU上的矩阵运算库使用了Eigen而不是BLAS库,能够基于ARM架构编译和优化,因此在移动设备(Android和iOS)上表现得很好。

TensorFlow在最开始发布时只支持单机,而且只支持CUDA 6.5和cuDNN v2,并且没有官方和其他深度学习框架的对比结果。在2015年年底,许多其他框架做了各种性能对比评测,每次TensorFlow都会作为较差的对照组出现。那个时期的TensorFlow真的不快,性能上仅和普遍认为很慢的Theano比肩,在各个框架中可以算是垫底。但是凭借Google强大的开发实力,很快支持了新版的cuDNN(目前支持cuDNN v5.1),在单GPU上的性能追上了其他框架。表2-3所示为https://github.com/soumith/convnet-benchmarks给出的各个框架在AlexNet上单GPU的性能评测。

 

图片描述

 

表2-3  各深度学习框架在AlexNet上的性能对比

目前在单GPU的条件下,绝大多数深度学习框架都依赖于cuDNN,因此只要硬件计算能力或者内存分配差异不大,最终训练速度不会相差太大。但是对于大规模深度学习来说,巨大的数据量使得单机很难在有限的时间完成训练。这时需要分布式计算使GPU集群乃至TPU集群并行计算,共同训练出一个模型,所以框架的分布式性能是至关重要的。TensorFlow在2016年4月开源了分布式版本,使用16块GPU可达单GPU的15倍提速,在50块GPU时可达到40倍提速,分布式的效率很高。目前原生支持的分布式深度学习框架不多,只有TensorFlow、CNTK、DeepLearning4J、MXNet等。不过目前TensorFlow的设计对不同设备间的通信优化得不是很好,其单机的reduction只能用CPU处理,分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,所以其分布式性能可能还没有达到最优。

Google 在2016年2月开源了TensorFlow Serving,这个组件可以将TensorFlow训练好的模型导出,并部署成可以对外提供预测服务的RESTful接口,如图2-2所示。有了这个组件,TensorFlow就可以实现应用机器学习的全流程:从训练模型、调试参数,到打包模型,最后部署服务,名副其实是一个从研究到生产整条流水线都齐备的框架。这里引用TensorFlow内部开发人员的描述:“TensorFlow Serving是一个为生产环境而设计的高性能的机器学习服务系统。它可以同时运行多个大规模深度学习模型,支持模型生命周期管理、算法实验,并可以高效地利用GPU资源,让TensorFlow训练好的模型更快捷方便地投入到实际生产环境”。除了TensorFlow以外的其他框架都缺少为生产环境部署的考虑,而Google作为广泛在实际产品中应用深度学习的巨头可能也意识到了这个机会,因此开发了这个部署服务的平台。TensorFlow Serving可以说是一副王牌,将会帮TensorFlow成为行业标准做出巨大贡献。

 

图片描述

 

图2-2  TensorFlow Serving架构

TensorBoard是TensorFlow的一组Web应用,用来监控TensorFlow运行过程,或可视化Computation Graph。TensorBoard目前支持5种可视化:标量(scalars)、图片(images)、音频(audio)、直方图(histograms)和计算图(Computation Graph)。TensorBoard的Events Dashboard可以用来持续地监控运行时的关键指标,比如loss、学习速率(learning rate)或是验证集上的准确率(accuracy);Image Dashboard则可以展示训练过程中用户设定保存的图片,比如某个训练中间结果用Matplotlib等绘制(plot)出来的图片;Graph Explorer则可以完全展示一个TensorFlow的计算图,并且支持缩放拖曳和查看节点属性。TensorBoard的可视化效果如图2-3和图2-4所示。

 

图片描述

 

图2-3  TensorBoard的loss标量的可视化

 

图片描述

 

图2-4  TensorBoard的模型结构可视化

TensorFlow拥有产品级的高质量代码,有Google强大的开发、维护能力的加持,整体架构设计也非常优秀。相比于同样基于Python的老牌对手Theano,TensorFlow更成熟、更完善,同时Theano的很多主要开发者都去了Google开发TensorFlow(例如书籍Deep Learning的作者Ian Goodfellow,他后来去了OpenAI)。Google作为巨头公司有比高校或者个人开发者多得多的资源投入到TensorFlow的研发,可以预见,TensorFlow未来的发展将会是飞速的,可能会把大学或者个人维护的深度学习框架远远甩在身后。

Caffe

官方网址:caffe.berkeleyvision.org/

GitHub:github.com/BVLC/caffe

Caffe全称为Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在TensorFlow出现之前一直是深度学习领域GitHub star最多的项目),目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。Caffe的创始人是加州大学伯克利的Ph.D.贾扬清,他同时也是TensorFlow的作者之一,曾工作于MSRA、NEC和Google Brain,目前就职于Facebook FAIR实验室。Caffe的主要优势包括如下几点。

容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络。
训练速度快,能够训练state-of-the-art的模型与大规模的数据。
组件模块化,可以方便地拓展到新的模型和学习任务上。

Caffe的核心概念是Layer,每一个神经网络的模块都是一个Layer。Layer接收输入数据,同时经过内部计算产生输出数据。设计网络结构时,只需要把各个Layer拼接在一起构成完整的网络(通过写protobuf配置文件定义)。比如卷积的Layer,它的输入就是图片的全部像素点,内部进行的操作是各种像素值与Layer参数的convolution操作,最后输出的是所有卷积核filter的结果。每一个Layer需要定义两种运算,一种是正向(forward)的运算,即从输入数据计算输出结果,也就是模型的预测过程;另一种是反向(backward)的运算,从输出端的gradient求解相对于输入的gradient,即反向传播算法,这部分也就是模型的训练过程。实现新Layer时,需要将正向和反向两种计算过程的函数都实现,这部分计算需要用户自己写C++或者CUDA(当需要运行在GPU时)代码,对普通用户来说还是非常难上手的。正如它的名字Convolutional Architecture for Fast Feature Embedding所描述的,Caffe最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此Caffe对卷积神经网络的支持非常好,但对时间序列RNN、LSTM等支持得不是特别充分。同时,基于Layer的模式也对RNN不是非常友好,定义RNN结构时比较麻烦。在模型结构非常复杂时,可能需要写非常冗长的配置文件才能设计好网络,而且阅读时也比较费力。

Caffe的一大优势是拥有大量的训练好的经典模型(AlexNet、VGG、Inception)乃至其他state-of-the-art(ResNet等)的模型,收藏在它的Model Zoo(github.com/BVLC/ caffe/wiki/Model-Zoo)。因为知名度较高,Caffe被广泛地应用于前沿的工业界和学术界,许多提供源码的深度学习的论文都是使用Caffe来实现其模型的。在计算机视觉领域Caffe应用尤其多,可以用来做人脸识别、图片分类、位置检测、目标追踪等。虽然Caffe主要是面向学术圈和研究者的,但它的程序运行非常稳定,代码质量比较高,所以也很适合对稳定性要求严格的生产环境,可以算是第一个主流的工业级深度学习框架。因为Caffe的底层是基于C++的,因此可以在各种硬件环境编译并具有良好的移植性,支持Linux、Mac和Windows系统,也可以编译部署到移动设备系统如Android和iOS上。和其他主流深度学习库类似,Caffe也提供了Python语言接口pycaffe,在接触新任务,设计新网络时可以使用其Python接口简化操作。不过,通常用户还是使用Protobuf配置文件定义神经网络结构,再使用command line进行训练或者预测。Caffe的配置文件是一个JSON类型的.prototxt文件,其中使用许多顺序连接的Layer来描述神经网络结构。Caffe的二进制可执行程序会提取这些.prototxt文件并按其定义来训练神经网络。理论上,Caffe的用户可以完全不写代码,只是定义网络结构就可以完成模型训练了。Caffe完成训练之后,用户可以把模型文件打包制作成简单易用的接口,比如可以封装成Python或MATLAB的API。不过在.prototxt文件内部设计网络节构可能会比较受限,没有像TensorFlow或者Keras那样在Python中设计网络结构方便、自由。更重要的是,Caffe的配置文件不能用编程的方式调整超参数,也没有提供像Scikit-learn那样好用的estimator可以方便地进行交叉验证、超参数的Grid Search等操作。Caffe在GPU上训练的性能很好(使用单块GTX 1080训练AlexNet时一天可以训练上百万张图片),但是目前仅支持单机多GPU的训练,没有原生支持分布式的训练。庆幸的是,现在有很多第三方的支持,比如雅虎开源的CaffeOnSpark,可以借助Spark的分布式框架实现Caffe的大规模分布式训练。

Theano

官方网址:http://www.deeplearning.net/software/theano/

GitHub:github.com/Theano/Theano

Theano诞生于2008年,由蒙特利尔大学Lisa Lab团队开发并维护,是一个高性能的符号计算及深度学习库。因其出现时间早,可以算是这类库的始祖之一,也一度被认为是深度学习研究和应用的重要标准之一。Theano的核心是一个数学表达式的编译器,专门为处理大规模神经网络训练的计算而设计。它可以将用户定义的各种计算编译为高效的底层代码,并链接各种可以加速的库,比如BLAS、CUDA等。Theano允许用户定义、优化和评估包含多维数组的数学表达式,它支持将计算装载到GPU(Theano在GPU上性能不错,但是CPU上较差)。与Scikit-learn一样,Theano也很好地整合了NumPy,对GPU的透明让Theano可以较为方便地进行神经网络设计,而不必直接写CUDA代码。Theano的主要优势如下。

集成NumPy,可以直接使用NumPy的ndarray,API接口学习成本低。
计算稳定性好,比如可以精准地计算输出值很小的函数(像log(1+x))。
动态地生成C或者CUDA代码,用以编译成高效的机器代码。

因为Theano非常流行,有许多人为它编写了高质量的文档和教程,用户可以方便地查找Theano的各种FAQ,比如如何保存模型、如何运行模型等。不过Theano更多地被当作一个研究工具,而不是当作产品来使用。虽然Theano支持Linux、Mac和Windows,但是没有底层C++的接口,因此模型的部署非常不方便,依赖于各种Python库,并且不支持各种移动设备,所以几乎没有在工业生产环境的应用。Theano在调试时输出的错误信息非常难以看懂,因此DEBUG时非常痛苦。同时,Theano在生产环境使用训练好的模型进行预测时性能比较差,因为预测通常使用服务器CPU(生产环境服务器一般没有GPU,而且GPU预测单条样本延迟高反而不如CPU),但是Theano在CPU上的执行性能比较差。

Theano在单GPU上执行效率不错,性能和其他框架类似。但是运算时需要将用户的Python代码转换成CUDA代码,再编译为二进制可执行文件,编译复杂模型的时间非常久。此外,Theano在导入时也比较慢,而且一旦设定了选择某块GPU,就无法切换到其他设备。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano自己的gpuarray库上支持多GPU训练,速度暂时还比不上CUDA的版本,并且Theano目前还没有分布式的实现。不过,Theano在训练简单网络(比如很浅的MLP)时性能可能比TensorFlow好,因为全部代码都是运行时编译,不需要像TensorFlow那样每次feed mini-batch数据时都得通过低效的Python循环来实现。

Theano是一个完全基于Python(C++/CUDA代码也是打包为Python字符串)的符号计算库。用户定义的各种运算,Theano可以自动求导,省去了完全手工写神经网络反向传播算法的麻烦,也不需要像Caffe一样为Layer写C++或CUDA代码。Theano对卷积神经网络的支持很好,同时它的符号计算API支持循环控制(内部名scan),让RNN的实现非常简单并且高性能,其全面的功能也让Theano可以支持大部分state-of-the-art的网络。Theano派生出了大量基于它的深度学习库,包括一系列的上层封装,其中有大名鼎鼎的Keras,Keras对神经网络抽象得非常合适,以至于可以随意切换执行计算的后端(目前同时支持Theano和TensorFlow)。Keras比较适合在探索阶段快速地尝试各种网络结构,组件都是可插拔的模块,只需要将一个个组件(比如卷积层、激活函数等)连接起来,但是设计新模块或者新的Layer就不太方便了。除Keras外,还有学术界非常喜爱的Lasagne,同样也是Theano的上层封装,它对神经内网络的每一层的定义都非常严谨。另外,还有scikit-neuralnetwork、nolearn这两个基于Lasagne的上层封装,它们将神经网络抽象为兼容Scikit-learn接口的classifier和regressor,这样就可以方便地使用Scikit-learn中经典的fit、transform、score等操作。除此之外,Theano的上层封装库还有blocks、deepy、pylearn2和Scikit-theano,可谓是一个庞大的家族。如果没有Theano,可能根本不会出现这么多好用的Python深度学习库。同样,如果没有Python科学计算的基石NumPy,就不会有SciPy、Scikit-learn和 Scikit-image,可以说Theano就是深度学习界的NumPy,是其他各类Python深度学习库的基石。虽然Theano非常重要,但是直接使用Theano设计大型的神经网络还是太烦琐了,用 Theano实现Google Inception就像用NumPy实现一个支持向量机(SVM)。且不说很多用户做不到用Theano实现一个Inception网络,即使能做到但是否有必要花这个时间呢?毕竟不是所有人都是基础科学工作者,大部分使用场景还是在工业应用中。所以简单易用是一个很重要的特性,这也就是其他上层封装库的价值所在:不需要总是从最基础的tensor粒度开始设计网络,而是从更上层的Layer粒度设计网络。

Torch

官方网址:http://torch.ch/

GitHub:github.com/torch/torch7

Torch给自己的定位是LuaJIT上的一个高效的科学计算库,支持大量的机器学习算法,同时以GPU上的计算优先。Torch的历史非常悠久,但真正得到发扬光大是在Facebook开源了其深度学习的组件之后,此后包括Google、Twitter、NYU、IDIAP、Purdue等组织都大量使用Torch。Torch的目标是让设计科学计算算法变得便捷,它包含了大量的机器学习、计算机视觉、信号处理、并行运算、图像、视频、音频、网络处理的库,同时和Caffe类似,Torch拥有大量的训练好的深度学习模型。它可以支持设计非常复杂的神经网络的拓扑图结构,再并行化到CPU和GPU上,在Torch上设计新的Layer是相对简单的。它和TensorFlow一样使用了底层C++加上层脚本语言调用的方式,只不过Torch使用的是Lua。Lua的性能是非常优秀的(该语言经常被用来开发游戏),常见的代码可以通过透明的JIT优化达到C的性能的80%;在便利性上,Lua的语法也非常简单易读,拥有漂亮和统一的结构,易于掌握,比写C/C++简洁很多;同时,Lua拥有一个非常直接的调用C程序的接口,可以简便地使用大量基于C的库,因为底层核心是C写的,因此也可以方便地移植到各种环境。Lua支持Linux、Mac,还支持各种嵌入式系统(iOS、Android、FPGA等),只不过运行时还是必须有LuaJIT的环境,所以工业生产环境的使用相对较少,没有Caffe和TensorFlow那么多。

为什么不简单地使用Python而是使用LuaJIT呢?官方给出了以下几点理由。

LuaJIT的通用计算性能远胜于Python,而且可以直接在LuaJIT中操作C的pointers。

Torch的框架,包含Lua是自洽的,而完全基于Python的程序对不同平台、系统移植性较差,依赖的外部库较多。

LuaJIT的FFI拓展接口非常易学,可以方便地链接其他库到Torch中。Torch中还专门设计了N-Dimension array type的对象Tensor,Torch中的Tensor是一块内存的视图,同时一块内存可能有许多视图(Tensor)指向它,这样的设计同时兼顾了性能(直接面向内存)和便利性。同时,Torch还提供了不少相关的库,包括线性代数、卷积、傅里叶变换、绘图和统计等,如图2-5所示。

 

图片描述

 

图2-5  Torch提供的各种数据处理的库

Torch的nn库支持神经网络、自编码器、线性回归、卷积网络、循环神经网络等,同时支持定制的损失函数及梯度计算。Torch因为使用了LuaJIT,因此用户在Lua中做数据预处理等操作可以随意使用循环等操作,而不必像在Python中那样担心性能问题,也不需要学习Python中各种加速运算的库。不过,Lua相比Python还不是那么主流,对大多数用户有学习成本。Torch在CPU上的计算会使用OpenMP、SSE进行优化,GPU上使用CUDA、cutorch、cunn、cuDNN进行优化,同时还有cuda-convnet的wrapper。Torch有很多第三方的扩展可以支持RNN,使得Torch基本支持所有主流的网络。和Caffe类似的是,Torch也是主要基于Layer的连接来定义网络的。Torch中新的Layer依然需要用户自己实现,不过定义新Layer和定义网络的方式很相似,非常简便,不像Caffe那么麻烦,用户需要使用C++或者CUDA定义新Layer。同时,Torch属于命令式编程模式,不像Theano、TensorFlow属于声明性编程(计算图是预定义的静态的结构),所以用它实现某些复杂操作(比如beam search)比Theano和TensorFlow方便很多。

Lasagne

官网网址:http://lasagne.readthedocs.io/

GitHub:github.com/Lasagne/Lasagne

Lasagne是一个基于Theano的轻量级的神经网络库。它支持前馈神经网络,比如卷积网络、循环神经网络、LSTM等,以及它们的组合;支持许多优化方法,比如Nesterov momentum、RMSprop、ADAM等;它是Theano的上层封装,但又不像Keras那样进行了重度的封装,Keras隐藏了Theano中所有的方法和对象,而Lasagne则是借用了Theano中很多的类,算是介于基础的Theano和高度抽象的Keras之间的一个轻度封装,简化了操作同时支持比较底层的操作。Lasagne设计的六个原则是简洁、透明、模块化、实用、聚焦和专注。

Keras

官方网址:keras.io

GitHub:github.com/fchollet/keras

Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,并可以同时运行在TensorFlow和Theano上。它旨在让用户进行最快速的原型实验,让想法变为结果的这个过程最短。Theano和TensorFlow的计算图支持更通用的计算,而Keras则专精于深度学习。Theano和TensorFlow更像是深度学习领域的NumPy,而Keras则是这个领域的Scikit-learn。它提供了目前为止最方便的API,用户只需要将高级的模块拼在一起,就可以设计神经网络,它大大降低了编程开销(code overhead)和阅读别人代码时的理解开销(cognitive overhead)。它同时支持卷积网络和循环网络,支持级联的模型或任意的图结构的模型(可以让某些数据跳过某些Layer和后面的Layer对接,使得创建Inception等复杂网络变得容易),从CPU上计算切换到GPU加速无须任何代码的改动。因为底层使用Theano或TensorFlow,用Keras训练模型相比于前两者基本没有什么性能损耗(还可以享受前两者持续开发带来的性能提升),只是简化了编程的复杂度,节约了尝试新网络结构的时间。可以说模型越复杂,使用Keras的收益就越大,尤其是在高度依赖权值共享、多模型组合、多任务学习等模型上,Keras表现得非常突出。Keras所有的模块都是简洁、易懂、完全可配置、可随意插拔的,并且基本上没有任何使用限制,神经网络、损失函数、优化器、初始化方法、激活函数和正则化等模块都是可以自由组合的。Keras也包括绝大部分state-of-the-art的Trick,包括Adam、RMSProp、Batch Normalization、PReLU、ELU、LeakyReLU等。同时,新的模块也很容易添加,这让Keras非常适合最前沿的研究。Keras中的模型也都是在Python中定义的,不像Caffe、CNTK等需要额外的文件来定义模型,这样就可以通过编程的方式调试模型结构和各种超参数。在Keras中,只需要几行代码就能实现一个MLP,或者十几行代码实现一个AlexNet,这在其他深度学习框架中基本是不可能完成的任务。Keras最大的问题可能是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。Keras的编程模型设计和Torch很像,但是相比Torch,Keras构建在Python上,有一套完整的科学计算工具链,而Torch的编程语言Lua并没有这样一条科学计算工具链。无论从社区人数,还是活跃度来看,Keras目前的增长速度都已经远远超过了Torch。

MXNet

官网网址:mxnet.io

GitHub:github.com/dmlc/mxnet

MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。MXNet的很多作者都是中国人,其最大的贡献组织为百度,同时很多作者来自cxxnet、minerva和purine2等深度学习项目,可谓博采众家之长。它是各个框架中率先支持多GPU和分布式的,同时其分布式性能也非常高。MXNet的核心是一个动态的依赖调度器,支持自动将计算任务并行化到多个GPU或分布式集群(支持AWS、Azure、Yarn等)。它上层的计算图优化算法可以让符号计算执行得非常快,而且节约内存,开启mirror模式会更加省内存,甚至可以在某些小内存GPU上训练其他框架因显存不够而训练不了的深度学习模型,也可以在移动设备(Android、iOS)上运行基于深度学习的图像识别等任务。此外,MXNet的一个很大的优点是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可谓非常全面,基本主流的脚本语言全部都支持了。在MXNet中构建一个网络需要的时间可能比Keras、Torch这类高度封装的框架要长,但是比直接用Theano等要快。MXNet的各级系统架构(下面为硬件及操作系统底层,逐层向上为越来越抽象的接口)如图2-6所示。

 

图片描述

 

图2-6  MXNet系统架构

DIGITS

官方网址:developer.nvidia.com/digits

GitHub: github.com/NVIDIA/DIGITS

DIGITS(Deep Learning GPU Training System)不是一个标准的深度学习库,它可以算是一个Caffe的高级封装(或者Caffe的Web版培训系统)。因为封装得非常重,以至于你不需要(也不能)在DIGITS中写代码,即可实现一个深度学习的图片识别模型。在Caffe中,定义模型结构、预处理数据、进行训练并监控训练过程是相对比较烦琐的,DIGITS把所有这些操作都简化为在浏览器中执行。它可以算作Caffe在图片分类上的一个漂亮的用户可视化界面(GUI),计算机视觉的研究者或者工程师可以非常方便地设计深度学习模型、测试准确率,以及调试各种超参数。同时使用它也可以生成数据和训练结果的可视化统计报表,甚至是网络的可视化结构图。训练好的Caffe模型可以被DIGITS直接使用,上传图片到服务器或者输入url即可对图片进行分类。

CNTK

官方网址:cntk.ai

GitHub:github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微软研究院(MSR)开源的深度学习框架。它最早由start the deep learning craze的演讲人创建,目前已经发展成一个通用的、跨平台的深度学习系统,在语音识别领域的使用尤其广泛。CNTK通过一个有向图将神经网络描述为一系列的运算操作,这个有向图中子节点代表输入或网络参数,其他节点代表各种矩阵运算。CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。CNTK有丰富的细粒度的神经网络组件,使得用户不需要写底层的C++或CUDA,就能通过组合这些组件设计新的复杂的Layer。CNTK拥有产品级的代码质量,支持多机、多GPU的分布式训练。

CNTK设计是性能导向的,在CPU、单GPU、多GPU,以及GPU集群上都有非常优异的表现。同时微软最近推出的1-bit compression技术大大降低了通信代价,让大规模并行训练拥有了很高的效率。CNTK同时宣称拥有很高的灵活度,它和Caffe一样通过配置文件定义网络结构,再通过命令行程序执行训练,支持构建任意的计算图,支持AdaGrad、RmsProp等优化方法。它的另一个重要特性就是拓展性,CNTK除了内置的大量运算核,还允许用户定义他们自己的计算节点,支持高度的定制化。CNTK在2016年9月发布了对强化学习的支持,同时,除了通过写配置文件的方式定义网络结构,CNTK还将支持其他语言的绑定,包括Python、C++和C#,这样用户就可以用编程的方式设计网络结构。CNTK与Caffe一样也基于C++并且跨平台,大部分情况下,它的部署非常简单。PC上支持Linux、Mac和Windows,但是它目前不支持ARM架构,限制了其在移动设备上的发挥。图2-7所示为CNTK目前的总体架构图。

 

图片描述

 

图2-7  CNTK的总体架构图

CNTK原生支持多GPU和分布式,从官网公布的对比评测来看,性能非常不错。在多GPU方面,CNTK相对于其他的深度学习库表现得更突出,它实现了1-bit SGD和自适应的mini-batching。图2-8所示为CNTK官网公布的在2015年12月的各个框架的性能对比。在当时,CNTK是唯一支持单机8块GPU的框架,并且在分布式系统中可以超越8块GPU的性能。

 

图片描述

 

图2-8  CNTK与各个框架的性能对比

Deeplearning4J

官方网址:http://deeplearning4j.org/

GitHub: github.com/deeplearning4j/deeplearning4j

Deeplearning4J(简称DL4J)是一个基于Java和Scala的开源的分布式深度学习库,由Skymind于2014年6月发布,其核心目标是创建一个即插即用的解决方案原型。埃森哲、雪弗兰、博斯咨询和IBM等都是DL4J的客户。DL4J拥有一个多用途的n-dimensional array的类,可以方便地对数据进行各种操作;拥有多种后端计算核心,用以支持CPU及GPU加速,在图像识别等训练任务上的性能与Caffe相当;可以与Hadoop及Spark自动整合,同时可以方便地在现有集群(包括但不限于AWS,Azure等)上进行扩展,同时DL4J的并行化是根据集群的节点和连接自动优化,不像其他深度学习库那样可能需要用户手动调整。DL4J选择Java作为其主要语言的原因是,目前基于Java的分布式计算、云计算、大数据的生态非常庞大。用户可能拥有大量的基于Hadoop和Spark的集群,因此在这类集群上搭建深度学习平台的需求便很容易被DL4J满足。同时JVM的生态圈内还有数不胜数的Library的支持,而DL4J也创建了ND4J,可以说是JVM中的NumPy,支持大规模的矩阵运算。此外,DL4J还有商业版的支持,付费用户在出现问题时可以通过电话咨询寻求支持。

Chainer

官方网址:chainer.org

GitHub:github.com/pfnet/chainer

Chainer是由日本公司Preferred Networks于2015年6月发布的深度学习框架。Chainer对自己的特性描述如下。

Powerful:支持CUDA计算,只需要几行代码就可以使用GPU加速,同时只需少许改动就可以运行在多GPU上。

Flexible:支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)。

Intuitive:前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度。

绝大多数的深度学习框架是基于“Define-and-Run”的,也就是说,需要首先定义一个网络,再向网络中feed数据(mini-batch)。因为网络是预先静态定义的,所有的控制逻辑都需要以data的形式插入网络中,包括像Caffe那样定义好网络结构文件,或者像Theano、Torch、TensorFlow等使用编程语言定义网络。而Chainer则相反,网络是在实际运行中定义的,Chainer存储历史运行的计算结果,而不是网络的结构逻辑,这样就可以方便地使用Python中的控制流,所以无须其他工作就可以直接在网络中使用条件控制和循环。

Leaf

官方网址:autumnai.com/leaf/book

GitHub:github.com/autumnai/leaf

Leaf是一个基于Rust语言的直观的跨平台的深度学习乃至机器智能框架,它拥有一个清晰的架构,除了同属Autumn AI的底层计算库Collenchyma,Leaf没有其他依赖库。它易于维护和使用,并且拥有非常高的性能。Leaf自身宣传的特点是为Hackers定制的,这里的Hackers是指希望用最短的时间和最少的精力实现机器学习算法的技术极客。它的可移植性非常好,可以运行在CPU、GPU和FPGA等设备上,可以支持有任何操作系统的PC、服务器,甚至是没有操作系统的嵌入式设备,并且同时支持OpenCL和CUDA。Leaf是Autumn AI计划的一个重要组件,后者的目标是让人工智能算法的效率提高100倍。凭借其优秀的设计,Leaf可以用来创建各种独立的模块,比如深度强化学习、可视化监控、网络部署、自动化预处理和大规模产品部署等。

Leaf拥有最简单的API,希望可以最简化用户需要掌握的技术栈。虽然才刚诞生不久,Leaf就已经跻身最快的深度学习框架之一了。图2-9所示为Leaf官网公布的各个框架在单GPU上训练VGG网络的计算时间(越小越好)的对比(这是和早期的TensorFlow对比,最新版的TensorFlow性能已经非常好了)。

 

图片描述

 

图2-9  Leaf和各深度学习框架的性能对比(深色为forawrd,浅色为backward)

DSSTNE

GitHub:github.com/amznlabs/amazon-dsstne 

DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亚马逊开源的稀疏神经网络框架,在训练非常稀疏的数据时具有很大的优势。DSSTNE目前只支持全连接的神经网络,不支持卷积网络等。和Caffe类似,它也是通过写一个JSON类型的文件定义模型结构,但是支持非常大的Layer(输入和输出节点都非常多);在激活函数、初始化方式及优化器方面基本都支持了state-of-the-art的方法,比较全面;支持大规模分布式的GPU训练,不像其他框架一样主要依赖数据并行,DSSTNE支持自动的模型并行(使用数据并行需要在训练速度和模型准确度上做一定的trade-off,模型并行没有这个问题)。

在处理特征非常多(上亿维)的稀疏训练数据时(经常在推荐、广告、自然语言处理任务中出现),即使一个简单的3个隐层的MLP(Multi-Layer Perceptron)也会变成一个有非常多参数的模型(可能高达上万亿)。以传统的稠密矩阵的方式训练方法很难处理这么多的模型参数,更不必提超大规模的数据量,而DSSTNE有整套的针对稀疏数据的优化,率先实现了对超大稀疏数据训练的支持,同时在性能上做了非常大的改进。

在DSSTNE官方公布的测试中,DSSTNE在MovieLens的稀疏数据上,在单M40 GPU上取得了比TensorFlow快14.8倍的性能提升(注意是和老版的TensorFlow比较),如图2-10所示。一方面是因为DSSTNE对稀疏数据的优化;另一方面是TensorFlow在数据传输到GPU上时花费了大量时间,而DSSTNE则优化了数据在GPU内的保留;同时DSSTNE还拥有自动模型并行功能,而TensorFlow中则需要手动优化,没有自动支持。

 

图片描述

 

图2-10  DSSTNE在稀疏数据上与TensorFlow的性能对比




深度学习框架

阅读数 461

没有更多推荐了,返回首页