GNN与VCPM编程模型各阶段运算的对比分析

GNN各阶段运算的分析

这里,我们将GNN主要分为Message、Aggregate和Update这三个阶段。
具体细节可以参考我的这篇博客:《GNN典型模型的各阶段执行时间与算子分析》

  • Message阶段主要是对邻居节点的特征进行变换。
  • Aggregate阶段主要是聚合(scatter)上一步处理好的每个节点的邻居节点特征(生成一条消息)。
  • Update阶段主要是通过当前节点表示和上一步生成的消息,更新当前层节点的嵌入表示。

图计算编程模型(以VCPM为例)各阶段运算的分析

在这里插入图片描述
文章中将VCPM主要分为2个阶段,但是和GNN一样,从代码实现和计算的角度来看,Scatter阶段做了不止一件事。因此,我觉得可以打破作者原来的划分方式,按照GNN阶段划分的思路,并且在客观事实的基础上,重新对VCPM的阶段进行划分。
有一点需要注意:在GNN中是中心节点主动「聚合」邻居节点,而在VCPM中是中心节点被动接受邻居节点的「扩散」。两者的本质是一样的,只不过理解起来有点别扭。
在这里,我将重点关注了Process_EdgeReduceApply这三个函数,并将其划分为3各阶段。

  • Process_Edge:把源节点u的属性值和边(u,v)的权重作为输入,经过简单的加法或max/min运算,完成对(需要扩散)节点u属性的变换操作。
  • Reduce:目的节点v不断接受上一步生成的处理结果,进行归约(reduce:一般是max/min)操作,生成扩散给节点v的一条消息。
  • Apply:通过消息和节点v当前的属性值,更新生成新的节点v的属性值。

GNN v.s. VCPM

联系和相似之处:

  • 我们仔细去对比GNN的3个阶段和VCPM的3个阶段,不难发现,思路基本一致。
    Process_Edge其实就相当于Message阶段对邻居信息的处理和变换,只不过在VCPM中,这个过程是邻居节点主动进行的。在Aggregate阶段中,我一直觉得用scatter来形容可能并不是那么直观,直到看到VCPM中的Reduce。现在,我觉得用归约(reduce)来形容Aggregate阶段的scatter操作可能更直观。它们本质上都是在聚合邻居信息。最后,Update阶段几乎就是Apply函数照猫画虎得到的。

不同点:

  • 节点属性的不同导致了在每个阶段的实际运算方面差异很大。GNN的节点属性大都是向量或张量,在Message和Update阶段会使用带参数的NN;而VCPM的运算大都是不含参数的简单的加法、max/min等操作。
    这也就导致了Message和Update阶段虽然涉及到了访存(节点的特征矩阵X),但是和NN的运算量相比还是不值一提,因此它们都应该是计算密集型的,具有很高的计算访存比。
    而Process_Edge和Apply阶段的运算十分简单,显现出来的就是大量细粒度的访存,所以计算访存比比较低。

结论

经过一番折腾之后,GNN和VCPM的各主要阶段能够比较好的进行一一对应,并且每个阶段都有其代表性的操作/运算。不同之处在于每个阶段的具体实例化。

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/113172807