GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架。框架使用C++语言开发实现。python
该框架是面向机器学习(ML)的流处理并行计算框架,能够运行在多处理机的单机系统、集群或是亚马逊的EC2 等多种环境下。框架的设计目标是,像MapReduce同样高度抽象。能够高效运行与机器学习相关的、具备稀疏的计算依赖特性的迭代性算法,而且保证计算过程当中数据的高度一致性和高效的并行计算性能。该框架最初是为处理大规模机器学习任务而开发的,但是该框架也相同适用于不少数据挖掘方面的计算任务。在并行图计算领域,该框架在性能上高出很是多其它并行计算框架(好比,MapReduce、Mahout)几个数量级。GraphLab 自成立以来就是一个发展很是迅速的开源项目,其用户涉及的范围也至关普遍,全球有2 000 多个企业、机构使用GraphLab。linux
GraphLab 做为一个基于图处理的并行计算框架,能够高效地运行机器学习相关的数据依赖性强,迭代型算法。其设计具备例如如下特色和长处。android
- 统一的API 接口。
对于多核处理器和分布式环境,採用统一的API 接口,一次编敲代码就能够高效地运行在共享内存环境或者分布式集群上。git
- 高性能。优化C++运行引擎,在大量多线程操做和同步I/O 操做之间进行了很是好的平衡。
- 可伸缩性强。GraphLab 能够智能地选择存储和计算的节点,缘由是GraphLab 对于数据的存储与计算都使用了精心设计的优良算法。
- 集成HDFS。GraphLab 内置对HDFS 的支持。GraphLab 能够直接从HDFS中读数据或者将计算结果数据直接写入到HDFS 中。
- 功能强大的机器学习类工具集。GraphLab 在自身提供的API 接口之上实现了大量的开箱即用的工具集。
GraphLab现在还不支持Windows,临时仅仅能经过VMware Player运行linux的虚拟机,官方给出了已经配置好的GraphLab Create的VM文件。能够免去编译等步骤。github
下载GraphLab Create,并依照要求配置安装
- 首先下载GraphLab Create VM文件
- 而后安装VMware Player。导入GraphLab Create VM文件详见文档
- 最后经过ipython查看可否正常导入graphlab库详见文档算法
通常的机器学习类算法有下面两个特性:编程
- 数据依赖性很是强。运算过程当中參与计算的各个机器之间经常需要交换大量的数据。
- 流处理复杂。主要表现在整个处理过程需要重复地迭代计算,数据处理分支很是多。很是难实现真正的并行。
在GraphLab 出现以前。针对这些机器学习的算法,广泛的编程方法是採用MPI 和PThread 这些已有的底层开发库来完毕这类计算问题。採用这样的编程模型的开发应用,针对详细的应用,需要开发人员实现相应的算法来完毕计算过程当中集群计算节点之间主机通讯和数据同步等底层操做。这样的开发方法的优点在于,能够针对详细的应用对代码进行深度的优化。以达到很是高的性能。windows
但是对于不一样的应用,需要重写代码实现底层的数据分配、数据通讯等细节,这就致使了代码重用率很是低,可拓展性差。对编程人员要求高。这样的编程模型显然不适合当前敏捷的互联网开发。而当前被普遍使用的MapReduce 计算框架,在并行运行多任务的时候,要求各个任务之间相互独立。任务运行期间不需要相互之间进行数据通讯。因此MapReduce 不适合数据依赖性强的任务,而且MapReduce 并行计算模型也不能高效表达迭代型算法。markdown
这样的计算模型在处理如日志分析、数据统计等数据独立性的任务时具备明显的优点,但是在机器学习领域。MapReduce框架并不能很是好地知足机器学习计算任务。多线程
GraphLab 的出现不是对MapReduce 算法的替代,相反,GraphLab 借鉴了MapReduce 的思想,将MapReduce 并行计算模型推广到了对数据重叠性、数据依赖性和迭代型算法适用的领域。本质上,GraphLab 填补了高度抽象的MapReduce 并行计算模型和底层消息传递、多线程模型(如MPI 和PThread)之间的空隙。
当前流行的并行计算框架MapReduce 将并行计算过程抽象为两个基本操做。即map 操做和reduce 操做。在map 阶段将做业分为相互独立的任务在集群上进行并行处理。在reduce阶段将map的输出结果进行合并获得终于的输出结果。GraphLab 模拟了MapReduce 中的抽象过程。对MapReduce的map操做,经过称为更新函数(Update Function)的过程进行模拟,更新函数能够读取和改动用户定义的图结构数据集。用户提供的数据图表明了程序在内存中和图的顶点、边相关联的内存状态,更新函数能够递归地触发更新操做。从而使更新操做做用在其它图节点上进行动态的迭代式计算。GraphLab 提供了强大的控制原语,以保证更新函数的运行顺序。GraphLab对MapReduce的reduce操做也经过称为同步操做(Sync Operation)的过程进行模拟。同步操做能够在后台计算任务进行的过程当中运行合并(Reductions),和GraphLab 提供的更新函数同样,同步操做能够同一时候并行处理多条记录,这也保证了同步操做能够在大规模独立环境下运行。
GraphLab将数据抽象成Graph结构,将算法的运行过程抽象成Gather、Apply、Scatter三个步骤。其并行的核心思想是对顶点的切分。
上图演示样例中,需要完毕对V0邻接顶点的求和计算,串行实现中。V0对其所有的邻接点进行遍历。累加求和。而GraphLab中,将顶点V0进行切分,将V0的边关系以及相应的邻接点部署在两台处理器上。各台机器上并行进行部分求和运算。而后经过master顶点和mirror顶点的通讯完毕终于的计算。
顶点是其最小并行粒度和通讯粒度。边是机器学习算法中数据依赖性的表现方式。
对于某个顶点,其被部署到多台机器,一台机器做为master顶点,其他机器上做为mirror。Master做为所有mirror的管理者,负责给mirror安排详细计算任务;mirror做为该顶点在各台机器上的代理运行者,与master数据的保持同步。
对于某条边。GraphLab将其惟一部署在某一台机器上,而对边关联的顶点进行多份存储,解了边数据量大的问题。
同一台机器上的所有edge和vertex构成local graph,在每台机器上,存在本地id到全局id的映射表。
vertex是一个进程上所有线程共享的,在并行计算过程当中,各个线程分摊进程中所有顶点的gather->apply->scatter操做。
每个顶点每一轮迭代通过gather->apple->scatter三个阶段。
Master利用total和上一步的顶点数据,依照业务需求进行进一步的计算,而后更新master的顶点数据,并同步mirror。
Apply阶段中。工做顶点可改动,边不可改动。
这scatter过程当中,工做顶点仅仅读,边上数据可写。
在运行模型中,graphlab经过控制三个阶段的读写权限来达到相互排斥的目的。在gather阶段仅仅读,apply对顶点仅仅写。scatter对边仅仅写。并行计算的同步经过master和mirror来实现,mirror至关于每个顶点对外的一个接口人。将复杂的数据通讯抽象成顶点的行为。
GraphLab:新的面向机器学习的并行框架
GraphLab百度百科
轻松搞定TB级数据。开源GraphLab突破人类图计算“极限值”
GraphLab:将大数据分析从理念运用到生产
转载请注明做者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354进入个人博客主页