PS:我已经提到了我的问题的可能解决方案,但对它们有很多困惑,请给我一些建议。另外,如果这个问题不适合这个网站,请指点我到正确的网站,我会把问题移到那里。提前致谢。
对于一些研究工作,我需要执行一些重复的图论和复杂的网络算法来分析大约 2000 个无自环的无向简单图。每个图有大约 40,000 个节点和大约 600,000 条边(基本上使它们成为稀疏图)。
目前,我正在使用 NetworkX 进行分析,目前正在运行nx.algorithms.cluster.average_clustering(G)
500nx.average_shortest_path_length(G)
个这样的图表,代码运行了 3 天,并且只运行了一半。这让我担心我的全面分析会花费大量的出乎意料的时间。
在详细说明我的问题和我想到的可能的解决方案之前,让我提一下我的计算机配置,因为它可能会帮助您建议最佳方法。我在配备 32GB RAM 和一个 Zotac GeForce GTX 1050 Ti OC 版 ZT-P10510B-10L 4GB PCI Express 显卡的 Intel i7-9700K 处理器上运行 Windows 10。
解释我可能的解决方案以及我对它们的困惑:
A) 使用带有邻接矩阵的 GPU 作为图形数据结构:我可以在 GPU 上放置一个邻接矩阵,并通过使用循环手动使用PyCuda或Numba对它们进行编码来执行我的分析,因为递归无法由 GPU 处理。我能够搜索的最近的是stackoverflow上的this,但它没有很好的解决方案。
我的期望:我希望加速算法,例如所有对最短路径、两个节点之间的所有可能路径、平均聚类、平均最短路径长度和小世界属性等。如果它对每个图有显着的加速,我的结果可以是达到非常快。
我的困惑:
- 这些图算法可以在 GPU 中高效编码吗?
- 哪个会更好用?PyCuda 还是 Numba?
- 有没有其他方法可以在 GPU 上存储图,因为我的图是稀疏图,所以效率更高。
- 我是一名普通的 Python 程序员,没有 GPU 编程经验,所以我必须了解和学习使用 PyCuda/Numba 进行 GPU 编程。哪个更容易学?
B) 在 CPU 本身上并行化程序:我可以使用 Joblib 或任何其他库在我的 CPU 本身上并行运行程序。我可以再安排 2-3 台计算机,我可以在这些计算机上运行独立的小程序部分,或者每台计算机可以运行 500 个图形。
我的期望:我希望通过在计算机之间并行化和划分任务来加速算法。如果GPU解决方案不起作用,我可能通过这种方法仍然有一些希望。
我的困惑:
- 哪些其他库可作为 Joblib 的良好替代品?
- 我应该为我的程序分配所有 CPU 内核(i7 中的 8 个内核)还是使用更少的内核?
C)除了我可能的解决方案之外,您对我还有其他建议吗?如果除了 C/C++ 之外的任何其他语言都有更好更快的解决方案,您也可以建议它们,因为如果没有任何效果,我已经考虑将 C++ 作为后备计划。
正在进行的更新
在我社区中对此问题的评论和讨论的不同建议中,这些是我建议探索的要点。
- GraphBLAS
- boost.graph + 带有 python-wrappers 的扩展
- 图形工具
- 火花/黄昏
- PyCuda/Numba
- 使用 Pytorch 的线性代数方法
我尝试
n_job=-1
使用 Joblib 在我的 CPU 上运行 100 个图表(使用 ),CPU 持续达到 100°C 的温度。处理器运行 3 小时后跳闸。- 作为一种解决方案,我在多台计算机上使用了 75% 的可用内核(因此,如果可用内核为 8,我使用 6 个内核)并且程序运行良好。加速也不错。