《图处理加速架构研究》第四章部分阅读感想

第 4 章 多模混合图神经网络加速架构

HyGCN具体的实现那一部分暂时还没看,主要是看了一部分加速架构的设计动机(4.1)、设计理念(4.2)、实验评估(4.5)、结果分析(4.6)、相关工作(4.7),想找一些和PyG相关的内容先看一下,也和之前在PyG上做的实验进行一个对比分析,检验一下之前想的和这里面写的是否一致。

Aggregate阶段和Combine阶段的特性分析

在第二章中,主要将GNN分为了Aggregate阶段和Combine阶段,一开始感觉有点不太对劲,因为他说的和MPNN中的好像不太一样,但是后来想了想,又和师姐讨论了一下,发现这么划分还是很有道理的,并且和PyG结合起来分析会更加明确一些。

文章里面一直在强调针对这两个阶段的加速问题,也通过实验分析出了每个阶段的特点。

Aggregate阶段因为涉及到邻居的访问,所以可以去类比图计算中的遍历,它的特点是动态计算和不规则访问。聚合阶段的特点也可以说是痛点在于「访存」。为什么这么说呢?因为节点的邻居是随机的,所以我们并不能“高瞻远瞩”去提前预知最近都会去访问哪些节点。我们访问节点的目的其实是要获取节点自身的特征/属性向量,然而,由于图的结构特性(一种访存的随机性),节点属性数据的时间局部性又很差。如果我们依旧使用原先的存储层次,会导致更多的DRAM访问、较高的L2/L3 cache不命中率以及大量无效的访存。

通过上面的分析,Aggregate阶段的特点也很明确了,就是不规则的访存,或者说是访存密集型的操作,虽然Aggregate阶段也有类似于逐元素的聚合操作,但是运算量和矩阵乘法没法比。所以,限制Aggregate阶段速度的主要是memory。怎样去避免或缓解这样一种不规则的访存是值得思考的一个问题。

Combine阶段因为涉及到NN、MLP等神经网络相关的变换,所以可以去类比传统的神经网络运算,它的特点是静态计算和规则访问。更新阶段的核心在于「计算」。这些变换基本上都是矩阵乘法运算,并且和传统NN有区别的地方在于,Combine阶段每一层当中的权重矩阵W在节点之间是共享的。这种共享一方面给原有的运算方法带来了新的挑战,另一方面也给我们指明了一条改进的思路,我们可以通过发掘其中的并行性和数据复用来进行加速。

通过上面的分析,Combine阶段的特点就是带有大量共享参数的计算过程,属于计算密集型的。虽然说Combine阶段也会涉及到访存,但都是针对矩阵的,很规则,时间和空间局部性都很好,所以主要的时间还是在于NN的计算。如何去利用共享的权重参数来加速运算,是这个阶段需要考虑的一个问题。

Aggregate阶段和Combine阶段做的事相差很大,一个主要在访存,一个主要在计算,也就是文章中所提到的混合行为模式,所以才提出来分别进行加速的思路。

PyG是如何去处理这两个阶段的

PyG是利用了MPNN框架去进行编程的,并且利用硬件去加速各个阶段。

对于一般的模型,首先进行Combine阶段,对节点的特征矩阵进行变换,实际上是把每一维的维数降下来,然后再进行Aggregate阶段去为每个节点聚合邻居的特征/属性信息。Combine阶段因为就是NN的运算,所以用NVIDIA的cuBLAS库来进行基于硬件的优化;Aggregate阶段涉及到不规则访存,所以用torch-scatter库进行加速(挖掘边级别的并行性)。到这里,基本和我之前做的实验能够对上了,一些结果也能够够得到比较好的解释。

但是,即便如此还是会有一些问题。第一点,还是数据的局部性比较差,这一点并没有实际去解决。还有就是这两个阶段都是各自基于硬件去优化,所以阶段之间的并行性也没有发掘出来。

还有就是关于采样的问题。文章并没有把采样算作是GNN的一个阶段,而是把它看作是一个预处理的过程,因为采样的时间确实很长。我在GraphSAGE的实验中也发现,采样时间确实不止长了一点半点,它和其他阶段的时间相差很大。其实采样也是一种不规则的访存,对于采样的优化其实也不能去忽视。

后面再去看一下PyG的paper,看看到底是怎么回事。

猜你喜欢

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