GraphLab介绍
GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架,框架使用C++语言开发实现。该框架是面向机器学习(ML)的流处理并行计算框架,可以运行在多处理机的单机系统、集群或是亚马逊的EC2 等多种环境下。框架的设计目标是,像MapReduce一样高度抽象,可以高效执行与机器学习相关的、具有稀疏的计算依赖特性的迭代性算法,并且保证计算过程中数据的高度一致性和高效的并行计算性能。该框架最初是为处理大规模机器学习任务而开发的,但是该框架也同样适用于许多数据挖掘方面的计算任务。在并行图计算领域,该框架在性能上高出很多其他并行计算框架(例如,MapReduce、Mahout)几个数量级。GraphLab 自成立以来就是一个发展很迅速的开源项目,其用户涉及的范围也相当广泛,全球有2 000 多个企业、机构使用GraphLab。
GraphLab的优点
GraphLab 作为一个基于图处理的并行计算框架,能够高效地执行机器学习相关的数据依赖性强,迭代型算法,其设计具有如下特点和优点。
- 统一的API 接口。对于多核处理器和分布式环境,采用统一的API 接口,一次编写程序即可高效地运行在共享内存环境或者分布式集群上。
- 高性能。优化C++执行引擎,在大量多线程操作和同步I/O 操作之间进行了很好的平衡。
- 可伸缩性强。GraphLab 能够智能地选择存储和计算的节点,原因是GraphLab 对于数据的存储与计算都使用了精心设计的优良算法。
- 集成HDFS。GraphLab 内置对HDFS 的支持,GraphLab 能够直接从HDFS中读数据或者将计算结果数据直接写入到HDFS 中。
- 功能强大的机器学习类工具集。GraphLab 在自身提供的API 接口之上实现了大量的开箱即用的工具集。
GraphLab在Windows下的安装
GraphLab现在还不支持Windows,暂时只能通过VMware Player运行linux的虚拟机,官方给出了已经配置好的GraphLab Create的VM文件,可以免去编译等步骤。下载GraphLab Create,并按照要求配置安装
- 首先下载GraphLab Create VM文件
- 然后安装VMware Player,导入GraphLab Create VM文件详见文档
- 最后通过ipython查看是否能正常导入graphlab库详见文档
GraphLab和MapReduce的对比
一般的机器学习类算法有以下两个特性:
- 数据依赖性很强。运算过程中参与计算的各个机器之间经常需要交换大量的数据。
- 流处理复杂。主要表现在整个处理过程需要反复地迭代计算,数据处理分支很多,很难实现真正的并行。
在GraphLab 出现之前,针对这些机器学习的算法,普遍的编程方法是采用MPI 和PThread 这些已有的底层开发库来完成这类计算问题。采用这种编程模型的开发应用,针对具体的应用,需要开发者实现相应的算法来完成计算过程中集群计算节点之间主机通信和数据同步等底层操作。这种开发方法的优势在于,可以针对具体的应用对代码进行深度的优化,以达到很高的性能。但是对于不同的应用,需要重写代码实现底层的数据分配、数据通信等细节,这就导致了代码重用率很低,可拓展性差,对编程人员要求高。这种编程模型显然不适合当前敏捷的互联网开发。而当前被广泛使用的MapReduce 计算框架,在并行执行多任务的时候,要求各个任务之间相互独立,任务执行期间不需要相互之间进行数据通信,所以MapReduce 不适合数据依赖性强的任务,而且MapReduce 并行计算模型也不能高效表达迭代型算法。这种计算模型在处理如日志分析、数据统计等数据独立性的任务时具有明显的优势,但是在机器学习领域,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并行框架
GraphLab将数据抽象成Graph结构,将算法的执行过程抽象成Gather、Apply、Scatter三个步骤。其并行的核心思想是对顶点的切分。
上图示例中,需要完成对V0邻接顶点的求和计算,串行实现中,V0对其所有的邻接点进行遍历,累加求和。而GraphLab中,将顶点V0进行切分,将V0的边关系以及对应的邻接点部署在两台处理器上,各台机器上并行进行部分求和运算,然后通过master顶点和mirror顶点的通信完成最终的计算。
Graph的构造
顶点是其最小并行粒度和通信粒度,边是机器学习算法中数据依赖性的表现方式。
对于某个顶点,其被部署到多台机器,一台机器作为master顶点,其余机器上作为mirror。Master作为所有mirror的管理者,负责给mirror安排具体计算任务;mirror作为该顶点在各台机器上的代理执行者,与master数据的保持同步。
对于某条边,GraphLab将其唯一部署在某一台机器上,而对边关联的顶点进行多份存储,解了边数据量大的问题。
同一台机器上的所有edge和vertex构成local graph,在每台机器上,存在本地id到全局id的映射表。vertex是一个进程上所有线程共享的,在并行计算过程中,各个线程分摊进程中所有顶点的gather->apply->scatter操作。
GraphLab的执行模型
每个顶点每一轮迭代经过gather->apple->scatter三个阶段。
- Gather阶段
工作顶点的边 (可能是所有边,也有可能是入边或者出边)从领接顶点和自身收集数据,记为gather_data_i,各个边的数据graphlab会求和,记为sum_data。这一阶段对工作顶点、边都是只读的。 - Apply阶段
Mirror将gather计算的结果sum_data发送给master顶点,master进行汇总为total。Master利用total和上一步的顶点数据,按照业务需求进行进一步的计算,然后更新master的顶点数据,并同步mirror。Apply阶段中,工作顶点可修改,边不可修改。 - Scatter阶段
工作顶点更新完成之后,更新边上的数据,并通知对其有依赖的邻结顶点更新状态。这scatter过程中,工作顶点只读,边上数据可写。
在执行模型中,graphlab通过控制三个阶段的读写权限来达到互斥的目的。在gather阶段只读,apply对顶点只写,scatter对边只写。并行计算的同步通过master和mirror来实现,mirror相当于每个顶点对外的一个接口人,将复杂的数据通信抽象成顶点的行为。