【TensorFlow实战——笔记】第2章:TensorFlow和其他深度学习框架的对比

2.1 主流深度学习框架对比

各个开源框架在Github上的数据统计

数据统计截止于2017.07.15

可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自R、Julia等语言的竞争压力,但是Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接,爬虫等无所不能,有一个完美的生态环境。仅在数据挖掘工具链上,Python就有Numpy、SciPy、Pandas、Scikit-learn、XGBoost等组件,做数据采集和预处理都非常方便,并且之后的模型训练阶段可以和TensorFlow等基于Python的深度学习框架完美衔接。

主流深度学习框架在各个维度的评分

各基础深度学习框架在AlexNet上的性能对比

数据来源于:

https://github.com/soumith/convnet-benchmarks

AlexNet (One Weird Trick paper) - Input 128x3x224x224

2.2 各深度学习框架简介

== TensorFlow ==

Github源码地址:

https://github.com/tensorflow/tensorflow

TensorFlow是由核心代码C++编写,提供的接口除了C++外,还有官方的Python、Go、Java接口,是通过SWIG(Simplified Wrapper and Interface Generator)实现的,这样用户就可以在硬件配置较好的机器中用Python进行实验,并在资源比较紧张的嵌入式环境或需要低延时的环境中使用C++部署模型

非官方接口地址如下:

Julia: https://github.com/malmaud/TensorFlow.jl
Node.js https://github.com/node-tensorflow/node-tensorflow
R: https://github.com/rstudio/tensorflow

TensorFlow内置TF.Learn和TF.Slim等上层组件可以帮助快速设计新网络,并兼任Scikit-learn estimator接口,方便实现evaluate、grid search、cross validation等功能。不局限于神经网络,数据流式图可以轻松实现深度学习以外的机器学习算法。

在数据并行模式上,类似Parameter Server,但是TensorFlow有自己独立的Variable node,不像其他框架有一个全局的参数服务器,因此参数同步更自由。和Spark一样都是数据计算的流式图。

灵活的移植性,同份代码基本不需修改就可以轻松部署到任意数据CPU、GPU的PC、服务器或移动设备上。编译速度快。有强大的可视化组件TensorBoard。

TensorFlow除了支持常见的网络结构卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurent Neural Network, RNN)外,还支持深度强化学习乃至其他计算密集的科学计算(如偏微分方程求解等)。

TensorFlow的用户可将训练好的模型方便地部署到多种硬件、操作系统平台上,支持Intel和AMD的CPU,通过CUDA支持NVIDIA的GPU,通过OpenCL支持AMD的GPU,支持Linux、Mac和Windows。在CPU上的矩阵运算库使用了Eigen而不是BLAS库,能够基于ARM架构编程和优化,因此在移动设备上表现得很好。

目前在单GPU条件下,绝大多数深度学习框架都依赖于cuDNN。对于大规模深度学习来说,巨大的数据量使得单机很难在有限时间完成训练。这时需要使用GPU集群乃至TPU集群并行运算。目前TensorFlow分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,分布式性能可能还没达到最优。

TensorFlow Serving

Google在2016年2月开源了TensorFlow Serving,这个组件可以将TensorFlow训练好的模型导出,并部署成可以对外提供预测服务的RESTful接口。内部开发人员描述:“TensorFlow Serving是一个为生产环境而设计的高性能的机器学习服务系统。它可以同时运行多个大规模深度学习模型,支持模型生命周期管理、算法实验,并可以高效地利用GPU资源,让TensorFlow训练好的模型更快捷方便地投入到实际生产环境”。

TensorBoard

TensorBoard是TensorFlow的一组Web应用。支持5种可视化:

  • 标量(scalars)
  • 图片(images)
  • 音频(audio)
  • 直方图(histograms)
  • 计算图(Computation Graph)

== Caffe ==

Github源码地址:

https://github.com/BVLC/caffe

Caffe全称为Convolutional Architecture for Fast Feature Embedding,在TensorFlow出现前,一直是最火的深度学习框架。其优势如下:

  • 容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络
  • 训练速度快,能够训练state-of-the-art的模型与大规模的数据
  • 组件模块化,可以方便拓展新的模型和学习任务

Caffe的核心概念是Layer,每一个神经网络的模块都是一个Layer。每一个Layer需要定义两种运算,一种是正向(forward)的运算,即从输入数据计算输出结果,也就是模型的预测过程;另一种是反向(backward)的运算,从输出端的gradient求解相对于输入的gradient,即相反传播算法,这部分就是模型的训练过程。

Caffe最开始设计时的目标只是针对于图像,没有考虑文本、语音或时间序列的数据。所以Caffe对卷积神经网络支持非常好,但对于时间序列RNN
、LSTM等支持的不是特别充分。同时,基于Layer的模式也对RNN不是非常友好,定义RNN结构时比较麻烦。

Caffe一大优势是拥有大量训练好的经典模型(AlexNet、VGG、Inception)乃至其他的state-of-the-art(ResNet等)。因为Caffe的底层基于C++,因此可以在各种硬件环境编译并具有良好的移植性,支持Linux、Mac和Windows系统,也可以编译部署到移动设备。

== Theano ==

Github源码地址:

https://github.com/Theano/Theano

Theano诞生于2008年,因为出现早,可算是这类库的始祖之一,也一度被认为是深度学习研究和应用的重要标准之一。Theano的核心是一个数学表达式的编译器,专门为处理大规模神经网络训练的计算而设计。其优势如下:

  • 集成NumPy,可以直接用NumPy的ndarray,API接口学习成本低
  • 计算稳定性好,比如可以精确地计算输出值很小的函数(像log(1+x))
  • 动态地生成C或者CUDA代码,用以编译成高效的机器代码

Theano更多地被当做一个研究工具,而不是当作产品来使用。虽然支持Linux、Mac和Windows,但是没有底层C++的接口,因此模型部署非常不方便。

== Torch7 ==

Github源码地址:

https://github.com/torch/torch7

Torch给自己的定位是LuaJIT上的一个高效的科学计算库,支持大量的机器学习算法,同时以GPU上的计算优先。Torch的目标是让设计科学计算算法变得便捷,它包含了大量的机器学习、计算机视觉、信号处理、并行运算、图像、视频、音频、网络处理的库,同时和Caffe类似,Torch拥有大量训练好的深度学习模型。

它和TensorFlow一样使用了底层C++加上层脚本语言调用的方式,只不过Torch使用的是Lua。Lua支持Linux和Mac,还支持各种嵌入式系统(iOS、Android、FPGA等),只不过运行时还是必须有LuaJIT的环境,所以工业生产环境的使用相对较少。

Torch提供的各种数据处理的库

== Lasagne ==

Github源码地址:

https://github.com/Lasagne/Lasagne

Lasagne是一个基于Theano的轻量级的神经网络库。它支持前馈神经网络,比如卷积网络、循环神经网络、LSTM等,以及它们的组合;支持许多优化方法,比如Nesterovmomentum、RMSprop、ADAM等;它是Theano的上层封装,但又不像Keras那样进行了重度的封装,Keras隐藏了Theano中所有的方法和对象,而Lasagne则是借用了Theano中很多的类,算是介于基础的Theano和高度抽象的Keras之间的轻度封装。

== Keras ==

Github源码地址:

https://github.com/fchollet/keras

Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,并可以同时运行在TensorFlow和Theano上。Keras专精于深度学习。它提供了目前为止最方便的API,用户只需要将高级的模块拼在一起,就可以设计神经网络,它大大降低了编程开销(code overhead)和阅读别人代码的理解开销(cognitive overhead)。

Keras最大的问题可能是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。

== MXNet ==

Github源码地址:

https://github.com/dmlc/mxnet

MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量的、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。MXNet的很多作者都是中国人,其最大的贡献组织为百度。它是各个框架中率先支持多GPU和分布式的,同时其分布式性能也非常高。

MXNet的核心是一个动态的以来调度器,支持自动将计算任务并行化到多个GPU或分布式集群。一个很大的优点就是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和Javascript等。

== DIGITS ==

Github源码地址:

https://github.com/NVIDIA/DIGITS

DIGITS(Deep Learning GPU Training System)不是一个标准的深度学习库,它可以算是一个Caffe的高级封装(或者Caffe的Web版培训系统)。因为封装得非常重,以至于你不需要(也不能)在DIGITS中写代码,即可实现一个深度学习的图片识别模型。

DIGITS把所有操作都简化在浏览器中执行,可以算是Caffe在图片分类上的一个漂亮的用户可视化界面(GUI),计算机视觉的研究者或者工程师可以方便的设计深度学习模型、测试准确率,以及调试各种超参数。同时使用它也可以生成数据和训练结果的可视化统计报表,甚至是网络的可视化结构图。

== CNTK ==

Github源码地址:

https://github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微软研究院(MSR)开源的深度学习框架。目前在语言识别领域的使用尤为广泛。CNTK通过一个有向图将神经网络描述为一系列的运算操作,这个有向图中子节点代表输入或网络参数,其他节点代表各种矩阵运算。

CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。拥有产品级的代码质量,支持多机、多GPU的分布式训练。

CNTK通过写配置文件的方式定义网络结构,还支持Python、C++和C#语言绑定,这样用户就可以用编程的方式设计网络结构。

CNTK原生支持多GPU和分布式,从官网公布的对比测试来看,性能非常不错。在GPU方面,CNTK相对于其他深度学习库表现得更突出,它实现了1-bit SGD和自适应的mini-batching。CNTK是唯一支持单机8块GPU的框架,并且在分布式系统中可以超越8块GPU的性能。

== Deeplearning4J ==

Github源码地址:

https://github.com/deeplearning4j/deeplearning4j

Deeplearning4J(简称DL4J)是一个基于Java和Scala的开源的分布式深度学习库。其核心目标是创建一个即插即用的解决方案原型。可以方便的与Hadoop及Spark自动整合,同时可以方便地在现有集群(包括但不限于AWS,Azure等)上进行扩展。此外,DL4J还有商业版的支持。

== Chainer ==

Github源码地址:

https://github.com/chainer/chainer

Chainer是由日本公司Preferred Networks于2015年6月发布的深度学习框架。特征描述如下:

  • Powerful:支持CUDA计算,只需要几行代码就可以使用GPU加速,同时只需少改动就可以运行在多GPU上
  • Flexible:支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)
  • Intuitive:前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度

== Leaf ==

Github源码地址:

https://github.com/autumnai/leaf

Leaf是一个基于Rust语言的直观的跨平台的深度学习乃至机器智能框架,它拥有一个清晰的架构,除了同属Autumu AI的底层计算库Collenchyma,Leaf没有其他依赖库。可移植性非常好,可以运行在CPU、GPU和FPGA等设备上,可以支持任何操作系统的PC、服务器,甚至是没有操作系统的嵌入式设备,并且同时支持OpenCL和CUDA。

== DSSTNE ==

Github源码地址:

https://github.com/amzn/amazon-dsstne

DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亚马逊开源的稀疏神经网络框架,在训练非常稀疏的数据时具有很大的优势。目前只支持全连接的神经网络,不支持卷积网络等。和Caffe类似,它也是通过写一个JSON类型的文件定义模型结构,但是支持非常大的Layer(输入和输出节点都非常多)。

推荐阅读更多精彩内容

  • 本节对5个开源深度学习框架进行对比研究,主要侧重于3个维度研究:硬件支持率、速度和准确率、社区活跃性。他们分别是:...
    Carlos_清流阅读 2,191评论 1 5
  • 31纳什均衡应用举例 案例一,库诺特(Cournot)寡头竞争模型。 这个模型可以说是纳什均衡最早的版本,它比纳什...
    北斗之光阅读 4,576评论 4 68
  • 她说 我害怕独自去流浪 他说 我陪你去远方 她说 我还是会恐慌 他说 我留给你左半边肩膀 她说 我们在一起就是天堂...
    初初遇见阅读 52评论 0 0
  • 可怕的并不是贫穷,甚至不是没有意识到贫穷,而是那股酸气和不努力。 1. 如果生在一个家境不太好,或者,日子过得捉襟...
    洛柠阅读 319评论 0 3
  • 幼儿膳食的基本要求: 1.幼儿膳食应包括五类食物,营养齐全、搭配合理。膳食蛋白质、脂肪、碳水化合物的重量比接近 1...
    罗文乐阅读 52评论 0 0