共计 8809 个字符,预计需要花费 23 分钟才能阅读完成。
简介:随着大数据的暴发,图数据的利用规模一直增长,现有的图计算零碎依然存在肯定的局限。阿里巴巴领有寰球最大的商品常识图谱,在丰盛的图场景和实在利用的驱动下,阿里巴巴达摩院智能计算实验室研发并开源了寰球首个一站式超大规模分布式图计算平台 GraphScope,并入选中国科学技术协会“科创中国”平台。本文详解图计算的原理和利用及 GraphScope 的架构设计。
一、什么是图计算
图数据对一组对象(顶点)及其关系(边)进行建模,能够直观、天然地示意事实世界中各种实体对象以及它们之间的关系。在大数据场景下,社交网络、交易数据、常识图谱、交通和通信网络、供应链和物流布局等都是典型的以图建模的例子。图 1 显示了阿里巴巴在电商场景下的图数据,其中有各种类型的顶点(消费者、卖家、物品和设施)和边(示意了购买、查看、评论等关系)。此外,每个顶点还有丰盛的属性信息相关联。
图 1:阿里巴巴电商场景图数据示例
理论场景中的这种图数据通常蕴含数十亿个顶点和数万亿条边。除了规模大之外,这个图的继续更新速度也十分快,每秒可能有近百万的更新。随着近年来图数据利用规模的一直增长,摸索图数据外部关系以及在图数据上的计算受到了越来越多的关注。依据图计算的不同指标,大抵能够分为交互查问、图剖析和基于图的机器学习三类工作。
1、图的交互查问
图 2:左,金融反欺诈示例;右,图学习示例。
在图计算的利用中,业务通常须要以摸索的形式来查看图数据,以进行一些问题的及时定位和剖析某个深刻的信息,如图 2(左)中的(简化)图模型可被用于金融反欺诈(信用卡非法套现)检测。通过应用伪造的标识符,“犯罪分子”能够从银行取得短期信用(顶点 4)。他尝试通过商家(顶点 3)的帮忙,以虚伪购买(边 2->3)来兑现货币。一旦从银行(顶点 4)收到付款(边 4->3),商家再通过其名下的多个帐户将钱(通过边 3->1 和 1->2)退还给“犯罪分子”。这种模式最终造成一个图上的闭环(2->3->1…->2)。实在场景中,图数据在线上的规模可能蕴含数十亿个顶点(例如,用户)和数千亿至万亿条边(例如,领取交易),并且整个欺诈过程可能波及到许多实体之间蕴含各种束缚的动静交易链,因而须要简单的实时交互剖析能力很好的辨认。
2、图剖析
对于图剖析计算的钻研曾经继续了数十年,产生了很多图剖析的算法。典型的图剖析算法包含经典图算法(例如,PageRank、最短门路和最大流),社区检测算法(例如,最大团 /clique、联通量计算、Louvain 和标签流传),图开掘算法(例如,频繁集开掘和图的模式匹配)。因为图剖析算法的多样性和分布式计算的复杂性,分布式图剖析算法往往须要遵循肯定的编程模型。以后的编程模型有点核心模型“Think-like-vertex”,基于矩阵的模型和基于子图的模型等。在这些模型下,涌现出各种图剖析零碎,如 Apache Giraph、Pregel、PowerGraph、Spark GraphX、GRAPE 等。
3、基于图的机器学习
经典的 Graph Embedding 技术,例如 Node2Vec 和 LINE,已在各种机器学习场景中宽泛应用。近年来提出的图神经网络(GNN),更是将图中的构造和属性信息与深度学习中的特色相结合。GNN 能够为图中的任何图构造(例如,顶点,边或整个图)学习低维表征,并且生成的表征能够被许多上游图相干的机器学习工作进行分类、链路预测、聚类等。图学习技术已被证实在许多与图相干的工作上具备令人信服的性能。与传统的机器学习工作不同,图学习工作波及图和神经网络的相干操作(见图 2 右),图中的每个顶点都应用与图相干的操作来抉择其街坊,并将其街坊的特色与神经网络操作进行聚合。
二、图计算:下一代人工智能的基石
不仅仅是阿里巴巴,近年来图数据和计算技术始终是学术界和工业界的热点。特地是,在过来的十年中,图计算零碎的性能已进步了 10~100 倍,并且零碎仍在变得越来越高效,这使得通过图计算来减速 AI 和大数据工作成为了可能。实际上,因为图能非常天然地表白各种简单类型的数据,并且能够为常见的机器学习模型提供形象。与密集张量相比,图能提供更丰盛的语义和更全面的优化性能。此外,图是稠密高维数据的天然表白,并且图卷积网络(GCN)和图神经网络(GNN)中越来越多的钻研证实,图计算是对机器学习的无效补充,在后果的可解释性、深层次推理因果等方面将表演越来越重要的作用。
图 3:图计算在 AI 各个领域具备广大的利用前景
能够预感,图计算将在下一代人工智能的各种利用中施展重要作用,包含反欺诈,智能物流,城市大脑,生物信息学,公共安全,公共卫生,城市规划,反洗钱,基础设施,举荐零碎,金融技术和供应链等畛域。
三、图计算现状
通过这些年的倒退,已有针对各种图计算需要的多种零碎和工具。例如在交互查问方面,有图数据库 Neo4j、ArangoDB 和 OrientDB 等、也有分布式系统和服务 JanusGraph、Amazon Neptune 和 Azure Cosmos DB 等;在图剖析方面,有 Pregel、Apache Giraph、Spark GraphX、PowerGraph 等零碎;在图学习上有 DGL、pytorch geometric 等。尽管如此,面对丰盛的图数据和多样化的图场景,无效利用图计算加强业务成果仍然面临着微小的挑战:
- 现实生活中的图计算场景多样,且通常非常复杂,波及到多种类型的图计算。现有的零碎次要是为特定类型的图计算工作设计的。因而,用户必须将简单的工作合成为波及许多零碎的多个作业。在零碎之间可能会产生大量例如集成、IO、格局转换、网络和存储方面的额定开销。
- 难以开发大型图计算的利用。为了开发图计算的利用,用户通常应用简略易用的工具(例如 Python 中的 NetworkX 和 TinkerPop)在一台机器上从小规模图数据开始。然而,对于普通用户而言,扩大其单机解决方案到并行环境解决大规模图是极其艰难的。现有的用于大规模图的分布式系统通常遵循不同的编程模型,并且不足单机库(例如 NetworkX)中丰盛的即用算法 / 插件库。这使得分布式图计算的门槛过高。
- 解决大图的规模和效率依然无限。例如,因为游历模式的高度复杂性,现有的交互式图查问零碎无奈并行执行 Gremlin 查问。对于图剖析零碎,传统的点核心编程模型使图级别的现有优化技术不再可用。此外,许多现有零碎也根本未在编译器级别上做过优化。
上面咱们通过一个具体的示例看看现有零碎的局限性。
1 示例:论文分类预测
数据集 ogbn-mag 是一个来自于微软学术的数据集。数据中蕴含四种类型的点,别离示意论文、作者、机构、钻研畛域;在这些点之间有示意关系的四种边:别离是作者“撰写”了论文,论文“援用”了另一篇论文,作者“隶属于”某个机构,和论文“属于”某个钻研畛域。这个数据很天然的能够用图来建模。
一个用户冀望在这个图上对 2014-2020 年间发表的“论文”做一个分类工作,冀望能依据论文在数据图中的构造属性、本身的主题特色、以及 kcore、三角计数 triangle-counting 等团圆度的掂量参数,将其归类并预测文章的主题类别。实际上,这是一个非常常见和有意义的工作,这个预测因为思考了论文的援用关系和论文的主题,能够帮忙钻研人员更好的发现畛域内的潜在单干和钻研热点。
让咱们合成一下这个计算工作:首先咱们须要对论文及其相干的点边做一个依据年份的筛选,再须要在这个图上计算 kcore、triangle-counting 等全图计算,最初将这两个参数和图上的原始特色一起,放入一个机器学习框架进行分类训练和预测。咱们发现以后已有的零碎并不能很好的端到端解决这个问题,咱们只能通过将多个零碎组织成一个 pipeline 的模式运行:
图 4:论文分类预测多零碎组成的工作流
这个工作看起来是解决了,实际上这样流水线的计划背地暗藏着许多问题。例如多个零碎之间相互独立和割裂,两头数据频繁落盘进行零碎间的数据传递;图剖析的程序不是申明性语言,没有固定范式;图的规模影响机器学习框架的效率等等。这些都是咱们在事实图计算场景中常遇到的问题,总结一下能够概括为以下三点:
- 图计算问题十分复杂,计算模式多样,解决方案碎片化。
- 图计算学习难度强,老本大,门槛高。
- 图的规模和数据量大,计算简单,效率低。
为了解决以上的问题,咱们设计并研发了一站式开源图计算零碎:GraphScope。
四、GraphScope 是什么
GraphScope 是阿里巴巴达摩院智能计算实验室研发并开源的一站式图计算平台。依靠于阿里海量数据和丰盛场景,与达摩院的高水平钻研,GraphScope 致力于针对实际生产中图计算的上述挑战,提供一站式高效的解决方案。
GraphScope 提供 Python 客户端,能非常不便的对接上下游工作流,具备一站式、开发便捷、性能极致等特点。它具备高效的跨引擎内存治理,在业界首次反对 Gremlin 分布式编译优化,同时反对算法的主动并行化和反对主动增量化解决动态图更新,提供了企业级场景的极致性能。在阿里巴巴外部和内部的利用中,GraphScope 曾经证实在多个要害互联网畛域(如风控,电商举荐,广告,网络安全,常识图谱等)实现重要的业务新价值。
GraphScope 汇合了达摩院的多项学术研究成绩,其中的核心技术曾取得数据库畛域顶级学术会议 SIGMOD2017 最佳论文奖、VLDB2017 最佳演示奖、VLDB2020 最佳论文提名奖、世界人工智能翻新大赛 SAIL 奖。GraphScope 的交互查问引擎的论文也已被 NSDI 2021 录用,行将发表。还有其它围绕 GraphScope 的十多项研究成果发表在畛域顶级的学术会议或期刊上,如 TODS、SIGMOD、VLDB、KDD 等。
1、架构介绍
图 5:GraphScope 零碎架构图
GraphScope 的底层是一个分布式内存数据管理系统 vineyard[1]。vineyard 也是咱们开源的一个我的项目,它提供了高效和丰盛的 IO 接口负责与更底层的文件系统交互,它提供了高效和高层次的数据抽象(包含但不限于图,tensor,vector 等),反对治理数据的分区、元数据等,能够为下层利用提供本机零拷贝的数据读取。正是这一点反对了 GraphScope 的一站式能力:在跨引擎之间,图数据按分区的模式存在于 vineyard,由 vineyard 对立治理。
两头是引擎层,别离由交互式查问引擎 GIE,图剖析引擎 GAE,和图学习引擎 GLE 组成,咱们将在后续的章节中具体介绍。
最上层是开发工具和算法库。GraphScope 提供了各类罕用的剖析算法,包含连通性计算类、社区发现类和 PageRank、核心度等数值计算类的算法,后续会一直扩大算法包,在超大规模图上提供与 NetworkX 算法库兼容的剖析能力。此外也提供了丰盛的图学习算法包,内置反对 GraphSage、DeepWalk、LINE、Node2Vec 等算法。
2、重解问题:论文分类预测
有了一站式计算平台 GraphScope,咱们能够用一种更简略的形式解决后面示例中的问题。
GraphScope 提供 Python 客户端,让数据科学家能够在本人相熟的环境中实现所有图计算相干的工作。关上 Python 后,咱们首先须要建设一个 GraphScope 会话。
import graphscope
from graphscope.dataset.ogbn_mag import load_ogbn_mag
sess = graphscope.sesson()
g = load_ogbn_mag(sess, "/testingdata/ogbn_mag/")
在下面的代码中,咱们建设了一个 GraphScope 的 session,并载入了图数据。
GraphScope 面向云原生设计,一个 session 的背地对应了一组 k8s 的资源,该 session 负责这个会话中所有资源的申请和治理。具体来说,在用户这行代码的背地,session 首先会申请一个后端总入口 Coordinator 的 pod。Coordinator 负责跟 Python 客户端的所有通信,在实现本身的初始化后,它会拉起一组引擎 pod。这组 pod 中每一个 pod 都有一个 vineyard 实例,独特组成一个分布式内存管理层;同时,每一个 pod 中都有 GIE、GAE、GLE 三个引擎,它们的启停状态由 Coordinator 在后续按需治理。当这组 pod 拉起并与 Coordinator 建设稳固连贯、实现健康检查后,Coordinator 会返回状态到客户端,通知用户,session 已拉起胜利,资源就绪能够开始载图或计算了。
interactive = sess.gremlin(g)
# count the number of papers two authors (with id 2 and 4307) have co-authored
papers = interactive.execute("g.V().has('author','id', 2).out('writes').where(__.in('writes').has('id', 4307)).count()").one()
首先咱们在图 g 上建设了一个交互式查问对象 interactive。这个对象在引擎 pod 中拉起了一组交互式查问引擎 GIE。接着上面是一个规范的 Gremlin 查问语句,用户想在这个数据中查看两个具体作者的单干论文。这个 Gremlin 语句会发送给 GIE 引擎进行拆解和执行。
GIE 引擎由并行化 Compiler、内存和调度治理、Operator 运行时、自适应的游历策略和分布式 Dataflow 引擎等外围组件组成。在收到交互式查问的语句后,该语句首先会被 Compiler 拆分,编译成多个运行算子。这些算子再以分布式数据流的模型被驱动和执行,在这个过程中,每一个持有分区数据的计算节点都跑一份该数据流的拷贝,并行处理本分区的数据,并在过程中按需进行数据交换,从而并行化的执行 Gremlin 查问。
Gremlin 简单的语法下,游历策略至关重要并影响着查问的并行度,它的抉择间接影响着资源的占用和查问的性能。只靠简略的 BFS 或是 DFS 在事实中并不能满足需要。最优的游历策略往往须要依据具体的数据和查问动静调整和抉择。GIE 引擎提供了自适应的游历策略配置,依据查问数据、拆解的 Op 和 Cost 模型抉择游历策略,以达到算子执行的高效性。
# extract a subgraph of publication within a time range
sub_graph = interactive.subgraph("g.V().has('year', inside(2014, 2020)).outE('cites')")
# project the projected graph to simple graph.
simple_g = sub_graph.project_to_simple(v_label="paper", e_label="cites")
ret1 = graphscope.k_core(simple_g, k=5)
ret2 = graphscope.triangles(simple_g)
# add the results as new columns to the citation graph
sub_graph = sub_graph.add_column(ret1, {"kcore": "r"})
sub_graph = sub_graph.add_column(ret2, {"tc": "r"})
在通过一系列单点查看的交互式查问后,用户通过以上语句开始做图剖析工作。
首先它通过一个 subgraph 的操作子从原图中依据筛选条件抽取了一个子图。这个操作子的背地,是交互式引擎 GIE 执行了一个查问,再将后果图写入了 vineyard。
而后用户在这个新图上抽取了 label 为论文的点和他们之间关系为援用(cites)的边,产出了一张同构图,并在下面调用了 GAE 的内置算法 k-core 和三角计数 triangles 在全图做了剖析型计算。产出后果后,这两个后果被作为点上的属性加回了原图。这里,借助于 vineyard 元数据管理和高层数据抽象,新的 sub_graph 是通过原图上新增一列的变换来生成的,不须要重建整张图的全副数据。
GAE 引擎外围继承了曾取得 SIGMOD2017 最佳论文奖的 GRAPE 零碎[2]。它由高性能运行时、主动并行化组件、多语言反对的 SDK 等组件组成。下面的例子用到了 GAE 自带的算法,此外,GAE 也反对用户非常简略的编写本人的算法并在其上即插即用。用户以基于子图编程的 PIE 模型编写算法,或者重用已有图算法,而不必思考分布式细节,由 GAE 来做主动并行化,大幅升高了分布式图计算对用户的高门槛。目前,GAE 反对用户通过 C ++、Python(后续将反对 Java)等多语言编写本人的算法逻辑,即插即用在分布式环境。GAE 的高性能运行时基于 MPI,对通信、数据排布,硬件特色做了非常粗疏的优化,以达到极致性能。
# define the features for learning
paper_features = []
for i in range(128):
paper_features.append("feat_" + str(i))
paper_features.append("kcore")
paper_features.append("tc")
# launch a learning engine.
lg = sess.learning(sub_graph, nodes=[("paper", paper_features)],
edges=[("paper", "cites", "paper")],
gen_labels=[("train", "paper", 100, (1, 75)),
("val", "paper", 100, (75, 85)),
("test", "paper", 100, (85, 100))
])
接下来咱们开始用图学习引擎为论文分类。首先咱们配置将数据中论文类节点的 128 维特色以及咱们在上一步中计算出的 kcore 和 triangles 两个属性独特作为训练特色。而后咱们从 session 中拉起图学习引擎 GIE。在拉起 GIE 中 图 lg 时,咱们配置了图数据,特色属性,指定了哪一类的边,以及将点集划分为了训练集、验证集和测试集。
from graphscope.learning.examples import GCN
from graphscope.learning.graphlearn.python.model.tf.trainer import LocalTFTrainer
from graphscope.learning.graphlearn.python.model.tf.optimizer import get_tf_optimizer
# supervised GCN.
def train_and_test(config, graph):
def model_fn():
return GCN(graph, config["class_num"], ...)
trainer = LocalTFTrainer(model_fn,
epoch=config["epoch"]...)
trainer.train_and_evaluate()
config = {...}
train_and_test(config, lg)
而后咱们通过下面的代码选用模型以及做一些训练相干的参数配置就能够非常便捷的用 GLE 开始做图分类工作。
GLE 引擎蕴含 Graph 与 Tensor 两局部,别离由各种 Operator 形成。Graph 局部波及图数据与深度学习的对接,如按 Batch 迭代、采样和负采样等,反对同构图和异构图。Tensor 局部则由各类深度学习算子形成。在计算模块中,图学习工作被拆解成一个个算子,算子再被运行时分布式的执行。为了进一步优化采样性能,GLE 将缓存近程街坊、常常拜访的点、属性索引等,以放慢每个分区中顶点及其属性的查找。GLE 采纳反对异构硬件的异步执行引擎,这使 GLE 能够无效地重叠大量并发操作,例如 I/O、采样和张量计算。GLE 将异构计算硬件形象为资源池(例如 CPU 线程池和 GPU 流池),并合作调度细粒度的并发工作。
五、性能
GraphScope 不仅在易用性上一站式的解决了图计算问题,在性能上也达到极致,满足了企业级需要。咱们应用 LDBC Benchmark 对 GraphScope 的性能进行了评估和比照测试。
如图 6 所示,在交互式查问测试 LDBC SNB Benchmark 上,单节点部署的 GraphScope 与开源零碎 JanusGraph 相比,少数查问快一个数量级以上;在分布式部署下,GraphScope 的交互式查问根本能达到线性减速的扩展性。
图 6:GraphScope 交互式查问性能
在图分析测试 LDBC GraphAnalytics Benchmark 上,GraphScope 与 PowerGraph 以及其余最新零碎比拟,简直在所有算法和数据集的组合中居于领先水平。在某些算法和数据集上,跟其余平台比拟最低也有五倍的性能劣势。部分数据见下图。
图 7:GraphScope 图剖析性能
对于试验的设定、重现和残缺的性能比拟能够参见交互式查问性能 [3] 和图剖析性能[4]。
六、拥抱开源
GraphScope 的白皮书、代码曾经在 github.com/alibaba/graphscope 开源[5],我的项目恪守 Apache License 2.0。欢送大家 star、试用,参加到图计算中来。也欢送大家奉献代码,一起打造业界最好的图计算零碎。咱们的指标是继续更新该我的项目,一直晋升性能的完整性和零碎的稳定性。
作者:开发者小助手_LS
原文链接
本文为阿里云原创内容,未经容许不得转载