主流开源深度学习框架对比分析

一、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      Google

    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#版本。

主流开源深度学习框架对比分析

你可能感兴趣的:(深度学习)