almost done

This commit is contained in:
StarLee 2016-06-02 21:16:33 +08:00
parent 495d04d9a3
commit 2902f28107
6 changed files with 117 additions and 65 deletions

BIN
dev_cycle.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
fork.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
star.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
systemml_arch.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
watch.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -22,14 +22,49 @@
\begin{document}
\maketitle
\section{基本介绍}
\section{总览}
各大公司开放这些系统源代码一方面原因就是为了吸引更多程序员从而加快这款软件的发展同时也可以帮助其招募该领域内的专家人才。所以首先分析这些系统在github上的关注度如何截止到2016年6月2日)。另外因为MLlib是包含在Spark中开源的所以在这里统计的是Spark项目的数据。
\begin{table}[!hbp]
\centering
\begin{tabular}{|c|c|c|c|}
\hline
\hline
系统 & Watch & Star & Fork \\
\hline
TensorFlow & 2,487 & 25,300 & 9,779 \\
\hline
Torch & 546 & 4,696 & 1,299 \\
\hline
MLLib & 1,344 & 8,762 & 8,147 \\
\hline
DMTK & 255 & 1,588 & 381 \\
\hline
SystemML & 66 & 289 & 109 \\
\hline
\end{tabular}
\caption{各个系统在github上的关注度}
\end{table}
从上表可以看出关注度最高的是Tensforflow其次是MLlib无论是Star数还是fork数都是遥遥领先于其他几个系统。如此高的关注度说明了这两个系统得到了开发人员的广泛认可和支持。在我看来这就形成了一个如下图所示的“开源软件开发良性循环”一个项目质量高那么用户和开发者就越喜欢从而就会积极地去贡献自己的力量也就会促使该项目的质量进一步提高如此循环不断。当然TensorFlow本身质量高之外和Google在业内的影响力也分不开。我最看好的是MLlib因为现在它是Spark原生集成的库对运行在Sark上有先天的优势借着Sark的势头应该会得到更加迅猛的发展和应用。
\begin{figure}[h!]
\centering
\includegraphics[height=6cm]{dev_cycle.jpg}
\caption{开源软件开发良性循环}
\label{dev_cycle}
\end{figure}
\section{各系统比较分析}
\subsection{TensorFlow}
2015年11月9日Google发布人工智能系统TensorFlow并宣布开源。TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统对比 DistBeliefTensorFlow 的编程模型更加灵活性能也更好支持在大规模的异构硬件平台上训练和使用很多的模型。TensorFlow的命名来源于本身的运行原理。Tensor张量意味着N维数组Flow意味着基于数据流图的计算TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow已被用于语音识别或图像识别等多项机器深度学习领域它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。其将复杂的数据结构传输至人工智能神经网中进行分析和处理,为扩展神经网络训练搞更大的部署环境TensorFlow 允许 client 简单地表达不同类型的并行通过复制和并行执行一个核心模型数据流图,依赖不同计算设备合作更新一个共享的参数或者其他的状态。 对计算描述的微妙变动可以使用较低的代价来达到和尝试很多不同的并行的方法。
2015年11月9日Google发布人工智能系统TensorFlow并宣布开源。TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统其将复杂的数据结构传输至人工智能神经网中进行分析和处理。TensorFlow的命名来源于本身的运行原理。Tensor张量意味着N维数组Flow意味着基于数据流图的计算TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow已被用于语音识别或图像识别等多项机器深度学习领域它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。
TensorFlow 的计算由一个有向图描述,这个图中由一个节点集合组成。该图表达了数据流计算,作出了一些类型的节点保持和更新持久状态和让分支及循环控制结构类似于 Naiad 的行为方式的扩展。客户一般都会使用 TensorFlow 支持的前端语言C++或者Python构建一个计算图下图就是一个结构计算图的实例。在一幅 TensorFlow 图中每个节点node有一个或者多个输入和零个或者多个输出表示一种操作operation的实例化一个操作有一个名字它表示一个抽象的计算比如说“矩阵相乘”或者“相加”
TensorFlow 的计算被表示为含状态的数据流图,聚焦在让这个系统足够灵活能够快速地实验研究中产生的新模型,并同时充分地提升产品级训练的性能和部署机器学习模型健壮性。计算图中由一个节点集合组成。该图表达了数据流计算,作出了一些类型的节点保持和更新持久状态和让分支及循环控制结构类似于 Naiad 的行为方式的扩展。客户一般都会使用 TensorFlow 支持的前端语言C++或者Python构建一个计算图下图就是一个结构计算图的实例。在一幅 TensorFlow 图中每个节点node有一个或者多个输入和零个或者多个输出表示一种操作operation的实例化一个操作有一个名字它表示一个抽象的计算比如说“矩阵相乘”或者“相加”
\begin{figure}[h!]
\centering
@ -40,14 +75,50 @@ TensorFlow 的计算由一个有向图描述,这个图中由一个节点集合
TensorFlow 系统的主要部分就是客户端,它使用了会话接口来和 master 及一个或者多个的 worker processes 进行通信,每个 worker process 负责对一个或者多个计算设备CPU 核或者 GPU card的任意访问和在这些设备上进行图节点的计算按照 master 的要求执行。我们有本地和分布式实现的 TensorFlow 接口。本地实现通常是客户端、master 和 worker 都是在同一台机器上在一个单一的操作系统进程(可能包括多个设备,比如说装了多个 GPU card的设备上运行。分布式实现采用了本地实现的很多的代码但是扩展了对客户端、master 和 worker 可以在不同的机器的不同的进程上运行的场景支持。
设备是 TensorFlow 的计算核心。每个 worker 负责一个或者多个设备,每个设备有一个设备类型和一个名字。设备名字由识别设备类型的部分,在 worker 中的设备索引以及在分布式设定中worker 的 job和任务或者 localhost 当设备是和进程在同一机器时的标志构成。TensorFlow支持单设备、多设备和分布式三种执行模式。
总的来说TensorFlow的优势有
\begin{itemize}
\item 多GPU支持
\item 利用分布式资源训练v0.8版本已经支持分布式计算
\item 可以使用TensorBoard实现图形可视化并且利用与其交互产生的日志记录文件可以实时监测学习率、损失值准确性的数据
\item 模型训练的过程中可以随时停下来对其做评估,然后从检查点载入,继续训练
\item 高质量的元框架KerasTensorFlow SlimSkflow和PrettyTensor等
不过TensorFlow的递归神经网络RNNS仍然有些不足并且利用异质资源增加复杂性此外TensorFlow 贪婪占用 GPU。
\end{itemize}
\subsection{Torch}
Torch是Facebook开源的一个广泛支持机器学习算法的科学计算框架。易于使用且高效主要得益于一个简单的和快速的脚本语言LuaJIT和底层的C/CUDA实现。Torch目标是让用户通过极其简单的过程、最大的灵活性和最快的速度建立自己的科学算法。Torch在机器学习领域有一个大型的生态社区驱动的库包包括计算机视觉、信号处理、并行处理、图像、视频、音频和网络等。Torch 的核心是目前流行的神经网络它使用简单同时具有最大的灵活性的优化库实现复杂神经网络的拓扑结构。用户可以用高效的方式通过CPU和GPU建立和优化神经网络。Torch 广泛使用在学校的实验室以及谷歌/deepmind、推特、NVIDIA、AMD、英特尔和许多其他公司。
Torch是Facebook开源的一个广泛支持机器学习算法的科学计算框架。易于使用且高效主要得益于一个简单的和快速的脚本语言LuaJIT和底层的C/CUDA实现。Torch目标是让用户通过极其简单的过程、最大的灵活性和最快的速度建立自己的科学算法。Torch在机器学习领域有一个大型的生态社区驱动的库包包括计算机视觉、信号处理、并行处理、图像、视频、音频和网络等。在Torch7的文章中声称有8个内置包分别有
\begin{itemize}
\item torchTorch7最主要的包提供Tensor简单序列化和其他的一些基础功能。
\item lb\&plot这两个包提供标准的类Matlab函数能够创建、转换以及绘制Tensor。
\item qt完全绑定Qt和Lua。支持快速的创建带有良好GUI的交互实例。
\item nn此包提供一组标准的神经网络模块以及能够定义任意方向图的容器模块。
\item image图像处理模块提供所有的标准图像处理功能加载、保存、缩放以及旋转等。
\item optim此包提供最陡下降和共轭梯度等的实现。
\item unsup此包包含一些非监督学习算法K-means,稀疏编码和自动编码等。
\item third-party基于上面的包还有许多可用的第三方包比如提供Matlab matrix和 Torch tensor之间双向接口的mattorch对Linux和MacOSX平台图像驱动的打包器camera等。
\end{itemize}
Torch 的核心是目前流行的神经网络它使用简单同时具有最大的灵活性的优化库实现复杂神经网络的拓扑结构。用户可以用高效的方式通过CPU和GPU建立和优化神经网络。Torch 广泛使用在学校的实验室以及谷歌/deepmind、推特、NVIDIA、AMD、英特尔和许多其他公司。其优点包括
\begin{itemize}
\item 快速高效的GPU支持
\item 可嵌入可移植到iOSAndroid和FPGA的后台
\item 一个强大的n维数组
\item 利用LuaJIT的良好的C接口
\item 很多实现索引、切片、移调线性代数、数值优化的例程
\end{itemize}
\subsection{MLLib}
MLlib 是Spark对常用的机器学习算法的实现库同时包括相关的测试和数据生成器。Spark 的设计初衷就是为了支持一些迭代的 Job, 这正好符合很多机器学习算法的特点。 Spark 之所以在机器学习方面具有得天独厚的优势,有以下两点原因:
1机器学习算法一般都有很多个步骤迭代计算的过程机器学习的计算需要在多次迭代后获得足够小的误差或者足够收敛才会停止迭代时如果使用 Hadoop 的 MapReduce 计算框架,每次计算都要读 / 写磁盘以及任务的启动等工作,这回导致非常大的 I/O 和 CPU 消耗。而 Spark 基于内存的计算模型天生就擅长迭代计算,多个步骤计算直接在内存中完成,只有在必要时才会操作磁盘和网络,所以说 Spark 正是机器学习的理想的平台。
2从通信的角度讲如果使用 Hadoop 的 MapReduce 计算框架, JobTracker 和 TaskTracker 之间由于是通过 heartbeat 的方式来进行的通信和传递数据,会导致非常慢的执行速度,而 Spark 具有出色而高效的 Akka 和 Netty 通信系统,通信效率极高。
MLlib 目前支持四种常见的机器学习问题二元分类回归聚类以及协同过滤同时也包括一个底层的梯度下降优化基础算法。MLlib 在 Spark 整个生态系统中的位置如下图所示。
MLlib 是Spark对常用的机器学习算法的实现库2012年作为MLbase项目的一部分开始研发。从一开始它就和Spark一起发布第一次发布是在0.8版本。MLlib初始版本是由伯克利大学的11贡献者开发的并且仅提供了有限的一些标准机器学习算法。从这之后MLlib得到了快速的发展不到两年的时间在Spark1.4的时候MLlib已经有超过50个组织的140个共享着在开发了。同时包括相关的测试和数据生成器。Spark 的设计初衷就是为了支持一些迭代的 Job, 这正好符合很多机器学习算法的特点。 MLlib 目前支持四种常见的机器学习问题二元分类回归聚类以及协同过滤同时也包括一个底层的梯度下降优化基础算法。MLlib 在 Spark 整个生态系统中的位置如下图所示。
\begin{figure}[h!]
\centering
\includegraphics[height=6cm]{MLlib.jpg}
@ -55,23 +126,7 @@ MLlib 目前支持四种常见的机器学习问题:二元分类,回归,
\label{MLlib}
\end{figure}
如下图所示, MLlib 是 MLBase 一部分,其中 MLBase 分为四部分: MLlib 、 MLI 、 ML Optimizer 和 MLRuntime 。
\begin{figure}[h!]
\centering
\includegraphics{MLBase.jpg}
\caption{MLBase}
\label{MLBase}
\end{figure}
\begin{itemize}
\item ML Optimizer 会选择它认为最适合的已经在内部实现好了的机器学习算法和相关参数,来处理用户输入的数据,并返回模型或别的帮助分析的结果
\item MLI 是一个进行特征抽取和高级 ML 编程抽象的算法实现的 API 或平台
\item MLlib 是 Spark 实现一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化,该算法可以进行可扩充
\item MLRuntime 基于 Spark 计算框架,将 Spark 的分布式计算应用到机器学习领域
\end{itemize}
从架构图可以看出 MLlib 主要包含三个部分:底层基础 :包括 Spark 的运行库、矩阵库和向量库;算法库 :包含广义线性模型、推荐系统、聚类、决策树和评估的算法;实用程序 :包括测试数据的生成、外部数据的读入等功能。
MLlib 是 MLBase 一部分,其中 MLBase 分为四部分: MLlib 、 MLI 、 ML Optimizer 和 MLRuntime 。 ML Optimizer 会选择它认为最适合的已经在内部实现好了的机器学习算法和相关参数来处理用户输入的数据并返回模型或别的帮助分析的结果MLI 是一个进行特征抽取和高级 ML 编程抽象的算法实现的 API 或平台MLlib实现一些常见的机器学习算法和实用程序包括分类、回归、聚类、协同过滤、降维以及底层优化该算法可以进行可扩充MLRuntime 基于 Spark 计算框架,将 Spark 的分布式计算应用到机器学习领域。从架构图可以看出 MLlib 主要包含三个部分:底层基础 :包括 Spark 的运行库、矩阵库和向量库;算法库 :包含广义线性模型、推荐系统、聚类、决策树和评估的算法;实用程序 :包括测试数据的生成、外部数据的读入等功能。
\begin{figure}[h!]
\centering
@ -81,6 +136,22 @@ MLlib 目前支持四种常见的机器学习问题:二元分类,回归,
\end{figure}
其中的底层基础部分主要包括向量接口和矩阵接口,这两种接口都会使用 Scala 语言基于 Netlib 和 BLAS/LAPACK 开发的线性代数库 Breeze 。MLlib 支持本地的密集向量和稀疏向量并且支持标量向量。MLlib 同时支持本地矩阵和分布式矩阵,支持的分布式矩阵分为 RowMatrix 、 IndexedRowMatrix 、 CoordinateMatrix 等。
MLlib基于Spark实现而Spark 之所以在机器学习方面具有得天独厚的优势,有以下两点原因:
\begin{itemize}
\item 机器学习算法一般都有很多个步骤迭代计算的过程,机器学习的计算需要在多次迭代后获得足够小的误差或者足够收敛才会停止,迭代时如果使用 Hadoop 的 MapReduce 计算框架,每次计算都要读 / 写磁盘以及任务的启动等工作,这回导致非常大的 I/O 和 CPU 消耗。而 Spark 基于内存的计算模型天生就擅长迭代计算,多个步骤计算直接在内存中完成,只有在必要时才会操作磁盘和网络,所以说 Spark 正是机器学习的理想的平台。
\item 从通信的角度讲,如果使用 Hadoop 的 MapReduce 计算框架, JobTracker 和 TaskTracker 之间由于是通过 heartbeat 的方式来进行的通信和传递数据,会导致非常慢的执行速度,而 Spark 具有出色而高效的 Akka 和 Netty 通信系统,通信效率极高。
\end{itemize}
MLlib在扩展性、速度和持续优化方面表现的很出色它的主要特征有
\begin{itemize}
\item 支持的方法和库MLlib提供常用的机器学习算法的快速分布式实现。包括线性模型、朴素朴素贝叶斯和决策树等分类和回归问题K-means聚类和主成分分析等降维算法等。该库还提供一些基础的用于优化、统计分析和特征提取的功能。
\item 算法优化MLlib为支持有效的分布式学习和预测提供了许多的优化。例如用于推荐的ALS算法有效的利用blocking来减少JVM垃圾回收的消耗以提升高级线性代数运算。决策树也从PLANET项目中借鉴了很多思想比如用基于数据的特征离散化来减少通信消耗。
\item 流水线API实际的机器学习算法的流水线经常包含数据预处理、特征抽取、模型调试和验证阶段而大多数的机器学习库没有为各种各样的功能提供原声支持。尤其是在处理大规模数据的时候数据流之间的消耗是很明显的。MLlib提供了解决这些问题的包spark.ml,这个包通过一组统一的高级API简化了开发过程和多阶段学习流水线的协调。
\item 集成SparkMLlib从Spark生态圈里的许多组件中受益。从底层来说Spark核心提供了通用的执行引擎支持80多种对数据转换的操作。高级的API比如Spark SQL提供了数据整合功能简化了数据清理等预处理阶段。此外Spark Streaming还允许用户处理实时数据流从而开发在线学习算法。
\end{itemize}
\subsection{DMTK}
@ -91,57 +162,38 @@ DMTK由一个服务于分布式机器学习的框架和一组分布式机器学
\item 分布式词向量词向量技术近来被普遍地应用于计算词汇的语义表示它可以用作很多自然语言处理任务的词特征。微软为两种计算词向量的算法提供了高效的分步式实现一种是标准的word2vec算法另一种是可以对多义词计算多个词向量的新算法。
\end{itemize}
DMTK通过分布式计算部署的方式满足了大规模机器学习的要求。由于云计算和高性能处理器的普及让机器学习从单机环境扩展到多机环境甚至是集群系统。分布式机器学习就是通过在更为廉价的集群系统上部署机器学习的算法把原来单机的计算能力扩展到成千上万台服务器上。
DMTK开源版提供了简单高效的分布式机器学习框架如下图所示它由参数服务器和客户端软件开发包SDK两部分构成。开发者只需要简单几行代码就可以非常容易地把自己开发的机器学习算法从单机环境扩展到多机或集群环境。这大幅降低了机器学习的门槛无论是高校研究者或是商用机器学习开发商都能基于微软DMTK开源版轻松扩展机器学习算法的计算环境和计算资源从而实现基于大数据的大规模机器学习。其次DMTK还提供了丰富的机器学习算法以满足更为深度、更为快速的机器学习。目前开源版的DMTK包含了其中两款独具特色的机器学习算法LightLDA主题模型和分布式词向量模型.据了解DMTK已经被应用到了微软的必应搜索引擎、广告、小冰等多款在线产品当中实现了更强交互性的机器学习。
DMTK通过分布式计算部署的方式满足了大规模机器学习的要求。由于云计算和高性能处理器的普及让机器学习从单机环境扩展到多机环境甚至是集群系统。分布式机器学习就是通过在更为廉价的集群系统上部署机器学习的算法把原来单机的计算能力扩展到成千上万台服务器上。DMTK开源版提供了简单高效的分布式机器学习框架如下图所示它由参数服务器和客户端软件开发包SDK两部分构成。
\begin{figure}[h!]
\centering
\includegraphics[width=16cm]{DMTK1.png}
\caption{DMTK框架}
\label{DMTK1}
\end{figure}
开发者只需要简单几行代码就可以非常容易地把自己开发的机器学习算法从单机环境扩展到多机或集群环境。这大幅降低了机器学习的门槛无论是高校研究者或是商用机器学习开发商都能基于微软DMTK开源版轻松扩展机器学习算法的计算环境和计算资源从而实现基于大数据的大规模机器学习。其次DMTK还提供了丰富的机器学习算法以满足更为深度、更为快速的机器学习。目前开源版的DMTK包含了其中两款独具特色的机器学习算法LightLDA主题模型和分布式词向量模型.据了解DMTK已经被应用到了微软的必应搜索引擎、广告、小冰等多款在线产品当中实现了更强交互性的机器学习。
\subsection{SystemML}
\newpage
\section{比较分析}
\subsection{TensorFlow}
优点:
System ML最初由IBM的Almaden实验室在10年前开发它可以简化开发人员定制机器学习软件的难度。例如该软件可以帮助银行编写风险建模软件从而在发现欺诈活动时预先发出警示。现在SystemML已经是Apache的孵化项目。它用 Java 语言编写,可支持描述性分析、分类、聚类、回归、矩阵分解及生存分析等算法。在部署方面, SystemML 运行环境支持 Windows、Linux 及 MacOS可支持单机和分布式部署。单机部署显然有利于本地开发的工作而分布式部署则可以真正发挥机器学习的威力支持的框架包括 Hadoop 和 Spark。下图是SystemML的整体架构图。
\begin{figure}[h!]
\centering
\includegraphics[width=8cm]{systemml_arch.jpg}
\caption{SystemML架构}
\label{SystemML}
\end{figure}
它的组件包括:
\begin{itemize}
\item 多GPU支持
\item 利用分布式资源训练v0.8版本已经支持分布式计算
\item 可以使用TensorBoard实现图形可视化并且利用与其交互产生的日志记录文件可以实时监测学习率、损失值准确性的数据
\item 模型训练的过程中可以随时停下来对其做评估,然后从检查点载入,继续训练
\item 高质量的元框架KerasTensorFlow SlimSkflow和PrettyTensor等
\item 语言DMLSysemML中的算法都是用“声明式机器学习语言”Declarative Machine learning Language写的。
\item 高级算子组件HOP高级算子组件High-Level Operator Component分析语句块中的任何操作然后选择合适的高级执行计划。
\item 低级算子组件LOP低级算子组件High-Level Operator Component把HOP生成的高级执行计划转换成是用于MapReduce的低级的物理计划。
\item 运行时运行时组件Runtime)把LOP生成的低级执行计划在hadoop执行。
\end{itemize}
缺点
SystemML 支持多个执行模式包括单个Hadoop 批量和 Spark 批量。其优势主要基于两方面
\begin{itemize}
\item 相比 TheanoTensorflow 的递归神经网络RNNS仍然有些不足
\item 缺少数据输入的权威案例
\item 文档可能不一致
\item 利用异质资源增加复杂性
\item TensorFlow 贪婪占用 GPU
\item SystemML语言声明式机器学习(DML)。SystemML 包含线性代数原语,统计功能和 ML 指定结构,可以更容易也更原生的表达 ML 算法。算法通过 R 类型或者 Python 类型的语法进行表达。DML 通过提供灵活的定制分析表达和独立于底层输入格式和物理数据表示的数据显著提升数据科学的生产力。
\item SystemML提供自动优化功能通过数据和集群特性保证高效和可伸缩.SystemML 可以在 MapReduce 或者 Spark 环境运行。
\end{itemize}
\subsection{Torch}
优点:
\begin{itemize}
\item 快速高效的GPU支持
\item 可嵌入可移植到iOSAndroid和FPGA的后台
\item 一个强大的n维数组
\item 利用LuaJIT的良好的C接口
\item 很多实现索引、切片、移调线性代数、数值优化的例程
\item 快速高效的GPU支持
\end{itemize}
缺点:
\begin{itemize}
\item to be done
\end{itemize}
\subsection{MLLib}
\subsection{DMTK}
\subsection{SystemML}
\end{document}