主流开源深度学习框架对比分析
一、Caffe
(Convolutional Architecture for Fast Feature Embedding) BVLC
We believe that Caffe is the fastest convnet implementation available. caffe的官网是http://caffe.berkeleyvision.org/。Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清,目前在Google工作。
Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换:Caffe::set_mode(Caffe::GPU); 在Caffe中图层需要使用C++定义,而网络则使用Protobuf定义。Caffe是一个深度卷积神经网络的学习框架,使用Caffe可以比较方便地进行CNN模型的训练和测试,精于CV领域。
Caffe作为快速开发和工程应用是非常适合的。caffe官方提供了大量examples,照着examples写,caffe只要求会写prototxt就行,它的训练过程、梯度下降算法等等都实现封装好了,懂了prototxt的语法了,基本就能自己构造神经网络了。caffe作为C++语言以及配合了CUDA开发的框架,训练效率也有保证,这也是caffe适合于工业应用的原因。代码易懂好理解,高效、实用。上手简单,使用方便,比较成熟和完善,实现基础算法方便快捷,开发新算法不是特别灵活,适合工业快速应用实现.
Caffe的优势:
一方面是调参,改网络很方便,开源做得很好,另一方面CNN在CV里用的很多,这也是Caffe的优势。
上手快:配置文件简单,易上手,文档齐全,模型与相应优化都是以文本形式而非代码形式给出。
Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
速度快:Google Protocol Buffer数据标准为Caffe提升了效率,能够运行最棒的模型与海量的数据。Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.
模块化:允许对新数据格式、网络层和损失函数进行扩展,方便扩展到新的任务和设置上。
可以使用Caffe提供的各层类型来定义自己的模型。
开放性:公开的代码和参考模型用于再现。
社区好:可以通过BSD-2参与开发与讨论。
学术论文采用此模型较多。不少论文都与Caffe有关(R-CNN,DSN,最近还有人用Caffe实现LSTM)
缺点:
灵活性差,不同版本接口不兼容, 可定制性较低,不能很方便得扩展到其它模型。
Caffe可能是第一个主流的工业级深度学习工具,它开始于2013年底,具有出色的卷积神经网络实现。在计算机视觉领域Caffe依然是最流行的工具包,它有很多扩展,但是由于一些遗留的架构问题,它对递归网络和语言建模的支持很差。
二、MXNet
百度 DMLC(分布式机器学习社区) 简称"深盟"
内存优化做得好
MXNet结合命令式和声明式编程的优点,既可以对系统做大量的优化,又可以方便调试。资源和计算的调度、内存分配资源管理、数据的表示、计算优化等都很值得学习的,原生支持分布式训练的。
对于一个优秀的深度学习系统,或者更广来说优秀的科学计算系统,最重要的是编程接口的设计。他们都采用将一个领域特定语言(domain specific language)嵌入到一个主语言中。例如numpy将矩阵运算嵌入到python中。这类嵌入一般分为两种,其中一种嵌入的较浅,其中每个语句都按原来的意思执行,且通常采用命令式编程(imperative programming),其中numpy和Torch就是属于这种。而另一种则用一种深的嵌入方式,提供一整套针对具体应用的迷你语言。这一种通常使用声明式语言(declarative programing),既用户只需要声明要做什么,而具体执行则由系统完成。这类系统包括Caffe,theano和TensorFlow。
这两种方式各有利弊,总结如下。
命令式编程:
如何执行 a=b+1: 需要b已经被赋值。立即执行加法,将结果保存在a中。
优点: 语义上容易理解,灵活,可以精确控制行为。通常可以无缝地和主语言交互,方便地利用主语言的各类算法,工具包,debug和性能调试器。
缺点: 实现统一的辅助函数和提供整体优化都很困难。
声明式编程:
如何执行 a=b+1: 返回对应的计算图(computation graph),我们可以之后对b进行赋值,然后再执行加法运算
优点: 在真正开始计算的时候已经拿到了整个计算图,所以我们可以做一系列优化来提升性能。实现辅助函数也容易,例如对任何计算图都提供forward和backward函数,对计算图进行可视化,将图保存到硬盘和从硬盘读取。
缺点: 很多主语言的特性都用不上。某些在主语言中实现简单,但在这里却经常麻烦,例如if-else语句 。debug也不容易,例如监视一个复杂的计算图中的某个节点的中间结果并不简单。
目前现有的系统大部分都采用上两种编程模式的一种。与它们不同的是,MXNet尝试将两种模式无缝的结合起来。在命令式编程上MXNet提供张量运算,而声明式编程中MXNet支持符号表达式。用户可以自由的混合它们来快速实现自己的想法。例如我们可以用声明式编程来描述神经网络,并利用系统提供的自动求导来训练模型。另一方便,模型的迭代训练和更新模型法则中可能涉及大量的控制逻辑,因此我们可以用命令式编程来实现。同时我们用它来进行方便地调式和与主语言交互数据。
下表我们比较MXNet和其他流行的深度学习系统
框架 Caffe Torch Theano TensorFlow MXNet
主语言 C++ Lua Python C++ C++
从语言 Python, Matlab x x Python Python, R, Julia, Scala, Javascript, Matlab, Go
硬件 CPU, GPU, CPU, GPU, FPGA CPU, GPU, CPU, GPU, mobile CPU, GPU,mobile
分布式 x x x v v
命令式 x v v x v
声明式 v x x v v
Symbol: 声明式的符号表达式
MXNet使用多值输出的符号表达式来声明计算图。符号是由操作子构建而来。一个操作子可以是一个简单的矩阵运算“+”,也可以是一个复杂的神经网络里面的层,例如卷积层。一个操作子可以有多个输入变量和多个输出变量,还可以有内部状态变量。一个变量既可以是自由的,我们可以之后对其赋值;也可以是某个操作子的输出。在执行一个符号表达式前,我们需要对所有的自由变量进行赋值。
NDArray:命令式的张量计算
MXNet提供命令式的张量计算来桥接主语言的和符号表达式。另一方面,NDArray可以无缝和符号表达式进行对接。
KVStore:多设备间的数据交互
MXNet提供一个分布式的key-value存储来进行数据交换。它主要有两个函数,push: 将key-value对从一个设备push进存储,pull:将某个key上的值从存储中pull出来此外,KVStore还接受自定义的更新函数来控制收到的值如何写入到存储中。最后KVStore提供数种包含最终一致性模型和顺序一致性模型在内的数据一致性模型。
读入数据模块
数据读取在整体系统性能上占重要地位。MXNet提供工具能将任意大小的样本压缩打包成单个或者数个文件来加速顺序和随机读取。
训练模块
MXNet实现了常用的优化算法来训练模型。用户只需要提供数据数据迭代器和神经网络的Symbol便可。此外,用户可以提供额外的KVStore来进行分布式的训练。
过去,现状,和未来
大半年数个优秀的C++机器学习系统的开发人员成立了DMLC,本意是更方便共享各自项目的代码,并给用户提供一致的体验。当时我们有两个深度学习的项目,一个是CXXNet,其通过配置来定义和训练神经网络。另一个是Minerva,提供类似numpy一样的张量计算接口。前者在图片分类等使用卷积网络上很方便,而后者更灵活。那时候我们想能不能做一个两者功能都具备的系统,于是这样就有了MXNet。其名字来自Minerva的M和CXXNet的XNet。其中Symbol的想法来自CXXNet,而NDArray的想法来自Minerva。我们也常把MXNet叫“mix net”。
MXNet的目的是做一个有意思的系统,能够让大家用着方便的系统,一个轻量的和可以快速测试系统和算法想法的系统。未来主要关注下面四个方向:
- 支持更多的硬件,目前在积极考虑支持AMD GPU,高通GPU,Intel Phi,FPGA,和更多智能设备。相信MXNet的轻量和内存节省可以在这些上大有作为。
- 更加完善的操作子。目前不论是Symbol还是NDArray支持的操作还是有限,我们希望能够尽快的扩充他们。
- 更多编程语言。除了C++,目前MXNet对Python,R和Julia的支持比较完善。但我们希望还能有很多的语言,例如javascript。
- 更多的应用。我们之前花了很多精力在图片分类上,下面我们会考虑很多的应用。
三、Torch Facebook Google DeepMind Twitter FAIR
核心的计算单元使用C或者cuda做了很好的优化。在此基础之上,使用lua构建了常见的模型。另外,torch7构建的是一个生态系统,安装新的模型实现模块只需要luarocks install package. 比如:luarocks install rnn。之后就可以欢乐地使用rnn模型了。torch7的缺点可能就是1. wrapper是lua语言,需要一点时间来学习。2. 优化新的计算单元可能会比较麻烦,backend修改起来会比较麻烦.
核心特征的总结:
1. 一个强大的n维数组
2. 很多实现索引,切片,移调transposing的例程
3.惊人的通过LuaJIT的C接口
4.线性代数例程
5.神经网络,并基于能量的模型
6.数值优化例程
7.快速高效的GPU支持
8.可嵌入,可移植到iOS,Android和FPGA的后台
优势:
1. 构建模型简单,一层层搭积木即可。
2. 高度模块化,一层就是一个模块,写新模块也方便,套用接口就行,用tensor运算不必写cuda也能用GPU。
3. 底层的tensor由C和cuda实现,速度不会比caffe差,甚至某些运算可能更快。
4. 使用GPU方便,把tensor数据送到GPU只要简单的 "tensor:cuda()"。
5. lua入门快,堪比python。
6. 很重要的一点,nngraph,理论上可以用nn里的模块实现任何DAG构造的网络,当然也包括RNN、LSTM之类的。
劣势:
1. 对于不少人来说,lua要新学。
2. 除了deep learning方面,其他好用的机器学习library较少。
3. 数据文件格式比较麻烦,一般原始数据没有torch专用的t7格式文件,需要通过mat等格式中转转换。
四、Theano
the LISA group at the University of Montreal(蒙特利尔)
Theano是一个Python库,用来定义、优化和计算数学表达式,用于高效的解决多维数组的计算问题。
优点:
集成NumPy-使用numpy.ndarray
使用GPU加速计算-比CPU快140倍(只针对32位float类型)
有效的符号微分-计算一元或多元函数的导数
速度和稳定性优化-比如能计算很小的x的函数log(1+x)的值
动态地生成C代码-更快地计算
广泛地单元测试和自我验证-检测和诊断多种错误
灵活性好
缺点:
1.scan 中糟糕参数的传递限制,immutable 机制导致 function compile 时候的时间过长。
2.theano 定义 function 时缺乏灵活的多态机制。
3.困难的调试方法
五、TensorFlow
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow 表达了高层次的机器学习计算,大幅简化了第一代系统,并且具备更好的灵活性和可延展性。TensorFlow一大亮点是支持异构设备分布式计算,它能够在各个平台上自动运行模型,从电话、单个CPU / GPU到成百上千GPU卡组成的分布式系统。从目前的文档看,TensorFlow支持CNN、RNN和LSTM算法,拥有C++/Python编程接口,这都是目前在Image,Speech和NLP最流行的深度神经网络模型。
TensorFlow的数据结构tensor,它相当于N维的array或者list,与MXNet类似,都是采用了以python调用的形式展现出来。某个定义好的tensor的数据类型是不变的,但是维数可以动态改变。用tensor rank和TensorShape来表示它的维数(例如rank为2可以看成矩阵,rank为1可以看成向量)。tensor是个比较中规中矩的类型。唯一特别的地方在于在TensorFlow构成的网络中,tensor是唯一能够传递的类型,而类似于array、list这种不能当成输入。
TensorFlow的网络实现方式选择的是符号计算方式,它的程序分为计算构造阶段和执行阶段,构造阶段是构造出computation graph,computation graph就是包含一系列符号操作Operation和Tensor数据对象的流程图,跟mxnet的symbol类似,它定义好了如何进行计算(加减乘除等)、数据通过不同计算的顺序(也就是flow,数据在符号操作之间流动的感觉)。但是暂时并不读取输入来计算获得输出,而是由后面的执行阶段启动session的run来执行已经定义好的graph。这样的方式跟mxnet很相似,应该都是借鉴了theano的想法。其中TensorFlow还引入了Variable类型,它不像mxnet的Variable属于symbol(tf的operation类似mxnet的symbol),而是一个单独的类型,主要作用是存储网络权重参数,从而能够在运行过程中动态改变。tf将每一个操作抽象成了一个符号Operation,它能够读取0个或者多个Tensor对象作为输入(输出),操作内容包括基本的数学运算、支持reduce、segment(对tensor中部分进行运算。
TensorFlow的优点:
1、TensorFlow则是功能很齐全,能够搭建的网络更丰富而不是像caffe仅仅局限在CNN。
2、 TensorFlow的深度学习部分能够在一个模型中堆积了许多不同的模型和转换,你能够在一个模型中方便地处理文本 图片和规则分类以及连续变量,同时实现多目标和多损失工作;
3、TensorFlow的管道部分能够将数据处理和机器学习放在一个框架中,TensorFlow指引了方向。
TensorFlow是一个理想的RNN(递归神经网络) API和实现,TensorFlow使用了向量运算的符号图方法,使得新网络的指定变得相当容易,但TensorFlow并不支持双向RNN和3D卷积,同时公共版本的图定义也不支持循环和条件控制,这使得RNN的实现并不理想,因为必须要使用Python循环且无法进行图编译优化。
六、CNTK 微软深度学习工具包
微软将人工智能成果 CNTK 开源放上 GitHub,称是运算速度最快的 Toolkit
是一个统一的深度学习工具包,它将神经网络描述成在有向图上的一系列计算步骤。在这个有向图中,叶子结点表示输入层或网络参数,其它的结点表示成在输入层上的矩阵操作。在CNTK上可以很容易的实现及结合当今流行的模型,例如前馈神经网络DNNs, 卷积神经网络(CNNs), 循环神经网络 (RNNs/LSTMs)。在实现随机梯度下降学习时能够自动计算梯度,而且还能通过多个GPUs或服务器实现并行计算。CNTK是微软在Cortana 数字助理和Skype 翻译应用中使用的语音识别的系统框架。
CNTK最大的优点是可以并行多个GPU或服务器。微软首席科学家黄学东说“谷歌公开的TensorFlow并没有这个功能”。
CNTK的另外一个优点是支持Microsoft Windows。但是这个开源工具是用C++写的。微软计划将尽快公开对应的Python和C#版本。
十个值得尝试的开源深度学习框架
本周早些时候开源中国社区公布了Google开源了TensorFlow(GitHub)消息,此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用自行研发的深度学习工具。
无疑,来自Google军火库的TensorFlow必然是开源深度学习软件中的明星产品,登陆GitHub当天就成为最受关注的项目,当周获得评星数就轻松超过1万个。
对于希望在应用中整合深度学习功能的开发者来说,GitHub上其实还有很多不错的开源项目值得关注,首先我们推荐目前规模人气最高的TOP3:
源自加州伯克利分校的Caffe被广泛应用,包括Pinterest这样的web大户。与TensorFlow一样,Caffe也是由C++开发,Caffe也是Google今年早些时候发布的DeepDream项目(可以识别喵星人的人工智能神经网络)的基础。
2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。
Torch诞生已经有十年之久,但是真正起势得益于去年Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了不怎么流行的编程语言Lua(该语言曾被用来开发视频游戏)。
除了以上三个比较成熟知名的项目,还有很多有特色的深度学习开源框架也值得关注:
来自瑞士人工智能实验室IDSIA的一个非常发展前景很不错的深度学习软件包,Brainstorm能够处理上百层的超级深度神经网络——所谓的公路网络Highway Networks。
来自一个日本的深度学习创业公司Preferred Networks,今年6月发布的一个Python框架。Chainer的设计基于define by run原则,也就是说,该网络在运行中动态定义,而不是在启动时定义,这里有Chainer的详细文档。
顾名思义,Deeplearning4j是”for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用 Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。
DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能,可应用于以下深度学习领域:
人脸/图像识别
语音搜索
语音转文字(Speech to text)
垃圾信息过滤(异常侦测)
电商欺诈侦测
是普林斯顿大学视觉工作组新推出的C++框架。该团队还提供了一个文件用于将Caffe模型转化成语Marvin兼容的模式。
这是斯坦福大学博士生Andrej Karpathy开发浏览器插件,基于万能的JavaScript可以在你的游览器中训练神经网络。Karpathy还写了一个ConvNetJS的入门教程,以及一个简洁的浏览器演示项目。
github主页:https://github.com/karpathy/convnetjs
出自CXXNet、Minerva、Purine等项目的开发者之手,主要用C++编写。MXNet强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。
由创业公司Nervana Systems于今年五月开源,在某些基准测试中,由Python和Sass开发的Neon的测试成绩甚至要优于Caffeine、Torch和谷歌的TensorFlow。
6642: iNaturalist(项目:连接自然)挑战2017数据集
1707- 06436: 未来的计算机视觉调查--通过对2016年的1600篇论文的调研
6342: ThiNet:一个滤波器级别的调谐方法用于深度网络压缩
6292: STag:一个基准的标记系统
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采