alibaba / graph-learn

An Industrial Graph Neural Network Framework
Apache License 2.0
1.28k stars 267 forks source link

关于graphlearn和aligraph论文中的内容不符的疑问 #151

Closed eedalong closed 3 years ago

eedalong commented 3 years ago

首先很感谢阿里的相关团队能够贡献这样一个训练框架,丰富了整个社区的资源。然而在研究框架的过程中我发现有些地方似乎让人有些疑惑。 aligraph主打的是工业级的训练框架,如果我没理解错,这里的工业级其实更多的侧重于针对超大图(需要几百G或者几个T的内存)的图处理侧的优化,包括超大图的存储管理、高性能/高扩展性复杂采样等,当然这也是论文中着重强调的功能。然而真正开源出来的graphlearn似乎并没有体现出来这些论文中强调的优化。作为一个用户,我之所以对aligraph感兴趣是因为各大公众号和论文中对于该框架能够满足工业级,即超大图上的训练优化的宣传。当然了,关于一些计算结果和重要节点的缓存等功能暂时并不奢望能看到,毕竟graphlearn作为阿里云的产品再售卖。但是起码我觉得基于partitioned graph的训练功能至少应该是有的,不然很难和贵团队的各个公众平台上的宣传相匹配。然而就像 #145 以及#35 也提到,目前的开源的graphlearn仍然是采用多个server进行完整图加载,采样加速的手段是当前server进行request的分发,将一个request分发给不同的server进行处理并相应的结果的merge,然而这样的实现实际上和pyg中的多进程采样本质是一样的,反而由于引入了过多的RPC过程使得性能更差。同时目前框架中实现的hashpartition只是用于request的分发做并行采样加速而并不是用于图切分,我想这也是为什么对于#24 中用户提到的boundary edge的处理问题的issue至今没有得到真正解答的核心原因,因为目前开源的实现中就没有去支持基于切分图的训练。总结而言,就目前开源的这个graphlearn代码,我貌似还没有发现其能够支持工业级训练的特性。 当然我相信aligraph中的功能在贵司内部肯定是全部都有很好的实现但只是没有开源出来而已。上述的疑惑希望能得到作者团队的回答,也希望能帮助到其他正在尝试或者准备尝试graphlearn的研究者能够对框架的功能特性有更多的了解。如果确如上述所说,也希望贵团队在项目中对这部分未支持特性进行相应的说明,以防止后续的研究人员产生与我相同的疑惑。 最后,再一次感谢贵司相关团队对开源社区的贡献!

jackonan commented 3 years ago

你好,感谢对GraphLearn的关注。第一版GraphLearn开源后,我们收到了很多反馈,尤其是模型接口层的确让大家有些困扰。GraphLearn2.0版本正在路上,不久就会放到社区,希望能给开发者带来更好的体验。

关于你的几个问题: 1、数据Partition。原始数据存于磁盘或DFS,GL把数据全量加载到内存。加载过程是分布式的,每个server读取一片数据,再根据id转发到不同的server,最终每个server维护大图的一个partition;每个server读取的数据分片和最终的图分片不是一回事;

2、我们把一个GNN模型分成数据和算法两个阶段。数据阶段,根据算法需求,进行图遍历、图采样、负采样,该过程用GSL描述,GSL返回一次按batch迭代需要的数据。算法层则利用返回的数据,做相关图语义的计算。分布式训练是数据并行的,也就是典型的ps-worker模式,每个worker都进行上述先数据、后算法的计算,每个worker会遍历不同的图数据;

  1. GL的数据分片不是子图模式,这是和其他框架很大一个区别。因为工业数据多是异构属性图,且规模大,做不到像小规模同构图那样的全图或子图训练;

  2. 提到的RPC性能差的问题,在大图训练中,RPC是不可避免的,图数据的各个server之间一定会通信。GSL就是为了弥补数据端可能造成的性能瓶颈而提出的,当前GSL只开放了使用接口,在将要release的版本里,GSL背后的实现是图引擎,可以把训练过程中数据开销overlap掉,性能提升也很明显;

  3. 很多疑惑源于使用场景的不一致,新版本里我们更注重使用接口,尽可能贴近算法开发者的习惯,同时文档配套也准备了相应示例,在大家读代码时更有参照性。