Caffe实战(二):常见深度学习框架对比

 
深度学习持续火爆,各种深度学习的框架也有很多,例如TensorFlow、Caffe、Keras、Torch、Theano、Deeplearning4j等等,这些深度学习框架被应用于计算机视觉、自然语言处理、语音识别等领域,获取了良好的效果。
 
下表是各大框架在GitHub上的数据统计情况,可以看到TensorFlow在star数量、fork数量、contributor数量这三个数据上都完胜其它框架,这得益于Google在业界的强大号召力,以及Google强大的人工智能研发水平,使大家对Google的深度学习框架充满信心。
 
注:数据截止2017-02
 
从上表也可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚,Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接、爬虫等无所不能,有一个完美的生态环境。
 
这些框架各有所长,下面对主流的深度学习框架进行比较。
 
TensorFlow
 
Google于2011 年推出了人工深度学习系统DistBelief。通过DistBelief(Large Scale Distributed Deep Network,NIPS 2012),Google能够扫描数据中心数以千计的核心,并建立更大的神经网络。这个系统将Google应用中的语音识别率提高了25% 以及在Google Photos中建立了图片搜索,并驱动了Google 的图片字幕匹配实验。DistBelief 还存在不少不足和限制。它很难被设置,和Google内部的基础设施联系也过于紧密,这导致研究代码儿乎不可能分享。
 
针对以上问题,Google在2015 Google Research Blog宣布推出新一代人工智能学习系统一TensorFlow(http://tensorflow.org/)。
 
在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」。TensorFlow是一款开源的数学计算软件,使用数据流图(Data Flow Graph)的形式进行计算。图中的节点代表数学运算,也可以表示数据输入输出的端点,而图中的线条表示多维数据数组(tensor)之间的交互,传递操作之间互相使用的多位数组(tensors),tensor在graph中流动——这也就是TensorFlow名字的由来。一旦节点相连的边传来了数据流,节点就被分配到计算设备上异步的(节点间)、并行的(节点内)执行。
 
TensorFlow是一个异构分布式系统上的大规模机器学习框架,移植性好(小到移动设备如手机,大到大规模集群,都能支持),支持多种深度学习模型。根据Google的说法,TensorFlow是综合的、灵活的、可移植的、易用的,更为关键的是,它是开源的。与此同时,TensorFlow的速度相比前代的DistBelief有了不小的提升,在一些跑分测试中,TensorFlow 的得分是第一代系统的两倍。尽管如此,TeasorFlow的效率仍然比不过其他大部分开源框架。不过,随着TensorF1ow 源码逐步开放,对新硬件、新设备、新的加速库如cuDNN的支持力度不断提升,其成为目前极具潜力的深度学习框架。
 
TensorFlow的特点:
  • 机动性: TensorFlow并不只是一个规则的neural network库,事实上如果你可以将你的计算表示成data flow graph的形式,就可以使用TensorFlow。
  • 可移植性:TensorFlow的另外一个重要特点是它灵活的移植性,可以将同一份代码几乎不经过修改就轻松地部署到有任意数量CPU或GPU的PC、服务器或者移动设备上。相比于Theano,TensorFlow还有一个优势就是它极快的编译速度,在定义新网络结构时,Theano通常需要长时间的编译。
  • 自动差分: TensorFlow的自动差分能力对很多基于Graph的机器学习算法有益。
  • 支持多种编程语言: TensorFlow支持python接口、C++接口、Go接口等。
 
Caffe
Caffe(Convolutional Architecture for Fast Feature Embeddìng,快速特征植入的卷积结构) 是由伯克利视觉和学习中心(Berkeley Vision and Learning Center, BVLC) 开发的基于C++/CUDN/Python实现的一个清晰而高效的卷积神经网络框架,提供了面向命令行、Matlab 和Python的绑定接口,项目主页见参考资料.(BVLC Caffe项目主页即:http:/caffe.berkeleyvision.org/)。Caffe前身为DeCAF(DeCAF: A Deep Convolutional Activation Featore for Generic Visual Recognition,http://arxiv.org/abs/1310.1531),作者均为贾扬清。
 
Caffe 不只是最老牌的框架之一,而是老牌中的老牌。起初的时候它并不是一个通用框架,而仅仅关注计算机视觉,但它具有非常好的通用性。Caffe 的缺点是它不够灵活。如果想作一点新改变,那就需要使用 C++ 、CUDA、Python 或 Matlab接口进行一些小改变。Caffe 的最大缺点之一是它的安装,它需要解决大量的依赖包。
 
Caffe的基本流程:Caffe遵循了神经网络的一个简单假设,即“所有的计算都是以layer的形式表示的”,layer做的事情就是获得一些数据,然后输出一些计算以后的结果,比如说卷积(就是输入一个图像),然后和这一层的参数(filter)做卷积,然后输出卷积的结果。每一个层级(layer)需要做两个计算:前向forward是从输入计算输出,然后反向backward是从上面给的gradient来计算相对于输入的gradient,只要这两个函数实现了以后,我们就可以把很多层连接成一个网络,这个网络做的事情就是输入我们的数据(图像或者语音等),然后来计算我们需要的输出(比如说识别的标签),在训练的时候,我们可以根据已有的标签来计算损失和gradient,然后用gradient来更新网络的参数。
 
Caffe的优势:上手快,模型与相应优化都是以文本形式而非代码形式给出;速度快,能够运行最棒的模型与海量的数据;模块化:方便扩展到新的任务和设置上。
 
Caffe的主要特性如下:
  • 它实现了前馈卷积神经网络架构(CNN),而不是递归网络架构(RNN) 。
  • 它速度快,因为利用了MKL 、OpenBLAS 、cuBLAS 等计算库,支持GPU 加速。
  • 它适合做特征提取,实际上适合做二维图像数据的特征提取。
  • Caffe 完全开源,遵循BSD-2 协议。
  • Caffe 提供了一整套工具集,可用于模型训练、预测、微调、发布、数据预处理,以及良好的自动测试。
  • Caffe 带布一系列参考模型和快速上手例程。
  • Caffe能在国内外有比较活跃的社区,有很多衍生项目,如Caffe for Wmdows 、Caffe with OpenCL 、NVlDlA DIGITS2 、R-CNN 等。
  • Caffe 代码组织良好,可读性强,通过掌握Caffe 代码可以很容易学习其他框架。
 
Keras
 
Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,并可以同时运行在TensorFlow和Theano上。它旨在让用户进行最快速的原型实验,让想法变为结果的这个过程最短。Theano和TensorFlow的计算图支持更通用的计算,而Keras则专精于深度学习。
 
它提供了目前为止最方便的API,用户只需要将高级的模块拼在一起,就可以设计神经网络,它大大降低了编程开销(code overhead)和阅读别人代码时的理解开销(cognitive overhead)。它同时支持卷积网络和循环网络,支持级联的模型或任意的图结构的模型(可以让某些数据跳过某些Layer和后面的Layer对接,使得创建Inception等复杂网络变得容易),从CPU上计算切换到GPU加速无须任何代码的改动。因为底层使用Theano或TensorFlow,用Keras训练模型相比于前两者基本没有什么性能损耗(还可以享受前两者持续开发带来的性能提升),只是简化了编程的复杂度,节约了尝试新网络结构的时间。
 
Keras的所有模块都是简洁、易懂、完全可配置、可随意插拔的,并且基本上没有任何使用限制,神经网络、损失函数、优化器、初始化方法、激活函数和正则化等模块都是可以自由组合的。
 
在Keras中,只需要几行代码就能实现一个MLP,或者十几行代码实现一个AlexNet,这在其他深度学习框架中基本是不可能完成的任务。Keras最大的问题可能是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。
 
CNTK
CNTK (Computational Network Toolkìt,http://www.cntk.ai/)是微软推出的开源深度学习框架,通过一系列计算步骤构成有向图来表达网络。它最早由start the deep learning craze的演讲人创建,目前已经发展成一个通用的、跨平台的深度学习系统,在语音识别领域的使用尤其广泛。
 
CNTK通过一个有向图将神经网络描述为一系列的运算操作,这个有向图中子节点代表输入或网络参数,其他节点代表各种矩阵运算。CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。CNTK有丰富的细粒度的神经网络组件,使得用户不需要写底层的C++或CUDA,就能通过组合这些组件设计新的复杂的Layer。CNTK拥有产品级的代码质量,支持多机、多GPU的分布式训练。
 
CNTK 的优点
  • 高性能:CNTK设计是性能导向的,在CPU、单GPU、多GPU,以及GPU集群上都有非常优异的表现。
  • 高灵活性:CNTK拥有很高的灵活度,它和Caffe一样通过配置文件定义网络结构,再通过命令行程序执行训练,支持构建任意的计算图,支持AdaGrad、RmsProp等优化方法。
  • 可扩展性好:CNTK除了内置的大量运算核,还允许用户定义他们自己的计算节点,支持高度的定制化。CNTK还将支持其他语言的绑定,包括Python、C++和C#,这样用户就可以用编程的方式设计网络结构。
 
从下图中可以看到,CNTK支持双机8GPU并行处理,而其他框架只支持单GPU(Teano)或单机多GPU (TensorFlow、Torch7、Caffe)。从单GPU 对比性能来看,Theano是性能最低的,而CNTK、Torch7 、Caffe 相差不大。单机4GPU的性能对比结果显示了CNTK 具有极高的效率。GitHub 上也有对常见的深度学习框架卷积计算性能的对比情况(https://github.com/soumith/convnet-benchmarks)。
 
 
虽然CNTK有上述优点,但同时要看到微软对自家Windows支持不遗余力,导致CNTK对Windows 平台支持最好。
 
MxNet
 
MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,出自CXXNet、Minerva、Purine 等项目的开发者之手,主要用C++ 编写,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。
 
MXNet的核心是一个动态的依赖调度器,支持自动将计算任务并行化到多个GPU或分布式集群(支持AWS、Azure、Yarn等)。它上层的计算图优化算法可以让符号计算执行得非常快,而且节约内存,开启mirror模式会更加省内存,甚至可以在某些小内存GPU上训练其他框架因显存不够而训练不了的深度学习模型,也可以在移动设备(Android、iOS)上运行基于深度学习的图像识别等任务。此外,MXNet的一个很大的优点是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可谓非常全面,基本主流的脚本语言全部都支持了。
 
MxNet是一个面向效率和灵活性设计的深度学习框架,吸收了多种不同框架(Minerva/Torch/ Theano) 的优点,加入了更多新的功能,如更加方便的多卡和多机分布式运行,
目前MxNet比cxxnet 快40% ,而且GPU显存使用少了一半。
 
MxNet 提供了两种编程接口:
  • N 维数组( ndarray) 接口,类似于Matlab 或Python 中的numpy.ndarray 或torch.tensor 。它独有的优势在于通过背后的engine 可以在性能和内存使用上优于其他框架;
  • 符号(symbolic) 接口,可以快速构建一个神经网络,实现自动求导功能。
 
目前MxNet 还在快速发展中,以后目标是更多的语言绑定(目前支持比较好的是Python ,马上会有Julia 和R)、更好的文档和更多的应用(语言建模、语音、机器翻译、视频)发展。
 
Torch &OverFeat
Torch(Torch主页:http://torch.ch/)是一个出现较早的支持大部分机器学习算法的科学计算框架,从2000 年第一个版本开始,目前己经发布了4 个版本(Torch 1、Toroh 3, Torch 5 、Torch 7)。Torch 使用轻量脚本语言Lua 及其C/CUDA 扩展模块实现,底层数值计算通过高效的OpenMP/SSE/CUDA 加速,同时具备灵活性和速度优势,得益于Lua 的轻量接口, Torch 可以很容易接入第三方软件。
 
Torch 完全开源,遵循BSD协议,为机器学习提供了类似于Matlab 的环境,目前纽约大学CNYU) , Facebook A1实验室和Google DeepMind Torch 均使用该框架做深度学习研究. (但是真正起势得益于Facebook开源了大量Torch的深度学习模块和扩展,并且在被谷歌收购之前 DeepMind 也是用的 Torch(收购之后 DeepMind 转向了 TensorFlow)。)
 
Torch的优势:高度模块化、构建模型简单、快速高效的GPU支持、可嵌入到iOS、Android后端等。
 
Torch的劣势:在目前深度学习编程语言绝大部分以 Python 实现为主的大趋势下,一个以 Lua 为编程语言的框架的最大劣势莫过于此。
 
OverFeat(Integrated Recognition,Localization and Detection using Convolutional Networks, http://arxiv.org/abs/1312.6229v4)是一个在lmageNet 数据集中使用Torch 7训练的特征提取器, 实现了图像识别、定位和检测三位一体的集成系统,取得了ILSVRC2013 定位任务冠军,同时在分类和检测任务中也取得了不错的成绩。
 
Theano
 
Theano诞生于2008年,由蒙特利尔大学Lisa Lab团队开发并维护,是一个高性能的符号计算及深度学习库。因其出现时间早,可以算是这类库的始祖之一,也一度被认为是深度学习研究和应用的重要标准之一。Theano的核心是一个数学表达式的编译器,专门为处理大规模神经网络训练的计算而设计。它可以将用户定义的各种计算编译为高效的底层代码,并链接各种可以加速的库,比如BLAS、CUDA等。
 
Theano允许用户定义、优化和评估包含多维数组的数学表达式,它支持将计算装载到GPU中(Theano在GPU上性能不错,但是CPU上较差)。Theano很好地整合了NumPy,对GPU的透明让Theano可以较为方便地进行神经网络设计,而不必直接写CUDA代码。Theano的主要优势如下:
  • 集成NumPy,可以直接使用NumPy的ndarray,API接口学习成本低;
  • 计算稳定性好,比如可以精准地计算输出值很小的函数(像log(1+x));
  • 使用GPU加速计算比CPU快140倍(只针对32位float类型)
  • 有效的符号微分-计算一元或多元函数的导数
  • 动态地生成C代码-更快地进行计算
 
Theano支持机器学习中的逻辑回归(Logistic Regression. LR)、多层感知器(MultLayer Perceptron. MLP) 、深度卷积网络等监督学习方法,以及自编码器(Auto Encoder, AE) 、降噪自编码器、限制玻尔兹曼机(Restricted Bolzman Machine,RBM) 、深度置信网络( Deep Belief Network, DBN) 等非监督/半监督学习方法,在国外教育领域非常受欢迎,一些机器学习课程都是采用Theano教学的。但是Theano 有个致命短板,就是计算速度慢,虽然有GPU 加速,但仍然不如其他框架高效,所以只适合研究人员使用,不适合在线上环境部署。
 
Deeplearning4j
 
顾名思义,Deeplearning4j是“for Java”的深度学习框架(也支持Scala),也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用 Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。
 
DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能。
 
DL4J选择Java作为其主要语言的原因是,目前基于Java的分布式计算、云计算、大数据的生态非常庞大。用户可能拥有大量的基于Hadoop和Spark的集群,因此在这类集群上搭建深度学习平台的需求便很容易被DL4J满足。同时JVM的生态圈内还有数不胜数的Library的支持,而DL4J也创建了ND4J,可以说是JVM中的NumPy,支持大规模的矩阵运算。此外,DL4J还有商业版的支持,付费用户在出现问题时可以通过电话咨询寻求支持。
 
MatConvNet
 
MatConvNet是Matlab上的卷积神经网络CNN实现。该工具包设计简单且灵活,它将CNN模块(用于计算滤波器组线性卷积,特征下采样等函数)封装为易用的Matlab函数,便于快速实现新的CNN架构原型设计。同时MatConvNet支持CPU/GPU高效计算,能够在大规模数据集如ImageNet上训练复杂模型。
 
项目主页:http://www.vlfeat.org/matconvnet/
Github地址:https://github.com/vlfeat/matconvnet
 
cuda-convnet & cuda-convnet2
 
cuda-convnet 和 cuda-convnet2是深度学习大神Alex Krizhevsky(2012年ILSVRC冠军)利用Python/C++/CUDA编写的深度卷积神经网络框架,充分挖掘了GPU硬件架构,使用纹理内存优化卷积算法达到了相当高的效率。该框架是为GPU定制的,因此运行这个框架要求读者必须有GPU硬件。
 
项目主页:https://code.google.com/p/cuda-convnet/
GitHub地址:https://github.com/akrizhevsky/cuda-convnet2
 
百度飞桨PaddlePaddle分布式深度学习平台
 
知乎上贾清扬的回答,目前是比较正面的评价。
  1. 很高质量的GPU代码
  2. 非常好的RNN设计
  3. 设计很干净,没有太多的abstraction,这一点比TensorFlow好很多。
  4. 高速RDMA的部分貌似没有开源(可能是因为RDMA对于cluster design有一定要求):Paddle/RDMANetwork.h at master · baidu/Paddle · GitHub
  5. 设计思路比较像第一代的DL框架,不过考虑到paddle已经有年头了,这样设计还是有历史原因的。
    1. config是hard-code的protobuf message,这对扩展性可能会有影响。
    2. 可以看到很多有意思的类似历史遗留的设计:采用了STREAM_DEFAULT macro,然后通过TLS的方式定向到非default stream:Paddle/hl_base.h at 4fe7d833cf0dd952bfa8af8d5d7772bbcd552c58 · baidu/Paddle · GitHub (所以Paddle off-the-shelf不支持mac?)
    3. 在梯度计算上采用了传统的粗粒度forward/backward设计(类似Caffe)。可能有人会说“所以paddle没有auto gradient generation”,这是不对的,autograd的存在与否和op的粒度粗细无关。事实上,TensorFlow在意识到细粒度operator超级慢的速度以后,也在逐渐转回粗粒度的operator上。目前只看到这里。总之是一个非常solid的框架,百度的开发功底还是不错的。
 
PaddlePaddle与caffe和TensorFlow之间的对比:
 
附接口语音
  • Caffe         ——cmd, matlab, python
  • Tensorflow——python, c++
  • Paddle      ——python, c++
 
1)Caffe可以说是第一个工业级深度学习工具,始于2013年底由UC Berkely的贾杨清编写的具有出色的CNN实现功能的开发语言,在计算机视觉领域Caffe仍然是最流行的工具包。Caffe的开发语言支持C++和Cuda,速度很快,但是由于一些历史性的遗留架构问题,它的灵活性不够强。而且对递归网络和语言建模的支持很差。Caffe支持所有主流开发系统,上手难度属于中等水平。
 
2)Tensorflow是Google开源的第二代深度学习技术,是一个理想的RNN API实现,它使用了向量运算的符号图方法,使得开发的速度可以很快。Tensorflow支持的比较好的系统只有各种Linux系统和OSX,不过其对语言的支持比较全面,包含了Python、C++和Cuda等,开发者文档写得没有Caffe那么全面,所以上手比较难。
 
3)而此次百度的Paddle,作为基于Spark的异构分布式深度学习系统,通过使用GPU与FPGA异构计算提升每台机器的数据处理能力,暂时获得了业内“相当简洁、设计干净、稳定,速度较快,显存占用较小。”的评价,跟它通过使用GPU与FPGA异构计算提升每台机器的数据处理能力有重要联系。
 
 
参考:
          
 
 

posted on 2021-04-10 18:54  悬崖边上打坐  阅读(584)  评论(0)    收藏  举报

导航