第四个步骤,得到汇聚后的消息后,可能还需要一个额外的Update,可能是通过一个神经网络进行,那么这个Update的结果其实就是最终的更新后的节点的表示 。那么这个步骤叫做Apply Vertex,那么这其实就是GPU Intensive 。
那么其实可以从这个范式里面可以看到:
第一,我们可以吸取以前GS的一些优良的系统,优化的一些策略,比如一些图划分、Pipeline、调度的策略 。
第二,这里也挑战,比如前文提到这是一个GPU和CPU交替intensive的一个任务,那么怎么优化?比如说GPU和CPU之间的数据传输,甚至是不同集群之间的数据传输,其实是一个非常重大的问题,也是近年来研究的热点 。那么接下来介绍一下它们之间的关系 。
2、图划分&图划分优化

文章插图
(1)单机上的图划分首先,对于第一个优化点,图划分和图划分的优化,本质上就是其实因为没办法把图放到显存和单机上面,因此就需要把图划分到不同的Server上面去 。对于Newer Graph来说,采用这种Locality Aware的图划分策略,相当让连在同一个节点上的边能尽可能在同一个窗口,这样再去做更新的时候,就不用访问其他的窗口,就可以优化内存的访问 。
(2)基于模型图划分第二个,ROC工作其实引入了Linear Regression Model,这个Linear Regression Model会去预测每一次Server里面的执行时间,然后通过这个执行时间去更新下一轮Partition的图Partition的策略 。这里是基于模型的Cost、Running Time的图的划分 。
(3)纵向划分节点特征P3这篇干脆就回避了划分的一些缺点,因为如果是基于节点或边的分割,会导致额外的信息通讯和信息损失,所以P3的划分就不是基于图的,而是基于特征的 。这个motivation的特征维度特别大,没办法全部放到同一个单机上面,但这个节点本质上是一个Adjacency List,是可以放到每一个单独的Server上面去的,因此可以对于每一个Server节点的特征进行动纵向划分 。Per dimension把这些划分放到各个机器上面去,这样既保证了图的完整性,也保证了Somehow减少信息通讯的代价 。
3、对于节点特征传输的优化

文章插图
很多工作都利用了节点特征传输的优化,会发现有些时候节点的原始特征是比GNN的Dimension大很多,尤其是当节点是一个C的特征,通过之后的Embedding,这个节点特征会非常非常大 。所以如果基于节点特征在节点的机器和机器之间做通信是非常不利的,不经济的 。怎么尽量去减少这种Move节点的这样的通信,或者说计算,也就是是对于节点特征传输的一个优化?那么这个地方也是有三项工作 。
PA graph其实就是一个静态缓存的机制 。比如我们知道某个显存可能只有20个G做计算,那显存如果还有10个G,就会去缓存一些节点的原始特征 。这个策略,本质上是基于静态的缓存机制,它会去把边的点的Out Degree进行排序,会把Out Degree多的点扔到缓存里面去,那显然Out Degree多的点很容易有更高的概率参与计算,所以说开始会把节点特征传输的通信量减少 。
在DistGNN里面,设计了一个更复杂的开始Blocking的机制 。这个开始Blocking的机制会把节点分为两类——要更新的目标节点和目标节点邻居节点 。传统的方法是基于目标节点进行遍历,然后去拉它的邻居节点DistGNN 。这里说的机制则是反向去遍历邻居节点,然后对目标节点特征进行alternately的更新 。这样做好处是目标节点的特征会放到CPU的缓存里面,每次去找邻居节点,只需要读一次,不需要缓存,每次去更新目标节点的时候,都是在CPU缓存里面更新 。这样子就是可以减少反复拉取邻居节点的开销 。
对于P3来说,这个设计就会更复杂一些,因为P3的目标是不希望产生任何原始特征之间拉取的通信,所以设计了一个hybrid parameter的机制 。对于输入层的GNN来说,模型会并行在每一个单机,也就是每一个单机有一部分特征 。计算出sub partial activation,然后每个机器在本地计算完partial activation,会把这个partial activation汇聚成一个输入层的GNN的输出,得到这个输入层的GNN输出以后,再走正常的Data Parallelism,去做这样计算的动机是原始特征的维度特别大,那么第一层GNN的参数和通信量都会非常大 。而除了第一层以外,其他GNN的黑洞Size其实都会比较小,这种时候如果在本地算好了第一层再去后面去算更深层的DNN,通信代价能大为减少 。
4、流水线、通信优化这是一个非常巧妙的设计,对于这种流水线通信的优化,就更不用说了 。流水线通信优化,其实也是传统的图计算里面做的非常多的,简单来说,同步更新的一些信息需要算完一轮特征以后再更新下一轮的特征,但有些时候可以不这样去做,而是一个异步更新,并且在异步更新的过程中,使数据聚合的过程中,或者在更新的过程中使用一些老的特征,同时也会设计一个老化机制 。
推荐阅读
- 哔哩哔哩数据服务中台建设实践
- 你了解ai绘画二次元男生图片怎么画的吗?
- 如何禁用Discord在启动时打开
- 黄河水流入哪个海!黄河最后流入哪个海
- 槿字取名寓意 瑾字取名寓意及含义
- 活虾怎么处理干净 活虾怎么处理虾线
- 翡翠玉雕——圆牌设计欣赏
- 打脸,她居然也出轨了!
- 女歌手毕夏,被骂上了热搜!
- 64岁的杨丽萍,被扫黄了
