开源图计算框架GraphLab介绍

GraphLab介绍

GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架。框架使用C++语言开发实现。

该框架是面向机器学习(ML)的流处理并行计算框架,可以运行在多处理机的单机系统、集群或是亚马逊的EC2 等多种环境下。框架的设计目标是,像MapReduce一样高度抽象。可以高效运行与机器学习相关的、具有稀疏的计算依赖特性的迭代性算法,并且保证计算过程中数据的高度一致性和高效的并行计算性能。该框架最初是为处理大规模机器学习任务而开发的,可是该框架也相同适用于很多数据挖掘方面的计算任务。在并行图计算领域,该框架在性能上高出非常多其它并行计算框架(比如,MapReduce、Mahout)几个数量级。GraphLab 自成立以来就是一个发展非常迅速的开源项目,其用户涉及的范围也相当广泛,全球有2 000 多个企业、机构使用GraphLab。

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三个阶段。

  1. Gather阶段
    工作顶点的边 (可能是全部边。也有可能是入边或者出边)从领接顶点和自身收集数据,记为gather_data_i。各个边的数据graphlab会求和,记为sum_data。这一阶段对工作顶点、边都是仅仅读的。

  2. Apply阶段
    Mirror将gather计算的结果sum_data发送给master顶点,master进行汇总为total。

    Master利用total和上一步的顶点数据,依照业务需求进行进一步的计算,然后更新master的顶点数据,并同步mirror。

    Apply阶段中。工作顶点可改动,边不可改动。

  3. Scatter阶段
    工作顶点更新完毕之后,更新边上的数据,并通知对其有依赖的邻结顶点更新状态。

    这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进入我的博客主页

posted @ 2016-01-01 17:20  zfyouxi  阅读(7073)  评论(0编辑  收藏  举报