深度学习框架_深度学习框架排名 - CSDN
深度学习框架 订阅
在开始深度学习项目之前,选择一个合适的框架是非常重要的,因为选择一个合适的框架能起到事半功倍的作用。研究者们使用各种不同的框架来达到他们的研究目的,侧面印证出深度学习领域百花齐放。全世界最为流行的深度学习框架有PaddlePaddle、Tensorflow、Caffe、Theano、MXNet、Torch和PyTorch。 展开全文
在开始深度学习项目之前,选择一个合适的框架是非常重要的,因为选择一个合适的框架能起到事半功倍的作用。研究者们使用各种不同的框架来达到他们的研究目的,侧面印证出深度学习领域百花齐放。全世界最为流行的深度学习框架有PaddlePaddle、Tensorflow、Caffe、Theano、MXNet、Torch和PyTorch。
信息
特    点
开源
本    质
作    用
降低了深度学习研究的入门门槛
中文名
深度学习框架
基本释义
用于深度学习的框架
外文名
Deep learning framework
深度学习框架概述
在深度学习初始阶段,每个深度学习研究者都需要写大量的重复代码。为了提高工作效率,这些研究者就将这些代码写成了一个框架放到网上让所有研究者一起使用。接着,网上就出现了不同的框架。随着时间的推移,最为好用的几个框架被大量的人使用从而流行了起来。 [1]  全世界最为流行的深度学习框架有PaddlePaddle、Tensorflow、Caffe、Theano、MXNet、Torch和PyTorch。
收起全文
  • 主流深度学习框架对比

    千次阅读 2018-10-16 05:20:30
    深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlow却杀出重围,在关注度...

    深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括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的性能对比
    展开全文
  • 一、深度学习框架究竟是什么?

    千次阅读 2018-09-15 21:27:24
    1 引言 一直在说深度学习框架,最近也在使用tensorflow进行了简单的实验,但是对其中关系的理解还是...






    1 引言

    一直在说深度学习框架,最近也在使用tensorflow进行了简单的实验,但是对其中关系的理解还是不够到位,他们里面究竟是怎样的一个运行机制呢?

    2 说明

    深度学习框架也就像Caffe、tensorflow这些是深度学习的工具,简单来说就是库,编程时需要import caffe、import tensorflow。作一个简单的比喻,一套深度学习框架就是这个品牌的一套积木,各个组件就是某个模型或算法的一部分,你可以自己设计如何使用积木去堆砌符合你数据集的积木。好处是你不必重复造轮子,模型也就是积木,是给你的,你可以直接组装,但不同的组装方式,也就是不同的数据集则取决于你。

    3 应用优势

    深度学习框架的出现降低了入门的门槛,你不需要从复杂的神经网络开始编代码,你可以依据需要,使用已有的模型,模型的参数你自己训练得到,你也可以在已有模型的基础上增加自己的layer,或者是在顶端选择自己需要的分类器和优化算法(比如常用的梯度下降法)。当然也正因如此,没有什么框架是完美的,就像一套积木里可能没有你需要的那一种积木,所以不同的框架适用的领域不完全一致。 总的来说深度学习框架提供了一些列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户自己去定义,然后调用深度学习框架的函数接口使用用户自定义的新算法.

    4 关于组件

    大部分深度学习框架都包含以下五个核心组件:
    1. 张量(Tensor)
    2. 基于张量的各种操作
    3. 计算图(Computation Graph)
    4. 自动微分(Automatic Differentiation)工具
    5. BLAS、cuBLAS、cuDNN等拓展包

    下面对这五大核心组件做一个简要的解释

    4.1张量(Tensor)

    张量是所有深度学习框架中最核心的组件,因为后续的所有运算和优化算法都是基于张量进行的。几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。

    举例来说,我们可以将任意一张RGB彩色图片表示成一个三阶张量(三个维度分别是图片的高度、宽度和色彩数据)。如下图所示是一张普通的水果图片,按照RGB三原色表示,其可以拆分为三张红色、绿色和蓝色的灰度图片,如果将这种表示方法用张量的形式写出来,就是图中最下方的那张表格。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    图中只显示了前5行、320列的数据,每个方格代表一个像素点,其中的数据[1.0, 1.0, 1.0]即为颜色。假设用[1.0, 0, 0]表示红色,[0, 1.0, 0]表示绿色,[0, 0, 1.0]表示蓝色,那么如图所示,前面5行的数据则全是白色。

    将这一定义进行扩展,我们也可以用四阶张量表示一个包含多张图片的数据集,其中的四个维度分别是:图片在数据集中的编号,图片高度、宽度,以及色彩数据。

    将各种各样的数据抽象成张量表示,然后再输入神经网络模型进行后续处理是一种非常必要且高效的策略。因为如果没有这一步骤,我们就需要根据各种不同类型的数据组织形式定义各种不同类型的数据操作,这会浪费大量的开发者精力。更关键的是,当数据处理完成后,我们还可以方便地将张量再转换回想要的格式。例如Python NumPy包中numpy.imread和numpy.imsave两个方法,分别用来将图片转换成张量对象(即代码中的Tensor对象),和将张量再转换成图片保存起来。

    4.2 基于张量的各种操作

    有了张量对象之后,下面一步就是一系列针对这一对象的数学运算和处理过程。
    这里写图片描述
    其实,整个神经网络都可以简单视为为了达到某种目的,针对输入张量进行的一系列操作过程。而所谓的“学习”就是不断纠正神经网络的实际输出结果和预期结果之间误差的过程。这里的一系列操作包含的范围很宽,可以是简单的矩阵乘法,也可以是卷积、池化和LSTM等稍复杂的运算。而且各框架支持的张量操作通常也不尽相同,详细情况可以查看其官方文档(如下为NumPy、Theano和TensorFlow的说明文档)。

    NumPy:http://www.scipy-lectures.org/intro/numpy/operations.html

    Theano:http://deeplearning.net/software/theano/library/tensor/basic.html

    TensorFlow:https://www.tensorflow.org/api_docs/python/math_ops/

    需要指出的是,大部分的张量操作都是基于类实现的(而且是抽象类),而并不是函数(这一点可能要归功于大部分的深度学习框架都是用面向对象的编程语言实现的)。这种实现思路一方面允许开发者将各种类似的操作汇总在一起,方便组织管理。另一方面也保证了整个代码的复用性、扩展性和对外接口的统一。总体上让整个框架更灵活和易于扩展,为将来的发展预留了空间。

    4.3 计算图(Computation Graph)

    有了张量和基于张量的各种操作之后,下一步就是将各种操作整合起来,输出我们需要的结果。

    但不幸的是,随着操作种类和数量的增多,管理起来就变得十分困难,各操作之间的关系变得比较难以理清,有可能引发各种意想不到的问题,包括多个操作之间应该并行还是顺次执行,如何协同各种不同的底层设备,以及如何避免各种类型的冗余操作等等。这些问题有可能拉低整个深度学习网络的运行效率或者引入不必要的Bug,而计算图正是为解决这一问题产生的。

    计算图首次被引入人工智能领域是在2009年的论文《Learning Deep Architectures for AI》。当时的图片如下所示,作者用不同的占位符(*,+,sin)构成操作结点,以字母x、a、b构成变量结点,再以有向线段将这些结点连接起来,组成一个表征运算逻辑关系的清晰明了的“图”型数据结构,这就是最初的计算图。
    这里写图片描述
    后来随着技术的不断演进,加上脚本语言和低级语言各自不同的特点(概括地说,脚本语言建模方便但执行缓慢,低级语言则正好相反),因此业界逐渐形成了这样的一种开发框架:前端用Python等脚本语言建模,后端用C++等低级语言执行(这里低级是就应用层而言),以此综合了两者的优点。可以看到,这种开发框架大大降低了传统框架做跨设备计算时的代码耦合度,也避免了每次后端变动都需要修改前端的维护开销。而这里,在前端和后端之间起到关键耦合作用的就是计算图。

    将计算图作为前后端之间的中间表示(Intermediate Representations)可以带来良好的交互性,开发者可以将Tensor对象作为数据结构,函数/方法作为操作类型,将特定的操作类型应用于特定的数据结构,从而定义出类似MATLAB的强大建模语言。

    需要注意的是,通常情况下开发者不会将用于中间表示得到的计算图直接用于模型构造,因为这样的计算图通常包含了大量的冗余求解目标,也没有提取共享变量,因而通常都会经过依赖性剪枝、符号融合、内存共享等方法对计算图进行优化。

    目前,各个框架对于计算图的实现机制和侧重点各不相同。例如Theano和MXNet都是以隐式处理的方式在编译中由表达式向计算图过渡。而Caffe则比较直接,可以创建一个Graph对象,然后以类似Graph.Operator(xxx)的方式显示调用。

    因为计算图的引入,开发者得以从宏观上俯瞰整个神经网络的内部结构,就好像编译器可以从整个代码的角度决定如何分配寄存器那样,计算图也可以从宏观上决定代码运行时的GPU内存分配,以及分布式环境中不同底层设备间的相互协作方式。除此之外,现在也有许多深度学习框架将计算图应用于模型调试,可以实时输出当前某一操作类型的文本描述。

    4.4 自动微分(Automatic Differentiation)工具

    计算图带来的另一个好处是让模型训练阶段的梯度计算变得模块化且更为便捷,也就是自动微分法。

    正如前面提到的,因为我们可以将神经网络视为由许多非线性过程组成的一个复杂的函数体,而计算图则以模块化的方式完整表征了这一函数体的内部逻辑关系,因此微分这一复杂函数体,即求取模型梯度的方法就变成了在计算图中简单地从输入到输出进行一次完整遍历的过程。与自动微分对应,业内更传统的做法是符号微分。

    符号微分即常见的求导分析。针对一些非线性过程(如修正线性单元ReLU)或者大规模的问题,使用符号微分法的成本往往非常高昂,有时甚至不可行(即不可微)。因此,以上述迭代式的自动微分法求解模型梯度已经被广泛采用。并且由于自动微分可以成功应对一些符号微分不适用的场景,目前许多计算图程序包(例如Computation Graph Toolkit)都已经预先实现了自动微分。

    另外,由于每个节点处的导数只能相对于其相邻节点计算,因此实现了自动微分的模块一般都可以直接加入任意的操作类中,当然也可以被上层的微分大模块直接调用。

    4.5 BLAS、cuBLAS、cuDNN等拓展包

    现在,通过上述所有模块,我们已经可以搭建一个全功能的深度学习框架:将待处理数据转换为张量,针对张量施加各种需要的操作,通过自动微分对模型展开训练,然后得到输出结果开始测试。这时还缺什么呢?答案是运算效率。

    由于此前的大部分实现都是基于高级语言的(如Java、Python、Lua等),而即使是执行最简单的操作,高级语言也会比低级语言消耗更多的CPU周期,更何况是结构复杂的深度神经网络,因此运算缓慢就成了高级语言的一个天然的缺陷。

    目前针对这一问题有两种解决方案。

    第一种方法是模拟传统的编译器。就好像传统编译器会把高级语言编译成特定平台的汇编语言实现高效运行一样,这种方法将高级语言转换为C语言,然后在C语言基础上编译、执行。为了实现这种转换,每一种张量操作的实现代码都会预先加入C语言的转换部分,然后由编译器在编译阶段将这些由C语言实现的张量操作综合在一起。目前pyCUDA和Cython等编译器都已经实现了这一功能。

    第二种方法就是前文提到的,利用脚本语言实现前端建模,用低级语言如C++实现后端运行,这意味着高级语言和低级语言之间的交互都发生在框架内部,因此每次的后端变动都不需要修改前端,也不需要完整编译(只需要通过修改编译参数进行部分编译),因此整体速度也就更快。

    除此之外,由于低级语言的最优化编程难度很高,而且大部分的基础操作其实也都有公开的最优解决方案,因此另一个显著的加速手段就是利用现成的扩展包。例如最初用Fortran实现的BLAS(基础线性代数子程序),就是一个非常优秀的基本矩阵(张量)运算库,此外还有英特尔的MKL(Math Kernel Library)等,开发者可以根据个人喜好灵活选择。
    这里写图片描述
    值得一提的是,一般的BLAS库只是针对普通的CPU场景进行了优化,但目前大部分的深度学习模型都已经开始采用并行GPU的运算模式,因此利用诸如NVIDIA推出的针对GPU优化的cuBLAScuDNN等更据针对性的库可能是更好的选择。

    运算速度对于深度学习框架来说至关重要,例如同样训练一个神经网络,不加速需要4天的时间,加速的话可能只要4小时。在快速发展的人工智能领域,特别是对那些成立不久的人工智能初创公司而言,这种差别可能就会决定谁是先驱者,而谁是追随者。




    展开全文
  • 常见深度学习框架比较

    万次阅读 2018-09-12 09:35:20
    常见的深度学习框架有 TensorFlow 、Caffe、Theano、Keras、PyTorch、MXNet等,如下图所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。下面将主要介绍...

    常见的深度学习框架有 TensorFlow 、Caffe、Theano、Keras、PyTorch、MXNet等,如下图所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。下面将主要介绍当前深度学习领域影响力比较大的几个框架,内容出自书籍《深度学习框架PyTorch:入门与实践》。
    这里写图片描述

    常见的深度学习框架

    Theano

    Theano最初诞生于蒙特利尔大学 LISA 实验室,于2008年开始开发,是第一个有较大影响力的Python深度学习框架。

    Theano 是一个 Python 库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。在解决包含大量数据的问题时,使用 Theano 编程可实现比手写 C 语言更快的速度,而通过 GPU 加速,Theano 甚至可以比基于 CPU 计算的 C 语言快上好几个数量级。Theano 结合了计算机代数系统(Computer Algebra System,CAS)和优化编译器,还可以为多种数学运算生成定制的 C 语言代码。对于包含重复计算的复杂数学表达式的任务而言,计算速度很重要,因此这种 CAS 和优化编译器的组合是很有用的。对需要将每一种不同的数学表达式都计算一遍的情况,Theano 可以最小化编译/解析的计算量,但仍然会给出如自动微分那样的符号特征。

    Theano诞生于研究机构,服务于研究人员,其设计具有较浓厚的学术气息,但在工程设计上有较大的缺陷。一直以来,Theano因难调试、构建图慢等缺点为人所诟病。为了加速深度学习研究,人们在它的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras等第三方框架,这些框架以Theano为基础,提供了更好的封装接口以方便用户使用。

    2017年9月28日,在Theano 1.0正式版即将发布前夕,LISA实验室负责人,深度学习三巨头之一的Yoshua Bengio 宣布Theano即将停止开发:“Theano is Dead”。尽管Theano即将退出历史舞台,但作为第一个Python深度学习框架,它很好地完成了自己的使命,为深度学习研究人员的早期拓荒提供了极大的帮助,同时也为之后深度学习框架的开发奠定了基本设计方向: 以计算图为框架的核心,采用GPU加速计算。

    2017年11月,LISA实验室在 GitHub 上开启了一个初学者入门项目,旨在帮助实验室新生快速掌握机器学习相关的实践基础,而该项目正是使用PyTorch作为教学框架。

    点评:由于Theano已经停止开发,不建议作为研究工具继续学习。

    TensorFlow

    2015年11月10日,Google宣布推出全新的机器学习开源工具TensorFlow。 TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。TensorFlow主要用于进行机器学习和深度神经网络研究, 但它是一个非常基础的系统,因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。

    TensorFlow在很大程度上可以看作Theano的后继者,不仅因为它们有很大一批共同的开发者,而且它们还拥有相近的设计理念,都是基于计算图实现自动微分系统。TensorFlow 使用数据流图进行数值计算,图中的节点代表数学运算, 而图中的边则代表在这些节点之间传递的多维数组(张量)。

    TensorFlow编程接口支持Python和C++。随着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 在GitHub代码仓库的总代码量超过100万行。这么大的代码仓库,对于项目维护者来说维护成为了一个难以完成的任务,而对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程,并且大多数时候这种尝试以放弃告终。
    • 频繁变动的接口。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。
    • 接口设计过于晦涩难懂。在设计TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说难以理解。同一个功能,TensorFlow提供了多种实现,这些实现良莠不齐,使用中还有细微的区别,很容易将用户带入坑中。
    • 文档混乱脱节。TensorFlow作为一个复杂的系统,文档和教程众多,但缺乏明显的条理和层次,虽然查找很方便,但用户却很难找到一个真正循序渐进的入门教程。
    由于直接使用TensorFlow的生产力过于低下,包括Google官方等众多开发者尝试基于TensorFlow构建一个更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等数不胜数的第三方框架每隔几个月就会在新闻中出现一次,但是又大多归于沉寂,至今TensorFlow仍没有一个统一易用的接口。

    凭借Google着强大的推广能力,TensorFlow已经成为当今最炙手可热的深度学习框架,但是由于自身的缺陷,TensorFlow离最初的设计目标还很遥远。另外,由于Google对TensorFlow略显严格的把控,目前各大公司都在开发自己的深度学习框架。

    点评:不完美但最流行的深度学习框架,社区强大,适合生产环境。

    Keras

    Keras是一个高层神经网络API,由纯Python编写而成并使用TensorFlow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够把想法迅速转换为结果。Keras应该是深度学习框架之中最容易上手的一个,它提供了一致而简洁的API, 能够极大地减少一般应用下用户的工作量,避免用户重复造轮子。

    严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。为了屏蔽后端的差异性,提供一致的用户接口,Keras做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序过于缓慢,许多BUG都隐藏于封装之中,在绝大多数场景下,Keras是本文介绍的所有框架中最慢的一个。

    学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。

    点评:入门最简单,但是不够灵活,使用受限。

    Caffe/Caffe2

    Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,核心语言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上运行,也可以在GPU上运行。

    Caffe的优点是简洁快速,缺点是缺少灵活性。不同于Keras因为太多的封装导致灵活性丧失,Caffe灵活性的缺失主要是因为它的设计。在Caffe中最主要的抽象对象是层,每实现一个新的层,必须要利用C++实现它的前向传播和反向传播代码,而如果想要新层运行在GPU上,还需要同时利用CUDA实现这一层的前向传播和反向传播。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难。

    Caffe凭借其易用性、简洁明了的源码、出众的性能和快速的原型设计获取了众多用户,曾经占据深度学习领域的半壁江山。但是在深度学习新时代到来之时,Caffe已经表现出明显的力不从心,诸多问题逐渐显现(包括灵活性缺失、扩展难、依赖众多环境难以配置、应用局限等)。尽管现在在GitHub上还能找到许多基于Caffe的项目,但是新的项目已经越来越少。

    Caffe的作者从加州大学伯克利分校毕业后加入了Google,参与过TensorFlow的开发,后来离开Google加入FAIR,担任工程主管,并开发了Caffe2。Caffe2是一个兼具表现力、速度和模块性的开源深度学习框架。它沿袭了大量的 Caffe 设计,可解决多年来在 Caffe 的使用和部署中发现的瓶颈问题。Caffe2的设计追求轻量级,在保有扩展性和高性能的同时,Caffe2 也强调了便携性。Caffe2 从一开始就以性能、扩展、移动端部署作为主要设计目标。Caffe2 的核心 C++ 库能提供速度和便携性,而其 Python 和 C++ API 使用户可以轻松地在 Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra 上进行原型设计、训练和部署。

    Caffe2继承了Caffe的优点,在速度上令人印象深刻。Facebook 人工智能实验室与应用机器学习团队合作,利用Caffe2大幅加速机器视觉任务的模型训练过程,仅需 1 小时就训练完ImageNet 这样超大规模的数据集。然而尽管已经发布半年多,开发一年多,Caffe2仍然是一个不太成熟的框架,官网至今没提供完整的文档,安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。

    极盛的时候,Caffe占据了计算机视觉研究领域的半壁江山,虽然如今Caffe已经很少用于学术界,但是仍有不少计算机视觉相关的论文使用Caffe。由于其稳定、出众的性能,不少公司还在使用Caffe部署模型。Caffe2尽管做了许多改进,但是还远没有达到替代Caffe的地步。

    点评:文档不够完善,但性能优异,几乎全平台支持(Caffe2),适合生产环境。

    MXNet

    MXNet是一个深度学习库,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等语言;支持命令和符号编程;可以运行在CPU、GPU、集群、服务器、台式机或者移动设备上。MXNet是CXXNet的下一代,CXXNet借鉴了Caffe的思想,但是在实现上更干净。在2014 年的NIPS 上,同为上海交大校友的陈天奇与李沐碰头,讨论到各自在做深度学习 Toolkits 的项目组,发现大家普遍在做很多重复性的工作,例如文件 loading 等。于是他们决定组建 DMLC【Distributied (Deep) Machine Learning Community】,号召大家一起合作开发 MXNet,发挥各自的特长,避免重复造轮子。

    MXNet以其超强的分布式支持,明显的内存、显存优化为人所称道。同样的模型,MXNet往往占用更小的内存和显存,并且在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。

    由于MXNet最初由一群学生开发,缺乏商业应用,极大地限制了MXNet的使用。2016年11月,MXNet被AWS正式选择为其云计算的官方深度学习平台。2017年1月,MXNet项目进入Apache基金会,成为Apache的孵化器项目。

    尽管MXNet拥有最多的接口,也获得了不少人的支持,但其始终处于一种不温不火的状态。个人认为这在很大程度上归结于推广不给力及接口文档不够完善。MXNet长期处于快速迭代的过程,其文档却长时间未更新,导致新手用户难以掌握MXNet,老用户常常需要查阅源码才能真正理解MXNet接口的用法。

    为了完善MXNet的生态圈,推广MXNet,MXNet先后推出了包括MinPy、Keras和Gluon等诸多接口,但前两个接口目前基本停止了开发,Gluon模仿PyTorch的接口设计,MXNet的作者李沐更是亲自上阵,在线讲授如何从零开始利用Gluon学习深度学习,诚意满满,吸引了许多新用户。

    点评:文档略混乱,但分布式性能强大,语言支持最多,适合AWS云平台使用。

    CNTK

    2015年8月,微软公司在CodePlex上宣布由微软研究院开发的计算网络工具集CNTK将开源。5个月后,2016年1月25日,微软公司在他们的GitHub仓库上正式开源了CNTK。早在2014年,在微软公司内部,黄学东博士和他的团队正在对计算机能够理解语音的能力进行改进,但当时使用的工具显然拖慢了他们的进度。于是,一组由志愿者组成的开发团队构想设计了他们自己的解决方案,最终诞生了CNTK。

    根据微软开发者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要强。CNTK支持CPU和GPU模式,和TensorFlow/Theano一样,它把神经网络描述成一个计算图的结构,叶子节点代表输入或者网络参数,其他节点代表计算步骤。CNTK 是一个非常强大的命令行系统,可以创建神经网络预测系统。CNTK 最初是出于在 Microsoft 内部使用的目的而开发的,一开始甚至没有Python接口,而是使用了一种几乎没什么人用的语言开发的,而且文档有些晦涩难懂,推广不是很给力,导致现在用户比较少。但就框架本身的质量而言,CNTK表现得比较均衡,没有明显的短板,并且在语音领域效果比较突出。

    点评:社区不够活跃,但是性能突出,擅长语音方面的相关研究。

    PyTorch

    2017年1月,Facebook人工智能研究院(FAIR)团队在GitHub上开源了PyTorch,并迅速占领GitHub热度榜榜首。

    PyTorch的历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,用的人不是很多。在2017年,Torch的幕后团队推出了PyTorch。PyTorch不是简单地封装Lua Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。

    • 简洁:PyTorch的设计追求最少的封装,尽量避免重复造轮子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的设计遵循tensor→variable(autograd)→nn.Module 三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),而且这三个抽象之间联系紧密,可以同时进行修改和操作。
    简洁的设计带来的另外一个好处就是代码易于理解。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。在笔者眼里,PyTorch的源码甚至比许多框架的文档更容易理解。

    • 速度:PyTorch的灵活性不以速度为代价,在许多评测中,PyTorch的速度表现胜过TensorFlow和Keras等框架 。框架的运行速度和程序员的编码水平有极大关系,但同样的算法,使用PyTorch实现的那个更有可能快过用其他框架实现的。

    • 易用:PyTorch是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法,即所思即所得,不需要考虑太多关于框架本身的束缚。

    • 活跃的社区:PyTorch提供了完整的文档,循序渐进的指南,作者亲自维护的论坛 供用户交流和求教问题。Facebook 人工智能研究院对PyTorch提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,不至于像许多由个人开发的框架那样昙花一现。

    其他框架

    除了上述的几个框架,还有不少的框架,都有一定的影响力和用户。比如百度开源的PaddlePaddle,CMU开发的DyNet,简洁无依赖符合C++11标准的tiny-dnn,使用Java开发并且文档极其优秀的Deeplearning4J,还有英特尔开源的Nervana,Amazon开源的DSSTNE。这些框架各有优缺点,但是大多流行度和关注度不够,或者局限于一定的领域。此外,还有许多专门针对移动设备开发的框架,如CoreML、MDL,这些框架纯粹为部署而诞生,不具有通用性,也不适合作为研究工具。

    展开全文
  • 先后就读于华中科技大学、中国科学院,先后就职于奇虎360AI研究院,陌陌深度学习实验室,6年计算机视觉从业经验,拥有丰富的传统图像算法和深度学习图像项目经验,著有畅销书《深度学习之图像识别:核心技术与案例...
  • 深度学习框架究竟是什么?

    万次阅读 多人点赞 2017-12-08 20:02:27
    1 引言一直在说深度学习框架,最近也在使用tensorflow进行了简单的实验,但是对其中关系的理解还是不够到位,他们里面究竟是怎样的一个运行机制呢?2 说明深度学习框架也就像Caffe、tensorflow这些是深度学习的工具...

    1 引言

    一直在说深度学习框架,最近也在使用tensorflow进行了简单的实验,但是对其中关系的理解还是不够到位,他们里面究竟是怎样的一个运行机制呢?

    2 说明

    深度学习框架也就像Caffe、tensorflow这些是深度学习的工具,简单来说就是库,编程时需要import caffe、import tensorflow。作一个简单的比喻,一套深度学习框架就是这个品牌的一套积木,各个组件就是某个模型或算法的一部分,你可以自己设计如何使用积木去堆砌符合你数据集的积木。好处是你不必重复造轮子,模型也就是积木,是给你的,你可以直接组装,但不同的组装方式,也就是不同的数据集则取决于你。

    3 应用优势

    深度学习框架的出现降低了入门的门槛,你不需要从复杂的神经网络开始编代码,你可以依据需要,使用已有的模型,模型的参数你自己训练得到,你也可以在已有模型的基础上增加自己的layer,或者是在顶端选择自己需要的分类器和优化算法(比如常用的梯度下降法)。当然也正因如此,没有什么框架是完美的,就像一套积木里可能没有你需要的那一种积木,所以不同的框架适用的领域不完全一致。 总的来说深度学习框架提供了一些列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户自己去定义,然后调用深度学习框架的函数接口使用用户自定义的新算法.

    4 关于组件

    大部分深度学习框架都包含以下五个核心组件:
    1. 张量(Tensor)
    2. 基于张量的各种操作
    3. 计算图(Computation Graph)
    4. 自动微分(Automatic Differentiation)工具
    5. BLAS、cuBLAS、cuDNN等拓展包

    下面对这五大核心组件做一个简要的解释

    4.1张量(Tensor)

    张量是所有深度学习框架中最核心的组件,因为后续的所有运算和优化算法都是基于张量进行的。几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。

    举例来说,我们可以将任意一张RGB彩色图片表示成一个三阶张量(三个维度分别是图片的高度、宽度和色彩数据)。如下图所示是一张普通的水果图片,按照RGB三原色表示,其可以拆分为三张红色、绿色和蓝色的灰度图片,如果将这种表示方法用张量的形式写出来,就是图中最下方的那张表格。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    图中只显示了前5行、320列的数据,每个方格代表一个像素点,其中的数据[1.0, 1.0, 1.0]即为颜色。假设用[1.0, 0, 0]表示红色,[0, 1.0, 0]表示绿色,[0, 0, 1.0]表示蓝色,那么如图所示,前面5行的数据则全是白色。

    将这一定义进行扩展,我们也可以用四阶张量表示一个包含多张图片的数据集,其中的四个维度分别是:图片在数据集中的编号,图片高度、宽度,以及色彩数据。

    将各种各样的数据抽象成张量表示,然后再输入神经网络模型进行后续处理是一种非常必要且高效的策略。因为如果没有这一步骤,我们就需要根据各种不同类型的数据组织形式定义各种不同类型的数据操作,这会浪费大量的开发者精力。更关键的是,当数据处理完成后,我们还可以方便地将张量再转换回想要的格式。例如Python NumPy包中numpy.imread和numpy.imsave两个方法,分别用来将图片转换成张量对象(即代码中的Tensor对象),和将张量再转换成图片保存起来。

    4.2 基于张量的各种操作

    有了张量对象之后,下面一步就是一系列针对这一对象的数学运算和处理过程。
    这里写图片描述
    其实,整个神经网络都可以简单视为为了达到某种目的,针对输入张量进行的一系列操作过程。而所谓的“学习”就是不断纠正神经网络的实际输出结果和预期结果之间误差的过程。这里的一系列操作包含的范围很宽,可以是简单的矩阵乘法,也可以是卷积、池化和LSTM等稍复杂的运算。而且各框架支持的张量操作通常也不尽相同,详细情况可以查看其官方文档(如下为NumPy、Theano和TensorFlow的说明文档)。

    NumPy:http://www.scipy-lectures.org/intro/numpy/operations.html

    Theano:http://deeplearning.net/software/theano/library/tensor/basic.html

    TensorFlow:https://www.tensorflow.org/api_docs/python/math_ops/

    需要指出的是,大部分的张量操作都是基于类实现的(而且是抽象类),而并不是函数(这一点可能要归功于大部分的深度学习框架都是用面向对象的编程语言实现的)。这种实现思路一方面允许开发者将各种类似的操作汇总在一起,方便组织管理。另一方面也保证了整个代码的复用性、扩展性和对外接口的统一。总体上让整个框架更灵活和易于扩展,为将来的发展预留了空间。

    4.3 计算图(Computation Graph)

    有了张量和基于张量的各种操作之后,下一步就是将各种操作整合起来,输出我们需要的结果。

    但不幸的是,随着操作种类和数量的增多,管理起来就变得十分困难,各操作之间的关系变得比较难以理清,有可能引发各种意想不到的问题,包括多个操作之间应该并行还是顺次执行,如何协同各种不同的底层设备,以及如何避免各种类型的冗余操作等等。这些问题有可能拉低整个深度学习网络的运行效率或者引入不必要的Bug,而计算图正是为解决这一问题产生的。

    计算图首次被引入人工智能领域是在2009年的论文《Learning Deep Architectures for AI》。当时的图片如下所示,作者用不同的占位符(*,+,sin)构成操作结点,以字母x、a、b构成变量结点,再以有向线段将这些结点连接起来,组成一个表征运算逻辑关系的清晰明了的“图”型数据结构,这就是最初的计算图。
    这里写图片描述
    后来随着技术的不断演进,加上脚本语言和低级语言各自不同的特点(概括地说,脚本语言建模方便但执行缓慢,低级语言则正好相反),因此业界逐渐形成了这样的一种开发框架:前端用Python等脚本语言建模,后端用C++等低级语言执行(这里低级是就应用层而言),以此综合了两者的优点。可以看到,这种开发框架大大降低了传统框架做跨设备计算时的代码耦合度,也避免了每次后端变动都需要修改前端的维护开销。而这里,在前端和后端之间起到关键耦合作用的就是计算图。

    将计算图作为前后端之间的中间表示(Intermediate Representations)可以带来良好的交互性,开发者可以将Tensor对象作为数据结构,函数/方法作为操作类型,将特定的操作类型应用于特定的数据结构,从而定义出类似MATLAB的强大建模语言。

    需要注意的是,通常情况下开发者不会将用于中间表示得到的计算图直接用于模型构造,因为这样的计算图通常包含了大量的冗余求解目标,也没有提取共享变量,因而通常都会经过依赖性剪枝、符号融合、内存共享等方法对计算图进行优化。

    目前,各个框架对于计算图的实现机制和侧重点各不相同。例如Theano和MXNet都是以隐式处理的方式在编译中由表达式向计算图过渡。而Caffe则比较直接,可以创建一个Graph对象,然后以类似Graph.Operator(xxx)的方式显示调用。

    因为计算图的引入,开发者得以从宏观上俯瞰整个神经网络的内部结构,就好像编译器可以从整个代码的角度决定如何分配寄存器那样,计算图也可以从宏观上决定代码运行时的GPU内存分配,以及分布式环境中不同底层设备间的相互协作方式。除此之外,现在也有许多深度学习框架将计算图应用于模型调试,可以实时输出当前某一操作类型的文本描述。

    4.4 自动微分(Automatic Differentiation)工具

    计算图带来的另一个好处是让模型训练阶段的梯度计算变得模块化且更为便捷,也就是自动微分法。

    正如前面提到的,因为我们可以将神经网络视为由许多非线性过程组成的一个复杂的函数体,而计算图则以模块化的方式完整表征了这一函数体的内部逻辑关系,因此微分这一复杂函数体,即求取模型梯度的方法就变成了在计算图中简单地从输入到输出进行一次完整遍历的过程。与自动微分对应,业内更传统的做法是符号微分。

    符号微分即常见的求导分析。针对一些非线性过程(如修正线性单元ReLU)或者大规模的问题,使用符号微分法的成本往往非常高昂,有时甚至不可行(即不可微)。因此,以上述迭代式的自动微分法求解模型梯度已经被广泛采用。并且由于自动微分可以成功应对一些符号微分不适用的场景,目前许多计算图程序包(例如Computation Graph Toolkit)都已经预先实现了自动微分。

    另外,由于每个节点处的导数只能相对于其相邻节点计算,因此实现了自动微分的模块一般都可以直接加入任意的操作类中,当然也可以被上层的微分大模块直接调用。

    4.5 BLAS、cuBLAS、cuDNN等拓展包

    现在,通过上述所有模块,我们已经可以搭建一个全功能的深度学习框架:将待处理数据转换为张量,针对张量施加各种需要的操作,通过自动微分对模型展开训练,然后得到输出结果开始测试。这时还缺什么呢?答案是运算效率。

    由于此前的大部分实现都是基于高级语言的(如Java、Python、Lua等),而即使是执行最简单的操作,高级语言也会比低级语言消耗更多的CPU周期,更何况是结构复杂的深度神经网络,因此运算缓慢就成了高级语言的一个天然的缺陷。

    目前针对这一问题有两种解决方案。

    第一种方法是模拟传统的编译器。就好像传统编译器会把高级语言编译成特定平台的汇编语言实现高效运行一样,这种方法将高级语言转换为C语言,然后在C语言基础上编译、执行。为了实现这种转换,每一种张量操作的实现代码都会预先加入C语言的转换部分,然后由编译器在编译阶段将这些由C语言实现的张量操作综合在一起。目前pyCUDA和Cython等编译器都已经实现了这一功能。

    第二种方法就是前文提到的,利用脚本语言实现前端建模,用低级语言如C++实现后端运行,这意味着高级语言和低级语言之间的交互都发生在框架内部,因此每次的后端变动都不需要修改前端,也不需要完整编译(只需要通过修改编译参数进行部分编译),因此整体速度也就更快。

    除此之外,由于低级语言的最优化编程难度很高,而且大部分的基础操作其实也都有公开的最优解决方案,因此另一个显著的加速手段就是利用现成的扩展包。例如最初用Fortran实现的BLAS(基础线性代数子程序),就是一个非常优秀的基本矩阵(张量)运算库,此外还有英特尔的MKL(Math Kernel Library)等,开发者可以根据个人喜好灵活选择。
    这里写图片描述
    值得一提的是,一般的BLAS库只是针对普通的CPU场景进行了优化,但目前大部分的深度学习模型都已经开始采用并行GPU的运算模式,因此利用诸如NVIDIA推出的针对GPU优化的cuBLAScuDNN等更据针对性的库可能是更好的选择。

    运算速度对于深度学习框架来说至关重要,例如同样训练一个神经网络,不加速需要4天的时间,加速的话可能只要4小时。在快速发展的人工智能领域,特别是对那些成立不久的人工智能初创公司而言,这种差别可能就会决定谁是先驱者,而谁是追随者。

    展开全文
  • 主流深度学习框架对比(转)

    千次阅读 2018-07-11 15:54:49
    原文地址:https://blog.csdn.net/zuochao_2013/article/details/56024172深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、...
  • 2017深度学习最新报告及8大主流深度学习框架超详细对比(内含PPT)
  • 目录Caffe设计结构Caffe的训练第一步 数据的准备第二步 编写网络文件第三步 定义solver文件第四步 训练主要特点优缺点Tensorflow代码示例优缺点TorchLua语言网络模型的主体结构主要特点优缺点MxNet总结 ...
  • 深度学习框架概述

    千次阅读 2018-07-22 23:50:59
    深度学习框架概述 1、引言 1.1 应用领域 1.2 图片识别框架 1.3 神经网络(neural network) 1.3.1 神经元(neuron) 1.3.2 神经网络 1.3.3 全连接前馈神经网络(full connect feedforward network) 1.3.4 应用...
  • 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括TensorFlow,Keras,MXNet,PyTorch,CNTK,Theano,Caffe,DeepLearning4,Lasagne,Neon,等等。Google,Microsoft等商业巨头...
  • 作者:来自读者投稿来源:Python数据之道深度学习中几种常用框架的介绍深度学习在今天之所以能够非常普及,很重要的一个原因是由于学术界和工业界贡献的各种各样的开源软件,这些开源的软件中集...
  • 亲自动手写一个深度学习框架

    千人学习 2019-12-31 13:08:11
    本课程带领大家亲自动手写一个更方便大家使用的深度学习框架,帮助大家理解常用技术的底层实现。具体安排如下: 1.板书完成数学推导,同时画图讲解; 2.基础:Python实现多层感知器; 3.进阶:C++实现深度学习...
  • [深度学习]如何选择深度学习框架

    千次阅读 2019-04-03 20:47:53
    不管是前端技术框架还是后端技术框架以及在深度学习技术框架,我们在决定使用前,都需要考虑以下几个方面,也就是我们在选型上通用的依据,这里以深度学习框架选型举例子: 1) 性能方面 性能方面一部分主要由实现...
  • 深度学习框架

    千次阅读 2018-07-19 09:54:11
    1、深度学习框架图: (参考网址https://blog.csdn.net/u010164190/article/details/72633245) 2、神经网络要解决的问题 2.1、基于网络功能函数的定义(网络模型的选择,激励函数的选择,优化方法的选择)--&...
  • 一、深度学习框架概述与深度学习技术的四大阵营 人工智能从学术理论研究到生产应用的产品化开发过程中通常会涉及到多个不同的步骤和工具,这使得人工智能开发依赖的环境安装、部署、测试以及不断迭代改进准确性和...
  • 最近华为开源了深度学习框架MindSpore,一时成为了热点。我之前也点评了很多微软、Google、腾讯等厂商的框架,有些点评文章还被官方社区收录,今天为大家解析下MindSpore。 首先阐明下我个人的观点,华为开源深度...
  • 常用深度学习框架简介

    千次阅读 2017-11-06 22:30:04
    需要用到深度学习相关的知识,自然是选择一款适合自己的深度学习框架是再好不过的。现在将最受欢迎的几款深度学习框架简介列在下面以备后续参考:1. TensorFlow(star: 75993) TensorFlow是一个使用数据流图进行...
  • 2017 深度学习框架发展回顾

    千次阅读 2017-12-27 10:45:14
    Theano是第一个被广泛采用的深度学习框架,由Yoshua Bengio领导的MILA创建和维护。但情况已经发生改变。今年9月,MILA宣布,在发布Theano的最新版本后,2018年将终止Theano的开发和维护。这个消息并不令人感到意外。...
  • 各大公司开源了自己的移动端深度学习框架,其中包括TensorFlow Lite、Caffe2、MACE、paddle-mobile(MDL)、FeatherCNN、NCNN等。我们参考开源的测试结果,结合自己整理的数据,针对主流的异动单深度学习框架进行简单...
  • 深度学习和深度学习框架CNTK入门(一) 深度学习介绍 是基于机器学习延伸出来的一个新的领域,由以人大脑结构为启发的神经网络算法为起源加之模型结构深度的增加发展,并伴随大数据和计算能力的提高而产生的一...
1 2 3 4 5 ... 20
收藏数 145,339
精华内容 58,135
关键字:

深度学习框架