开源图深度学习框架DGL的机遇与挑战|NUC2022

先简单介绍一下,我叫王敏捷,现在是亚马逊云科技上海人工智能研究院的资深应用科学家,我们研究院成立不久,主要研究的内容其实就是图。我们知道图(Graph)其实是一个非常广阔的东西,它包含的不仅仅是数据结构本身,它包含的是一种关系,甚至于是知识这样的一种范式。

相信听过上半场很多这些talk的同学们或者老师们,肯定对这一点是毋庸置疑了——就是我们的图数据其实在整个生产生活当中是无处不在的,在一些比如说非常微观的层面上,我们的药物和分子结构其实可以认为是一种图的结构,然后在我们的电商等等场景当中,像社交网络产品的交互网络知识图谱等等,其实都是图的数据结构。

那既然图的数据结构有那么多样,而且无处不在,在图上的机器学习也会有各种各样的种类,这边我简单地抽象地概括一下,比如说我们现在有这张图,我们在这个图上其实有很多种不同的机器学习任务,比如说我可以对这个节点去做一个预测,我可以试图去分析,比如说一个用户他的兴趣爱好是什么,其实这就是在图上做节点分类的这样一个任务。

对应的我们既然有节点分类任务,也可以有链接预测的任务,比如说我现在这张图上有一条边,我去判断边的属性,其实这就是一个边预测的任务。我可以对一个已有的边进行分类,也可以去判断两个节点之间它是不是存在一条边,其实都是链接预测的这样的任务。相对应的例子,比如说像推荐系统,知识图谱股权等等,其实都是链接预测对应的实际应用。

最后也会有整图检测这样的一个任务。整图检测往往是一个比对于比较小的这些图,比如说我们可以把药物的分子或者说一些化合物把它给认为是主图的结构,然后我去判断说给定一个药分子的这样一个图的结构,我能不能去预测出分子是否具有我们想要的某种化学性质,这类的任务就是整图的性质预测。

刚刚讲的可能是一些比较抽象的分类,接下来我讲几个实际的例子。

第一个例子,我们实际做的一个客户案例。这个客户是一个社交平台,它的一个任务是水军检测,它的数据其实大家在PPT上可以看到——有一个异构图,这个图上有两类节点,一类是这个帖子的节点,一类是用户的节点,我分别用圆圈方块来表示,这些边代表的是用户和帖子的交互关系,比如说用户点赞转发帖子等等这些。水军检测这个任务对应的是,如果出现一类新的交互关系,我要去判断说这个关系究竟是一个好的关系,还是一个恶意的关系,其实这对应的就是我们刚刚提到的边的分类任务。

所以其实可以看到,对于水军检测这样一个任务本身,我们可以把它给抽象成一个图上的机器学习任务。

当时我们想做的一个任务叫做药物重定位,什么叫药物重定位?我们知道一个新的病毒产生,我们希望能够立马找到它的靶向药,但是一个药物的审批流程是非常长的,所以我们想要做的事情就是在已经审批过的药物当中,能不能把这个药物重定向为新的病毒的靶向药。当然这个过程是非常复杂的,我们做了这么一个知识图谱,叫做药物重定位知识图谱(DRKG)。

可以看到左边这个知识图谱的Schema是非常复杂的,在这个图当中,比如说有Compound的化合物基因,包括Disease等等不同类型的节点,我们怎么去解决药物重定位的问题?其实也是同样的思路,我们把药物重定位的问题给映射成这个图上的一个机器学习问题。

如果把药物重定位映射成图上机器学习问题,它其实对应的就是一个链接预测,我希望能够去判断,比如一个疾病节点,它是不是潜在地和某一个药物节点之间有一个潜在的靶向连接关系,如果说通过数据分析能够判断出来有这样潜在的连接关系,就有理由相信说这类药物是治疗这类病毒的一个潜在的药物。

通过这个方式我们也做了一些建模,包括一些数据分析,最终的结果我们发现通过这个图数据分析的方式,所推荐的41种药物当中,有11种还确实是被用于Covid-19的临床实践的。所以可以看到其实在这个图数据当中,我们可以学习出很多有重要价值的信息和(取得)一些结果。

实际过程中使用图数据去解决问题,大家可能会想到说我有这样的任务,我有这样的一个需求,我应该用怎样的模型去解决它呢?

现在主流的或者说一个非常火热的方向,(就是)把我们知道已经非常成功的深度学习技巧引入到图数据的学习当中,因此也就诞生了一类新的图数据库,叫做图神经网络GraphNeuralNetwork,GNN。

什么是GNN?我这边做一个简单的介绍,如果做个类比的话,我们可以想象说非常常见的传统的比如说卷积神经网络,它是用于比如说图像识别这些任务,其实这些神经网络它的一个目的就是说我获得一份输入的数据,然后把这些输入数据变成一种高维空间中的向量表征。其实图神经网络也是对应的类似的这样一个技巧,它的输入数据是个图,所以自然地我就可以把这个图上的点边,甚至于整张图这个数据通过图神经网络的学习映射成一个高维的向量——其实这就是图神经网络。

这边有个简单的例子,比如说我们可以看到左边的输入数据是一个简单的社交网络,每个节点是个用户,用户和用户之间是朋友的关系,我可以通过神经网络给不同的用户生成一个高维空间的向量,它不仅仅包含比如说用户本身的画像信息,同时也会包含它周围邻居的结构信息。通过这样一个画像,这样的一个高维向量,我可以把它输入到分类器中去判断说他的一个兴趣爱好。

图数据网络为什么强大?一个原因就在于它在计算的过程当中,其实不仅仅考虑了一个节点自己的画像信息,也考虑了一个节点它周围的邻居的结果。

同样的,图神经网络也利用这样的一个很朴素的思想,也就是说当我在计算某一个节点的向量的时候,我会去收集它周围邻居的向量特征,然后做个聚合,通过这样的不断的迭代的方式,我可以获得图神经网络的最终输出的结果。

这边简单看一个公式,总体来说就是刚刚我们所说的这样一个过程,就是通过收集邻居信息,然后再做聚合的过程。

这个过程叫做消息传递,可以用一个数两个数学公式去表达。大家要记住这个词,消息传递是非常重要的,是我们图神经网络一个核心的概念。这当中其实包含了两类的计算,一类是在边上计算,去计算一个节点,到底要给邻居发怎样的消息,对应的当中也会有一个函数叫做消息函数。

然后另外一个是在节点上发生的计算,就是说(节点)现在收到了很多邻居的消息,我怎么把它给聚合起来,所以这对应的也会有一个累和函数。然后我通过了这些累和的消息以及我自身的消息,去重新更新自己的向量特征,所以这边会有一个更新函数。

图神经网络的灵活性以及强大在于,我刚刚所提到的这些消息函数、累和函数、更新函数,可以通过你自己的场景和任务本身去定制,也就是说图神经网络它不是一个模型,它是一类模型,而我完全可以根据你到底是做的怎样一个下游任务,去定制化这样的一个函数来获得更好的效果。

在学术圈,在今年年中刚刚结束的亚马逊云科技的发布会上,我们的资深副总斯瓦米(Swami)也是专门提到了GraphNeuralNetworks,他专门提到说GraphNeuralNetworksarethenextbigthing。也就是说其实不论是学界还是工业界,都是认为图神经网络是非常重要的、里程碑式的一个发展。

正是因为看到了这样一类新的神经网络的诞生,所以我们其实整个团队也是很快就跟上了。

这边可以看到右边是一些不同的推特,就说当时我们刚刚上线的时候,有很多的知名学者,包括像图灵奖获得者YannLeCun也是专门给我们点赞,我们现在的GitHubStar数已经超过1万了,总体来说在一个良好的这样的一个增长的趋势当中。可以这么说,DGL在学界可以说是全球领先的深度学习框架之一,在业界DGL的使用率上也是全面领先。

所以为什么DGL这么受人欢迎,我总结下来有4个原因——

第一个是我们有一个灵活应用的编程接口。图神经网络其实是作用在图上的这样的一类神经网络,所以其实包括我们刚刚看到这些消息传递对吧?我收集连接的信息,然后再累和其实都是图上的一个概念,所以我们采用了一个以图为核心的这样一个编程接口,使用户在编写图神经网络过程当中觉得非常的简单易懂。

第二点是我们有非常高效的底层系统设计,原因也是因为图和比如说我们常见的深度学习所遇到的数据,比如说张量等等是不一样的,图它是稀疏的,并且它是不规则的,所以他其实对于底层比如说用GPU加速是有挑战的,在这一点上就是专门实现了很高效的底层设计,使得比如说大家写了一个图神经网络,它能够很方便的在GPU上进行加速。

第三点就是我们有优秀的巨图训练性能。在实际场景当中一个图可能非常大,可能有百亿级的点和边,怎么去训练这样的大图是一个非常难的挑战。DGL在这当中做了很多的探索,也做了很多的实践。

最后就是说DGL其实在很多的学术顶会上都做过手把手的教程,包括像KDD、WWW等等,而且我们作为开源项目也会把所有的材料全部公开在网上,所以如果大家想要学习DGL想要去上手的话,可以在这些网站上找到我们的这些学习材料。

然后我们也知道就是说作为一个开源项目,一个很重要的就是建立一个开源生态,所以我这边也简单罗列了一下基于DGL所开发的很多项目,或者比较有interaction的一些项目。

首先是可视化,因为我们知道这个图是个非常复杂的数据,比如说我看张图片或者说看一段文本,我能够很清晰地了解它到底是什么意思,但是我看到这张图我可能就懵了,我不知道这个图连接在一起到底是什么意思,对吧?所以可视化就是个非常重要的一个手段去给我们的客户解释说图数据到底意味着什么。这边我们也看到有像学界的GNNLens,包括业界的HGNN等等这些,他们都基于DGL开发了可视化的工具。

第二点是复杂图,因为我刚提到的一些图,比如社交网络它可能更多的是比较简单的图,因为其实只有一类节点,就是用户,用户之间比如说有个朋友的关系——但实际,我们看到很多的图它是异构的,它有不同类型的节点和不同类型的边,在复杂图上怎么去建模,这是一个比较难的问题,我们这边也有专门是北京邮电大学的石川老师组,可以说是国内做异构图最有名的组,他们所开发的叫做OpenHGNN这样一个项目,专门给大家提供了异构图的很多模型库,所以如果大家感兴趣的话,也可以去看一下OpenHGNN。

接下来就是GNN的评测标准,作为一个新兴领域,我们肯定需要有很好的评测标准来衡量哪个图层网络模型更好,所以这边有OpenGraphBenchmark,OGB也是现在目前最火热的benchmark之一,基于他也是开放了DGL的接口。

数据库的话,就是说我们知道有很多数据它其实不在内存里面,它可能一开始是来自于比如用户自己的这些数据的warehouse这边,也像有就AmazonNeptuneML、Neo4j、ArangoDB,他们都提供了关于DGL的这样的一个开放的接口,我后面会提到我们的NebulaGraph,NebulaGraph其实和DGL也有一个良好的数据接口,然后我们专门还有一个和NebulaGraph的这样的一个实践案例,后面我会提到。

接下来是自然语言处理。这一点可能大家会觉得有点surprise,为什么自然语言处理和Graph有关系?事实上我们去看一个文本的时候,我们去理解一段文本,其实一个很自然的想法是去理解它的结构,比如说我去理解这个段和段之间的上下的因果关系,所以其实在我们研究院看来,我们研究图本身不仅仅是应该局限在图数据,也应该去看说比如说一些非结构化数据当中有没有图这样的一个关系,其实学界当中和我们的想法有很多地方是不谋而合的,所以这边也有像GraphNLP这些专门基于NGLbuild的给这些NLP的库。

生命科学也是非常重要,我刚提到像分子生物医药等等,还有这些微观的数据,其实可以认为是图,所以DGL也有专门的面向分子生物的包叫做DGL-LifenSci,像在这个领域做研究,做了很多的同学可能会了解deepchem这么一个package,这个package是有提供DGL所实现的模型,

简单看一下DGL这三年的开发历程,其实我们从2018年年底发布第一个版本之后,一直在不断的开发新的功能,然后也是几乎每三个月大概是开发一个新的版本,然后每个版本就会添加很多不同的这样的一个支持,比如说大图的一些采用的算法的支持,包括分布式的训练等等。

介绍完DGL的事情,我想讲一下我们作为一个开源图机器学习框架面临的一些核心的挑战。

事实上如果我们去看市面上的图神经网络框架其实有很多对吧?不仅有DGL,还有像PaddleGraphLearning、Jraffe、PyG等等,有很多这样的一个package。

你可以想象就为什么有那么多package,原因也很简单,就是我们还做得不够好,否则的话也不会有那么多package对吧?那就说明它其实有很多的挑战是我们没有办法很好解决的,也是我们在看的主要的方向。这些方向我总结下来一共有三点,第一点是易用性,我怎么让用户使用开发这个图神经网络变得非常方便。第二点是高性能,怎么让他们训练的过程变得非常快。最后就是大规模图我怎么去解决,在一个图上就是一个巨图的这样的问题。

大家可以看到这个图当中其实有很多的交集,也就是说其实我们在做的过程中,我们会发现,其实很多情况下它是有trade-off的,比如说如果我在易用性上我要达到一个完美的易用性,很有可能我在性能上就会有做一些损失,这个当中就会有带来了很多的研究的问题和挑战。

所以接下来我可能会讲一些我们研究院在这几个不同的交集当中,我们做的一些实践,以及我们做的一些研究的课题。

首先的一个问题我想说的是易用性加上高性能,因为我们做下来发现一个很大的点是说神经网络已经很难了,然后图又是一个很复杂的数据,所以当我们把这个图和神经网络结合在一块以后,就会发现这个事情特别难做,所以它的整个入门门槛是非常高的。

我这边做一个简单的举个例子就说这边有一个网络叫做Graph,其实大家不用特别担心说这个数这个公式怎么看上去那么复杂对吧?但是我可以给大家讲稍微讲一下,比如说大家如果回想一下图神经网络,我刚刚提到其实就是两类计算对吧?一个在边上的计算,一个是在点上计算。

我在边上要做的事情是把一个节点的消息发给邻居,在点上要做的事情是说我收到很多邻居的消息把它聚合,对吧?所以说如果我去看GAT这个模型公式,其实它也就是这两个计算,比如说公式1和公式2和公式6,你可以看到他其实做的都是说在这个节点的边上,我计算某个东西,对吧?

我们不用管它算的是什么东西,你可以直接认为公式1、2、6它其实就是在边上进行计算,然后7这个公式是在点上算的,它的做法就是把这个点上就我刚刚算出来这些边上的消息做一个有机的结合,然后再把它聚合起来。

Ok,所以这就是GraphAttentionNetwork,GAT这样一个模型。

如果我们去编写一个code在当中,其实边我们提供了两套方式去编写,第一套方式我们叫它User-definedFunction,UDF。这个一看到就是说如果用户去写UDF的话,它写出来是这样的一个两个函数,第一个叫做message,第二个叫做aggregate对吧?虽然说写程序写的不多的同学可能不太了解,但是大概还是能够看出来,比如说每一行代码它对应的哪一行公式,对吧?

所以其实整体的代码逻辑是非常简单的,而且能够自然而然看出来它的对应关系,这样的一类编程接口就是非常直观,但是一个问题是在于说它非常低效,原因是在于我们要为了支持这样一种非常直观的编程方式,需要把图这种不规整的数据结构整理成规整的数据结构。

我可以举个例子,比如在图上很常见的情况是一个节点,它可能有不同数目的邻居,可能有的节点它是一个名人节点对吧?我可能有100万个邻居,但有些节点可能就像我们这样的,可能也就是比如说100、200个朋友对不对?你在计算这个消息累和的过程当中,它的计算的代价是很不一样的,我为了要支持这样的一个方式,我需要把它进行分类。

比如说节点度数比较高的,我把它给聚在一块,节点度数低的我把它给分成另外一块,然后通过不同的批次的计算完成整个计算,可以想象这个计算本身是非常耗时的,原因也是因为我把一个大的规整,我把大的计算把它切成了很多小计算,切成小计算的代价,就是会增加很多系统上的一些overhead。

所以在DGL当中我们提供了另外一种编程方式,就说对于一些高级的用户,我们推荐大家是怎么去写GAT这个模型?是让他们直接调用我们已经包装好的底层的算子。比如说下面这个例子,如果我要用DGL包装好的底层的算子去实现阶梯模型是怎么做的?

可以看到就是说首先虽然我有大概的还有个对应,比如说我这边用注释写了,说每一行公式对应的是哪一些代码,但是这个代码本身其实的可读性已经比上面要低很多了,我并不能很快的去了解说到底每一个operation到底在干什么。

这边可以看到有很多DGL的调用,比如说如我们看下面的这些调用,其实就是我刚刚提到的说提交已经封装好的底层的这些算子交给用户去做,但是理解这些算子的本身是有代价的,所以可以看到说这个当中也就是另外一类编程模型的这样一个问题,它虽然非常高效,因为每一个就是很高效的算子去帮你高效GPU的加速,但是它是直白的,然后这当中的性能差距能有多大呢?

当然得判断这个图的分布是怎样,但是最终的结果我们测下来大概平均会有10倍到100倍的差距,所以这个差距是非常大的。

Ok,所以这其实就有一个trade-off在里面,就我刚刚提到的在易用性和高性能之间,它是有一个要做权衡的。

比如说右边可以看到我刚刚提到的OpenGraphBenchmark,OGB这样的一个评测集当中的数据集的大小,可以看到其实现在最大的图也是比之前要大很多了,像MAG-LSC有大概240million这样的一个规模,但是这个规模和我们工业界遇到的图的规模还是差很多的,我们公益就遇到了规模肯定是要在百亿千亿级量,就相相当于是这个图的大概10倍到100倍以上。

所以可以看到就说学界还没有感受到工业界的这样的一个规模,但是在这样的规模上其实已经有很多的问题了。

因为这个图很大,我没有办法把整个图放到内存当中,该怎么办?其实是需要做一个采样的方式去做训练的。这个在GNN当中我们也称之为叫做小批次训练,mini-batchtraining。

Mini-batchtraining包含好几个步骤,首先是第一个步骤是,因为整个图没有办法放到内存里面,所以只能先选取目标节点,然后去看这个目标节点的邻居子图,把这个子图拿出来,这个图就小了。抽取出子图之后,再去根据子图的关系去把它对应的特征给拿出来,拿出来之后就获得了一些比较小的图。

然后在这个子图上训练网络,比如说可以把这个图放到GPU上,因为GPU内存有限,但这个子图变得很小,我就把它放到GPU上进行训练,然后我在不断重复这个步骤,直到它的收敛。

可以看到其实整个过程是比普通的深度神经网络的小批次训练要复杂的,而这个过程由于它包含了很多的步骤,所以我们在设计DGL的子图训练框架的过程当中,也把它给分割成了不同的模块。

比如说对于第一个,我们把我们给定一个节点,我们去抽取他的邻居的子图,这个模块我们称之为采样模块,这个模块就在右边这个图上对应的叫做samplingcomponent,这个模块它负责的作用,就是说我把这个子图抽出来,把它给喂到下面的步骤当中去做计算。

然后第二个是子图的特征的存储,我们知道子图特征其实本质上是很多高维向量特征,高维向量特征我其实可以用一个传统的keyvaluestore的方式把它给存储起来,其实我们专门为图神经网络设计了一个Keyvaluestore的这样一个component,然后当把这个图采样和子特征都已经抽取出来之后,就可以把它给放到接下来的输入到接下来训练模块里边,而训练模块就很有可能在GPU上,而且可能会有多个这样的训练模块进行之间进行一个协作,可以获得一个更高效的并行训练的效果。

然后这样的训练分割其实可以部署到不同的硬件环境上面,包括我刚刚说的采样模块,特征模块、训练模块,根据不同的硬件环境,我可以采取不同的部署。

举个例子,如果现在是个单GPU训练这样的一个流程,现在有个Graffstructure和一个Nodefeature,这些图都很大、整个特征包括图结构都很大,我没有办法放到GPU上。那该怎么做呢?OK,我(可以)放到CPU上。

通过刚刚说的先做一个子图的抽取,抽取完之后对这个子图做一些变换,然后把它对应的feature把它给抽出来,最终把它给交到GNN上做一个训练,其实这就是在单GPU上的整个训练的流程。

在传统的训练硬件的部署方面,其实是因为这个图很大,所以只能把前面的这些采样包括特征抽取的流程放在CPU上,然后把后面训练的流程放在GPU上。那这个过程就显而易见会带来一个问题,就是我们在从CPU到GPU的数据拷贝,它会成为整个训练的瓶颈。

所以在DGL其实是上一个版本0.8这个过程当中,我们其实就对刚刚我说的流程进行了一个更新,我们的总体原则是说我们希望把更多的计算放在GPU上,这样才能更高效。但是因为GPU内存不够,所以我们需要使用新的技术来解决内存限制的问题。

我们使用新的技术就叫做CUDAUVA这样一个技术,如果我用一句话来概括它就是说我可以在CPU上开辟一块空间,这个空间的大小可以和你的CPU的用量一样大,但是这块空间是可以被GPU访问的。这其实就解决了刚刚说的你的CPU用量不够,但是又想用GPU进行加速的这样一个问题。

通过使用GPUUVA的技术,我可以把所有的图的结构包括feature的结构把它放到UVAmemory当中,这部分memory虽然在CPU上,但是GPU可见的,然后我把后面的所有的流程全部通过GPU进行加速,整个过程就会达到一个非常高效的这样性能。

好,这个是在单GPU上的训练流程,如果说我们图更大对吧?我可能一个机器的内存都存不下,我该怎么办对吧?其实一个很自然的想法,就是说我们能不能通过一些已有的infrastructure来解决这个问题,这个当中最重要的一个infrastructure之一就是这个图数据库了,那图数据库有哪些特性呢?

首先我们可以看图数据库它是天然支持海量巨图的,对吧?图不论多大,我可以分布式存储。同时图数据库另外几个好处,比如说可以支持数据持久化,可以支持实时的事务性操作,包括灵活的图查询语言,为什么灵活的图查询语言非常重要?因为其实大家可以想我采样的过程,我给定一个节点,我去拿到这个节点的这样的一个周围的邻居过程,其实是完全就等价于说我在图做了一个查询操作。

Ok,其实可以看到图数据库包含这些很好的一些性质。我们刚刚也提到DGL有丰富的GNN的模型库,然后我们有高效的GPU的实现,我们也可以实现多机多卡的这样一个训练。

自然而然我们可以思考说能不能把它们结合起来,结合起来的一个想法也非常简单,就是我刚刚提到的我把图数据库作为我们这个图采样系统,因为它支持图查询语言它可以作为采样的一个部分,对吧?而且它可以支持海量的巨图,然后我把图样本从图数据库当中抽取出来之后,交给DGL只要作为GNN训练系统进行操作——所以这个就是一套整套的一个新的这样的一个design。

这边其实我们也是给我们客户做的一个案例,这个案例也是非常有幸地使用到了NebulaGraph的技术。这是在我们的AWS云上所做的这样的一个architecture,可以看到整个过程当中,核心就是说你可以看到NebulaGraph所做的事情,就是一旦这个节点它是一个实时系统,就说我这个图就算在整个运行过程当中有新的节点,新的边加进来,它也是可以满足需求的。

因为NebulaGraph是有实时的事务性操作的功能,在这边其实NebulaGraph所起的作用就是一个图采样系统。我们通过graphdatabase拿到sub-graph,也就是我们说的子图,获得子图之后,我们再交给DGL,我们DGL是部署在Amazon的SageMaker这样的一个endpoint上,然后通过DGL的计算,我们可以获得这样的一个更高效的这样一个训练效果。

接下来我也想说一下训练成本的这样一个问题,因为其实刚刚我记得之前嘉宾也提到说训练非常慢,其实不仅仅慢也很贵。

我现在这边做一个简单的例子,我使用的一个数据叫做是OGB里边的一个数据叫做MAG240M,然后它这个数据规模有多大?我刚刚提过了,它其实有240million这样的一个节点,所以它的图结构数据大概是30GB,节点特征大概是200GB左右这样一个量级。

如果使用CPU加GPU的混合训练,我需要把这些数据全部放在CPU上,所以需要一台这样的机器——这个机器在AWS上大家可以查到它的价格大概是8美元一小时,ok,有人说我可能还是比较有钱的对吧,所以我可以用得起这样的一个这样的一个数据这样的机器。如果说我想要用全GPU训练,我们把它的速度再push到一个limit,对吧?我想要更快怎么办?我需要很多的GPU它的总的容量,GPU内存总容量能够放下所有的就是图结构包括特征结构,这个时候我就需要4台这样的机器,你的价格就已经上升很多了,对吧?

同时我们要考虑就是说这个图本身还不是最大的,事实上如果我们去考虑Internet,我们整个互联网对吧?互联网我们认为它是个图,它的整个链接关系都可以认为是连接关系,这个图的大小是MAG240的10倍以上,我们可以想象我们的训练成本有多贵,对吧?

所以训练成本其实是图神经网络现在大规模图神经网络训练上的一个很严重的问题。

当然解决问题肯定要一步步做,所以我们看到这个问题,我们先对推理的问题做了一定的优化。我们所采取的一个思路叫做叫Layer-wiseinflunce,按层的这样一个推理的范式。什么意思?就是我们发现为什么刚刚我们看到这个推理性能那么的慢,原因是因为传统的推理性能都是基于b这样的一种做法,就是Node-wiseinference。

Node-wiseinfluence的做法比如我要influenceA这个节点的结果,我怎么做?根据图神经网络的做法,我要去看他所有的邻居以及邻居的邻居的消息,对吧?所以对A来说我要计算它周围所有的节点。接下来我走到下一个batch,我要去算B的时候,很不幸它正好share所有A的neighbor,这个时候其实我就全部重新算了一遍,这个当中就有很多的计算冗余,这就是为什么之前我们看到计算那么慢的一个主要的原因。

因此我们的解决方案就是把这样的计算方式换成了Layer-wise的计算方式,也就是说我并不是先计算A和B,而是先计算它的二度邻居的inbeding,比如说C和D。通过这样的方式,每个节点都只需要计算一次,这就是为什么Layer-wisa要比它快很多。

当然Layer-wise也有它的问题,比如说我写了一个GraphSAGE,它是有三层的模型,每一层是一个sagecom的一个layer,当我把它变成一个Layer-wise的计算的时候,它的整个代码就看不懂了。因为Layer-wise它其实是break了我们的整个在计算的过程当中一个计算的逻辑,然后用户必须对所有的模型都要重写一份代码。

通过这个方式,其实我们做了一个研究工作,就叫做全自动的GNN推理。利用了刚刚我们提到的逐层Layer-wise推理的方式,同时为了解决我刚刚提到的用户编写代码困难,所以我们又设计了一个编译的框架,通过分析编译用户的代码,然后把它给自动地变成我们刚刚看到的Layer-wise这样的一个推理的一个代码,然后达到一个比较高效的推理速度。

Ok,谢谢大家。

NUC2022往期精彩内容回顾:

交流图数据库技术?加入Nebula交流群请先填写下你的Nebula名片,Nebula小助手会拉你进群~~

THE END
1.如何构建完整的知识体系框架?这就意味着你在学习绝大部分所谓的“新知识”时都不应该是从零开始,并且应该与你大脑中已有的知识和经验去联系起来,这样既能加快你学习新知识的速度,又能加深你对新知识的理解。 但要建立知识间的联系,就需要你以使用为目的去构建完整的知识框架,否则你又怎么会知道某一数学知识和物理知识是怎么关联的? https://www.jianshu.com/p/06e2b1a92a98
2.怎么学政治最快最有效的方法怎么学政治最快最有效的方法 政治学是一个概念密集型的学科,因此,建立一个概念框架是很重要的。学习政治的第一步就是掌握核心概念并理解它们之间的关系。阅读教材、课程大纲和参考书籍可以帮助你建立一个全面的概念框架。 1学习政治最快最有效的方法 建立概念框架:政治学是一个概念密集型的学科,因此,建立一个概念http://www.chusan.com/zhongkao/275171.html
3.小学语文教学中如何体现核心素养例如,在教学《草原的早晨》时,为了帮助学生把握文章的主题思想,感受草原辽阔以及牧民的淳朴,并进一步发展学生语言能力,教师可以指导学生用字典查阅文章的重点字词,将掌握字词作为语言学习的基础内容。同时引导学生流利准确和带有感情地朗诵课文,在朗诵实践当中积累语言知识,帮助学生建立起语言框架,培养语言能力,为学生语文https://www.qinxue365.com/fangfa/466954.html
4.考研政治复习这一个半月要要逐字逐句的从头到尾全面的把红宝书研读一遍,看目录、看大标题、看小标题,学会建立知识框架结构体系,将知识点置于知识结构体系中进行学习会事半功倍。同时仔细地做好笔记,笔记的主要内容就是要整理出各章节内容的体系框架,市面上有很多政治辅导书籍,上面也有很多关于每章节内容体系的框架表格,做得很https://www.unjs.com/kaoyan/beizhan/zhengzhi/20150325000000_1144874.html
5.机器学习实战从零开始深度学习(通过GPU服务器进行深度学习)2 利用Pytorch构建深度学习框架 2.1数据预处理与特征工程 2.2 如何决定要使用的层? 2.3 损失函数 2.4 优化器的选择 2.5 评估机器学习模型 2.6 模型的选择 3 案例实践——猫狗图像分类 3.1 数据集的建立(训练集+验证集) 3.2 数据预处理(图片数据转换成PyTorch张量) https://cloud.tencent.com/developer/article/1990845
6.家居行业创业计划书(通用10篇)日子如同白驹过隙,我们的工作又将在忙碌中充实着,在喜悦中收获着,让我们一起来学习写计划吧。计划怎么写才能发挥它最大的作用呢?以下是小编收集整理的家居行业创业计划书,欢迎大家分享。 家居行业创业计划书 1 一、关于创业的基本条件可行性概述 1、市场需求与本人的关联 https://www.ruiwen.com/chuangyejihuashu/4069988.html
7.一位资深司长工作40年的36忌:为什么要事毕回复?我以前写文章,不是漏了“怎么样”,就是少了“怎么办”,一看就知道是逻辑不清楚。 知道了这一点,我就有意识地把建立逻辑框架运用到工作的方方面面,这些年我思考琢磨了一个“五要素工作法”,即总结出一般工作都必须回答的五个方面的问题,即“理念—目标—机制—内容—方法”。一项规划、一个项目、一次会议或https://www.jfdaily.com/news/detail?id=80378
8.张华峰,史静寰:走出“中国学习者悖论”——中国大学生主体性学习这一悖论的提出带动了西方学者对中国学习者学习特质的热烈探讨,也引出了更多难以解释的新悖论。在比格斯基于西方教学实践提出的深层学习的概念框架中,只有以兴趣为代表的学习动机和以深层思考为代表的认知方式,才体现出学习者内生的主体性,才能促进学生的学习成果。反之,看重考试和就业的外部动机和强调浅层接收的认知策略https://www.cahe.edu.cn/site/content/11739.html
9.如何从零开始构建深度学习项目?这里有一份详细的教程深度学习项目的成功取决于数据集的质量。在本文的第 2 部分中,我们将探讨创建优质训练数据集的核心问题。 公开及学术数据集 对于研究项目,可以搜索已建立的公开数据集。这些数据集可以提供更整齐的样本和基线模型性能。如果你有多个可用的公开数据集,请选择与你的问题最相关且质量最好的样本。 自定义数据集 对于实际https://download.csdn.net/blog/column/10595130/111189422
10.阿里达摩院开源新框架:入局隐私保护计算,联邦学习迎来重磅玩家当下最主流的一种解决方案就是联邦学习,一种用来建立机器学习模型的算法框架。 在联邦学习的框架下,用户自身的数据从始至终都停留在用户自己的手机、汽车和各类物联网设备等终端内。 同时,训练机器学习模型需要的信息会以加密、加噪声或拆分等方式保护起来,聚合到云端的服务器进行模型更新,此后云端再将更新的模型推送https://www.51cto.com/article/708069.html
11.美国高中IB课程是什么IB考试有大量的阅读要求和写作论文,需要学生有很强的英语能力。在学习之余,同学们可以多看一些喜欢的英语书籍和电影,多多练习口语,提高英语水平。 3、建立学习框架 在备考时,同学们可以认真梳理各科的知识点,建立清晰的知识框架体系,有助于理解和记忆。还可以对照各科目的考试大纲,检查自己对知识点的掌握情况,针对不https://www.eol.cn/liuxue/guoji/20240926574411.html
12.如何用「8点网格」来规范你的设计?看这篇好文!优设网4. 建立icon的框架 △ Material Design icon的框架 图标通常需要不同的大小以保持相同的视觉重量。用框架来设计图标,这是保持尺寸一致性的简单方法。同时,框架能有效保证图标的大小符合网格的规范。同样记得把图标的框架大小设置成8的倍数,并从大的图标开始设计,缩放后记得对细节做调整。 https://www.uisdc.com/8-grid-regulate-design/