Tensorflow 与Caffe(转)

TensorFlowhtml

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 的接口支持,地址以下。node

Julia: http://github.com/malmaud/TensorFlow.jlgit

Node.js: http://github.com/node-tensorflow/node-tensorflowgithub

R: http://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)上表现得很好。app

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 的性能评测。

TensorFlow和Caffe、MXNet、Keras等其余深度学习框架的对比

表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 成为行业标准作出巨大贡献。

TensorFlow和Caffe、MXNet、Keras等其余深度学习框架的对比

图2-2 TensorFlow Serving 架构

TensorBoard 是 TensorFlow 的一组 Web 应用,用来监控 TensorFlow 运行过程,或可视化 Computation Graph。TensorBoard 目前支持五种可视化:标量(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 所示。

TensorFlow和Caffe、MXNet、Keras等其余深度学习框架的对比

图2-3 TensorBoard 的 loss 标量的可视化

TensorFlow和Caffe、MXNet、Keras等其余深度学习框架的对比

图2-4 TensorBoard 的模型结构可视化

TensorFlow 拥有产品级的高质量代码,有 Google 强大的开发、维护能力的加持,总体架构设计也很是优秀。相比于一样基于 Python 的老牌对手 Theano,TensorFlow 更成熟、更完善,同时 Theano 的不少主要开发者都去了 Google 开发 TensorFlow(例如书籍 Deep Learning 的做者 Ian Goodfellow,他后来去了 OpenAI)。Google 做为巨头公司有比高校或者我的开发者多得多的资源投入到 TensorFlow 的研发,能够预见,TensorFlow 将来的发展将会是飞速的,可能会把大学或者我的维护的深度学习框架远远甩在身后。

Caffe

官方网址:http://caffe.berkeleyvision.org/

GitHub:http://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 (http://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 的大规模分布式训练。

相关文章
相关标签/搜索