图数据对一组对象(顶点)及其关系(边)进行建模,可以直观、自然地表示现实世界中各种实体对象以及它们之间的关系。在大数据场景下,社交网络、交易数据、知识图谱、交通和通信网络、供应链和物流规划等都是典型的以图建模的例子。图 1 显示了阿里巴巴在电商场景下的图数据,其中有各种类型的顶点(消费者、卖家、物品和设备)和边(表示了购买、查看、评论等关系)。此外,每个顶点还有丰富的属性信息相关联。
nerror="javascript:errorimg.call(this);">
图 1:阿里巴巴电商场景图数据示例
1、 图的交互查询
nerror="javascript:errorimg.call(this);">
图 2:左,金融反欺诈示例;右,图学习示例。
2、 图分析
3、 基于图的机器学习
不仅仅是阿里巴巴,近年来图数据和计算技术一直是学术界和工业界的热点。特别是,在过去的十年中,图计算系统的性能已提高了 10~100 倍,并且系统仍在变得越来越高效,这使得通过图计算来加速AI和大数据任务成为了可能。实际上,由于图能十分自然地表达各种复杂类型的数据,并且可以为常见的机器学习模型提供抽象。与密集张量相比,图能提供更丰富的语义和更全面的优化功能。此外,图是稀疏高维数据的自然表达,并且图卷积网络(GCN)和图神经网络(GNN)中越来越多的研究证明,图计算是对机器学习的有效补充,在结果的可解释性、深层次推理因果等方面将扮演越来越重要的作用。
nerror="javascript:errorimg.call(this);">
图 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 查询。对于图分析系统,传统的点中心编程模型使图级别的现有优化技术不再可用。此外,许多现有系统也基本未在编译器级别上做过优化。
数据集 ogbn-mag 是一个来自于微软学术的数据集。数据中包含四种类型的点,分别表示论文、作者、机构、研究领域;在这些点之间有表示关系的四种边:分别是作者“撰写”了论文,论文“引用”了另一篇论文,作者“隶属于”某个机构,和论文“属于”某个研究领域。这个数据很自然的可以用图来建模。
让我们分解一下这个计算任务:首先我们需要对论文及其相关的点边做一个根据年份的筛选,再需要在这个图上计算 kcore、triangle-counting 等全图计算,最后将这两个参数和图上的原始特征一起,放入一个机器学习框架进行分类训练和预测。我们发现当前已有的系统并不能很好的端到端解决这个问题,我们只能通过将多个系统组织成一个 pipeline 的形式运行:
nerror="javascript:errorimg.call(this);">
图 4:论文分类预测多系统组成的工作流
为了解决以上的问题,我们设计并研发了一站式开源图计算系统:GraphScope。
四 、GraphScope 是什么
GraphScope 提供 Python 客户端,能十分方便的对接上下游工作流,具有一站式、开发便捷、性能极致等特点。它具有高效的跨引擎内存管理,在业界首次支持 Gremlin 分布式编译优化,同时支持算法的自动并行化和支持自动增量化处理动态图更新,提供了企业级场景的极致性能。在阿里巴巴内部和外部的应用中,GraphScope 已经证明在多个关键互联网领域(如风控,电商推荐,广告,网络安全,知识图谱等)实现重要的业务新价值。
1、 架构介绍
nerror="javascript:errorimg.call(this);">
图 5:GraphScope 系统架构图
中间是引擎层,分别由交互式查询引擎 GIE,图分析引擎 GAE,和图学习引擎 GLE 组成,我们将在后续的章节中详细介绍。
2、 重解问题:论文分类预测
GraphScope 提供 Python客户端, 让数据科学家可以在自己熟悉的环境中完成所有图计算相关的工作。打开 Python 后,我们首先需要建立一个 GraphScope 会话。
import graphscopefrom graphscope.dataset.ogbn_mag import load_ogbn_magsess = graphscope.sesson()g = load_ogbn_mag(sess, "/testingdata/ogbn_mag/")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-authoredpapers = interactive.execute("g.V().has('author', 'id', 2).out('writes').where(__.in('writes').has('id', 4307)).count()").one()GIE 引擎由并行化 Compiler、内存和调度管理、Operator 运行时、自适应的游历策略和分布式 Dataflow 引擎等核心组件组成。在收到交互式查询的语句后,该语句首先会被 Compiler 拆分,编译成多个运行算子。这些算子再以分布式数据流的模型被驱动和执行,在这个过程中,每一个持有分区数据的计算节点都跑一份该数据流的拷贝,并行处理本分区的数据,并在过程中按需进行数据交换,从而并行化的执行 Gremlin 查询。
在通过一系列单点查看的交互式查询后,用户通过以上语句开始做图分析任务。
然后用户在这个新图上抽取了 label 为论文的点和他们之间关系为引用(cites)的边,产出了一张同构图,并在上面调用了 GAE 的内置算法 k-core 和三角计数 triangles 在全图做了分析型计算。产出结果后,这两个结果被作为点上的属性加回了原图。这里,借助于 vineyard 元数据管理和高层数据抽象,新的 sub_graph 是通过原图上新增一列的变换来生成的,不需要重建整张图的全部数据。
接下来我们开始用图学习引擎为论文分类。首先我们配置将数据中论文类节点的 128 维特征以及我们在上一步中计算出的 kcore 和 triangles 两个属性共同作为训练特征。然后我们从 session 中拉起图学习引擎 GIE。在拉起 GIE中 图 lg 时,我们配置了图数据,特征属性,指定了哪一类的边,以及将点集划分为了训练集、验证集和测试集。
from graphscope.learning.examples import GCNfrom graphscope.learning.graphlearn.python.model.tf.trainer import LocalTFTrainerfrom 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 引擎包含 Graph 与 Tensor 两部分,分别由各种 Operator 构成。Graph 部分涉及图数据与深度学习的对接,如按 Batch 迭代、采样和负采样等,支持同构图和异构图。Tensor 部分则由各类深度学习算子构成。在计算模块中,图学习任务被拆解成一个个算子,算子再被运行时分布式的执行。为了进一步优化采样性能,GLE 将缓存远程邻居、经常访问的点、属性索引等,以加快每个分区中顶点及其属性的查找。GLE 采用支持异构硬件的异步执行引擎,这使 GLE 可以有效地重叠大量并发操作,例如 I/O、采样和张量计算。GLE 将异构计算硬件抽象为资源池(例如 CPU 线程池和 GPU 流池),并协作调度细粒度的并发任务。
五 、性能
如图 6 所示,在交互式查询测试 LDBC SNB Benchmark上,单节点部署的 GraphScope 与开源系统 JanusGraph 相比,多数查询快一个数量级以上;在分布式部署下,GraphScope 的交互式查询基本能达到线性加速的扩展性。
nerror="javascript:errorimg.call(this);">
图 6:GraphScope 交互式查询性能
关于实验的设定、重现和完整的性能比较可以参见交互式查询性能[3]和图分析性能[4]。六 、拥抱开源
作者:开发者小助手_LS
本文为阿里云原创内容,未经允许不得转载
orientdb(一文了解阿里一站式图计算平台GraphScope)
