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

  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相当于每一个顶点对外的一个接口人。将复杂的数据通信抽象成顶点的行为。

參考资料

p=215">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进入我的博客主页

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

开源图计算框架GraphLab介绍的更多相关文章

  1. 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

  2. 开源实体映射框架EmitMapper介绍

    开源实体映射框架EmitMapper介绍   综述       EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/.       Emit ...

  3. GraphLab介绍[转]

    GraphLab介绍 原文链接:http://blog.jasonding.top/2015/06/08/Machine%20Learning/%E5%BC%80%E6%BA%90%E5%9B%BE% ...

  4. Spark入门实战系列--9.Spark图计算GraphX介绍及实例

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...

  5. 腾讯开源进入爆发期,Plato助推十亿级节点图计算进入分钟级时代

    腾讯开源再次迎来重磅项目,14日,腾讯正式宣布开源高性能图计算框架Plato,这是在短短一周之内,开源的第五个重大项目. 相对于目前全球范围内其它的图计算框架,Plato可满足十亿级节点的超大规模图计 ...

  6. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  7. 图计算 on nLive:Nebula 的图计算实践

    本文首发于 Nebula Graph Community 公众号 在 #图计算 on nLive# 直播活动中,来自 Nebula 研发团队的 nebula-plato 维护者郝彤和 nebula-a ...

  8. Spark(十七)图计算GraphX

    一.图概念术语 1.1 基本概念 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种数据结构. 这里的图并非指代数中的图.图可以对事物以及事物之间的关系建模,图可以用来表示自然发 ...

  9. GraphX 图计算实践之模式匹配抽取特定子图

    本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...

随机推荐

  1. ASP.NET - Eval数据绑定

    <!--新闻分类--> <div id ="category" class ="Frm"> <h4>新闻分类</h4& ...

  2. GreenDao数据库结构升级

    1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...

  3. osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo

    生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在执行期间,为应用程序提供操作osgi框架的方法 Bundle 代 ...

  4. Swift - 发送消息(文本,图片,文件等)给微信好友或分享到朋友圈

    通过调用微信提供的API接口,我们可以很方便的在应用中发送消息给微信好友,或者分享到朋友圈.在微信开发平台(https://open.weixin.qq.com)里,提供了详细的说明文档和样例.但由于 ...

  5. 关于VC6编译LPDIRECT3D8不通过的问题

    重装了系统,打开以前的工程看看,重新编译发现类似的错误: error C2146: syntax error : missing ';' before identifier 'lpdi' fatal ...

  6. UpdateWindow API函数的作用很明显

    待续 摘自<Delphi深度历险>

  7. TWinControl.DefaultHandler处理WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC消息的两个参数很有意思,两个都是传递句柄

    procedure TWinControl.DefaultHandler(var Message); begin then begin with TMessage(Message) do begin ...

  8. iOS国际化时遇到的错误:read failed: the data couldn&#39;t be read because it isn&#39;t in the correct format.

    事实上这个错误非常easy,就是当我们在国际化的时候,写key,写着写着就忘了加 ";" 所以查看一下自己的Localization文件就能够了

  9. 《生活在Linux中》之:使用Bash就是使用Emacs

    定义bash Emacs模式下的快捷键请参考: Readline-在BASH下自定义键盘热键 未完待续...

  10. 移动无边框窗体(设置标志位更流畅,或者发送WM_SYSCOMMAND和SC_MOVE + HTCAPTION消息)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...