dmlc--dgl
25ac334403
* Distributed heterograph (#3) * heterogeneous graph partition. * fix graph partition book for heterograph. * load heterograph partitions. * update DistGraphServer to support heterograph. * make DistGraph runnable for heterograph. * partition a graph and store parts with homogeneous graph structure. * update DistGraph server&client to use homogeneous graph. * shuffle node Ids based on node types. * load mag in heterograph. * fix per-node-type mapping. * balance node types. * fix for homogeneous graph * store etype for now. * fix data name. * fix a bug in example. * add profiler in rgcn. * heterogeneous RGCN. * map homogeneous node ids to hetero node ids. * fix graph partition book. * fix DistGraph. * shuffle eids. * verify eids and their mappings when loading a partition. * Id map from homogneous Ids to per-type Ids. * verify partitioned results. * add test for distributed sampler. * add mapping from per-type Ids to homogeneous Ids. * update example. * fix DistGraph. * Revert "add profiler in rgcn." This reverts commit 36daaed8b660933dac8f61a39faec3da2467d676. * add tests for homogeneous graphs. * fix a bug. * fix test. * fix for one partition. * fix for standalone training and evaluation. * small fix. * fix two bugs. * initialize projection matrix. * small fix on RGCN. * Fix rgcn performance (#17) Co-authored-by: Ubuntu <ubuntu@ip-172-31-62-171.ec2.internal> * fix lint. * fix lint. * fix lint. * fix lint. * fix lint. * fix lint. * fix. * fix test. * fix lint. * test partitions. * remove redundant test for partitioning. * remove commented code. * fix partition. * fix tests. * fix RGCN. * fix test. * fix test. * fix test. * fix. * fix a bug. * update dmlc-core. * fix. * fix rgcn. * update readme. * add comments. Co-authored-by: Ubuntu <ubuntu@ip-172-31-2-202.us-west-1.compute.internal> Co-authored-by: Ubuntu <ubuntu@ip-172-31-9-132.us-west-1.compute.internal> Co-authored-by: xiang song(charlie.song) <classicxsong@gmail.com> Co-authored-by: Ubuntu <ubuntu@ip-172-31-62-171.ec2.internal> * fix. * fix. * add div_int. * fix. * fix. * fix lint. * fix. * fix. * fix. * adjust. * move code. * handle heterograph. * return pytorch tensor in GPB. * remove some tests in example. * add to_block for distributed training. * use distributed to_block. * remove unnecessary function in DistGraph. * remove distributed to_block. * use pytorch tensor. * fix a bug in ntypes and etypes. * enable norm. * make the data loader compatible with the old format. * fix. * add comments. * fix a bug. * add test for heterograph. * support partition without reshuffle. * add test. * support partition without reshuffle. * fix. * add test. * fix bugs. * fix lint. * fix dataset. * fix for mxnet. * update docstring. * rename to floor_div * avoid exposing NodePartitionPolicy and EdgePartitionPolicy. * fix docstring. * fix error. * fixes. * fix comments. * rename. * rename. * explain IdMap. * fix docstring. * fix docstring. * update docstring. * remove the code of returning heterograph. * remove argument. * fix example. * make GraphPartitionBook an abstract class. * fix. * fix. * fix a bug. * fix a bug in example * fix a bug * reverse heterograph sampling. * temp fix. * fix lint. * Revert "temp fix." This reverts commit c450717b9f578b8c48769c675f2a19d6c1e64381. * compute norm. * Revert "reverse heterograph sampling." This reverts commit bd6deb7f52998de76508f800441ff518e2fadcb9. * fix. * move id_map.py * remove check * add more comments. * update docstring. Co-authored-by: Ubuntu <ubuntu@ip-172-31-2-202.us-west-1.compute.internal> Co-authored-by: Ubuntu <ubuntu@ip-172-31-9-132.us-west-1.compute.internal> Co-authored-by: xiang song(charlie.song) <classicxsong@gmail.com> Co-authored-by: Ubuntu <ubuntu@ip-172-31-62-171.ec2.internal>
91 行
3.9 KiB
Python
91 行
3.9 KiB
Python
import dgl
|
|
import numpy as np
|
|
import torch as th
|
|
import argparse
|
|
import time
|
|
|
|
from ogb.nodeproppred import DglNodePropPredDataset
|
|
|
|
def load_ogb(dataset):
|
|
if dataset == 'ogbn-mag':
|
|
dataset = DglNodePropPredDataset(name=dataset)
|
|
split_idx = dataset.get_idx_split()
|
|
train_idx = split_idx["train"]['paper']
|
|
val_idx = split_idx["valid"]['paper']
|
|
test_idx = split_idx["test"]['paper']
|
|
hg_orig, labels = dataset[0]
|
|
subgs = {}
|
|
for etype in hg_orig.canonical_etypes:
|
|
u, v = hg_orig.all_edges(etype=etype)
|
|
subgs[etype] = (u, v)
|
|
subgs[(etype[2], 'rev-'+etype[1], etype[0])] = (v, u)
|
|
hg = dgl.heterograph(subgs)
|
|
hg.nodes['paper'].data['feat'] = hg_orig.nodes['paper'].data['feat']
|
|
paper_labels = labels['paper'].squeeze()
|
|
|
|
num_rels = len(hg.canonical_etypes)
|
|
num_of_ntype = len(hg.ntypes)
|
|
num_classes = dataset.num_classes
|
|
category = 'paper'
|
|
print('Number of relations: {}'.format(num_rels))
|
|
print('Number of class: {}'.format(num_classes))
|
|
print('Number of train: {}'.format(len(train_idx)))
|
|
print('Number of valid: {}'.format(len(val_idx)))
|
|
print('Number of test: {}'.format(len(test_idx)))
|
|
|
|
# get target category id
|
|
category_id = len(hg.ntypes)
|
|
for i, ntype in enumerate(hg.ntypes):
|
|
if ntype == category:
|
|
category_id = i
|
|
|
|
train_mask = th.zeros((hg.number_of_nodes('paper'),), dtype=th.bool)
|
|
train_mask[train_idx] = True
|
|
val_mask = th.zeros((hg.number_of_nodes('paper'),), dtype=th.bool)
|
|
val_mask[val_idx] = True
|
|
test_mask = th.zeros((hg.number_of_nodes('paper'),), dtype=th.bool)
|
|
test_mask[test_idx] = True
|
|
hg.nodes['paper'].data['train_mask'] = train_mask
|
|
hg.nodes['paper'].data['val_mask'] = val_mask
|
|
hg.nodes['paper'].data['test_mask'] = test_mask
|
|
|
|
hg.nodes['paper'].data['labels'] = paper_labels
|
|
return hg
|
|
else:
|
|
raise("Do not support other ogbn datasets.")
|
|
|
|
if __name__ == '__main__':
|
|
argparser = argparse.ArgumentParser("Partition builtin graphs")
|
|
argparser.add_argument('--dataset', type=str, default='ogbn-mag',
|
|
help='datasets: ogbn-mag')
|
|
argparser.add_argument('--num_parts', type=int, default=4,
|
|
help='number of partitions')
|
|
argparser.add_argument('--part_method', type=str, default='metis',
|
|
help='the partition method')
|
|
argparser.add_argument('--balance_train', action='store_true',
|
|
help='balance the training size in each partition.')
|
|
argparser.add_argument('--undirected', action='store_true',
|
|
help='turn the graph into an undirected graph.')
|
|
argparser.add_argument('--balance_edges', action='store_true',
|
|
help='balance the number of edges in each partition.')
|
|
args = argparser.parse_args()
|
|
|
|
start = time.time()
|
|
g = load_ogb(args.dataset)
|
|
|
|
print('load {} takes {:.3f} seconds'.format(args.dataset, time.time() - start))
|
|
print('|V|={}, |E|={}'.format(g.number_of_nodes(), g.number_of_edges()))
|
|
print('train: {}, valid: {}, test: {}'.format(th.sum(g.nodes['paper'].data['train_mask']),
|
|
th.sum(g.nodes['paper'].data['val_mask']),
|
|
th.sum(g.nodes['paper'].data['test_mask'])))
|
|
|
|
if args.balance_train:
|
|
balance_ntypes = {'paper': g.nodes['paper'].data['train_mask']}
|
|
else:
|
|
balance_ntypes = None
|
|
|
|
dgl.distributed.partition_graph(g, args.dataset, args.num_parts, 'data',
|
|
part_method=args.part_method,
|
|
balance_ntypes=balance_ntypes,
|
|
balance_edges=args.balance_edges)
|