alibaba / euler

A distributed graph deep learning framework.
Apache License 2.0
2.89k stars 559 forks source link

图存储的内存占用,以及split算子体现在何处? #287

Open TheFinalHydra opened 4 years ago

TheFinalHydra commented 4 years ago

想请教关于euler 2.0的几个问题

  1. 目前的图结构加载起来后是以什么形式存在?是以邻接表的形式完全存在内存中吗,还是只存点和边的id在内存,具体的features单独存? 如果不是全部在内存中,是以什么形式,耗费的内存大概占图大小的多少比例呢?
  2. 文档里面说的分布式自动添加split和merge算子的代码位置具体在哪里呢,我看IDSplit好像并没有被实际调用?这个op主要好处是dag分布式情况下优化起来更方便吗
  3. 目前分布式下对于一些多跳采样的操作,看文档描述感觉仍然要等前一度的点返回了才能进行下一度的采样,感觉dag并行调度的优势似乎没有办法充分得到体现?

看了文档和一点点代码之后有些疑问,不知道是否愿意帮忙答疑一下,谢谢!

zakheav commented 4 years ago

1:全部都是以邻接表形式存储在内存中 2: idsplit op和 merge op 在分布式模式下才会被插入Euler的计算图中,这部分逻辑在euler/parser/目录下,由compiler调用optimizer的过程中生成。 3: 使用dag调度的一个好处是,可以使用一些计算图优化算法:比如对于一个节点,需要获取其neighbor和特征时,原来模式需要调用两次rpc,现在可以被融合进一次rpc调用;同时这种情况下split方法原来会调用两次,现在会被dag优化器中的公共子表达式消除给优化掉。 目前Euler内部实际上已经支持了图分割模式的查询,假如用户把一个图分割为多个社团,并假设一个节点的所有信息查询都可以在这个社团中获取到,那么dag优化器会把尽可能多的算子打包成一个整体,一次rpc就可以吧信息获取得到。但这只是个试验性功能,目前还没有实际上生产

zakheav commented 4 years ago

当然,Euler自己的dag执行引擎也更加轻量,所以相对于Euler1,计算图完全依赖tensorflow构建,性能也会相应提升。

zakheav commented 4 years ago

可以顺着这个路径看GQL complier部分的代码: https://github.com/alibaba/euler/blob/master/euler/parser/compiler.h#L119 https://github.com/alibaba/euler/blob/master/euler/parser/optimizer.cc#L214 https://github.com/alibaba/euler/blob/master/euler/parser/optimizer.cc#L116 https://github.com/alibaba/euler/blob/master/euler/core/dag_def/dag_def.cc#L343 https://github.com/alibaba/euler/blob/master/euler/core/dag_def/dag_def.cc#L128

TheFinalHydra commented 4 years ago

感谢这么详细的回复!

那就是说各个点/边的features也是直接存到了点/边的类中,而不是分开存储的吗,我看json2partdat.py的代码似乎也就是把每个点和边的所有属性直接打平了依次serialize到文件中。 第三点听起来挺好的,类似于把几个op给batch到一个rpc里面了

代码路径厉害了,非常感谢!