工欲善其事,必先利其器。深度学习诞生10年有余,已经有了不少成熟的开发框架,这篇文章就来了解一下当前主流的框架。
参考文章:详解 6 大主流深度学习框架
参考书籍:【深度学习与计算机视觉】 叶韵编著
Caffe,全称为Convolutional Architecture for Fast Feature Embedding,由伯克利加州大学的博士生贾扬清开发,后来一直由伯克利视觉及学习中心(Berkeley Vision and Learning Center, BVLC)进行维护。Caffe基于C++和英伟达公司的GPU(Graphic Processing Unit)通用计算架构CUDA(Compute Unified Device Architecture)开发,特点是高效、可配置化的输入、GPU和CPU的无缝切换。当然还有非常重要的一点,Caffe拥有庞大的社区,无论是科研领域还是业界都有大量的用户。每当一些最前沿的深度学习方法发表后,没多久就会有官方的预训练模型或是第三方基于Caffe的实现,所以Caffe是一个对初学者和有经验的人都非常适合的工具。
2013年,贾扬清得到了一块NVIDIA免费提供的K20加速卡。在这个契机下贾扬清一边做毕业论文一边开始写一个用于深度学习的框架。经过了近半年的独立开发,Caffe初具形态并且在伯克利的研究组内获得了良好的试用反响。后来在物体检测领域成为经典的R-CNN(Regions with Convolutional Neural Network features)方法就是在这段时间内基于Caffe实现的。
2013年底,贾扬清将Caffe开源,成为了当时业内第一个较为完整的深度学习开源框架,于是立刻获得了学术界和业界的好评及支持。后来在BLVC和NVIDIA为主的合力推广下,Caffe很快成为了深度学习领域,尤其是基于深度学习的计算机视觉领域最流行的框架。
初学使用Caffe还需要注意下面两个问题。
Caffe的安装过程需要大量的依赖库,因此涉及很多安装版本问题,初学者须多加注意。
当用户要实现一个新的层,就需要用C++实现它的前向传播和反向传播代码,而如果想要新层运行在GPU上,则需要同时使用CUDA实现这一层的前向传播和反向传播。
这个由希腊神话中伊卡里亚岛国王妻子名字命名的框架,是由本吉奥领导的蒙特利尔大学机器学习研究小组(MILA)开发的。作为一个诞生比Caffe早的框架,在早期Theano是深度学习领域最流行的软件包。严格来说,Theano不是专门面向深度学习的,而是一个基于多维数组用于计算和优化数学表达式的数值软件包,因为神经网络的本质其实就是数学表达式,所以用Theano可以非常灵活地从无到有地实现神经网络的各种功能。Theano基于Python,最大的优点是灵活,性能非常出色,确实是基于函数式的编程方式,还有拗口的API,异常困难的调试等,造就了陡峭的学习曲线。另外,其异常慢的编译速度也常常遭人诟病。
直接在Theano中开发虽然灵活度最高,但开发工作量和难度也不小,所以在Theano基础上有很多封装过后的框架,比如MILA官方的Pylearn2,还有第三方开发的Lasagne和Keras等。Pylearn2由于把Theano的缺点又进一步发挥到了极致,在火了一小阵后就被渐渐冷落,如今已经停止了实际意义上的开发。后两个框架正在蓬勃发展中,尤其是Keras,渐渐开始成为一个脱离底层实现的大框架,目前除了Theano也支持了Google的Tensorflow。
Google开源的深度学习框架,一开始主要面向的是分布式系统。从官方介绍上来看,具有非常好的延展性,在多GPU/多机上拥有最好的灵活性。另外Google的强有力支持也算是一大优点。初期版本在单机和一些小任务上性能差强人意,在一些基准测试上甚至常常被其他框架甩下一个量级。不过随着TensorFlow的持续改进,以及Google光环的照耀,现在TensorFlow正在变得越来越流行。截至2016年5月,在github上关于TensorFlow的相关讨论的数量已经超过Caffe跃居第一位。
TensorFlow在很大程度上可以看作Theano的后继者,这不仅因为它们有很大一批共同的开发者,还因为它们拥有相近的设计理念,都基于计算图实现自动微分系统。TensorFlow 使用数据流图进行数值计算,图中的节点代表数学运算,图中的边代表在这些节点之间传递的多维数组。
TensorFlow编程接口支持Python和C++,TensorFlow 1.0版本开始支持Java、Go、R和Haskell API的Alpha版本。此外,TensorFlow还可以在Google Cloud和AWS中运行。TensorFlow支持Windows 7、Windows 10和Windows Server 2016系统。
因为TensorFlow使用C++ Eigen库,所以可以在ARM架构上编译和优化。这也就意味着用户可以在各种服务器和移动设备上部署自己的训练模型,无须执行单独的模型解码器或者加载Python解释器。
作为当前最流行的深度学习框架,TensorFlow获得了极大的成功,但在学习过程中读者也需要注意下面一些问题。
因为TensorFlow的接口在不断地快速迭代,并且版本之间不兼容,所以在开发和调试过程中可能会出现问题,例如开源代码无法在新版的TensorFlow上运行。
想学习TensorFlow底层运行机制的读者需要做好心理准备,TensorFlow在GitHub代码仓库的总代码量超过100万行,系统设计比较复杂,这将是一个漫长的学习过程。
在代码层面,对于同一个功能,TensorFlow提供了多种实现,这些实现良莠不齐,使用中还有细微的区别,请读者注意选择。另外,TensorFlow创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说较难理解。
由卷积神经网络之父杨乐昆领导开发的框架,是Facebook的深度学习开发工具,于2014年开源后,迅速传播开来。Torch的性能非常优秀,其他方面作为一个框架该有的功能都有。另外,作为集合了杨乐昆学术能力和Facebook业界经验的框架,Torch天然对多GPU的支持也胜过了被经常拿来一起比较的Caffe。Torch是基于Lua的,虽然Lua是一个简单又灵活的语言,但是毕竟是小众语言,这在一定程度上限制了Torch的流行程度。
PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是很多主流深度学习框架比如Tensorflow等都不支持的。
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
相对于TensorFlow,PyTorch的一大优点是它的图是动态的,而TensorFlow框架是静态图,不利于扩展。同时,PyTorch非常简洁,方便使用。
如果说TensorFlow的设计是“Make it complicated”,Keras的设计是“Make it complicated and hide it”,那么PyTorch的设计则真正做到了“Keep it simple,stupid”。
由分布式机器学习社区(Distributed/Deep Machine Learning Community, DMLC)开发,是第一个由中国人主导开发的流行框架。MXNet的特点是轻量级、高性能,以及对从分布式到嵌入式等多种场景的优异支持。MXNet前身是DMLC的CXXNet和Minerva,这两个项目一个通过配置和定义来训练网络,而另一个则提供了类似numpy一样的多维数组的用法。MXNet无缝地衔接了这两种用法,获得了非常好的灵活性,这是另一个特点。MXNet支持语言非常多,尤其是对R的支持,赢得了一批统计领域的用户,并且扩展性也不错,可以说是一个非常有潜力的框架。此外,MXNet还有一个很大的特点是文档非常“烂”。2016年末,Amazon宣布MXNet为其官方深度学习平台,并会提供进一步支持,这个问题似乎有望被解决。
由2012年让深度学习在视觉领域声名大噪的AlexNet作者,辛顿的学生艾利克斯·克里则夫斯基(Alex Krizhevsky)开发。作为一名学术工程双馨的天才,其开发的cuda-convnet2的性能曾经非常强悍,不过不知什么原因,最近也停止更新了。
由一家结合了深度学习人才和硬件人才的创业公司Nervana Systems于2015年开源发布。这是一个比较独特的框架,因为其公司软硬结合的血统,在硬件优化上的造诣让这个框架在发布时在不少基准测试上达到了世界最佳的成绩。2016年中,Nervana System被Intel收购。
支持Java的机器学习库,由Skymind发布于2014年发布,商业标准的开源框架,在一些欧美咨询公司中受到欢迎。
全称为Computational Network Toolkit,是微软出品的深度学习框架,于2016年初开源,所以目前使用者寥寥。该框架同时支持CPU和GPU,据说性能极其强悍,在微软官方博客上的测试中,超过了其他所有常见框架。
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。目前,飞桨已凝聚超过265万开发者,服务企业10万家,基于飞桨开源深度学习平台产生了34万个模型 。飞桨助力开发者快速实现AI想法,快速上线AI业务。帮助越来越多的行业完成AI赋能,实现产业智能化升级。
飞桨在业内率先实现了动静统一的框架设计,兼顾灵活性与高性能,并提供一体化设计的高层API和基础API,确保用户可以同时享受开发的便捷性和灵活性。
在大规模分布式训练技术上,飞桨率先支持了千亿稀疏特征、万亿参数、数百节点并行训练的能力,并推出业内首个通用异构参数服务器架构,达到国际领先水平。
飞桨拥有强大的多端部署能力,支持云端服务器、移动端以及边缘端等不同平台设备的高速推理;飞桨推理引擎支持广泛的AI芯片,已经适配和正在适配的芯片或IP达到29款,处于业界领先地位。
飞桨围绕企业实际研发流程量身定制打造了大规模的官方模型库,算法总数达到270多个,服务企业遍布能源、金融、工业、农业等多个领域。
Keras是一个高层神经网络API,使用Python编写,并将TensorFlow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够快速实现开发者的想法。Keras目前是最容易上手的深度学习框架,它提供了一致且简洁的API,能够极大减少一般应用下用户的工作量。
相比于深度学习框架,Keras更像是一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失了灵活性。Keras最初作为Theano的高级API,后来增加了TensorFlow和CNTK作为后端。
为了屏蔽后端的差异性,Keras提供了一致的用户接口并做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序运行十分缓慢,许多Bug都隐藏于封装之中。在绝大多数场景下,Keras是本文介绍的所有框架中运行最慢的。
学习Keras十分容易,但是很快就会遇到瓶颈,因为它不够灵活。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。
Keras的过度封装使其并不适合新手学习(无法理解深度学习的真正内涵),故不推荐。