写点什么

解读 2016 之深度学习篇:开源深度学习框架发展展望

2016 年 12 月 26 日

引言

深度学习(Deep Learning)的概念由加拿大多伦多大学教授 Geoffrey Hinton 等人于 2006 年提出,它本质上是一种神经网络算法,其原理是通过模拟人脑进行分析学习,算法训练时可以不用人工干预,因此它也属于一种无监督式机器学习算法。从深度学习的概念提出到今天,已历经十年时间,在这十年当中,无论是国际互联网巨头 Google、微软、百度,还是全世界各大学术研究机构,都投入了巨大的人力、财力用于理论和工业级应用的探索,并在字符识别(OCR)、图像分类、语音识别、无人自动驾驭、自然语言处理等众多领域内取得了突破性的进展,极大地推动了人工智能(AI)的发展。

图 1. 深度学习的典型应用场景示例

2012 年斯坦福大学的 Andrew Ng 和 Jeff Dean 教授共同主导的 Google Brain 项目通过使用深度学习让系统能够自动学习并识别猫,这项目研究引起了学术界和工业界极大的轰动,激起了全世界范围研究深度学习的热潮,《纽约时报》披露了 Google Brain 项目,让普通大众对深度学习有了最初的认知。2016 年 3 月,Google 旗下 DeepMind 公司开发的 AlphaGo 以 4:1 的总比分战胜了世界围棋冠军、职业九段选手李世石,这让人们对人工智能(AI)的认知跨越到一个新的阶段。

深度学习在众多领域的成功应用,离不开学术界及工业界对该技术的开放态度,在深度学习发展初始,相关代码就被开源,使得深度学习“飞入寻常百姓家”,大大降低了学术界研究及工业界使用的门槛。本文并不打算对深度学习算法的发展趋势进行分析,而是跳出算法层面,对当前主流的开源深度学习框架的发展趋势进行分析。

开源深度学习框架

在计算机视觉领域内,神经网络算法一直被用来解决图像分类识别等问题,学术界采用的算法研究工具通常是 Matlab、Python,有很多深度学习工具包都是基于 Matlab 、Python 语言,在使用海量图像训练深度学习算法模型时,由于单台机器 CPU 的计算能力非常有限,通常会使用专门的图形处理器(Graphics Processing Unit,GPU)来提高算法模型速度。但在工业级应用当中,由于 Matlab、Python、R 语言的性能问题,大部分算法都会使用 C++ 语言实现,而且随着深度学习在自然语言处理、语音识别等领域的广泛应用,专用的 GPU 也慢慢演变为通用图像处理器(General Purpose GPU,GPGPU),处理器不仅仅被用于渲染处理图像,还可以用于需要处理大数据量的科学计算的场景,这种提高单台机器的处理能力的方式属于纵向扩展(Scale Up)。

随着大数据时代的来临,大数据处理技术的日趋成熟为解决深度学习模型训练耗时问题提供了重要发展方向,因此如何通过大数据训练深度学习模型在当前引起了广泛关注,大量的研究表明:增加训练样本数或模型参数的数量,或同时增加训练样本数和模型参数的数量,都能够极大地提升最终分类的准确性。由于Hadoop 已经成为构建企业级大数据基础设施的事实标准,有许多的分布式深度学习算法框架被构建在Hadoop 生态体系内,这种通过分布式集群提高处理能力的扩展方式被称为横向扩展(Scale Out)。

虽然利用Spark 等平台训练深度学习算法可以极大地提高训练速度,但近年来,存储设备和网络在性能方面的提升远超CPU ,如图2 所示。

图2. 存储系统、网络及CPU 的性能变化比较

CPU 性能瓶颈极大地限制了分布式环境下,单台节点的处理速度。为解决这一问题,许多优秀的开源深度学习框架都在尝试将开源大数据处理技术框架如 Spark 和 GPGPU 结合起来,通过提高集群中每台机器的处理性能来加速深度学习算法模型的训练,图 3 给出的是 SparkNet 的架构原理图。这种通过结合横向扩展及纵向扩展提高处理能力的方式被称为融合扩展。图 4 对深度学习提升性能的方式进行了总结,图中分别给出了横向扩展、纵向扩展及融合扩展的典型开源深度学习框架。

图 3.SparkNet 中的 Scale Up 和 Scale Out

图 4. 深度学习提升性能的方式

下面将对目前一些优秀的开源深度学习框架进行介绍,包括基于 GPU 的单机开源深度学习框架和融合了 GPU 的开源分布式深度学习框架。让大家熟悉目前开源深度学习主流框架的同时,又能够进一步窥探开源分布式深度学习框架的发展方向。

单机开源深度学习框架

目前拥有众多的学术机构如国际顶级名校加州大学伯克利分校,以及互联网巨头如 Google、微软等开源的深度学习工具,比较成熟的基于 GPU 的单机开源深度学习框架有:

  1. Theano :深度学习开源工具的鼻祖,由蒙特利尔理工学院时间开发于 2008 年并将其开源,框架使用 Python 语言开发。有许多在学术界和工业界有影响力的深度学习框架都构建在 Theano 之上,并逐步形成了自身的生态系统,这其中就包含了著名的 Keras Lasagne Blocks
  2. Torch :Facebook 和 Twitter 主推的一款开源深度学习框架,Google 和多个大学研究机构也在使用 Torch。出于性能的考虑,Torch 使用一种比较小众的语言(Lua)作为其开发语言,目前在音频、图像及视频处理方面有着大量的应用。大名鼎鼎的 Alpha Go 便是基于 Torch 开发的,只不过在 Google 开源 TensorFlow 之后,Alpha Go 将迁移到 TensorFlow 上。
  3. TensorFlow :Google 开源的一款深度学习工具,使用 C++ 语言开发,上层提供 Python API。在开源之后,在工业界和学术界引起了极大的震动,因为 TensorFlow 曾经是著名的 Google Brain 计划中的一部分,Google Brain 项目的成功曾经吸引了众多科学家和研究人员往深度学习这个“坑”里面跳,这也是当今深度学习如此繁荣的重要原因,足见 TensorFlow 的影响力。TensorFlow 一直在往分布式方向发展,特别是往 Spark 平台上迁移,这点在后面会有介绍。
  4. Caffe Caffe 是加州大学伯克利分校视觉与学习中心(Berkeley Vision and Learning Center ,BVLC) 贡献出来的一套深度学习工具,使用 C/C++ 开发,上层提供 Python API。Caffe 同样也在走分布式路线,例如著名的 Caffe On Spark 项目。
  5. CNTK: CNTK (Computational Network Toolkit)是微软开源的深度学习工具,现已经更名为 Microsoft Cognitive Toolkit,同样也使用 C++ 语言开发并提供 Python API。目前在计算视觉、金融领域及自然处理领域已经被广泛使用。

DeepLearning4J 官网有篇文章《DL4J vs. Torch vs. Theano vs. Caffe vs. TensorFlow》,对这些主流的深度学习框架的优劣势进行了详细的分析比较,感兴趣的读者可以点击查看。

分布式开源深度学习框架

Google 研究员 Jeffy Dean 在 2012 发表了一篇《Large Scale Distributed Deep Networks》对分布式环境下的深度学习算法设计原理进行了阐述,给出了深度学习在分布式环境下的两种不同的实现思路:模型并行化(Model parallelism)和数据并行化(Model Parallelism)。模型并行化将训练的模型分割并发送到各 Worker 节点上;数据并行化将数据进行切分,然后将模型复本发送到各 Worker 节点,通过参数服务器(Parameter Server)对训练的参数进行更新。具体原理如图 5 所示。

图 5. 深度学习并行化的两种方式:模型并行化(左)和数据并行化(右)

目前开源分布式深度学习框架大多数采用的是数据并行化的方式进行设计。目前有两大类:框架自身具备分布式模型训练能力;构建在 Hadoop 生态体系内,通过分布式文件系统(HDFS)、资源调度系统 (Yarn) 及 Spark 计算平台进行深度学习模型训练。其中框架自身具备分布式模型训练能力的开源深度学习框架有:

  1. DSSTNE :亚马逊开源的一套深度学习工具,英文全名为 Deep Scalable Sparse Tensor Network Engine(DSSTNE),由 C++ 语言实现,解决稀疏数据场景下的深度学习问题。值得一提的是,亚马逊在是否走开源的道路上一直扭扭捏捏,开源 DSSTNE,似乎也是在 Google、Facebook 等巨头抢占开源深度学习领域高地之后的无奈之举。
  2. Paddle :百度开源的并行分布式深度学习框架(PArallel Distributed Deep Learning,PADDLE),由 C++ 语言实现并提供 Python API。Paddle 框架已经经过百度内部多个产品线检验,包括搜索广告中的点击率预估(CTR)、图像分类、光学字符识别(OCR)、搜索排序、计算机病毒检测等。

由于 Hadoop 生态体系已经占据了企业级大数据市场的大部分份额,因此目前许多开源分布式都在往 Hadoop 生态体系迁移,这其中有 Caffe、TensorFlow,也有百度的 Paddle 。构建在 Hadoop/Spark 生态体系下的深度学习框架实现原理图如下:

图 6 .Hadoop 生态体系分布式深度学习算法实现原理

目前比较有影响力的基于 Hadoop/Spark 的开源分布式深度学习框架有:

  1. SparkNet :由 AMPLab 于 2015 年开源,底层封装 Caffe 和 Tensorflow,采用集中式的参数服务器进行实现,具体实现原理及架构参见论文《SPARKNET: TRAINING DEEP NETWORKS IN SPARK》
  2. Deeplearning4J :由 Skymind 公司于 2014 年开发并开源的分布式深度学习项目,采用 Java 语言实现,同时也支持 Scala 语言。它使用的参数服务器模式为 IterativeReduce
  3. Caffe On Spark :Yahoo 于 2015 年开源的分布式深度学习框架,采用 Java 语言和 Scala 语言混合实现,使用 Spark+MPI 架构以保障性能,其参数服务器采用点对点(Peer-to-Peer)的实现方式。通过将 Caffe 纳入到 Hadoop/Spark 生态系统,解决大规模分布式环境下的深度学习问题,意图将 Caffe On Spark 成为继 Spark SQL、Spark ML/MLlib、Spark Graphx 及 Spark Streaming 之后的第五个组件。
  4. Tensorflow on Spark :2014 年由 Arimo 公司创建,将 TensorFlow 移植到 Spark 平台之上。
  5. TensorFrames (TensorFlow on Spark Dataframes) :Databricks 开源的分布式深度学习框架,目的是将 Google TensorFlow 移植到 Spark 的 DataFrames,使用 DataFrame 的优良特性,未来可能会结合 Spark 的 Structure Streaming 对深度学习模型进行实时训练。
  6. Inferno :由墨尔本 La Trobe 大学博士生 Matthias Langer 开发的基于 Spark 平台的深度学习框架,作者正在整理发表关于 Inferno 的实现原理论文,同时也承诺在论文发表后会将代码开源到 GitHub 上。
  7. DeepDist :由 Facebook 的资深数据科学家 Dirk Neumann 博士开源的一套基于 Spark 平台的深度学习框架,用于加速深度信念网络(Deep Belief Networks)模型的训练,其实现方式可以看作是论文《Large Scale Distributed Deep Networks》中 Downpour 随机梯度下降(Stochastic Gradient Descent,SGD)算法的开源实现。
  8. Angel :腾讯计划于 2017 年开源的分布式机器学习计算平台,Angel 可以支持 Caffe、TensorFlow 和 Torch 等开源分布式学习框架,为各框架提供计算加速。Angel 属于腾讯第三代机器学习计算平台,第一代基于 Hadoop,只支持离线计算场景,第二代基于 Spark/Storm,使用自主研发的 Gala 调度平台替换 YARN,能够同时支持在线分析和实时计算场景,第三代属于腾讯自研的平台,除底层文件系统使用 HDFS 外,资源调度和计算引擎全部为腾讯自研产品。

SparkNet Deeplearning4J Caffe On Spark 等构建在 Spark 平台上的深度学习框架在性能、易用性、功能等方面的详细比较,参见《Which Is Deeper Comparison of Deep Learning Frameworks Atop Spark》《inferno-scalable-deep-learning-on-spark》。由于近几年在大数据技术的日趋成熟和流行,特别是基于 JVM 的语言(主要是 Java 和 Scala)构建的大数据处理框架如 Hadoop、Spark、Kafka 及 Hive 等几乎引领着大数据技术的发展方向,相信以后将会有越来越多的开源深度学习框架构建在 Hadoop 生态体系内,并且基于 Java 或 Scala 语言实现。

总结与展望

本文首先介绍了深度学习提升性能的三种方式:纵向扩展(给机器加 GPU)、横向扩展(通过集群训练模型)及融合扩展(在分布式的基础上,给每个集群中的 Worker 节点加 GPU),然后对主流的开源深度学习框架进行了介绍。通过对这些开源深度学习框架的了解,可以看到当前开源深度学习框架的发展有以下几个趋势:

  1. 分布式深度学习框架特别是构建在 Hadoop 生态体系内的分布式深度学习框架(基于 Java 或 Scala 语言实现)会越来越流行,并通过融合扩展的方式加速深度学习算法模型的训练。
  2. 在分布式深度学习方面,大数据的本质除了常说的 4V 特性之外,还有一个重要的本质那就是 Online,数据随时可更新可应用,而且数据本质上具备天然的流式特征,因此具备实时在线、模型可更新算法的深度学习框架也是未来发展的方向
  3. 当待训练的深度学习算法模型参数较多时, Spark 与开源分布式内存文件系统 Tachyon 结合使用是提升性能的有效手段

深度学习作为 AI 领域的一个重要分支,俨然已经成为 AI 的代名词,人们提起 AI 必定会想到深度学习,相信随着以后大数据和深度学习技术的不断发展,更多现象级的应用将不断刷新人们对 AI 的认知,让我们尽情期待“奇点”临近。

作者简介:

周志湖,电子科技大学计算机硕士,研究方向为计算机视觉、机器学习,曾在国内外核心期刊发表机器学习相关注水论文若干,现为绿城中国资深数据平台架构师、专业经理,主要从事房产行业大数据应用。

赵永标,宁波大学应用数学硕士,11 年互联网从业经验,现为杭州以数科技有限公司 CTO、联合创始人,主攻工业、公安及房产行业大数据应用。

2016 年 12 月 26 日 19:145549

评论

发布
暂无评论
  • 分布式计算模式之流水线:你方唱罢我登场

    今天,我以TensorFlow为例,与你讲述了分布式计算中的流水线计算模式。

    2019 年 11 月 1 日

  • 雅虎如何在 Hadoop 集群上实现大规模分布式深度学习

    雅虎在Hadoop集群上开发了大规模机器学习算法,将Hadoop集群打造成了雅虎首选的大规模机器学习平台。近日,雅虎Big ML团队的Cyprien Noel、Jun Shi和Andy Feng撰文介绍了雅虎在Hadoop集群上构建大规模分布式深度学习的实践。这主要包含两个方面的工作,一是通过向Hadoop集群添加GPU节点增强集群,而是基于开源软件库Apache Spark和Caffe创建了一个分布式综合解决方案Caffe-on-Spark。

  • 如何从技术上突破数据科学的两大挑战

    本文是10月13日大数据杂谈群分享的内容。 TalkingData的平台上有巨大的数据量,日活是2.5亿、月活是6.5亿。每天能够收到14TB的数据,处理370亿条消息,收到35亿个位置定位点。 如何利用这些数据创造价值?

  • 深度学习:2016 年大事记回放

  • 微软在 GitHub 上开源其深度学习工具包 CNTK

    1月25日,微软在GitHub上发布了其深度学习工具包——Computational Network Toolkit(简称CNTK)。CNTK是一个统一的深度学习工具包,它通过一个有向图将神经网络描述为一系列计算步骤。在有向图中,叶节点表示输入值或网络参数,边表示输入之上的矩阵运算。

  • Facebook 开源基于 Torch 的一组深度学习插件

    深度学习是机器学习研究中的一个新的领域,它能够模仿人脑的机制来解释数据。近日,Facebook人工智能研究院(FAIR)宣布开源了一组深度学习工具,这些工具能够很大程度地提升神经网络的性能,并可用于计算机视觉和自然语言处理(NLP)等场景。

  • Datumbox:基于 Java 的新的开源机器学习框架

    当今时代的探索和发现都是基于大量的算法、模型以及统计学的测试和工具。Datumbox公司应运而生,它提供了一套强有力的基于Java的开源机器学习框架。目前,基于GPL3.0的Datumbox机器学习框架已经开源并且可以从Github上进行下载。

  • TensorFlow、DMTK 与 SystemML 孰优孰劣

    毫无疑问,机器学习是目前数据分析领域最为炙手可热的主题之一,其研究成果早已渗透到了日常生活中,从垃圾邮件过滤到人脸支付,从信用欺诈检测到自然灾害预测等场景无一不活跃着机器学习的身影。但即便机器学习已经得到了广泛的应用,开发人员能够从网上找到很多机器学习算法实现,但是这些代码往往“脏”而“乱”,没有经过大规模的生产验证。幸运的是现在这种窘境已经不复存在了,因为Google、Microsoft和IBM分别发布并开源了自己的机器学习工具包TensorFlow、DMTK和SystemML,每一个项目都是各自公司知识积累的结晶,在其内部发挥着举足轻重的作用,那么这些工具包相互之间又有哪些区别呢?

  • 极客大学架构师训练营第十三周学习总结

    本周继续上周的大数据课程,智慧老师给我们介绍了Spark相关的基础知识以及开源流处理框架Flink。后半周介绍了数据可视化、常用数据指标以及PageRank排名算法,接着就引入了机器学习的相关知识。

    2020 年 9 月 9 日

  • Spark 上的深度学习框架再添新兵:Yahoo 开源 TensorFlowOnSpark

    Yahoo Big ML团队宣布开源TensorFlowOnSpark,他们用来在大数据集群的分布式深度学习最新的开源框架。 Yahoo Big ML团队成员Lee Yang、Jun Shi、Bobbie Chern和Andy Feng日前合著了一篇文章,详细介绍了他们开源的TensorFlowOnSpark的方方面面。 Yahoo开源的TensorFlowOnSpark使Google发起的TensorFlow深度学习开源框架与Apache Spark集群中的数据集兼容,一些组织为了处理大量不同类型的数据而进行维护,对他们来说无疑是个好消息。 Yahoo开源TensorFlowOnSpark采用了Apache 2.0协议许可,并在GitHub上发布。 深度学习通常涉及大量数据进行人工神经网络训练,像照片,然后指导神经网络对新数据做出最佳猜测。 InfoQ翻译并整理本文。

  • 英特尔 BigDL 设计思路解析:落地深度学习要具备工业级大数据分析流水线

    深度学习蓬勃发展,开源界已有 Caffe,MXNet,TensorFlow,Theano,Torch 等主流框架;英特尔也开源了分布式深度学习库 BigDL,它的特点是可以直接运行在现有的 Apache Spark 或 Hadoop 集群之上,并且其目标人群更偏向于大数据分析师们。InfoQ 曾经撰文《 Intel 开源深度学习库 BigDL:Non GPU on Spark》和《Intel 开源了基于 Apache Spark 的分布式深度学习框架 BigDL》,上个月 InfoQ 走进英特尔亚太研发有限公司,进一步学习和了解了 BigDL,并对英特尔公司软件与服务事业部副总裁、系统技术及优化部门总经理 Michael Greene 和英特尔资深首席工程师、大数据技术全球 CTO 戴金权进行了采访,主要内容整理如下。

  • 使⽤TensorFlow Lite 实现边缘智能

    2020 年 8 月 13 日

  • 移动开发新大陆: 边缘智能计算的趋势

    我在移动端机器学习的项目中,接触了不少安卓开发的同学,也看到团队中不少安卓开发同学展现出的机器学习技术的开发能力,我也在思考AI和安卓开发可以相结合的点。

    2019 年 4 月 6 日

  • 为什么 MapReduce 会被硅谷一线公司淘汰?

    自2014年左右开始,Google内部已经几乎没人写新的MapReduce了,你知道这是为什么吗?

    2019 年 4 月 17 日

  • 大数据架构:大数据技术架构的思想和原理是什么?

    面对如此庞大的数据,如何存储,如何利用大规模的服务器集群处理计算大量的数据,就是大数据技术的核心关键。

    2020 年 2 月 3 日

  • DMLC:最大开源分布式机器学习项目

    近日,分布式开源机器学习项目正式发布。本文对该项目所包含的库及系统组件进行了简单介绍。

  • 深度学习在 Gilt 上的应用

    机器学习起源于神经网络,而深度学习是机器学习的一个快速发展的子领域。最近的一些算法的进步和GPU并行计算的使用,使得基于深度学习的算法可以在围棋和其他的一些实际应用里取得很好的成绩。时尚产业是深度学习的目标领域之一。闪购网站Gilt正在实际应用中使用深度学习技术。

  • 计算机视觉领域的深度学习模型(一):AlexNet

    从今天开始,我们进入一个新的模块,我会结合几篇经典的论文,给你介绍几个专门为计算机视觉而提出来的深度学习模型。

    2018 年 9 月 7 日

发现更多内容

大数据技术思想入门(二):分布式存储集群特点

抖码算法

Java 大数据 hadoop 分布式

牛逼操作,ThreadLocal还能当缓存用

简爱W

Java

netty案例,netty4.1高级应用篇一,手写RPC框架第一章《自定义配置xml》

小傅哥

Java Netty

netty案例,netty4.1源码分析篇一《NioEventLoopGroup源码分析》

小傅哥

Netty 小傅哥

世界正在重塑 加密货币将扮演什么角色

CECBC区块链专委会

数字货币 加密货币

netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》

小傅哥

Netty 小傅哥

netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》

小傅哥

Netty 小傅哥

一个实用的开源项目,可以快速将 Elasticsearch 数据导出到 csv

AlwaysBeta

Python 数据库 elasticsearch Kibana Lucene Elastic Search

阿里内部流传的Mybatis笔记终于流传出来了,赶紧收藏

简爱W

netty案例,netty4.1源码分析篇二《ServerBootstrap配置与绑定启动》

小傅哥

Java Netty 小傅哥

区块链的共识机制有哪些好处优势?

CECBC区块链专委会

区块链 分布式 金融

Week10--课后作业

Geek_165f3d

oeasy 教您玩转linux010101查看内核uname

o

JDK8 日期 API 使用

HeGuang

JDK1.8

spring事务的这10种坑,你稍不注意可能就会踩中

简爱W

这么理解业务架构就对了!

周金根

BIZBOK 业务架构

深入浅出Vert.x架构

dinstone

大龄程序员的自我介绍 v 0.1

escray

学习 面试 自我介绍 面试现场

数字化背景下的经济社会发展的新特征 新趋势

CECBC区块链专委会

区块链 人工智能 大数据

书摘之《堂吉诃德》—— 谁不曾想过仗剑走天涯?

Sicolas Flamel

读书笔记

netty案例,netty4.1源码分析篇六《Netty异步架构监听类Promise源码分析》

小傅哥

Netty 小傅哥

Week10---课后总结

Geek_165f3d

做职场里的“超级英雄”,需要怎样的盔甲与工具?

脑极体

我,一个当代普通大学生的自述

有梦的咸鱼

个人成长 大学生日常 个人感悟 讨论写作

netty案例,netty4.1高级应用篇三,手写RPC框架第三章《RPC中间件》

小傅哥

Netty 小傅哥

netty案例,netty4.1源码分析篇五《一行简单的writeAndFlush都做了哪些事》

小傅哥

Java Netty 小傅哥

netty案例,netty4.1源码分析篇四《ByteBuf的数据结构在使用方式中的剖析》

小傅哥

Java Netty 小傅哥

8锁问题

HeGuang

synchronized

Spring的Controller是单例还是多例?怎么保证并发的安全

简爱W

netty案例,netty4.1高级应用篇二,手写RPC框架第二章《netty通信》

小傅哥

Netty 小傅哥

netty案例,netty4.1源码分析篇三《Netty服务端初始化过程以及反射工厂的作用》

小傅哥

Java Netty 小傅哥

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

解读2016之深度学习篇:开源深度学习框架发展展望-InfoQ