一种支持跨节点自动微分的分布式图神经网络训练方法

文档序号:31803175发布日期:2022-10-14 19:29阅读:65来源:国知局
一种支持跨节点自动微分的分布式图神经网络训练方法

1.本发明涉及分布式计算和深度学习领域,尤其涉及一种支持跨节点自动微分的分布式图神经网络训练方法。


背景技术:

2.传统的深度学习方法虽然已经在目标识别,自然语言处理,语音识别等领域取得了革命性的成功,并且促进了模式识别和数据挖掘的发展与研究,但是它只能处理欧式空间的数据,而许多实际应用场景中的数据是从非欧式空间生成的。图数据就是一种典型的非欧式结构的结构化数据,它能够很好的体现生活中很多场景对象之间的关联性,它由一系列的对象(nodes)和关系类型(edges)组成,具有局部连接的特点。传统的机器学习方法无法有效的处理这些图数据。因此一个新的研究热点“图神经网络(graph neural networks,gnn)”应运而生,当前出现了很多能够将深度学习的方法应用到图数据上的图神经网络算法,如gcn、gat、graphsage等。
3.发表在vldb 2019的“aligraph:a comprehensive graph neural network platform”的图神经网络系统aligraph,采用了一种缓存重要节点的邻居的策略来降低通信开销,但是这种策略引起了大量冗余计算和产生巨大存储空间成本的问题。因为一个节点很有可能是多个节点的邻居节点,当其邻居节点分布在不同的机器上时,该节点会被拷贝到多个机器,从而引起重复的计算开销。例如,当有神经网络模型是两层时,需要将以该节点的邻居节点为根节点,将邻居节点的一跳邻居的节点作为叶节点的这样一个子树都拷贝在该节点的机器上,如果该邻居节点有多个邻居则需要可能需要将子树拷贝多份到不同的机器上,产生大量的冗余计算。而存储这样的子树同时也占据了巨大存储的空间。
4.发表在mlsys上的“improving the accuracy,scalability,and performance of graph neural networks with roc”提出的图神经网络训练系统roc,采用不缓存节点嵌入值,通过通信获取远程邻居节点的节点嵌入值。但是roc采用了单一的处理引擎,即单向通信,正向和反向传播阶段都是主节点给镜像节点发消息,这样的设计导致了正向和反向的计算不灵活。因为图神经网络的前向传播计算与反向传播计算具有不同的计算逻辑。在前向计算中,每个节点从集群中收集邻居节点的信息,产生的中间变量将被缓存并用于反向计算中。在反向计算中,每个点基于前向传播的结果计算邻居节点的梯度并将结果发送给其邻居(本地或者远程机器)。这两种计算具有不同的特征,但是如果使用单一图传播模型进行处理,在反向传播计算时,每个主节点要首先将自己的梯度值发送给镜像节点,然后镜像节点收到主节点传来的梯度值后再根据依赖关系计算需要给邻居节点传递的梯度值,这样的处理策略导致反向计算图和正向计算图不能在同一台机器上执行,所以无法使用现有的深度学习库的自动微分库,只能手动实现反向传播的算子。同时为了支持不同的图神经网络算法在roc上训练,需要根据每一种算法的特性来手动实现正向和反向的计算算子,尤其要求用户需要手动推导其反向计算逻辑,这对用户来说是极其困难的。同时,手动实现的算子也难以保证其高效性和易用性。
5.aligraph采用的缓存重要节点的策略,会产生大量的冗余计算,占用大量的存储空间,而roc单一的处理引擎导致了正向反向的计算不灵活,对不同的算法都需要手动实现对应逻辑的算子。


技术实现要素:

6.针对现有技术的不足,本发明提出一种支持跨节点自动微分的分布式图神经网络训练方法;
7.一种支持跨节点自动微分的分布式图神经网络训练方法,具体包括以下步骤:
8.步骤1:对分布式图神经网络进行正向训练;
9.步骤1.1:首先对用户提供的图数据使用图划分方法如meits进行划分,划分一部分点及其入边给每一个机器;
10.步骤1.2:每个机器基于划分后的图数据,建立master-mirror机制;
11.步骤1.2.1:每个机器将划分到的节点表示为master点即主节点,每个机器负责执行master节点的计算;
12.步骤1.2.2:这些master点即主节点在其他机器中作为源点体现边关系的称为mirror点即镜像点,一个master点可能成为在其他多个机器中的镜像点;
13.步骤1.3:对图神经网络正向训练的训练过程进行分析、解耦、训练;即使用synchronize-compute引擎执行图计算,现有深度学习库执行神经网络计算;
14.步骤1.3.1:图神经网络每一层的每一个节点正向计算的公式为:
[0015][0016]
其中,分别表示第i层和第i+1层节点v的嵌入值;n(v)表示节点v的邻居节点,表示节点v的邻居节点的节点表示;w
i+1
分别表示第i+1层的可学习参数;σ表示引入非线性变换的函数;aggregate
i+1
表示第i+1层结合邻居节点和自身节点的嵌入值的计算方式;combine
i+1
表示第i+1层聚合计算;
[0017]
步骤1.3.2:基于步骤1.3.1正向传播计算公式,进一步将其细粒度地解耦为图传播计算和神经网络计算两部分:
[0018][0019][0020]
其中,表示第i+1层经过图传播计算后得到的节点v的聚合的邻居表示;表示第i层节点v的嵌入值;表示节点v的邻居节点的节点表示;aggregate
i+1
表示第i+1层结合邻居节点和自身节点的嵌入值的计算方式;combine
i+1
表示第i+1层聚合计算;w
i+1
分别表示第i+1层的可学习参数;σ表示引入非线性变换的函数;
[0021]
步骤1.3.3:使用synchronize-compute模式计算引擎对图数据中的每个节点按照解耦后的图传播计算部分即公式2执行计算;其中,synchronize表示对一个节点的主备份和镜像备份的值进行同步,compute表示对节点执行计算;
[0022]
步骤1.3.3.1:首先进行synchronize;每个mirror节点即镜像节点进行节点嵌入的同步,从它的master节点,即对应的远程的主节点所在的机器拉取最新的节点嵌入值;
[0023]
步骤1.3.3.2:然后进行compute;因为master节点计算所依赖的所有数据都通过sychronzie通信缓存到了本地,所以master节点在本地根据图结构进行计算,即拉取它的入邻居的节点嵌入值执行计算,得到邻居表示;
[0024]
步骤1.3.4:使用现有的深度学习库,如pytorch、tensorflow、mindspore按照解耦后的神经网络计算部分即公式3执行计算得到节点的下一层嵌入值;
[0025]
步骤1.4:步骤1.3为一层图神经网络的正向训练过程,每一层的图神经网络的正向训练逻辑都相同;如果模型有n层,那么正向训练完成之后会得到第n层的节点表示;
[0026]
步骤1.5:然后基于第n层的节点表示和数据集提供的真实的节点表示,使用损失函数l得到损失值loss;该部分可以使用现有的深度学习库,如pytorch、tensorflow、mindspore完成;接下来基于损失函数和损失值进行反向训练;
[0027]
步骤2:对分布式图神经网络进行反向训练;
[0028]
步骤2.1:对图神经网络反向训练的训练过程进行分析、解耦、训练;即使用compute-synchronize引擎执行图计算,现有深度学习库的autograd库执行神经网络计算;
[0029]
图神经网络中的每一层的梯度包含两部分,一部分是节点嵌入梯度,另一部分是可学习参数的梯度;
[0030]
步骤2.1.1:基于正向训练过程即步骤1.3.1的训练公式使用链式求导规则进行梯度求值推导,得到图神经网络中的每一层可学习参数的梯度—公式4和每一层节点的嵌入梯度—公
[0031]
式5:
[0032][0033][0034]
其中,l表示损失函数;表示第i+1层可学习参数的梯度;表示第i层节点的嵌入梯度;表示对第i+1层节点的嵌入梯度求值公式;表示基于第i+1层的节点嵌入h
i+1
对第i+1层的可学习参数梯度的求值公式;表示基于第i+1层的节点嵌入h
i+1
对第i+1层邻居节点表示的梯度求值公式;表示对第i层节点的嵌入梯度聚合公式,此公式是图传播计算的反向传播过程;
[0035]
因为每一层的节点嵌入值h
i+1
都是由图传播计算得到的邻居表示嵌入值与可学习参数w
i+1
相乘得到的,所以每一层可学习参数梯度的求值和每一层节点的输出h
i+1

关;公式5等式右边的第三项对应于正向训练中的图传播计算部分公式2,是一个图计算,涉及通信操作;
[0036]
因此,将一层图神经网络反向训练过程解耦为神经网络操作—公式4、公式5中的因此,将一层图神经网络反向训练过程解耦为神经网络操作—公式4、公式5中的和图传播操作
[0037]
步骤2.1.2:使用现有的深度学习库的autograd库,如pytorch、tensorflow、mindspore等调用自动微分库执行公式4和5等式右边前两项得到当前层可学习参数的梯度和邻居表示的梯度
[0038]
步骤2.1.3:使用compute-synchronize模式计算引擎对图数据中的每个节点按照解耦后的图传播计算部分即公式5中的执行计算;
[0039]
步骤2.1.3.1:首先进行compute每个节点在本地执行反向计算,计算它需要传递给每个入邻居的梯度值;
[0040]
步骤2.1.3.2:然后进行synchronize每一个mirror即镜像点把它的梯度值发给远程的master点,master点聚合多个mirror点发来的梯度值,得到下一层的节点嵌入梯度
[0041]
步骤2.2:以上为一层图神经网络的反向训练过程,每一层的图神经网络的反向训练步骤都相同;如果模型有n层,那么反向训练完成之后会得到n层的参数梯度,然后机器之间通过通信对梯度进行同步,最后对参数更新,完成一轮训练;
[0042]
步骤3:对分布式图神经网络进行正向传播和反向传播训练后代表一轮训练结束;所述轮数由用户根据想要达到精度的不同而决定。
[0043]
本发明的有益技术效果:本发明的目的是设计与实现一种支持高效跨节点自动微分技术的分布式图神经网络训练技术,避免了用户手动推导和实现图神经网络模型反向传播训练的负担。相较于背景技术中的aligraph和roc系统,本发明减少了冗余计算开销,提升了系统的吞吐量。在通信与计算设计方面,本发明解耦了通信与计算,并根据图神经网络正向和反向的计算特性,设计实现了synchronize-compute和compute-synchronize双模式计算引擎来灵活支持正向反向的计算,大大减小了设计难度,使用master-mirror同步机制来支持高效的节点属性通信。
[0044]
本发明的方法将图神经网络训练过程解耦成通信与计算两部分,并根据图神经网络正向和反向的计算特性,在正向计算中,每个节点从集群中收集邻居节点的信息,产生的中间变量将被缓存并用于反向计算中。在反向计算中,每个点基于前向传播的结果计算邻居节点的梯度并将结果发送给其邻居即本地或者远程机器。实现自动微分的关键点就是在执行正向和反向计算之前,使用synchronize-compute双模式计算获取计算所需要的依赖项,保证在反向求梯度时所有的依赖数据都在本地,从而可以结合现有的深度学习自动微分库实现跨计算节点的自动微分。基于此逻辑以及对训练过程的解耦,本发明设计与实现
了synchronize-compute双模式计算引擎和master-mirror同步机制。
[0045]
使用master-mirror同步机制支持高效的集群间数据通信,避免了冗余计算。设计synchronize-compute和compute-synchronize双模式计算引擎实现正向和反向训练就地执行,以支持结合图引擎和现有成熟的自动微分库实现高效的跨计算节点的自动微分,避免了用户手动实现算子。同时,也正是基于本发明的设计,使得模型训练可以灵活选择特定硬件优化的深度学习库,如在gpu上优化执行的pytorch,tpu上优化执行的tensorflow,ascend人工智能芯片上优化执行的mindsore,以支持更加高效地模型训练。
附图说明
[0046]
图1本发明实施例系统模型训练示例流程图;
[0047]
图2本发明实施例compute-synchronize计算模式;
[0048]
图3本发明实施例与distdgl,roc系统实验数据的对比;其中,neutronstar为本发明设计与实现的系统。
具体实施方式
[0049]
下面结合附图和实施例对本发明做进一步说明;
[0050]
本发明以图示的形式形象化地描述使用本发明设计的系统训练由2层图神经网络层组成的图神经网络模型模型的流程,如图1所示。一种支持跨节点自动微分的分布式图神经网络训练方法,具体步骤为:
[0051]
正向训练过程:
[0052]
步骤1:首先对用户提供的图数据使进行划分:如图2所示,示例图数据由2个节点组成,将1号节点划分给机器0,2号节点划分给机器1;
[0053]
步骤2:基于划分后的图,建立master-mirror机制:
[0054]
步骤2.1:机器0的master点为1号点,机器1的master点为2号点;
[0055]
步骤2.2:机器0的mirror点为2号点,机器1的mirror点为1号点;
[0056]
步骤3:第一层图神经网络正向训练;
[0057]
步骤3.1:机器0中的master点1号节点在第一层图神经网络中的正向计算公式为:
[0058][0059]
其中,分别表示1号节点在第0层和第1层的嵌入值;n(1)表示1号节点的邻居节点{1,2};表示1号节点的邻居节点1和2第0层的嵌入值;w1分别表示第1层的可学习参数;σ表示引入非线性变换的函数;aggregate1表示第1层结合邻居节点和自身节点的嵌入值的计算方式;combine1表示第1层聚合计算。同理,机器1中的master点2号节点在第1层图神经网络中的正向计算公式为:
[0060][0061]
其中,分别表示2号节点在第0层和第1层的嵌入值;n(2)表示2号节点的邻居节点{1,2}。
[0062]
步骤3.2:基于步骤3.1正向传播计算公式,进一步将其细粒度地解耦为图传播计
算和神经网络计算两部分:
[0063][0064][0065]
其中,表示第1层经过图传播计算后得到的1号节点的聚合的邻居表示。同理,解耦后2号节点的计算公式为:
[0066][0067][0068]
其中,表示第1层经过图传播计算后得到的2号节点的聚合的邻居表示。
[0069]
步骤3.3:使用synchronize-compute模式计算引擎分别对1号节点、2号节点按照解耦后的图传播计算部分(3)、(5)执行计算;
[0070]
步骤3.3.1:synchronize:如图2正向所示,首先机器0上的mirror节点2号点通过通信从机器1上拉取第0层的嵌入值缓存到本地;
[0071]
步骤3.3.2:compute:因为1号节点计算所依赖的所有数据——1号节点和2号节点的第0层的嵌入值都已经在本地(机器0上),所以1号节点根据图结构拉取它的入邻居1号节点和2号节点的嵌入值执行计算,得到第1层的邻居表示
[0072]
同理,在机器1的计算,先执行synchronize,机器1上的mirror节点1号点通过通信从机器0上拉取第0层的嵌入值缓存到本地;然后执行compute,2号节点根据图结构拉取它的入邻居1号节点和2号节点的第0层的嵌入值执行计算,得到第1层的邻居表示
[0073]
步骤3.4:使用现有的深度学习库,如pytorch、tensorflow、mindspore等按照解耦后的(4)、(6)神经网络计算部分执行计算得到1号节点和2号节点的第1层嵌入值
[0074]
步骤4:第二层图神经网络正向训练;
[0075]
步骤4.1:机器0中的master点1号节点在第二层图神经网络中的正向计算公式为:
[0076][0077]
其中,分别表示1号节点在第1层和第2层的嵌入值;n(1)表示1号节点的邻居节点{1,2};表示1号节点的邻居节点1和2第1层的嵌入值;w2分别表示第2层的可学习参数;σ表示引入非线性变换的函数;aggregate2表示第2层结合邻居节点和自身节点的嵌入值的计算方式;combine2表示第2层聚合计算。同理,机器1中的master点2号节点在第2层图神经网络中的正向计算公式为:
[0078][0079]
其中,分别表示2号节点在第1层和第2层的嵌入值;n(2)表示2号节点的邻居节点{1,2}。
[0080]
步骤4.2:基于步骤4.1正向传播计算公式,进一步将其细粒度地解耦为图传播计
算和神经网络计算两部分:
[0081][0082][0083]
其中,表示第2层经过图传播计算后得到的1号节点的聚合的邻居表示。同理,解耦后2号节点的计算公式为:
[0084][0085][0086]
其中,表示第2层经过图传播计算后得到的2号节点的聚合的邻居表示。
[0087]
步骤4.3:使用synchronize-compute模式计算引擎分别对1号节点、2号节点按照解耦后的图传播计算部分(9)、(11)执行计算;
[0088]
步骤4.3.1:synchronize:如图2正向所示,首先机器0上的mirror节点2号点通过通信从机器1上拉取第1层的嵌入值缓存到本地;
[0089]
步骤4.3.2:compute:因为1号节点计算所依赖的所有数据——1号节点和2号节点的嵌入值都已经在本地(机器0上),所以1号节点根据图结构拉取它的入邻居1号节点和2号节点的嵌入值执行计算,得到邻居表示
[0090]
同理,在机器1的计算,先执行synchronize,机器1上的mirror节点1号点通过通信从机器0上拉取第0层的嵌入值缓存到本地;然后执行compute,2号节点根据图结构拉取它的入邻居的1号节点和2号节点的第0层的嵌入值执行计算,得到第1层的邻居表示
[0091]
步骤4.4:使用现有的深度学习库,如pytorch、tensorflow、mindspore等按照解耦后的(4)、(6)神经网络计算部分执行计算得到1号节点和2号节点第2层的嵌入值
[0092]
然后基于第1层的节点表示和数据集提供给的真实的节点表示,使用损失函数l得到损失值loss。该部分可以使用现有的深度学习库,如pytorch、tensorflow、minspore等完成;接下来基于损失函数和损失值进行反向训练。
[0093]
反向训练过程:
[0094]
步骤1:第二层图神经网络反向训练;
[0095]
步骤1.1:机器0中的master点1号节点在第2层图神经网络中的反向计算公式为:
[0096][0097][0098]
其中,l表示损失函数;表示第2层可学习参数的梯度;表示1号节点在第1
层的嵌入梯度;表示对1号节点在第2层节点的嵌入梯度求值公式;表示基于1号节点在第2层的节点嵌入h
12
对第2层的可学习参数梯度求值公式;表示基于1号节点在第2层的节点嵌入h
12
对第2层1号节点的邻居节点表示的梯度求值公式;表示对第1层节点的嵌入梯度聚合公式。同理,机器1中的master点2号节点在第2层图神经网络中的正向计算公式为:
[0099][0100][0101]
其中,表示2号节点在第1层的嵌入梯度;表示对2号节点在第2层节点的嵌入梯度求值公式;表示基于2号节点在第2层的节点嵌入对第2层的可学习参数梯度求值公式;表示基于2号节点在第2层的节点嵌入对第2层2号节点的邻居节点表示的梯度求值公式;表示对第1层节点的嵌入梯度聚合公式。
[0102]
步骤1.2:在两台机器上使用现有的深度学习库的autograd库,如pytorch、tensorflow、mindspore等调用自动微分库执行公式(13)、(15),(14)和(16)右边前两项得到当前层可学习参数的梯度和邻居表示的梯度
[0103]
步骤1.3:使用compute-synchronize模式计算引擎分别对1号节点、2号节点按照解耦后的图传播计算部分(公式(14)、(16)右边第三项——)执行计算:
[0104]
步骤1.3.1:compute如图2反向所示,首先机器0上的master节点1号点在本地执行反向计算,计算它需要传递给每个入邻居1号点和2号点的梯度值;
[0105]
步骤1.3.2:synchronize mirror节点2号点把它的梯度值通过通信发给远程的master点,即机器1上的2号点。机器1上的2号点聚合多个mirror点(来自于机器0和机器1)发来的梯度值,得到下一层的节点嵌入梯度
[0106]
同理,在机器1的计算,先执行compute,机器1上的master节点2号点在本地执行反向计算,计算它需要传递给每个入邻居1号点和2号点的梯度值;然后执行synchronize mirror节点1号点把它的梯度值通过通信发给远程的master点,即机器0上的1号点。机器0
上的1号点聚合多个mirror点(来自于机器0和机器1)发来的梯度值,得到下一层的节点嵌入梯度
[0107]
机器1和机器2通信同步第2层的参数梯度然后同步更新得到当前层的参数。
[0108]
步骤2:第一层图神经网络反向训练;
[0109]
步骤2.1:机器0中的master点1号节点在第1层图神经网络中的反向计算公式为:
[0110][0111][0112]
其中,l表示损失函数;表示第1层可学习参数的梯度;表示1号节点在第1层的嵌入梯度;表示对1号节点在第1层节点的嵌入梯度求值公式;表示基于1号节点在第1层的节点嵌入对第1层的可学习参数梯度求值公式;表示基于1号节点在第1层的节点嵌入对第1层1号节点的邻居节点表示的梯度求值公式;表示对第0层节点的嵌入梯度聚合公式。同理,机器1中的master点2号节点在第2层图神经网络中的正向计算公式为:
[0113][0114][0115]
其中,表示2号节点在第1层的嵌入梯度;表示对2号节点在第1层节点的嵌入梯度求值公式;表示基于2号节点在第1层的节点嵌入对第1层的可学习参数梯度求值公式;表示基于2号节点在第1层的节点嵌入对第2层2号节点的邻居节点表示的梯度求值公式;表示对第0层节点的嵌入梯度聚合公式。
[0116]
步骤2.2:在两台机器上使用现有的深度学习库的autograd库,如pytorch、tensorflow、mindspore等调用自动微分库执行公式(17)、(19),(18)和(20)右边前两项得到当前层可学习参数的梯度和邻居表示的梯度
[0117]
步骤2.3:因为当前层是模型的第1层,且在机器1和机器2已经计算得到了第1层的
梯度,所以不需要再使用compute-synchronize执行图上的计算,所以通信同步第2层的参数梯度然后同步更新得到当前层的参数。
[0118]
自此,完成一轮训练。
[0119]
通过master-mirror同步机制,正向和反向在计算前就可以通信获取依赖项的值。同时这种双模式计算引擎的设计,能够在本地对一个节点执行正向和反向的计算,即使得正向和反向计算图均在一个机器上执行。因此,这种设计可以天然地使用现有的成熟的深度学习库中的优化算子(包括自动微分算子)结合图传播引擎来执行正向和反向计算,而不需要用户手动实现算子,实现了跨计算节点的自动微分。同时,也是因为这种设计使得模型训练可以灵活切换使用特定硬件优化的深度学习库,如在gpu上优化执行的pytorch,tpu上优化执行的tensorflow,ascend人工智能芯片上优化执行的mindspore。
[0120]
基于以上分析和设计,本发明结合现有深度学习库和synchronize-compute模双模式计算引擎设计了跨计算机节点的自动微分工具链,将其抽象成算法表示如下:
[0121][0122]
该算法的输入是转置图(即将原始输入图的结构关系进行转向),边的权重,当前层的节点表示,后一层的梯度,当前层的邻居表示,当前层的可学习参数。输出是前一层的节点嵌入梯度。
[0123]
算法解释:第1行到第5行表示依据当前层的节点表示计算当前层的可学习参数和邻居表示的梯度,可以使用现有深度学习库,如pytorch、tensorflow、mindspore等的自动微分库计算出可学习参数w的梯度和邻居节点表示的梯度。分别对应于公式4等式右边的第二项和公式5等式右边的第二项。第6行到第11行表示根据链式求导法则求解参数w的全局梯度和前一层的节点嵌入梯度,分别对应于公式4,公式5的第一项。第12行到第16行表示每个节点计算需要给入邻居节点传递的梯度,并通过通信发送然后进行聚合计算得到前一层
的的节点嵌入梯度。第17行表示所有机器通过通信同步可学习参数的梯度,然后进行更新。第18行表示输出前一层的的节点嵌入梯度。
[0124]
本发明的实验是在由16台阿里云服务器组成的集群下进行的。每台机器的配置是16核cpu,62gb内存,nvidia tesla t4 gpu,操作系统是ubuntu 18.04。网络带宽是6gbps/s。
[0125]
数据集和gnn算法:实验测试使用了6个数据集:google、pokec、livej、reddi、orkut、wiki。同时,选取了三个具有代表性的图神经网络模型:gcn、gin、gat,实际实验时每个模型都是两层。
[0126]
对比系统:distdgl,roc。neutronstar为本发明设计与实现的系统;图3本发明实施例与distdgl,roc系统实验数据的对比;
[0127]
本发明使用6个真实世界图数据进行了实验对比,相较于distdgl和roc两种图神经网络系统,本发明的系统可以取得到1.8倍到15.8倍的加速比。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1