论文阅读在这篇文章
data文件夹
图划分算法,没有采用Louvain算法(Blondel et al., 2008),在Zhang et al. (2021),使用到。而是使用的METIS graph partitioning algorithm(Karypis,1997)
disjoint.py
parser.py
parser.py
解析参数
multiprocs.py
multiprocs.py
分布式训练的进程管理,
整体流程图:
ParentProcess├── __init__()│ ├── 解析 GPU 设置│ ├── 创建共享字典 sd│ ├── 创建工作进程 (create_workers)│ └── 初始化 Server 实例└── start()├── 设置初始状态├── 创建路径 (检查点和日志)├── 多轮训练循环│ ├── 调用 on_round_begin()│ ├── 选择客户端并分配给工作进程│ ├── 等待客户端更新 (wait)│ └── 调用 on_round_complete()├── 更新 sd 状态以通知工作进程结束└── 进程清理
layers.py
定义单层的MaskedGCNConv等
net.py
构建MaskedGCN
server.py
库
metispy
metispy
是一个用于图划分(graph partitioning)的Python库,它是METIS库的Python接口。METIS 是一个用于将图划分成若干个子图的工具,广泛应用于并行计算、网络分析等领域。
安装:pip install metispy
安装建议参考:https://github.com/james77777778/metis_python?tab=readme-ov-file,适用unix.
应用示例:
import metispy as metis
import networkx as nx# 创建一个示例图
G = nx.karate_club_graph()# 获取节点和边列表
nodes = list(G.nodes)
edges = list(G.edges)# 将 NetworkX 图转换为 METIS 所需的格式
node_mapping = {node: idx for idx, node in enumerate(nodes)}
edges_mapped = [(node_mapping[u], node_mapping[v]) for u, v in edges]# 创建 METIS 图
metis_graph = metis.MetisGraph(len(nodes), edges_mapped)# 设置划分成的子图数量
num_parts = 4# 执行图划分
objval, parts = metis.part_graph(metis_graph, nparts=num_parts)# 打印结果
print(f'Objective value: {objval}')
print(f'Partition labels: {parts}')# 将划分结果映射回原始节点
partition_mapping = {node: parts[node_mapping[node]] for node in nodes}
print(f'Partition mapping: {partition_mapping}')