摘要
腾讯TEG在大数据机器学习以及数据挖掘方面,基于Spark,结合参数服务器PS开发了新平台Angel,在图计算方面对比Spark GraphX形成了新的训练模式,结合PS对参数的更新迭代,分布式环境下的数据通信做了新的设计。GraphX在分布式数据通信时,使用join操作导致多个worker之间的数据shuffle,使得模型更新变慢,而且临时数据导致空间利用率下降。而PSGraph使用PS可以有效降低这方面的时空消耗。
模型介绍
论文把图上的问题分为3类:
- 传统的图算法:PageRank,KCore,等
- 图嵌入算法:LINE,等
- 图神经网络算法:GCN,GraphSAGE,等
首先介绍一下PSGraph针对图算法的大致处理思路:worker处理部分子图,需要的信息从ps上拉取,处理结束后更新ps,更新当前结果。
PSGraph模型为处理图问题,跟其它分布式图处理系统GraphX一样,需要将图进行partition的划分,只不过其多了参数服务器的数据划分过程。图的partition划分基于节点的index,每个partition中存储部分节点,以及该部分节点的邻居列表。ps上存储的数据存节点id与参数数据的map,ps上的partition可根据行和列进行划分。
算法举例
文章挑选了5个不同的算法:PageRank,CommonNeighbor,Fast Unfolding,Line,GraphSAGE,介绍了其在PSGraph上的编程流程。
PageRank
pagerank需要频繁获得节点的邻居节点的pr值,因此ps上存节点index以及其对应pr值,每个batch拉取相关的节点pr值,然后计算新的pr值,最后push到ps上。这里可以有个优化,注意到大部分的pr值是不变的,可以将pr作为ps上存储的更新参数。ps上存有两个向量,分别是pr值以及上轮的pr值,每一轮节点pullpr,计算新的ps,并pushpr到ps,然后根据pr更新ps上的pr值,之后再重置ps上的pr向量。
CommonFriends
只计算有连接边的两个顶点的共同好友。ps上存储顶点的neighbor table。处理两个顶点时从ps上拉取neighbor table,计算重复的元素个数。
Fast Unfolding
基于模块度的社区发现算法。流程上首先将每个点看成单独的社区,之后每个顶点分别尝试与其邻居节点所在的社区结合,计算结合前后模块度的变化,如果模块度变化大于0,则将节点归属为是的模块度增大最多的邻居节点的社区,如果小与0则不变。循环迭代,直到所有的值都不变化。在这个过程中,ps上存节点的社区id,同时也要记录每个社区所包含的节点的权重之和,因此社区上存了vertex2com,和com2weight。
Line
将embedding向量和contex向量存在ps上,需要时从ps上拉取到worker。一些简单的计算可以通过内置的psFunc进行自定义计算。每一轮迭代,每一个batch从ps上拉取需要的向量,然后通过随机梯度下降更新向量然后再push到ps上。一些简单的计算可以放到ps上执行,调用自定义的psf。
GraphSAGE
经典的sampler和aggregator任务。从节点的邻居,二阶邻居,k阶邻居中sample一部分,然后通过aggregator将这些节点的信息与当前节点信息结合,之后送入全连接的圣经网络得到新的embbeding。ps上存权重,以及embbeding值,以及节点的neighbor table。Angel开发了pytorch on angel版本,可以在torch环境下使用angel的api,而不用关心底层的实现。
效果对比
相对于GraphX的算法,执行超大图的时候GraphX的效率很低,很多会因为OOM而终止。而PSGraph执行时全部任务都能以更小的空间代价跑出来,并且速度上有数倍乃至数十倍的优化。