DeepHypergraph
DeepHypergraph copied to clipboard
关于稠密图数据用于训练
您好,我在使用库中gcn的模型进行稠密图的训练的时候发现效率非常低,在用github内另一个引用同一个文献的gcn实现的代码时算法效率并没有这么低。是优化还是什么别的原因吗?
如果是算法效率的问题那么算法效率可能限制了这个库的应用场景,我这里测试的稠密图的输入大概是一张图,1000左右个节点,3万左右条边,过一层gcn大概需要数秒的时间,但之前在另一个框架上跑的时候比这个要快许多
您好,可否提供一下代码? 我猜测可能是你在每一次infer的时候都重新建图导致的。
我简单做了一个性能测试,2080Ti的显卡。 在7W个节点,200W个边的情况下进行2次GCN的传播, 用时:0.02s,显存占用大约4个G。 DHG对静态的图/超图网络十分友好,我设计了多层的缓存,速度应该是极快的。 除非每个epoch的时候重新调用g = dhg.Graph(num_v, e_list),这种情况下是动态图,速度很难通过缓存优化。 我建议可以参考样例,在主函数里面一次性把图/超图建好,然后在训练和推理的时候将g/hg传给相应的函数即可。 可以参考这个样例: https://deephypergraph.readthedocs.io/en/0.9.2/examples/vertex_cls/graph.html#gcn-on-cora
落木银石 @.***
您好,我自己的实验部分的代码在dhg.experiments.simple.sub-dep-seed文件内,确实我在每次infer的时候传入的都是不同的图,即图上边的结构是不同的,因为我研究的问题可能更偏向于动态图。是这个导致算法效率低下的吗?意思是说此框架的代码目前只适合做静态图的工作吗? ------------------ 原始邮件 ------------------ 发件人: "iMoonLab/DeepHypergraph" @.>; 发送时间: 2022年9月27日(星期二) 下午3:37 @.>; @.@.>; 主题: Re: [iMoonLab/DeepHypergraph] 关于稠密图数据用于训练 (Issue #12)
您好,可否提供一下代码? 我猜测可能是你在每一次infer的时候都重新建图导致的。
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
您好, 目前dhg的性能优化更偏向于处理静态图。方便的话,您可以将您对动态图的构想和期望的功能写成一个更为详细的issue,或者在discussion里面提出。我们也正准备在dhg的后续版本对动态图的操作做出一定的计算性能上的优化。 期待您的反馈。 祝好, 一帆
好的,我会和我这边的同学商量一下,然后稍后整理个更详细的在github中disucssion部分提出。不过我们实验室主要是用超图来做图分类任务,和只在一张图上做点分类很不一样。我们的需求主要是输入结构,功能上不同的超图,然后对每张超图做图分类任务。因此对动态图的需求比较高。我们不是每个epoch,重构一张图,而是每一个batch都会重构一张图
落木银石 @.***
------------------ 原始邮件 ------------------ 发件人: "Yifan @.>; 发送时间: 2022年10月11日(星期二) 晚上8:43 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [iMoonLab/DeepHypergraph] 关于稠密图数据用于训练 (Issue #12)
您好,
目前dhg的性能优化更偏向于处理静态图。方便的话,您可以将您对动态图的构想和期望的功能写成一个更为详细的issue,或者在discussion里面提出。我们也正准备在dhg的后续版本对动态图的操作做出一定的计算性能上的优化。
期待您的反馈。
祝好, 一帆
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
期待!
iMoonLab/DHGNN: DHGNN source code for IJCAI19 paper: "Dynamic Hypergraph Neural Networks" (github.com),在你们实验室的这个项目里面,就针对动态超图进行了实现。据我观察,每一层都对超图进行了重构,重新的初始化。但并没有对算法效率带来特别大的影响。之前我们讨论的,重新对超图进行初始化在dhg这个项目里面会对超图卷积操作带来很大的影响。这其中的原因大概是什么样的呢?
落木银石 @.***
------------------ 原始邮件 ------------------ 发件人: "Yifan @.>; 发送时间: 2022年10月12日(星期三) 下午5:42 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [iMoonLab/DeepHypergraph] 关于稠密图数据用于训练 (Issue #12)
期待!
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
您好, 关于DHGNN的速度快,是因为,DHGNN仅仅考虑了一种类型的超边,也就是动态KNN建立超边组,同时也必须保证是在小规模图的情况下才可以。这样做只需要利用torch中的cdist计算出一个NxN的距离矩阵然后用topk和gather两个函数即可直接获取超边特征。当然这样做还有一个限制,也就是要保证每个超边连接了固定的个数K个点的情况下,才可以。因为这样才能对齐数据,进行矩阵操作。而新的DHG框架,因为没有每个超边连接点的个数相同的限制,没有只接受KNN建图的限制,没有只能进行小图计算的限制,在支持大规模,动态超图,灵活超边组构建上DHG目前解决了有无问题,但目前版本由于没有对动态适配,因此速度受到了限制。
一帆
我很高心,您关注到了DHG在每次增加超边或者动态删除的时候,都会进行新的超图初始化。这在目前是必须的。因为,我们必须对添加的超边加以限制。这里我拿图来举例子,严格意义上的简单图,A矩阵必须是对称的,也就是说, 当你添加(1,3)这个边的时候,我们DHG需要帮你隐式添加(3, 1)这个边。当你删除(3, 1)这个边的时候,我们DHG需要帮你隐式删除(1, 3)这个边。当然这是简单图上的约束,有向图就没有这个约束。当你在简单图重复添加,(1, 3)这个这个边的时候,我们会对新的(1, 3)这个边的权重,与已有的(1, 3)的边的权重进行merge(目前支持min, max, 和mean)。当然这是简单图上的约束,有向图就没有这个约束。同样,我们会对每次新增的超边都会使其与已有的超边进行比对,然后进行权重的合并。DHG在处理这些问题上是非常严谨的,因此每次添加新的超边都需要进行验证因此增加了时间的消耗。但是这里我们进行了一定的优化,我们对已有的超边使用字典的形式进行组织,因此增加超边的复杂度只有O(1)。你所能感受的耗时,是因为增加超边后这个超图的H矩阵变了,因此需要删除旧的H矩阵创建一个新的H矩阵,这就带来了大量内存的复制,从list复制到torch里面。这部分是最耗时的。
一帆
我其实也在构想对动态增加超边的支持。这里我也进行了profile,后期可能需要对从表示结构到计算结构(list -> torch.tensor)的时候,对旧的H矩阵加以利用。而不是直接删除然后创建新的,直接删除然后创建势必会带来大量内存的copy是十分耗时的。当然如果您有想法,欢迎提出讨论!
一帆
从大佬们的讨论里学到了很多!
哈哈 欢迎提意见!