From 46a8b0bde43f6d56f1ab6447d955d2e6615986cd Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 25 Mar 2024 09:57:25 -0700 Subject: [PATCH 01/33] dist sampler --- .../cugraph/gnn/data_loading/dist_sampler.py | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 python/cugraph/cugraph/gnn/data_loading/dist_sampler.py diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py new file mode 100644 index 00000000000..dc3e81c297b --- /dev/null +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -0,0 +1,109 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pylibcugraph +import numpy as np +import cupy +import cudf + +from typing import Union, List, Dict +TensorType = Union['torch.Tensor', 'cupy.ndarray', 'cudf.Series'] + + +def nccl_init(rank: int, world_size: int, uid: int): + # calls a c++ function that calls ncclCommInitRank + # returns a resource handle and nccl communicator + # should wrap the resource handle and communicator in a CuGraph context object + pass + +class DistSampleWriter: + def __init__(self, format, directory, batches_per_partition): + self.__format = format + self.__directory = directory + self.__batches_per_partition = batches_per_partition + + + + def write_minibatches(self, minibatch_dict): + if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): + self.__write_minibatches_coo(minibatch_dict) + elif "major_offsets" in minibatch_dict and "minors" in minibatch_dict: + self.__write_minibatches_csr(minibatch_dict) + else: + raise ValueError("invalid columns") + +class DistSampler: + def __init__(self, graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], writer: DistSampleWriter): + self.__graph = graph + + def sample_batches(self, nodes: TensorType, batch: TensorType, random_state: int): + raise NotImplementedError("Must be implemented by subclass") + + def sample_from_nodes(self, nodes: TensorType, batch: TensorType, random_state: int): + minibatch_dict = self.sample_batches(nodes=nodes, batch=batch, random_state=random_state) + self.__writer.write_minibatches(minibatch_dict) + + + @property + def is_multi_gpu(self): + return isinstance(self.__graph, pylibcugraph.MGGraph) + +class UniformNeighborSampler(DistSampler): + def __init__( + self, + graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], + fanout: List[int], + prior_sources_behavior: str, + deduplicate_sources: bool, + return_hops: bool, + renumber: bool, + compression: str, + compress_per_hop:bool): + super(graph) + self.__fanout = fanout + self.__prior_sources_behavior = prior_sources_behavior + self.__deduplicate_sources = deduplicate_sources + self.__return_hops = return_hops + self.__renumber = renumber + self.__compress_per_hop = compress_per_hop + self.__compression = compression + + def sample_batches(self, nodes: TensorType, batch: TensorType, random_state: int): + if self.is_multi_gpu: + # get resource handle + # pass label list, label_to_comm_rank + # all labels on this worker should remain there + pylibcugraph.uniform_neighbor_sample( + + ) + else: + sampling_results_dict = pylibcugraph.uniform_neighbor_sample( + pylibcugraph.ResourceHandle(), + self.__graph, + start_list=nodes, + batch_id_list=batch, + h_fan_out=np.array(self.__fanout, dtype='int32'), + with_replacement=self.__with_replacement, + do_expensive_check=False, + with_edge_properties=True, + random_state=random_state, + prior_sources_behavior=self.__prior_sources_behavior, + deduplicate_sources=self.__deduplicate_sources, + return_hops=self.__return_hops, + renumber=self.__renumber, + compression=self.__compression, + compress_per_hop=self.__compress_per_hop, + return_dict=True, + ) + + return sampling_results_dict \ No newline at end of file From 39d139df2b883304215d96071e8672680fc46dc7 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 25 Mar 2024 15:22:23 -0700 Subject: [PATCH 02/33] working prototype of nccl cugraph --- .../cugraph_pyg/examples/cugraph_nccl.py | 107 ++++++++++++++++++ python/cugraph/cugraph/gnn/__init__.py | 6 + python/cugraph/cugraph/gnn/comms/__init__.py | 12 ++ .../cugraph/gnn/comms/cugraph_nccl_comms.py | 99 ++++++++++++++++ .../cugraph/gnn/data_loading/dist_sampler.py | 8 -- .../simpleDistributedGraph.py | 3 + 6 files changed, 227 insertions(+), 8 deletions(-) create mode 100644 python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py create mode 100644 python/cugraph/cugraph/gnn/comms/__init__.py create mode 100644 python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py new file mode 100644 index 00000000000..d9f26141e0b --- /dev/null +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py @@ -0,0 +1,107 @@ +import os + +from time import sleep + +import pandas +import numpy as np +import torch +import torch.multiprocessing as tmp +import torch.distributed as dist + +from cugraph.gnn import ( + cugraph_comms_init, + cugraph_comms_shutdown, + cugraph_comms_create_unique_id, + cugraph_comms_get_raft_handle, +) + +from pylibcugraph import MGGraph, ResourceHandle, GraphProperties, degrees + +def init_pytorch(rank, world_size): + os.environ['MASTER_ADDR'] = 'localhost' + os.environ['MASTER_PORT'] = '12355' + dist.init_process_group('nccl', rank=rank, world_size=world_size) + +def train(rank:int, world_size: int, uid, edgelist): + init_pytorch(rank, world_size) + + device = rank + cugraph_comms_init(rank, world_size, uid, device) + + import rmm + rmm.reinitialize(pool_allocator=False, managed_memory=False, devices=[device]) + + from rmm.allocators.cupy import rmm_cupy_allocator + import cupy + cupy.cuda.set_allocator(rmm_cupy_allocator) + + import cudf + + print(f'rank {rank} initialized cugraph') + + src = cudf.Series( + np.array_split(edgelist[0], world_size)[rank] + ) + dst = cudf.Series( + np.array_split(edgelist[1], world_size)[rank] + ) + + seeds = cudf.Series( + np.arange(rank * 50, (rank + 1) * 50) + ) + handle = ResourceHandle(cugraph_comms_get_raft_handle().getHandle()) + + print('constructing graph') + G = MGGraph( + handle, + GraphProperties(is_multigraph=True,is_symmetric=False), + src_array=[src], + dst_array=[dst], + weight_array=None, + edge_id_array=None, + edge_type_array=None, + num_arrays=1, + store_transposed=False, + do_expensive_check=False, + drop_multi_edges=False, + ) + print('graph constructed') + + print('calculating degrees') + vertices, in_deg, out_deg = degrees( + handle, + G, + seeds, + do_expensive_check=False + ) + print('degrees calculated') + + print('constructing dataframe') + df = pandas.DataFrame({ + 'v': vertices.get(), + 'in': in_deg.get(), + 'out': out_deg.get() + }) + print(df) + + dist.barrier() + cugraph_comms_shutdown() + print(f'rank {rank} shut down cugraph') + + +def main(): + world_size = torch.cuda.device_count() + uid = cugraph_comms_create_unique_id() + + from ogb.nodeproppred import NodePropPredDataset + dataset = NodePropPredDataset('ogbn-products') + el = dataset[0][0]['edge_index'].astype('int64') + + tmp.spawn( + train, + args=(world_size, uid, el), + nprocs=world_size, + ) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/__init__.py b/python/cugraph/cugraph/gnn/__init__.py index f8a3035440b..0365b6746a6 100644 --- a/python/cugraph/cugraph/gnn/__init__.py +++ b/python/cugraph/cugraph/gnn/__init__.py @@ -13,3 +13,9 @@ from .feature_storage.feat_storage import FeatureStore from .data_loading.bulk_sampler import BulkSampler +from .comms.cugraph_nccl_comms import ( + cugraph_comms_init, + cugraph_comms_shutdown, + cugraph_comms_create_unique_id, + cugraph_comms_get_raft_handle, +) \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/comms/__init__.py b/python/cugraph/cugraph/gnn/comms/__init__.py new file mode 100644 index 00000000000..a205757235a --- /dev/null +++ b/python/cugraph/cugraph/gnn/comms/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py new file mode 100644 index 00000000000..815e5bc71da --- /dev/null +++ b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py @@ -0,0 +1,99 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +from raft_dask.common.nccl import nccl +from raft_dask.common.comms_utils import inject_comms_on_handle_coll_only + +from pylibraft.common.handle import Handle +from rmm._cuda.gpu import getDevice, setDevice + +from cugraph.dask.comms.comms_wrapper import init_subcomms + +__nccl_comms = None +__raft_handle = None + +def nccl_init(rank: int, world_size: int, uid: int): + # calls a c++ function that calls ncclCommInitRank + # returns a resource handle and nccl communicator + # should wrap the resource handle and communicator in a CuGraph context object + try: + ni = nccl() + ni.init(world_size, uid, rank) + return ni + except Exception as ex: + raise RuntimeError(f"A nccl error occurred: {ex}") + +def make_raft_handle(rank, world_size, nccl_comms, n_streams_per_handle=0, verbose=False): + handle = Handle(n_streams=n_streams_per_handle) + inject_comms_on_handle_coll_only( + handle, + nccl_comms, + world_size, + rank, + verbose + ) + + return handle + +def __get_2D_div(ngpus): + prows = int(math.sqrt(ngpus)) + while ngpus % prows != 0: + prows = prows - 1 + return prows, int(ngpus / prows) + + +def cugraph_comms_init(rank, world_size, uid, device=0): + global __nccl_comms, __raft_handle + if __nccl_comms is not None or __raft_handle is not None: + raise RuntimeError("cuGraph has already been initialized!") + + # TODO add options for rmm initialization + + global __old_device + __old_device = getDevice() + setDevice(device) + + nccl_comms = nccl_init(rank, world_size, uid) + # FIXME should we use n_streams_per_handle=1 here? + raft_handle = make_raft_handle(rank, world_size, nccl_comms, verbose=True) + + pcols, _ = __get_2D_div(world_size) + init_subcomms( + raft_handle, + pcols + ) + + __nccl_comms = nccl_comms + __raft_handle = raft_handle + + +def cugraph_comms_shutdown(): + global __raft_handle, __nccl_comms, __old_device + + __nccl_comms.destroy() + setDevice(__old_device) + + del __raft_handle + del __nccl_comms + del __old_device + + +def cugraph_comms_create_unique_id(): + return nccl.get_unique_id() + + +def cugraph_comms_get_raft_handle(): + global __raft_handle + return __raft_handle \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index dc3e81c297b..6519eceb3e1 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -20,20 +20,12 @@ TensorType = Union['torch.Tensor', 'cupy.ndarray', 'cudf.Series'] -def nccl_init(rank: int, world_size: int, uid: int): - # calls a c++ function that calls ncclCommInitRank - # returns a resource handle and nccl communicator - # should wrap the resource handle and communicator in a CuGraph context object - pass - class DistSampleWriter: def __init__(self, format, directory, batches_per_partition): self.__format = format self.__directory = directory self.__batches_per_partition = batches_per_partition - - def write_minibatches(self, minibatch_dict): if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): self.__write_minibatches_coo(minibatch_dict) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index 0ef5eaf1b9e..81dceff9cb6 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -135,6 +135,9 @@ def _make_plc_graph( src_array = [edata_x[i][src_col_name] for i in range(num_arrays)] dst_array = [edata_x[i][dst_col_name] for i in range(num_arrays)] + + print(src_array, dst_array, weight_type, edge_id_type, edge_type_id, num_arrays) + plc_graph = MGGraph( resource_handle=ResourceHandle(Comms.get_handle(sID).getHandle()), graph_properties=graph_props, From ca732a95aa86a89bf54691a0a52352bed3e0a651 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 25 Mar 2024 15:25:58 -0700 Subject: [PATCH 03/33] revert debug changes --- .../structure/graph_implementation/simpleDistributedGraph.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index 81dceff9cb6..0ef5eaf1b9e 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -135,9 +135,6 @@ def _make_plc_graph( src_array = [edata_x[i][src_col_name] for i in range(num_arrays)] dst_array = [edata_x[i][dst_col_name] for i in range(num_arrays)] - - print(src_array, dst_array, weight_type, edge_id_type, edge_type_id, num_arrays) - plc_graph = MGGraph( resource_handle=ResourceHandle(Comms.get_handle(sID).getHandle()), graph_properties=graph_props, From 2669596a1208f68f5f94fe5a00dc4ecce93f63c7 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 26 Mar 2024 11:26:28 -0700 Subject: [PATCH 04/33] clean up examples, add sg --- .../{cugraph_nccl.py => pylibcugraph_mg.py} | 49 ++++++------ .../cugraph_pyg/examples/pylibcugraph_sg.py | 75 +++++++++++++++++++ 2 files changed, 101 insertions(+), 23 deletions(-) rename python/cugraph-pyg/cugraph_pyg/examples/{cugraph_nccl.py => pylibcugraph_mg.py} (65%) create mode 100644 python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py similarity index 65% rename from python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py rename to python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py index d9f26141e0b..93fa39c8ee0 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_nccl.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py @@ -1,6 +1,22 @@ -import os +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This example shows how to use cuGraph nccl-only comms, pylibcuGraph, +# and PyTorch DDP to run a multi-GPU workflow. Most users of the +# GNN packages will not interact with cuGraph directly. This example +# is intented for users who want to extend cuGraph within a DDP workflow. -from time import sleep +import os import pandas import numpy as np @@ -8,6 +24,8 @@ import torch.multiprocessing as tmp import torch.distributed as dist +import cudf + from cugraph.gnn import ( cugraph_comms_init, cugraph_comms_shutdown, @@ -17,26 +35,19 @@ from pylibcugraph import MGGraph, ResourceHandle, GraphProperties, degrees +from ogb.nodeproppred import NodePropPredDataset + def init_pytorch(rank, world_size): os.environ['MASTER_ADDR'] = 'localhost' os.environ['MASTER_PORT'] = '12355' dist.init_process_group('nccl', rank=rank, world_size=world_size) -def train(rank:int, world_size: int, uid, edgelist): +def calc_degree(rank:int, world_size: int, uid, edgelist): init_pytorch(rank, world_size) device = rank cugraph_comms_init(rank, world_size, uid, device) - import rmm - rmm.reinitialize(pool_allocator=False, managed_memory=False, devices=[device]) - - from rmm.allocators.cupy import rmm_cupy_allocator - import cupy - cupy.cuda.set_allocator(rmm_cupy_allocator) - - import cudf - print(f'rank {rank} initialized cugraph') src = cudf.Series( @@ -55,15 +66,8 @@ def train(rank:int, world_size: int, uid, edgelist): G = MGGraph( handle, GraphProperties(is_multigraph=True,is_symmetric=False), - src_array=[src], - dst_array=[dst], - weight_array=None, - edge_id_array=None, - edge_type_array=None, - num_arrays=1, - store_transposed=False, - do_expensive_check=False, - drop_multi_edges=False, + [src], + [dst], ) print('graph constructed') @@ -93,12 +97,11 @@ def main(): world_size = torch.cuda.device_count() uid = cugraph_comms_create_unique_id() - from ogb.nodeproppred import NodePropPredDataset dataset = NodePropPredDataset('ogbn-products') el = dataset[0][0]['edge_index'].astype('int64') tmp.spawn( - train, + calc_degree, args=(world_size, uid, el), nprocs=world_size, ) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py new file mode 100644 index 00000000000..288a974ca88 --- /dev/null +++ b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py @@ -0,0 +1,75 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This example shows how to use cuGraph and pylibcuGraph to run a +# single-GPU workflow. Most users of the GNN packages will not interact +# with cuGraph directly. This example is intented for users who want +# to extend cuGraph within a PyTorch workflow. + +import pandas +import numpy as np + +import cudf + +from pylibcugraph import SGGraph, ResourceHandle, GraphProperties, degrees + +from ogb.nodeproppred import NodePropPredDataset + +def calc_degree(edgelist): + src = cudf.Series( + edgelist[0] + ) + dst = cudf.Series( + edgelist[1] + ) + + seeds = cudf.Series( + np.arange(256) + ) + + print('constructing graph') + G = SGGraph( + ResourceHandle(), + GraphProperties(is_multigraph=True,is_symmetric=False), + src, + dst, + ) + print('graph constructed') + + print('calculating degrees') + vertices, in_deg, out_deg = degrees( + ResourceHandle(), + G, + seeds, + do_expensive_check=False + ) + print('degrees calculated') + + print('constructing dataframe') + df = pandas.DataFrame({ + 'v': vertices.get(), + 'in': in_deg.get(), + 'out': out_deg.get() + }) + print(df) + + print('done') + + +def main(): + dataset = NodePropPredDataset('ogbn-products') + el = dataset[0][0]['edge_index'].astype('int64') + calc_degree(el) + +if __name__ == '__main__': + main() \ No newline at end of file From 8e17ee725692cc0b5e674a42cbf8ac4edef6840f Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 26 Mar 2024 12:49:56 -0700 Subject: [PATCH 05/33] wrap up sampler calls --- .../cugraph_pyg/examples/pylibcugraph_mg.py | 66 ++++---- .../cugraph_pyg/examples/pylibcugraph_sg.py | 53 +++---- python/cugraph/cugraph/gnn/__init__.py | 4 +- python/cugraph/cugraph/gnn/comms/__init__.py | 2 +- .../cugraph/gnn/comms/cugraph_nccl_comms.py | 26 ++-- .../cugraph/gnn/data_loading/dist_sampler.py | 144 ++++++++++++++---- 6 files changed, 179 insertions(+), 116 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py index 93fa39c8ee0..832c5ec74f0 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_mg.py @@ -37,68 +37,57 @@ from ogb.nodeproppred import NodePropPredDataset + def init_pytorch(rank, world_size): - os.environ['MASTER_ADDR'] = 'localhost' - os.environ['MASTER_PORT'] = '12355' - dist.init_process_group('nccl', rank=rank, world_size=world_size) + os.environ["MASTER_ADDR"] = "localhost" + os.environ["MASTER_PORT"] = "12355" + dist.init_process_group("nccl", rank=rank, world_size=world_size) + -def calc_degree(rank:int, world_size: int, uid, edgelist): +def calc_degree(rank: int, world_size: int, uid, edgelist): init_pytorch(rank, world_size) device = rank cugraph_comms_init(rank, world_size, uid, device) - print(f'rank {rank} initialized cugraph') - - src = cudf.Series( - np.array_split(edgelist[0], world_size)[rank] - ) - dst = cudf.Series( - np.array_split(edgelist[1], world_size)[rank] - ) - - seeds = cudf.Series( - np.arange(rank * 50, (rank + 1) * 50) - ) + print(f"rank {rank} initialized cugraph") + + src = cudf.Series(np.array_split(edgelist[0], world_size)[rank]) + dst = cudf.Series(np.array_split(edgelist[1], world_size)[rank]) + + seeds = cudf.Series(np.arange(rank * 50, (rank + 1) * 50)) handle = ResourceHandle(cugraph_comms_get_raft_handle().getHandle()) - print('constructing graph') + print("constructing graph") G = MGGraph( handle, - GraphProperties(is_multigraph=True,is_symmetric=False), + GraphProperties(is_multigraph=True, is_symmetric=False), [src], [dst], ) - print('graph constructed') + print("graph constructed") - print('calculating degrees') - vertices, in_deg, out_deg = degrees( - handle, - G, - seeds, - do_expensive_check=False + print("calculating degrees") + vertices, in_deg, out_deg = degrees(handle, G, seeds, do_expensive_check=False) + print("degrees calculated") + + print("constructing dataframe") + df = pandas.DataFrame( + {"v": vertices.get(), "in": in_deg.get(), "out": out_deg.get()} ) - print('degrees calculated') - - print('constructing dataframe') - df = pandas.DataFrame({ - 'v': vertices.get(), - 'in': in_deg.get(), - 'out': out_deg.get() - }) print(df) dist.barrier() cugraph_comms_shutdown() - print(f'rank {rank} shut down cugraph') + print(f"rank {rank} shut down cugraph") def main(): world_size = torch.cuda.device_count() uid = cugraph_comms_create_unique_id() - dataset = NodePropPredDataset('ogbn-products') - el = dataset[0][0]['edge_index'].astype('int64') + dataset = NodePropPredDataset("ogbn-products") + el = dataset[0][0]["edge_index"].astype("int64") tmp.spawn( calc_degree, @@ -106,5 +95,6 @@ def main(): nprocs=world_size, ) -if __name__ == '__main__': - main() \ No newline at end of file + +if __name__ == "__main__": + main() diff --git a/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py index 288a974ca88..2f273ee581e 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/pylibcugraph_sg.py @@ -25,51 +25,42 @@ from ogb.nodeproppred import NodePropPredDataset + def calc_degree(edgelist): - src = cudf.Series( - edgelist[0] - ) - dst = cudf.Series( - edgelist[1] - ) - - seeds = cudf.Series( - np.arange(256) - ) + src = cudf.Series(edgelist[0]) + dst = cudf.Series(edgelist[1]) + + seeds = cudf.Series(np.arange(256)) - print('constructing graph') + print("constructing graph") G = SGGraph( ResourceHandle(), - GraphProperties(is_multigraph=True,is_symmetric=False), + GraphProperties(is_multigraph=True, is_symmetric=False), src, dst, ) - print('graph constructed') + print("graph constructed") - print('calculating degrees') + print("calculating degrees") vertices, in_deg, out_deg = degrees( - ResourceHandle(), - G, - seeds, - do_expensive_check=False + ResourceHandle(), G, seeds, do_expensive_check=False + ) + print("degrees calculated") + + print("constructing dataframe") + df = pandas.DataFrame( + {"v": vertices.get(), "in": in_deg.get(), "out": out_deg.get()} ) - print('degrees calculated') - - print('constructing dataframe') - df = pandas.DataFrame({ - 'v': vertices.get(), - 'in': in_deg.get(), - 'out': out_deg.get() - }) print(df) - print('done') + print("done") def main(): - dataset = NodePropPredDataset('ogbn-products') - el = dataset[0][0]['edge_index'].astype('int64') + dataset = NodePropPredDataset("ogbn-products") + el = dataset[0][0]["edge_index"].astype("int64") calc_degree(el) -if __name__ == '__main__': - main() \ No newline at end of file + +if __name__ == "__main__": + main() diff --git a/python/cugraph/cugraph/gnn/__init__.py b/python/cugraph/cugraph/gnn/__init__.py index 0365b6746a6..20fefc7de8a 100644 --- a/python/cugraph/cugraph/gnn/__init__.py +++ b/python/cugraph/cugraph/gnn/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, NVIDIA CORPORATION. +# Copyright (c) 2022-2024, NVIDIA CORPORATION. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -18,4 +18,4 @@ cugraph_comms_shutdown, cugraph_comms_create_unique_id, cugraph_comms_get_raft_handle, -) \ No newline at end of file +) diff --git a/python/cugraph/cugraph/gnn/comms/__init__.py b/python/cugraph/cugraph/gnn/comms/__init__.py index a205757235a..aeae6078111 100644 --- a/python/cugraph/cugraph/gnn/comms/__init__.py +++ b/python/cugraph/cugraph/gnn/comms/__init__.py @@ -9,4 +9,4 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. \ No newline at end of file +# limitations under the License. diff --git a/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py index 815e5bc71da..b668ecce424 100644 --- a/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py +++ b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py @@ -24,6 +24,7 @@ __nccl_comms = None __raft_handle = None + def nccl_init(rank: int, world_size: int, uid: int): # calls a c++ function that calls ncclCommInitRank # returns a resource handle and nccl communicator @@ -35,18 +36,16 @@ def nccl_init(rank: int, world_size: int, uid: int): except Exception as ex: raise RuntimeError(f"A nccl error occurred: {ex}") -def make_raft_handle(rank, world_size, nccl_comms, n_streams_per_handle=0, verbose=False): + +def make_raft_handle( + rank, world_size, nccl_comms, n_streams_per_handle=0, verbose=False +): handle = Handle(n_streams=n_streams_per_handle) - inject_comms_on_handle_coll_only( - handle, - nccl_comms, - world_size, - rank, - verbose - ) + inject_comms_on_handle_coll_only(handle, nccl_comms, world_size, rank, verbose) return handle + def __get_2D_div(ngpus): prows = int(math.sqrt(ngpus)) while ngpus % prows != 0: @@ -70,10 +69,7 @@ def cugraph_comms_init(rank, world_size, uid, device=0): raft_handle = make_raft_handle(rank, world_size, nccl_comms, verbose=True) pcols, _ = __get_2D_div(world_size) - init_subcomms( - raft_handle, - pcols - ) + init_subcomms(raft_handle, pcols) __nccl_comms = nccl_comms __raft_handle = raft_handle @@ -81,10 +77,10 @@ def cugraph_comms_init(rank, world_size, uid, device=0): def cugraph_comms_shutdown(): global __raft_handle, __nccl_comms, __old_device - + __nccl_comms.destroy() setDevice(__old_device) - + del __raft_handle del __nccl_comms del __old_device @@ -96,4 +92,4 @@ def cugraph_comms_create_unique_id(): def cugraph_comms_get_raft_handle(): global __raft_handle - return __raft_handle \ No newline at end of file + return __raft_handle diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 6519eceb3e1..b7190471c65 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -16,16 +16,36 @@ import cupy import cudf -from typing import Union, List, Dict -TensorType = Union['torch.Tensor', 'cupy.ndarray', 'cudf.Series'] +from typing import Union, List +from cugraph.utilities import import_optional +from cugraph.gnn import cugraph_comms_get_raft_handle + +from math import ceil + +# PyTorch is NOT optional but this is required for container builds. +torch = import_optional("torch") + +TensorType = Union[torch.Tensor, cupy.ndarray, cudf.Series] class DistSampleWriter: - def __init__(self, format, directory, batches_per_partition): + def __init__(self, format: str, directory: str, batches_per_partition: int): self.__format = format self.__directory = directory self.__batches_per_partition = batches_per_partition - + + @property + def _format(self): + return self.__format + + @property + def _directory(self): + return self.__directory + + @property + def _batches_per_partition(self): + return self.__batches_per_partition + def write_minibatches(self, minibatch_dict): if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): self.__write_minibatches_coo(minibatch_dict) @@ -34,33 +54,75 @@ def write_minibatches(self, minibatch_dict): else: raise ValueError("invalid columns") + class DistSampler: - def __init__(self, graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], writer: DistSampleWriter): + def __init__( + self, + graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], + writer: DistSampleWriter, + local_seeds_per_call: int = 32768, + rank: int = 0, + ): self.__graph = graph - - def sample_batches(self, nodes: TensorType, batch: TensorType, random_state: int): + self.__local_seeds_per_call = local_seeds_per_call + self.__rank = rank + + def sample_batches( + self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 + ): raise NotImplementedError("Must be implemented by subclass") - def sample_from_nodes(self, nodes: TensorType, batch: TensorType, random_state: int): - minibatch_dict = self.sample_batches(nodes=nodes, batch=batch, random_state=random_state) - self.__writer.write_minibatches(minibatch_dict) + def sample_from_nodes(self, nodes: TensorType, batch_size: int, random_state: int): + batches_per_call = self._local_seeds_per_call // batch_size + actual_seeds_per_call = batches_per_call * batch_size + num_calls = int(ceil(len(nodes) / actual_seeds_per_call)) + + nodes = torch.split(torch.as_tensor(nodes, device="cuda"), num_calls) + + for i, current_seeds in enumerate(nodes): + current_batches = torch.arange( + i * batches_per_call, + (i + 1) * batches_per_call, + device="cuda", + dtype=torch.int32, + ) + current_batches = current_batches.repeat_interleave(batch_size)[ + : len(current_seeds) + ] + + minibatch_dict = self.sample_batches( + seeds=current_seeds, + batch_ids=current_batches, + random_state=random_state, + ) + self.__writer.write_minibatches(minibatch_dict) @property def is_multi_gpu(self): return isinstance(self.__graph, pylibcugraph.MGGraph) + @property + def _local_seeds_per_call(self): + return self.__local_seeds_per_call + + @property + def rank(self): + return self.__rank + + class UniformNeighborSampler(DistSampler): def __init__( - self, - graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], - fanout: List[int], - prior_sources_behavior: str, - deduplicate_sources: bool, - return_hops: bool, - renumber: bool, - compression: str, - compress_per_hop:bool): + self, + graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], + fanout: List[int], + prior_sources_behavior: str, + deduplicate_sources: bool, + return_hops: bool, + renumber: bool, + compression: str, + compress_per_hop: bool, + ): super(graph) self.__fanout = fanout self.__prior_sources_behavior = prior_sources_behavior @@ -70,21 +132,45 @@ def __init__( self.__compress_per_hop = compress_per_hop self.__compression = compression - def sample_batches(self, nodes: TensorType, batch: TensorType, random_state: int): + def sample_batches( + self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 + ): if self.is_multi_gpu: - # get resource handle - # pass label list, label_to_comm_rank - # all labels on this worker should remain there - pylibcugraph.uniform_neighbor_sample( + handle = pylibcugraph.ResourceHandle( + cugraph_comms_get_raft_handle().getHandle() + ) + label_to_output_comm_rank = torch.full( + (len(seeds),), self.rank, dtype=torch.int32, device="cuda" + ) + label_list = torch.unique(batch_ids) + sampling_results_dict = pylibcugraph.uniform_neighbor_sample( + handle, + self.__graph, + start_list=seeds, + batch_id_list=batch_ids, + label_list=label_list, + label_to_output_comm_rank=label_to_output_comm_rank, + h_fan_out=np.array(self.__fanout, dtype="int32"), + with_replacement=self.__with_replacement, + do_expensive_check=False, + with_edge_properties=True, + random_state=random_state, + prior_sources_behavior=self.__prior_sources_behavior, + deduplicate_sources=self.__deduplicate_sources, + return_hops=self.__return_hops, + renumber=self.__renumber, + compression=self.__compression, + compress_per_hop=self.__compress_per_hop, + return_dict=True, ) else: sampling_results_dict = pylibcugraph.uniform_neighbor_sample( pylibcugraph.ResourceHandle(), self.__graph, - start_list=nodes, - batch_id_list=batch, - h_fan_out=np.array(self.__fanout, dtype='int32'), + start_list=seeds, + batch_id_list=batch_ids, + h_fan_out=np.array(self.__fanout, dtype="int32"), with_replacement=self.__with_replacement, do_expensive_check=False, with_edge_properties=True, @@ -97,5 +183,5 @@ def sample_batches(self, nodes: TensorType, batch: TensorType, random_state: int compress_per_hop=self.__compress_per_hop, return_dict=True, ) - - return sampling_results_dict \ No newline at end of file + + return sampling_results_dict From 4e367190fdbca04253a4efe391cdb2684a33ffea Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 26 Mar 2024 13:18:01 -0700 Subject: [PATCH 06/33] more cleanup --- python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py index b668ecce424..fc27789621f 100644 --- a/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py +++ b/python/cugraph/cugraph/gnn/comms/cugraph_nccl_comms.py @@ -26,9 +26,6 @@ def nccl_init(rank: int, world_size: int, uid: int): - # calls a c++ function that calls ncclCommInitRank - # returns a resource handle and nccl communicator - # should wrap the resource handle and communicator in a CuGraph context object try: ni = nccl() ni.init(world_size, uid, rank) From 2fe5084aa6d016b0141972fd385dcdb391bebdfa Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 27 Mar 2024 14:48:50 -0700 Subject: [PATCH 07/33] writing --- .../cugraph/cugraph/gnn/data_loading/dist_sampler.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index b7190471c65..063afb8561d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -45,6 +45,9 @@ def _directory(self): @property def _batches_per_partition(self): return self.__batches_per_partition + + def __write_minibatches_coo(self): + def write_minibatches(self, minibatch_dict): if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): @@ -64,6 +67,7 @@ def __init__( rank: int = 0, ): self.__graph = graph + self.__writer = writer self.__local_seeds_per_call = local_seeds_per_call self.__rank = rank @@ -118,8 +122,6 @@ def __init__( fanout: List[int], prior_sources_behavior: str, deduplicate_sources: bool, - return_hops: bool, - renumber: bool, compression: str, compress_per_hop: bool, ): @@ -127,8 +129,6 @@ def __init__( self.__fanout = fanout self.__prior_sources_behavior = prior_sources_behavior self.__deduplicate_sources = deduplicate_sources - self.__return_hops = return_hops - self.__renumber = renumber self.__compress_per_hop = compress_per_hop self.__compression = compression @@ -158,7 +158,7 @@ def sample_batches( random_state=random_state, prior_sources_behavior=self.__prior_sources_behavior, deduplicate_sources=self.__deduplicate_sources, - return_hops=self.__return_hops, + return_hops=True, renumber=self.__renumber, compression=self.__compression, compress_per_hop=self.__compress_per_hop, From 50c5a8054eaa7cdb7775fe1c1660f124afc73b79 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 1 Apr 2024 14:46:57 -0700 Subject: [PATCH 08/33] pull in change --- .../cugraph/gnn/data_loading/dist_sampler.py | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 063afb8561d..68bb0539360 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -47,7 +47,65 @@ def _batches_per_partition(self): return self.__batches_per_partition def __write_minibatches_coo(self): - + label_hop_offsets_array = offsets.offsets.dropna().values + batch_id_array = offsets.batch_id.dropna().values + renumber_map_offsets_array = offsets.renumber_map_offsets.dropna().values + + # Offsets is always in order, so the last batch id is always the highest + print(offsets_array, batch_id_array) + max_batch_id = batch_id_array[-1] + results.dropna(axis=1, how="all", inplace=True) + + + for p in range(0, int(ceil(len(batch_id_array) / batches_per_partition))): + partition_start = p * (batches_per_partition) + partition_end = (p + 1) * (batches_per_partition) + + label_hop_offsets_array_current_partition = label_hop_offsets_array[ + partition_start * fanout_length : partition_end * fanout_length + 1 + ] + + batch_ids_current_partition = batch_id_array[partition_start:partition_end] + start_batch_id = batch_ids_current_partition[0] + + start_ix, end_ix = label_hop_offsets_array_current_partition[[0, -1]] + results_p = results.iloc[start_ix:end_ix].reset_index(drop=True) + + if renumber_map is None: + raise ValueError("Bulk sampling without renumbering is no longer supported") + + # create the renumber map offsets + renumber_map_offsets_array_current_partition = renumber_map_offsets_array[ + partition_start : partition_end + 1 + ] + + renumber_map_start_ix, renumber_map_end_ix = renumber_map_offsets_array_current_partition[[0,-1]] + + renumber_map_current_partition = renumber_map.renumber_map.values[ + renumber_map_start_ix:renumber_map_end_ix + ] + + results_current_partition = create_df_from_disjoint_series( + [ + results_p.majors, + results_p.minors, + cudf.Series(renumber_map_current_partition, name="map"), + cudf.Series(label_hop_offsets_array_current_partition, name="label_hop_offsets"), + results_p.weight, + results_p.edge_id, + results_p.edge_type, + cudf.Series(renumber_map_offsets_array_current_partition, name='renumber_map_offsets'), + ] + ) + + end_batch_id = start_batch_id + len(batch_ids_current_partition) - 1 + full_output_path = os.path.join( + output_path, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" + ) + + results_p.to_parquet( + full_output_path, compression=None, index=False, force_nullable_schema=True + ) def write_minibatches(self, minibatch_dict): if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): From 9e393a017e163b7112f278d9beaeb68cb08b9c29 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 1 Apr 2024 19:12:44 -0700 Subject: [PATCH 09/33] dist sampler io --- .../gnn/data_loading/bulk_sampler_io.py | 9 +- .../cugraph/gnn/data_loading/dist_sampler.py | 93 +++++++++++-------- 2 files changed, 62 insertions(+), 40 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py index 194df7d2f75..24b97d281a8 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py @@ -19,7 +19,7 @@ from pandas import isna -from typing import Union, Optional, List +from typing import Union, Optional, List, Dict def create_df_from_disjoint_series(series_list: List[cudf.Series]): @@ -32,6 +32,13 @@ def create_df_from_disjoint_series(series_list: List[cudf.Series]): return df +def create_df_from_disjoint_arrays(array_dict: Dict[cupy.array]): + for k in list(array_dict.keys()): + array_dict[k] = cudf.Series(array_dict[k], name=k) + + return create_df_from_disjoint_series(list(array_dict.values())) + + def _write_samples_to_parquet_csr( results: cudf.DataFrame, offsets: cudf.DataFrame, diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 68bb0539360..2d6649018eb 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -11,6 +11,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os +from math import ceil + import pylibcugraph import numpy as np import cupy @@ -20,7 +23,7 @@ from cugraph.utilities import import_optional from cugraph.gnn import cugraph_comms_get_raft_handle -from math import ceil +from cugraph.gnn.data_loading.bulk_sampler_io import create_df_from_disjoint_arrays # PyTorch is NOT optional but this is required for container builds. torch = import_optional("torch") @@ -46,71 +49,83 @@ def _directory(self): def _batches_per_partition(self): return self.__batches_per_partition - def __write_minibatches_coo(self): - label_hop_offsets_array = offsets.offsets.dropna().values - batch_id_array = offsets.batch_id.dropna().values - renumber_map_offsets_array = offsets.renumber_map_offsets.dropna().values + def __write_minibatches_coo(self, minibatch_dict): + has_edge_ids = minibatch_dict['edge_id'] is not None + has_edge_types = minibatch_dict['edge_type'] is not None + has_weights = minibatch_dict['weight'] is not None - # Offsets is always in order, so the last batch id is always the highest - print(offsets_array, batch_id_array) - max_batch_id = batch_id_array[-1] - results.dropna(axis=1, how="all", inplace=True) + if minibatch_dict['renumber_map'] is None: + raise ValueError("Distributed sampling without renumbering is not supported") + fanout_length = (len(minibatch_dict['label_hop_offsets']) - 1) // len(minibatch_dict['batch_id']) - for p in range(0, int(ceil(len(batch_id_array) / batches_per_partition))): - partition_start = p * (batches_per_partition) - partition_end = (p + 1) * (batches_per_partition) + for p in range(0, int(ceil(len(minibatch_dict['batch_id']) / self.__batches_per_partition))): + partition_start = p * (self.__batches_per_partition) + partition_end = (p + 1) * (self.__batches_per_partition) - label_hop_offsets_array_current_partition = label_hop_offsets_array[ + label_hop_offsets_array_p = minibatch_dict['label_hop_offsets'][ partition_start * fanout_length : partition_end * fanout_length + 1 ] - batch_ids_current_partition = batch_id_array[partition_start:partition_end] - start_batch_id = batch_ids_current_partition[0] - - start_ix, end_ix = label_hop_offsets_array_current_partition[[0, -1]] - results_p = results.iloc[start_ix:end_ix].reset_index(drop=True) + batch_id_array_p = minibatch_dict['batch_id'][partition_start:partition_end] + start_batch_id = batch_id_array_p[0] - if renumber_map is None: - raise ValueError("Bulk sampling without renumbering is no longer supported") + start_ix, end_ix = label_hop_offsets_array_p[[0, -1]] + majors_array_p = minibatch_dict["majors"][start_ix:end_ix] + minors_array_p = minibatch_dict["minors"][start_ix:end_ix] + edge_id_array_p = ( + minibatch_dict["edge_id"][start_ix:end_ix] if has_edge_ids + else cupy.array([], dtype='int64') + ) + edge_type_array_p = ( + minibatch_dict["edge_type"][start_ix:end_ix] if has_edge_types + else cupy.array([], dtype='int32') + ) + weight_array_p = ( + minibatch_dict["weight"][start_ix:end_ix] if has_weights + else cupy.array([], dtype='float32') + ) # create the renumber map offsets - renumber_map_offsets_array_current_partition = renumber_map_offsets_array[ + renumber_map_offsets_array_p = minibatch_dict['renumber_map_offsets'][ partition_start : partition_end + 1 ] - renumber_map_start_ix, renumber_map_end_ix = renumber_map_offsets_array_current_partition[[0,-1]] + renumber_map_start_ix, renumber_map_end_ix = renumber_map_offsets_array_p[[0,-1]] - renumber_map_current_partition = renumber_map.renumber_map.values[ + renumber_map_array_p = minibatch_dict['renumber_map'][ renumber_map_start_ix:renumber_map_end_ix ] - results_current_partition = create_df_from_disjoint_series( - [ - results_p.majors, - results_p.minors, - cudf.Series(renumber_map_current_partition, name="map"), - cudf.Series(label_hop_offsets_array_current_partition, name="label_hop_offsets"), - results_p.weight, - results_p.edge_id, - results_p.edge_type, - cudf.Series(renumber_map_offsets_array_current_partition, name='renumber_map_offsets'), - ] + results_dataframe_p = create_df_from_disjoint_arrays( + { + 'majors': majors_array_p, + 'minors': minors_array_p, + 'map': renumber_map_array_p, + 'label_hop_offsets': label_hop_offsets_array_p, + 'weight': weight_array_p, + 'edge_id': edge_id_array_p, + 'edge_type': edge_type_array_p, + 'renumber_map_offsets': renumber_map_offsets_array_p, + } ) - end_batch_id = start_batch_id + len(batch_ids_current_partition) - 1 + end_batch_id = start_batch_id + len(batch_id_array_p) - 1 full_output_path = os.path.join( - output_path, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" + self.__directory, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" ) - results_p.to_parquet( + results_dataframe_p.to_parquet( full_output_path, compression=None, index=False, force_nullable_schema=True ) + + def __write_minibatches_csr(self, minibatch_dict): + raise NotImplementedError("CSR format currently not supported for distributed sampling") def write_minibatches(self, minibatch_dict): - if ("majors" in minibatch_dict) and ("minors" in minibatch_dict): + if (minibatch_dict['majors'] is not None) and (minibatch_dict['minors'] is not None): self.__write_minibatches_coo(minibatch_dict) - elif "major_offsets" in minibatch_dict and "minors" in minibatch_dict: + elif (minibatch_dict["major_offsets"] is not None) and (minibatch_dict['minors'] is not None): self.__write_minibatches_csr(minibatch_dict) else: raise ValueError("invalid columns") From b35ad1f187fa6710b172fbf6aabd10b596b6119f Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 13:39:26 -0700 Subject: [PATCH 10/33] dist sampling io --- .../examples/cugraph_dist_sampling.py | 105 +++++++++++++++ python/cugraph/cugraph/gnn/__init__.py | 5 + python/cugraph/cugraph/gnn/comms/__init__.py | 7 + .../cugraph/gnn/data_loading/__init__.py | 5 + .../gnn/data_loading/bulk_sampler_io.py | 2 +- .../cugraph/gnn/data_loading/dist_sampler.py | 122 +++++++++++++----- 6 files changed, 210 insertions(+), 36 deletions(-) create mode 100644 python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py new file mode 100644 index 00000000000..10033304e91 --- /dev/null +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py @@ -0,0 +1,105 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This example shows how to use cuGraph nccl-only comms, pylibcuGraph, +# and PyTorch DDP to run a multi-GPU sampling workflow. Most users of the +# GNN packages will not interact with cuGraph directly. This example +# is intented for users who want to extend cuGraph within a DDP workflow. + +import os + +import tempfile +import numpy as np +import torch +import torch.multiprocessing as tmp +import torch.distributed as dist + +import cudf + +from cugraph.gnn import ( + cugraph_comms_init, + cugraph_comms_shutdown, + cugraph_comms_create_unique_id, + cugraph_comms_get_raft_handle, + DistSampleWriter, + UniformNeighborSampler +) + +from pylibcugraph import MGGraph, ResourceHandle, GraphProperties + +from ogb.nodeproppred import NodePropPredDataset + + +def init_pytorch(rank, world_size): + os.environ["MASTER_ADDR"] = "localhost" + os.environ["MASTER_PORT"] = "12355" + dist.init_process_group("nccl", rank=rank, world_size=world_size) + + +def sample(rank: int, world_size: int, uid, edgelist, directory): + init_pytorch(rank, world_size) + + device = rank + cugraph_comms_init(rank, world_size, uid, device) + + print(f"rank {rank} initialized cugraph") + + src = cudf.Series(np.array_split(edgelist[0], world_size)[rank]) + dst = cudf.Series(np.array_split(edgelist[1], world_size)[rank]) + + seeds = cudf.Series(np.arange(rank * 50, (rank + 1) * 50)) + handle = ResourceHandle(cugraph_comms_get_raft_handle().getHandle()) + + print("constructing graph") + G = MGGraph( + handle, + GraphProperties(is_multigraph=True, is_symmetric=False), + [src], + [dst], + ) + print("graph constructed") + + sample_writer = DistSampleWriter( + directory=directory, + batches_per_partition=2 + ) + sampler = UniformNeighborSampler( + G, + sample_writer, + fanout=[5,5], + ) + + sampler.sample_from_nodes(seeds, batch_size=16, random_state=62) + + dist.barrier() + cugraph_comms_shutdown() + print(f"rank {rank} shut down cugraph") + + +def main(): + world_size = torch.cuda.device_count() + uid = cugraph_comms_create_unique_id() + + dataset = NodePropPredDataset("ogbn-products") + el = dataset[0][0]["edge_index"].astype("int64") + + with tempfile.TemporaryDirectory() as directory: + tmp.spawn( + sample, + args=(world_size, uid, el, '.'), + nprocs=world_size, + ) + + +if __name__ == "__main__": + main() diff --git a/python/cugraph/cugraph/gnn/__init__.py b/python/cugraph/cugraph/gnn/__init__.py index 20fefc7de8a..2f0bc2c0bd5 100644 --- a/python/cugraph/cugraph/gnn/__init__.py +++ b/python/cugraph/cugraph/gnn/__init__.py @@ -13,6 +13,11 @@ from .feature_storage.feat_storage import FeatureStore from .data_loading.bulk_sampler import BulkSampler +from .data_loading.dist_sampler import ( + DistSampler, + DistSampleWriter, + UniformNeighborSampler +) from .comms.cugraph_nccl_comms import ( cugraph_comms_init, cugraph_comms_shutdown, diff --git a/python/cugraph/cugraph/gnn/comms/__init__.py b/python/cugraph/cugraph/gnn/comms/__init__.py index aeae6078111..4b40de85abb 100644 --- a/python/cugraph/cugraph/gnn/comms/__init__.py +++ b/python/cugraph/cugraph/gnn/comms/__init__.py @@ -10,3 +10,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +from .cugraph_nccl_comms import ( + cugraph_comms_init, + cugraph_comms_shutdown, + cugraph_comms_create_unique_id, + cugraph_comms_get_raft_handle, +) \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/data_loading/__init__.py b/python/cugraph/cugraph/gnn/data_loading/__init__.py index 4b725fba75a..4eb4bf3de9e 100644 --- a/python/cugraph/cugraph/gnn/data_loading/__init__.py +++ b/python/cugraph/cugraph/gnn/data_loading/__init__.py @@ -12,3 +12,8 @@ # limitations under the License. from cugraph.gnn.data_loading.bulk_sampler import BulkSampler +from cugraph.gnn.data_loading.dist_sampler import ( + DistSampler, + DistSampleWriter, + UniformNeighborSampler +) \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py index 24b97d281a8..a109f8fac93 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py @@ -32,7 +32,7 @@ def create_df_from_disjoint_series(series_list: List[cudf.Series]): return df -def create_df_from_disjoint_arrays(array_dict: Dict[cupy.array]): +def create_df_from_disjoint_arrays(array_dict: Dict[str, cupy.array]): for k in list(array_dict.keys()): array_dict[k] = cudf.Series(array_dict[k], name=k) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 2d6649018eb..537e38cf780 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -12,6 +12,7 @@ # limitations under the License. import os +import warnings from math import ceil import pylibcugraph @@ -21,7 +22,7 @@ from typing import Union, List from cugraph.utilities import import_optional -from cugraph.gnn import cugraph_comms_get_raft_handle +from cugraph.gnn.comms import cugraph_comms_get_raft_handle from cugraph.gnn.data_loading.bulk_sampler_io import create_df_from_disjoint_arrays @@ -32,7 +33,10 @@ class DistSampleWriter: - def __init__(self, format: str, directory: str, batches_per_partition: int): + def __init__(self, directory: str, *, batches_per_partition: int=256, format: str="parquet"): + if format != "parquet": + raise ValueError("Invalid format (currently supported: 'parquet')") + self.__format = format self.__directory = directory self.__batches_per_partition = batches_per_partition @@ -54,10 +58,12 @@ def __write_minibatches_coo(self, minibatch_dict): has_edge_types = minibatch_dict['edge_type'] is not None has_weights = minibatch_dict['weight'] is not None + print(minibatch_dict) if minibatch_dict['renumber_map'] is None: raise ValueError("Distributed sampling without renumbering is not supported") fanout_length = (len(minibatch_dict['label_hop_offsets']) - 1) // len(minibatch_dict['batch_id']) + rank_batch_offset = minibatch_dict['batch_id'][0] for p in range(0, int(ceil(len(minibatch_dict['batch_id']) / self.__batches_per_partition))): partition_start = p * (self.__batches_per_partition) @@ -68,7 +74,7 @@ def __write_minibatches_coo(self, minibatch_dict): ] batch_id_array_p = minibatch_dict['batch_id'][partition_start:partition_end] - start_batch_id = batch_id_array_p[0] + start_batch_id = batch_id_array_p[0] - rank_batch_offset start_ix, end_ix = label_hop_offsets_array_p[[0, -1]] majors_array_p = minibatch_dict["majors"][start_ix:end_ix] @@ -111,9 +117,16 @@ def __write_minibatches_coo(self, minibatch_dict): ) end_batch_id = start_batch_id + len(batch_id_array_p) - 1 - full_output_path = os.path.join( - self.__directory, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" - ) + if 'rank' in minibatch_dict: + rank = minibatch_dict['rank'] + full_output_path = os.path.join( + self.__directory, f"batch={rank:05d}{start_batch_id:08d}-{rank:05d}{end_batch_id:08d}.parquet" + ) + else: + full_output_path = os.path.join( + self.__directory, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" + ) + results_dataframe_p.to_parquet( full_output_path, compression=None, index=False, force_nullable_schema=True @@ -137,29 +150,45 @@ def __init__( graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], writer: DistSampleWriter, local_seeds_per_call: int = 32768, - rank: int = 0, ): self.__graph = graph self.__writer = writer self.__local_seeds_per_call = local_seeds_per_call - self.__rank = rank def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 ): raise NotImplementedError("Must be implemented by subclass") - def sample_from_nodes(self, nodes: TensorType, batch_size: int, random_state: int): + def sample_from_nodes(self, nodes: TensorType, *, batch_size: int=16, random_state: int=62): batches_per_call = self._local_seeds_per_call // batch_size actual_seeds_per_call = batches_per_call * batch_size - num_calls = int(ceil(len(nodes) / actual_seeds_per_call)) - nodes = torch.split(torch.as_tensor(nodes, device="cuda"), num_calls) + num_seeds = len(nodes) + nodes = torch.split(torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call) + + if self.is_multi_gpu: + rank = torch.distributed.get_rank() + world_size = torch.distributed.get_world_size() + + t = torch.empty((world_size,), dtype=torch.int64, device='cuda') + local_size = torch.tensor([int(ceil(num_seeds / batch_size))], dtype=torch.int64, device='cuda') + + torch.distributed.all_gather_into_tensor(t, local_size) + if (t != local_size).any() and rank == 0: + warnings.warn( + "Not all ranks received the same number of batches. " + "This might cause your training loop to hang due to uneven inputs." + ) + + batch_id_start = t.cumsum(dim=0)[rank] - t[0] + else: + batch_id_start = 0 for i, current_seeds in enumerate(nodes): current_batches = torch.arange( - i * batches_per_call, - (i + 1) * batches_per_call, + batch_id_start + i * batches_per_call, + batch_id_start + (i + 1) * batches_per_call, device="cuda", dtype=torch.int32, ) @@ -182,67 +211,90 @@ def is_multi_gpu(self): @property def _local_seeds_per_call(self): return self.__local_seeds_per_call - + @property - def rank(self): - return self.__rank + def _graph(self): + return self.__graph class UniformNeighborSampler(DistSampler): def __init__( self, graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], - fanout: List[int], - prior_sources_behavior: str, - deduplicate_sources: bool, - compression: str, - compress_per_hop: bool, + writer: DistSampleWriter, + *, + local_seeds_per_call:int = 32768, + fanout: List[int] = [-1], + prior_sources_behavior: str = 'exclude', + deduplicate_sources: bool = True, + compression: str = "COO", + compress_per_hop: bool = False, + with_replacement: bool = False, ): - super(graph) + super().__init__(graph, writer, local_seeds_per_call=local_seeds_per_call) self.__fanout = fanout self.__prior_sources_behavior = prior_sources_behavior self.__deduplicate_sources = deduplicate_sources self.__compress_per_hop = compress_per_hop self.__compression = compression + self.__with_replacement = with_replacement def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 ): + # FIXME allow skipping of the synchronization logic with a boolean + # flag that assumes all ranks have the same number of batches. if self.is_multi_gpu: + rank = torch.distributed.get_rank() + world_size = torch.distributed.get_world_size() handle = pylibcugraph.ResourceHandle( cugraph_comms_get_raft_handle().getHandle() ) - label_to_output_comm_rank = torch.full( - (len(seeds),), self.rank, dtype=torch.int32, device="cuda" + + local_label_list = torch.unique(batch_ids) + local_label_to_output_comm_rank = torch.full( + (len(local_label_list),), rank, dtype=torch.int32, device="cuda" ) - label_list = torch.unique(batch_ids) + + num_batches = torch.tensor([len(local_label_list)], device='cuda', dtype=torch.int64) + torch.distributed.all_reduce(num_batches, op=torch.distributed.ReduceOp.SUM) + + label_list = torch.empty((num_batches,), device='cuda', dtype=torch.int32) + w1 = torch.distributed.all_gather_into_tensor(label_list, local_label_list, async_op=True) + + label_to_output_comm_rank = torch.empty((num_batches,), device='cuda', dtype=torch.int32) + w2 = torch.distributed.all_gather_into_tensor(label_to_output_comm_rank, local_label_to_output_comm_rank, async_op=True) + + w1.wait() + w2.wait() sampling_results_dict = pylibcugraph.uniform_neighbor_sample( handle, - self.__graph, - start_list=seeds, - batch_id_list=batch_ids, - label_list=label_list, - label_to_output_comm_rank=label_to_output_comm_rank, + self._graph, + start_list=cupy.asarray(seeds), + batch_id_list=cupy.asarray(batch_ids), + label_list=cupy.asarray(label_list), + label_to_output_comm_rank=cupy.asarray(label_to_output_comm_rank), h_fan_out=np.array(self.__fanout, dtype="int32"), with_replacement=self.__with_replacement, do_expensive_check=False, with_edge_properties=True, - random_state=random_state, + random_state=random_state + rank, prior_sources_behavior=self.__prior_sources_behavior, deduplicate_sources=self.__deduplicate_sources, return_hops=True, - renumber=self.__renumber, + renumber=True, compression=self.__compression, compress_per_hop=self.__compress_per_hop, return_dict=True, ) + sampling_results_dict['rank'] = rank else: sampling_results_dict = pylibcugraph.uniform_neighbor_sample( pylibcugraph.ResourceHandle(), self.__graph, - start_list=seeds, - batch_id_list=batch_ids, + start_list=cupy.asarray(seeds), + batch_id_list=cupy.asarray(batch_ids), h_fan_out=np.array(self.__fanout, dtype="int32"), with_replacement=self.__with_replacement, do_expensive_check=False, @@ -251,7 +303,7 @@ def sample_batches( prior_sources_behavior=self.__prior_sources_behavior, deduplicate_sources=self.__deduplicate_sources, return_hops=self.__return_hops, - renumber=self.__renumber, + renumber=True, compression=self.__compression, compress_per_hop=self.__compress_per_hop, return_dict=True, From 9bc944b489c91dbade9202069a47d0c860f4b059 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 14:34:00 -0700 Subject: [PATCH 11/33] cleanup --- .../cugraph_pyg/examples/cugraph_dist_sampling.py | 11 ++++++++++- .../cugraph/cugraph/gnn/data_loading/dist_sampler.py | 3 +-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py index 10033304e91..29366c404df 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py @@ -17,8 +17,9 @@ # is intented for users who want to extend cuGraph within a DDP workflow. import os - +import re import tempfile + import numpy as np import torch import torch.multiprocessing as tmp @@ -100,6 +101,14 @@ def main(): nprocs=world_size, ) + print("Printing samples...") + for file in os.listdir(directory): + m=re.match(r'batch=([0-9]+)\.([0-9]+)\-([0-9]+)\.([0-9]+)\.parquet', file) + rank, start, _, end = int(m[1]), int(m[2]), int(m[3]), int(m[4]) + print(f'File: {file} (batches {start} to {end} for rank {rank})') + print(cudf.read_parquet(os.path.join(directory, file))) + print('\n') + if __name__ == "__main__": main() diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 537e38cf780..c3948e73da8 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -58,7 +58,6 @@ def __write_minibatches_coo(self, minibatch_dict): has_edge_types = minibatch_dict['edge_type'] is not None has_weights = minibatch_dict['weight'] is not None - print(minibatch_dict) if minibatch_dict['renumber_map'] is None: raise ValueError("Distributed sampling without renumbering is not supported") @@ -120,7 +119,7 @@ def __write_minibatches_coo(self, minibatch_dict): if 'rank' in minibatch_dict: rank = minibatch_dict['rank'] full_output_path = os.path.join( - self.__directory, f"batch={rank:05d}{start_batch_id:08d}-{rank:05d}{end_batch_id:08d}.parquet" + self.__directory, f"batch={rank:05d}.{start_batch_id:08d}-{rank:05d}.{end_batch_id:08d}.parquet" ) else: full_output_path = os.path.join( From 5e9135b1596606b00c51d9ff63818d6949f59b58 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 14:53:41 -0700 Subject: [PATCH 12/33] style --- .../examples/cugraph_dist_sampling.py | 17 +- python/cugraph/cugraph/gnn/__init__.py | 2 +- python/cugraph/cugraph/gnn/comms/__init__.py | 2 +- .../cugraph/gnn/data_loading/__init__.py | 6 +- .../gnn/data_loading/bulk_sampler_io.py | 2 +- .../cugraph/gnn/data_loading/dist_sampler.py | 155 +++++++++++------- 6 files changed, 112 insertions(+), 72 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py index 29366c404df..c66d649658f 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py @@ -33,7 +33,7 @@ cugraph_comms_create_unique_id, cugraph_comms_get_raft_handle, DistSampleWriter, - UniformNeighborSampler + UniformNeighborSampler, ) from pylibcugraph import MGGraph, ResourceHandle, GraphProperties @@ -70,14 +70,11 @@ def sample(rank: int, world_size: int, uid, edgelist, directory): ) print("graph constructed") - sample_writer = DistSampleWriter( - directory=directory, - batches_per_partition=2 - ) + sample_writer = DistSampleWriter(directory=directory, batches_per_partition=2) sampler = UniformNeighborSampler( G, sample_writer, - fanout=[5,5], + fanout=[5, 5], ) sampler.sample_from_nodes(seeds, batch_size=16, random_state=62) @@ -97,17 +94,17 @@ def main(): with tempfile.TemporaryDirectory() as directory: tmp.spawn( sample, - args=(world_size, uid, el, '.'), + args=(world_size, uid, el, "."), nprocs=world_size, ) print("Printing samples...") for file in os.listdir(directory): - m=re.match(r'batch=([0-9]+)\.([0-9]+)\-([0-9]+)\.([0-9]+)\.parquet', file) + m = re.match(r"batch=([0-9]+)\.([0-9]+)\-([0-9]+)\.([0-9]+)\.parquet", file) rank, start, _, end = int(m[1]), int(m[2]), int(m[3]), int(m[4]) - print(f'File: {file} (batches {start} to {end} for rank {rank})') + print(f"File: {file} (batches {start} to {end} for rank {rank})") print(cudf.read_parquet(os.path.join(directory, file))) - print('\n') + print("\n") if __name__ == "__main__": diff --git a/python/cugraph/cugraph/gnn/__init__.py b/python/cugraph/cugraph/gnn/__init__.py index 2f0bc2c0bd5..1f4d98f0230 100644 --- a/python/cugraph/cugraph/gnn/__init__.py +++ b/python/cugraph/cugraph/gnn/__init__.py @@ -16,7 +16,7 @@ from .data_loading.dist_sampler import ( DistSampler, DistSampleWriter, - UniformNeighborSampler + UniformNeighborSampler, ) from .comms.cugraph_nccl_comms import ( cugraph_comms_init, diff --git a/python/cugraph/cugraph/gnn/comms/__init__.py b/python/cugraph/cugraph/gnn/comms/__init__.py index 4b40de85abb..b842dd0927d 100644 --- a/python/cugraph/cugraph/gnn/comms/__init__.py +++ b/python/cugraph/cugraph/gnn/comms/__init__.py @@ -16,4 +16,4 @@ cugraph_comms_shutdown, cugraph_comms_create_unique_id, cugraph_comms_get_raft_handle, -) \ No newline at end of file +) diff --git a/python/cugraph/cugraph/gnn/data_loading/__init__.py b/python/cugraph/cugraph/gnn/data_loading/__init__.py index 4eb4bf3de9e..a50f6085e9a 100644 --- a/python/cugraph/cugraph/gnn/data_loading/__init__.py +++ b/python/cugraph/cugraph/gnn/data_loading/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-2024, NVIDIA CORPORATION. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -15,5 +15,5 @@ from cugraph.gnn.data_loading.dist_sampler import ( DistSampler, DistSampleWriter, - UniformNeighborSampler -) \ No newline at end of file + UniformNeighborSampler, +) diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py index a109f8fac93..6abbd82647b 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py @@ -35,7 +35,7 @@ def create_df_from_disjoint_series(series_list: List[cudf.Series]): def create_df_from_disjoint_arrays(array_dict: Dict[str, cupy.array]): for k in list(array_dict.keys()): array_dict[k] = cudf.Series(array_dict[k], name=k) - + return create_df_from_disjoint_series(list(array_dict.values())) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index c3948e73da8..42e7d95c44d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -33,7 +33,13 @@ class DistSampleWriter: - def __init__(self, directory: str, *, batches_per_partition: int=256, format: str="parquet"): + def __init__( + self, + directory: str, + *, + batches_per_partition: int = 256, + format: str = "parquet", + ): if format != "parquet": raise ValueError("Invalid format (currently supported: 'parquet')") @@ -52,92 +58,114 @@ def _directory(self): @property def _batches_per_partition(self): return self.__batches_per_partition - + def __write_minibatches_coo(self, minibatch_dict): - has_edge_ids = minibatch_dict['edge_id'] is not None - has_edge_types = minibatch_dict['edge_type'] is not None - has_weights = minibatch_dict['weight'] is not None + has_edge_ids = minibatch_dict["edge_id"] is not None + has_edge_types = minibatch_dict["edge_type"] is not None + has_weights = minibatch_dict["weight"] is not None - if minibatch_dict['renumber_map'] is None: - raise ValueError("Distributed sampling without renumbering is not supported") + if minibatch_dict["renumber_map"] is None: + raise ValueError( + "Distributed sampling without renumbering is not supported" + ) - fanout_length = (len(minibatch_dict['label_hop_offsets']) - 1) // len(minibatch_dict['batch_id']) - rank_batch_offset = minibatch_dict['batch_id'][0] + fanout_length = (len(minibatch_dict["label_hop_offsets"]) - 1) // len( + minibatch_dict["batch_id"] + ) + rank_batch_offset = minibatch_dict["batch_id"][0] - for p in range(0, int(ceil(len(minibatch_dict['batch_id']) / self.__batches_per_partition))): + for p in range( + 0, int(ceil(len(minibatch_dict["batch_id"]) / self.__batches_per_partition)) + ): partition_start = p * (self.__batches_per_partition) partition_end = (p + 1) * (self.__batches_per_partition) - label_hop_offsets_array_p = minibatch_dict['label_hop_offsets'][ + label_hop_offsets_array_p = minibatch_dict["label_hop_offsets"][ partition_start * fanout_length : partition_end * fanout_length + 1 ] - batch_id_array_p = minibatch_dict['batch_id'][partition_start:partition_end] + batch_id_array_p = minibatch_dict["batch_id"][partition_start:partition_end] start_batch_id = batch_id_array_p[0] - rank_batch_offset start_ix, end_ix = label_hop_offsets_array_p[[0, -1]] majors_array_p = minibatch_dict["majors"][start_ix:end_ix] minors_array_p = minibatch_dict["minors"][start_ix:end_ix] edge_id_array_p = ( - minibatch_dict["edge_id"][start_ix:end_ix] if has_edge_ids - else cupy.array([], dtype='int64') + minibatch_dict["edge_id"][start_ix:end_ix] + if has_edge_ids + else cupy.array([], dtype="int64") ) edge_type_array_p = ( - minibatch_dict["edge_type"][start_ix:end_ix] if has_edge_types - else cupy.array([], dtype='int32') + minibatch_dict["edge_type"][start_ix:end_ix] + if has_edge_types + else cupy.array([], dtype="int32") ) weight_array_p = ( - minibatch_dict["weight"][start_ix:end_ix] if has_weights - else cupy.array([], dtype='float32') + minibatch_dict["weight"][start_ix:end_ix] + if has_weights + else cupy.array([], dtype="float32") ) - + # create the renumber map offsets - renumber_map_offsets_array_p = minibatch_dict['renumber_map_offsets'][ + renumber_map_offsets_array_p = minibatch_dict["renumber_map_offsets"][ partition_start : partition_end + 1 ] - renumber_map_start_ix, renumber_map_end_ix = renumber_map_offsets_array_p[[0,-1]] + renumber_map_start_ix, renumber_map_end_ix = renumber_map_offsets_array_p[ + [0, -1] + ] - renumber_map_array_p = minibatch_dict['renumber_map'][ + renumber_map_array_p = minibatch_dict["renumber_map"][ renumber_map_start_ix:renumber_map_end_ix ] results_dataframe_p = create_df_from_disjoint_arrays( { - 'majors': majors_array_p, - 'minors': minors_array_p, - 'map': renumber_map_array_p, - 'label_hop_offsets': label_hop_offsets_array_p, - 'weight': weight_array_p, - 'edge_id': edge_id_array_p, - 'edge_type': edge_type_array_p, - 'renumber_map_offsets': renumber_map_offsets_array_p, + "majors": majors_array_p, + "minors": minors_array_p, + "map": renumber_map_array_p, + "label_hop_offsets": label_hop_offsets_array_p, + "weight": weight_array_p, + "edge_id": edge_id_array_p, + "edge_type": edge_type_array_p, + "renumber_map_offsets": renumber_map_offsets_array_p, } ) end_batch_id = start_batch_id + len(batch_id_array_p) - 1 - if 'rank' in minibatch_dict: - rank = minibatch_dict['rank'] + if "rank" in minibatch_dict: + rank = minibatch_dict["rank"] full_output_path = os.path.join( - self.__directory, f"batch={rank:05d}.{start_batch_id:08d}-{rank:05d}.{end_batch_id:08d}.parquet" + self.__directory, + f"batch={rank:05d}.{start_batch_id:08d}-" + f"{rank:05d}.{end_batch_id:08d}.parquet", ) else: full_output_path = os.path.join( - self.__directory, f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet" + self.__directory, + f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet", ) - results_dataframe_p.to_parquet( - full_output_path, compression=None, index=False, force_nullable_schema=True + full_output_path, + compression=None, + index=False, + force_nullable_schema=True, ) - + def __write_minibatches_csr(self, minibatch_dict): - raise NotImplementedError("CSR format currently not supported for distributed sampling") + raise NotImplementedError( + "CSR format currently not supported for distributed sampling" + ) def write_minibatches(self, minibatch_dict): - if (minibatch_dict['majors'] is not None) and (minibatch_dict['minors'] is not None): + if (minibatch_dict["majors"] is not None) and ( + minibatch_dict["minors"] is not None + ): self.__write_minibatches_coo(minibatch_dict) - elif (minibatch_dict["major_offsets"] is not None) and (minibatch_dict['minors'] is not None): + elif (minibatch_dict["major_offsets"] is not None) and ( + minibatch_dict["minors"] is not None + ): self.__write_minibatches_csr(minibatch_dict) else: raise ValueError("invalid columns") @@ -159,20 +187,26 @@ def sample_batches( ): raise NotImplementedError("Must be implemented by subclass") - def sample_from_nodes(self, nodes: TensorType, *, batch_size: int=16, random_state: int=62): + def sample_from_nodes( + self, nodes: TensorType, *, batch_size: int = 16, random_state: int = 62 + ): batches_per_call = self._local_seeds_per_call // batch_size actual_seeds_per_call = batches_per_call * batch_size num_seeds = len(nodes) - nodes = torch.split(torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call) + nodes = torch.split( + torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call + ) if self.is_multi_gpu: rank = torch.distributed.get_rank() world_size = torch.distributed.get_world_size() - t = torch.empty((world_size,), dtype=torch.int64, device='cuda') - local_size = torch.tensor([int(ceil(num_seeds / batch_size))], dtype=torch.int64, device='cuda') - + t = torch.empty((world_size,), dtype=torch.int64, device="cuda") + local_size = torch.tensor( + [int(ceil(num_seeds / batch_size))], dtype=torch.int64, device="cuda" + ) + torch.distributed.all_gather_into_tensor(t, local_size) if (t != local_size).any() and rank == 0: warnings.warn( @@ -210,7 +244,7 @@ def is_multi_gpu(self): @property def _local_seeds_per_call(self): return self.__local_seeds_per_call - + @property def _graph(self): return self.__graph @@ -222,9 +256,9 @@ def __init__( graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], writer: DistSampleWriter, *, - local_seeds_per_call:int = 32768, + local_seeds_per_call: int = 32768, fanout: List[int] = [-1], - prior_sources_behavior: str = 'exclude', + prior_sources_behavior: str = "exclude", deduplicate_sources: bool = True, compression: str = "COO", compress_per_hop: bool = False, @@ -245,24 +279,33 @@ def sample_batches( # flag that assumes all ranks have the same number of batches. if self.is_multi_gpu: rank = torch.distributed.get_rank() - world_size = torch.distributed.get_world_size() handle = pylibcugraph.ResourceHandle( cugraph_comms_get_raft_handle().getHandle() ) - + local_label_list = torch.unique(batch_ids) local_label_to_output_comm_rank = torch.full( (len(local_label_list),), rank, dtype=torch.int32, device="cuda" ) - num_batches = torch.tensor([len(local_label_list)], device='cuda', dtype=torch.int64) + num_batches = torch.tensor( + [len(local_label_list)], device="cuda", dtype=torch.int64 + ) torch.distributed.all_reduce(num_batches, op=torch.distributed.ReduceOp.SUM) - label_list = torch.empty((num_batches,), device='cuda', dtype=torch.int32) - w1 = torch.distributed.all_gather_into_tensor(label_list, local_label_list, async_op=True) + label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) + w1 = torch.distributed.all_gather_into_tensor( + label_list, local_label_list, async_op=True + ) - label_to_output_comm_rank = torch.empty((num_batches,), device='cuda', dtype=torch.int32) - w2 = torch.distributed.all_gather_into_tensor(label_to_output_comm_rank, local_label_to_output_comm_rank, async_op=True) + label_to_output_comm_rank = torch.empty( + (num_batches,), device="cuda", dtype=torch.int32 + ) + w2 = torch.distributed.all_gather_into_tensor( + label_to_output_comm_rank, + local_label_to_output_comm_rank, + async_op=True, + ) w1.wait() w2.wait() @@ -287,7 +330,7 @@ def sample_batches( compress_per_hop=self.__compress_per_hop, return_dict=True, ) - sampling_results_dict['rank'] = rank + sampling_results_dict["rank"] = rank else: sampling_results_dict = pylibcugraph.uniform_neighbor_sample( pylibcugraph.ResourceHandle(), From 059327832bf3e6fc06e4f229e898dc798870f792 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 15:07:22 -0700 Subject: [PATCH 13/33] sg example --- ...ampling.py => cugraph_dist_sampling_mg.py} | 0 .../examples/cugraph_dist_sampling_sg.py | 82 +++++++++++++++++++ .../cugraph/gnn/data_loading/dist_sampler.py | 23 ++---- 3 files changed, 91 insertions(+), 14 deletions(-) rename python/cugraph-pyg/cugraph_pyg/examples/{cugraph_dist_sampling.py => cugraph_dist_sampling_mg.py} (100%) create mode 100644 python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py similarity index 100% rename from python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling.py rename to python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py new file mode 100644 index 00000000000..119e2aa5199 --- /dev/null +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py @@ -0,0 +1,82 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This example shows how to use cuGraph nccl-only comms, pylibcuGraph, +# and PyTorch DDP to run a multi-GPU sampling workflow. Most users of the +# GNN packages will not interact with cuGraph directly. This example +# is intented for users who want to extend cuGraph within a DDP workflow. + +import os +import re +import tempfile + +import numpy as np +import torch +import torch.multiprocessing as tmp +import torch.distributed as dist + +import cudf + +from cugraph.gnn import ( + DistSampleWriter, + UniformNeighborSampler, +) + +from pylibcugraph import SGGraph, ResourceHandle, GraphProperties + +from ogb.nodeproppred import NodePropPredDataset + + +def sample(edgelist, directory): + src = cudf.Series(edgelist[0]) + dst = cudf.Series(edgelist[1]) + + seeds = cudf.Series(np.arange(0, 50)) + + print("constructing graph") + G = SGGraph( + ResourceHandle(), + GraphProperties(is_multigraph=True, is_symmetric=False), + src, + dst, + ) + print("graph constructed") + + sample_writer = DistSampleWriter(directory=directory, batches_per_partition=2) + sampler = UniformNeighborSampler( + G, + sample_writer, + fanout=[5, 5], + ) + + sampler.sample_from_nodes(seeds, batch_size=16, random_state=62) + + +def main(): + dataset = NodePropPredDataset("ogbn-products") + el = dataset[0][0]["edge_index"].astype("int64") + + with tempfile.TemporaryDirectory() as directory: + sample(el, directory) + + print("Printing samples...") + for file in os.listdir(directory): + m = re.match(r"batch=([0-9]+)\.([0-9]+)\-([0-9]+)\.([0-9]+)\.parquet", file) + rank, start, _, end = int(m[1]), int(m[2]), int(m[3]), int(m[4]) + print(f"File: {file} (batches {start} to {end} for rank {rank})") + print(cudf.read_parquet(os.path.join(directory, file))) + print("\n") + + +if __name__ == "__main__": + main() diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 42e7d95c44d..226f76ff2da 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -133,18 +133,13 @@ def __write_minibatches_coo(self, minibatch_dict): ) end_batch_id = start_batch_id + len(batch_id_array_p) - 1 - if "rank" in minibatch_dict: - rank = minibatch_dict["rank"] - full_output_path = os.path.join( - self.__directory, - f"batch={rank:05d}.{start_batch_id:08d}-" - f"{rank:05d}.{end_batch_id:08d}.parquet", - ) - else: - full_output_path = os.path.join( - self.__directory, - f"batch={start_batch_id:010d}-{end_batch_id:010d}.parquet", - ) + rank = minibatch_dict["rank"] if "rank" in minibatch_dict else 0 + + full_output_path = os.path.join( + self.__directory, + f"batch={rank:05d}.{start_batch_id:08d}-" + f"{rank:05d}.{end_batch_id:08d}.parquet", + ) results_dataframe_p.to_parquet( full_output_path, @@ -334,7 +329,7 @@ def sample_batches( else: sampling_results_dict = pylibcugraph.uniform_neighbor_sample( pylibcugraph.ResourceHandle(), - self.__graph, + self._graph, start_list=cupy.asarray(seeds), batch_id_list=cupy.asarray(batch_ids), h_fan_out=np.array(self.__fanout, dtype="int32"), @@ -344,7 +339,7 @@ def sample_batches( random_state=random_state, prior_sources_behavior=self.__prior_sources_behavior, deduplicate_sources=self.__deduplicate_sources, - return_hops=self.__return_hops, + return_hops=True, renumber=True, compression=self.__compression, compress_per_hop=self.__compress_per_hop, From b44ea3b4b2e95ae8a1edaf6adc6c63c7beb1cc0e Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 15:10:10 -0700 Subject: [PATCH 14/33] cleanup: --- .../cugraph_pyg/examples/cugraph_dist_sampling_sg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py index 119e2aa5199..fac58efac01 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py @@ -12,9 +12,9 @@ # limitations under the License. # This example shows how to use cuGraph nccl-only comms, pylibcuGraph, -# and PyTorch DDP to run a multi-GPU sampling workflow. Most users of the +# and PyTorch to run a single-GPU sampling workflow. Most users of the # GNN packages will not interact with cuGraph directly. This example -# is intented for users who want to extend cuGraph within a DDP workflow. +# is intented for users who want to extend cuGraph within a PyTorch workflow. import os import re From e7af04526a889edfe1df396d00b4a7a618f7d72c Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 Apr 2024 15:10:45 -0700 Subject: [PATCH 15/33] cleanup imports --- .../cugraph_pyg/examples/cugraph_dist_sampling_sg.py | 3 --- python/cugraph/cugraph/gnn/data_loading/dist_sampler.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py index fac58efac01..f02aa62e2ec 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py @@ -21,9 +21,6 @@ import tempfile import numpy as np -import torch -import torch.multiprocessing as tmp -import torch.distributed as dist import cudf diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 226f76ff2da..3cc9b840768 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -134,7 +134,7 @@ def __write_minibatches_coo(self, minibatch_dict): end_batch_id = start_batch_id + len(batch_id_array_p) - 1 rank = minibatch_dict["rank"] if "rank" in minibatch_dict else 0 - + full_output_path = os.path.join( self.__directory, f"batch={rank:05d}.{start_batch_id:08d}-" From 06dfdd51f292f1c24075dd8b41a40e43b6beb8ae Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 11:01:36 -0700 Subject: [PATCH 16/33] set seeds per rank --- .../cugraph_pyg/examples/cugraph_dist_sampling_mg.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py index c66d649658f..29a6cc2b464 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_mg.py @@ -58,7 +58,8 @@ def sample(rank: int, world_size: int, uid, edgelist, directory): src = cudf.Series(np.array_split(edgelist[0], world_size)[rank]) dst = cudf.Series(np.array_split(edgelist[1], world_size)[rank]) - seeds = cudf.Series(np.arange(rank * 50, (rank + 1) * 50)) + seeds_per_rank = 50 + seeds = cudf.Series(np.arange(rank * seeds_per_rank, (rank + 1) * seeds_per_rank)) handle = ResourceHandle(cugraph_comms_get_raft_handle().getHandle()) print("constructing graph") From 4cd2f1042eb1bceee2a4b9c8b38e22666cf0675a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 11:02:10 -0700 Subject: [PATCH 17/33] set seeds per rank for sg --- .../cugraph_pyg/examples/cugraph_dist_sampling_sg.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py index f02aa62e2ec..8366ff44233 100644 --- a/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py +++ b/python/cugraph-pyg/cugraph_pyg/examples/cugraph_dist_sampling_sg.py @@ -38,7 +38,8 @@ def sample(edgelist, directory): src = cudf.Series(edgelist[0]) dst = cudf.Series(edgelist[1]) - seeds = cudf.Series(np.arange(0, 50)) + seeds_per_rank = 50 + seeds = cudf.Series(np.arange(0, seeds_per_rank)) print("constructing graph") G = SGGraph( From 4dfae1fd1cc0d56458b2c9d9ee17247ff3502541 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 11:32:08 -0700 Subject: [PATCH 18/33] rename nodes to nodes_call_groups --- python/cugraph/cugraph/gnn/data_loading/dist_sampler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 3cc9b840768..00170c229e1 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -189,7 +189,7 @@ def sample_from_nodes( actual_seeds_per_call = batches_per_call * batch_size num_seeds = len(nodes) - nodes = torch.split( + nodes_call_groups = torch.split( torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call ) @@ -213,7 +213,7 @@ def sample_from_nodes( else: batch_id_start = 0 - for i, current_seeds in enumerate(nodes): + for i, current_seeds in enumerate(nodes_call_groups): current_batches = torch.arange( batch_id_start + i * batches_per_call, batch_id_start + (i + 1) * batches_per_call, From 983a6845ab669596a973453a8f249dd0d68dcc3a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 11:40:20 -0700 Subject: [PATCH 19/33] docstring, type annotations --- .../cugraph/gnn/data_loading/dist_sampler.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 00170c229e1..4bf3965d851 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -20,7 +20,7 @@ import cupy import cudf -from typing import Union, List +from typing import Union, List, Dict from cugraph.utilities import import_optional from cugraph.gnn.comms import cugraph_comms_get_raft_handle @@ -179,12 +179,45 @@ def __init__( def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 - ): + ) -> Dict[str, TensorType]: + """ + For a single call group of seeds and associated batch ids, performs + sampling. + + Parameters + ---------- + seeds: TensorType + Input seeds for a single call group (node ids). + batch_ids: TensorType + The batch id for each seed. + random_state: int + The random seed to use for sampling. + + Returns + ------- + A dictionary containing the sampling outputs (majors, minors, map, etc.) + """ raise NotImplementedError("Must be implemented by subclass") def sample_from_nodes( self, nodes: TensorType, *, batch_size: int = 16, random_state: int = 62 ): + """ + Performs node-based sampling. Accepts a list of seed nodes, and batch size. + Splits the seed list into batches, then divides the batches into call groups + based on the number of seeds per call this sampler was set to use. Then calls + sample_batches for each call group and writes the result using the writer + associated with this sampler. + + Parameters + ---------- + nodes: TensorType + Input seeds (node ids). + batch_size: int + The size of each batch. + random_state: int + The random seed to use for sampling. + """ batches_per_call = self._local_seeds_per_call // batch_size actual_seeds_per_call = batches_per_call * batch_size From 03c27c9db9a3fe48dff25815af2d771c2daaf253 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 12:13:42 -0700 Subject: [PATCH 20/33] new functions and docstring --- .../cugraph/gnn/data_loading/dist_sampler.py | 151 +++++++++++++----- 1 file changed, 110 insertions(+), 41 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 4bf3965d851..573258c4d6a 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -178,7 +178,7 @@ def __init__( self.__local_seeds_per_call = local_seeds_per_call def sample_batches( - self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 + self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False ) -> Dict[str, TensorType]: """ For a single call group of seeds and associated batch ids, performs @@ -192,6 +192,10 @@ def sample_batches( The batch id for each seed. random_state: int The random seed to use for sampling. + assume_equal_input_size: bool + If True, will assume all ranks have the same number of inputs, + and will skip the synchronization/gather steps to check for + and handle uneven inputs. Returns ------- @@ -199,8 +203,49 @@ def sample_batches( """ raise NotImplementedError("Must be implemented by subclass") + def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size:bool=False) -> int: + """ + Gets the starting batch offset to ensure each rank's set of batch ids is + disjoint. + + Parameters + ---------- + local_num_batches: int + The number of batches for this rank. + assume_equal_input_size: bool + Whether to assume all ranks have the same number of batches. + + Returns + ------- + The starting batch offset (int). + + """ + rank = torch.distributed.get_rank() + world_size = torch.distributed.get_world_size() + + if self.is_multi_gpu: + if assume_equal_input_size: + t = torch.full((world_size,), local_num_batches, dtype=torch.int64, device='cpu') + else: + t = torch.empty((world_size,), dtype=torch.int64, device="cuda") + local_size = torch.tensor( + [local_num_batches], dtype=torch.int64, device="cuda" + ) + + torch.distributed.all_gather_into_tensor(t, local_size) + if (t != local_size).any() and rank == 0: + warnings.warn( + "Not all ranks received the same number of batches. " + "This might cause your training loop to hang due to uneven inputs." + ) + + return t.cumsum(dim=0)[rank] - t[0] + else: + return 0 + + def sample_from_nodes( - self, nodes: TensorType, *, batch_size: int = 16, random_state: int = 62 + self, nodes: TensorType, *, batch_size: int = 16, random_state: int = 62, assume_equal_input_size:bool=False ): """ Performs node-based sampling. Accepts a list of seed nodes, and batch size. @@ -225,26 +270,9 @@ def sample_from_nodes( nodes_call_groups = torch.split( torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call ) - - if self.is_multi_gpu: - rank = torch.distributed.get_rank() - world_size = torch.distributed.get_world_size() - - t = torch.empty((world_size,), dtype=torch.int64, device="cuda") - local_size = torch.tensor( - [int(ceil(num_seeds / batch_size))], dtype=torch.int64, device="cuda" - ) - - torch.distributed.all_gather_into_tensor(t, local_size) - if (t != local_size).any() and rank == 0: - warnings.warn( - "Not all ranks received the same number of batches. " - "This might cause your training loop to hang due to uneven inputs." - ) - - batch_id_start = t.cumsum(dim=0)[rank] - t[0] - else: - batch_id_start = 0 + + local_num_batches = int(ceil(num_seeds / batch_size)) + batch_id_start = self.get_batch_start_offset(local_num_batches, assume_equal_input_size=assume_equal_input_size) for i, current_seeds in enumerate(nodes_call_groups): current_batches = torch.arange( @@ -300,32 +328,58 @@ def __init__( self.__compression = compression self.__with_replacement = with_replacement - def sample_batches( - self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0 - ): - # FIXME allow skipping of the synchronization logic with a boolean - # flag that assumes all ranks have the same number of batches. - if self.is_multi_gpu: - rank = torch.distributed.get_rank() - handle = pylibcugraph.ResourceHandle( - cugraph_comms_get_raft_handle().getHandle() - ) + def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_equal_input_size: bool=False): + """ + Computes the label list and output rank mapping for the list of labels (batch ids). - local_label_list = torch.unique(batch_ids) - local_label_to_output_comm_rank = torch.full( - (len(local_label_list),), rank, dtype=torch.int32, device="cuda" - ) + Parameters + ---------- + local_label_list: TensorType + The list of unique labels on this rank. + assume_equal_input_size: bool + If True, assumes that all ranks have the same number of inputs (batches) + and skips some synchronization/gathering accordingly. + + Returns + ------- + label_list: TensorType + The global label list containing all labels used across ranks. + label_to_output_comm_rank: TensorType + The global mapping of labels to ranks. + """ + rank = torch.distributed.get_rank() + world_size = torch.distributed.get_world_size() + if assume_equal_input_size: + num_batches = len(local_label_list) * world_size + else: num_batches = torch.tensor( [len(local_label_list)], device="cuda", dtype=torch.int64 ) torch.distributed.all_reduce(num_batches, op=torch.distributed.ReduceOp.SUM) - label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) - w1 = torch.distributed.all_gather_into_tensor( - label_list, local_label_list, async_op=True - ) + # Can't avoid the all gather here even with equal input size, since we don't know + # which labels the other ranks are using. + label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) + w1 = torch.distributed.all_gather_into_tensor( + label_list, local_label_list, async_op=True + ) + if assume_equal_input_size: + label_to_output_comm_rank = torch.concat([ + torch.full( + (len(local_label_list),), + r, + dtype=torch.int32, + device="cuda" + ) + for r in range(world_size) + ]) + w2 = None + else: + local_label_to_output_comm_rank = torch.full( + (len(local_label_list),), rank, dtype=torch.int32, device="cuda" + ) label_to_output_comm_rank = torch.empty( (num_batches,), device="cuda", dtype=torch.int32 ) @@ -335,9 +389,24 @@ def sample_batches( async_op=True, ) - w1.wait() + w1.wait() + if w2 is not None: w2.wait() + return label_list, label_to_output_comm_rank + + + def sample_batches( + self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False + ): + if self.is_multi_gpu: + handle = pylibcugraph.ResourceHandle( + cugraph_comms_get_raft_handle().getHandle() + ) + + local_label_list = torch.unique(batch_ids) + label_list, label_to_output_comm_rank = self.get_label_list_and_output_rank(local_label_list, assume_equal_input_size=assume_equal_input_size) + sampling_results_dict = pylibcugraph.uniform_neighbor_sample( handle, self._graph, From b9cd5296fe49afb32038f9308c41f76e97ac766d Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Wed, 3 Apr 2024 12:17:12 -0700 Subject: [PATCH 21/33] save resource handle --- .../cugraph/gnn/data_loading/dist_sampler.py | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 573258c4d6a..ecfcad65e6d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -176,6 +176,7 @@ def __init__( self.__graph = graph self.__writer = writer self.__local_seeds_per_call = local_seeds_per_call + self.__handle = None def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False @@ -305,6 +306,17 @@ def _local_seeds_per_call(self): def _graph(self): return self.__graph + @property + def _resource_handle(self): + if self.__handle is None: + if self.is_multi_gpu: + self.__handle = pylibcugraph.ResourceHandle( + cugraph_comms_get_raft_handle().getHandle() + ) + else: + self.__handle = pylibcugraph.ResourceHandle() + return self.__handle + class UniformNeighborSampler(DistSampler): def __init__( @@ -400,15 +412,13 @@ def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False ): if self.is_multi_gpu: - handle = pylibcugraph.ResourceHandle( - cugraph_comms_get_raft_handle().getHandle() - ) + rank = torch.distributed.get_rank() local_label_list = torch.unique(batch_ids) label_list, label_to_output_comm_rank = self.get_label_list_and_output_rank(local_label_list, assume_equal_input_size=assume_equal_input_size) sampling_results_dict = pylibcugraph.uniform_neighbor_sample( - handle, + self._resource_handle, self._graph, start_list=cupy.asarray(seeds), batch_id_list=cupy.asarray(batch_ids), @@ -430,7 +440,7 @@ def sample_batches( sampling_results_dict["rank"] = rank else: sampling_results_dict = pylibcugraph.uniform_neighbor_sample( - pylibcugraph.ResourceHandle(), + self._resource_handle, self._graph, start_list=cupy.asarray(seeds), batch_id_list=cupy.asarray(batch_ids), From 30ab3247b5646069a133b6a6996c194929db3330 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 5 Apr 2024 16:40:15 -0700 Subject: [PATCH 22/33] speed improvements, testing --- .../cugraph/gnn/data_loading/dist_sampler.py | 35 ++--- .../tests/sampling/test_dist_sampler.py | 100 ++++++++++++ .../tests/sampling/test_dist_sampler_mg.py | 143 ++++++++++++++++++ 3 files changed, 261 insertions(+), 17 deletions(-) create mode 100644 python/cugraph/cugraph/tests/sampling/test_dist_sampler.py create mode 100644 python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index ecfcad65e6d..8119bf9cd7d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -220,13 +220,13 @@ def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size: ------- The starting batch offset (int). - """ - rank = torch.distributed.get_rank() - world_size = torch.distributed.get_world_size() - + """ if self.is_multi_gpu: + rank = torch.distributed.get_rank() + world_size = torch.distributed.get_world_size() + if assume_equal_input_size: - t = torch.full((world_size,), local_num_batches, dtype=torch.int64, device='cpu') + t = torch.full((world_size,), local_num_batches, dtype=torch.int64, device='cuda') else: t = torch.empty((world_size,), dtype=torch.int64, device="cuda") local_size = torch.tensor( @@ -240,7 +240,7 @@ def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size: "This might cause your training loop to hang due to uneven inputs." ) - return t.cumsum(dim=0)[rank] - t[0] + return t.cumsum(dim=0)[rank] - t[0] else: return 0 @@ -273,7 +273,7 @@ def sample_from_nodes( ) local_num_batches = int(ceil(num_seeds / batch_size)) - batch_id_start = self.get_batch_start_offset(local_num_batches, assume_equal_input_size=assume_equal_input_size) + batch_id_start = self.get_start_batch_offset(local_num_batches, assume_equal_input_size=assume_equal_input_size) for i, current_seeds in enumerate(nodes_call_groups): current_batches = torch.arange( @@ -291,6 +291,7 @@ def sample_from_nodes( seeds=current_seeds, batch_ids=current_batches, random_state=random_state, + assume_equal_input_size=assume_equal_input_size ) self.__writer.write_minibatches(minibatch_dict) @@ -364,18 +365,18 @@ def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_eq if assume_equal_input_size: num_batches = len(local_label_list) * world_size + label_list = torch.arange(0, num_batches, device='cuda', dtype=torch.int32) + w1 = None else: num_batches = torch.tensor( [len(local_label_list)], device="cuda", dtype=torch.int64 ) torch.distributed.all_reduce(num_batches, op=torch.distributed.ReduceOp.SUM) - - # Can't avoid the all gather here even with equal input size, since we don't know - # which labels the other ranks are using. - label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) - w1 = torch.distributed.all_gather_into_tensor( - label_list, local_label_list, async_op=True - ) + + label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) + w1 = torch.distributed.all_gather_into_tensor( + label_list, local_label_list, async_op=True + ) if assume_equal_input_size: label_to_output_comm_rank = torch.concat([ @@ -401,16 +402,16 @@ def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_eq async_op=True, ) - w1.wait() + if w1 is not None: + w1.wait() if w2 is not None: w2.wait() return label_list, label_to_output_comm_rank - def sample_batches( self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False - ): + ) -> Dict[str, TensorType]: if self.is_multi_gpu: rank = torch.distributed.get_rank() diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py new file mode 100644 index 00000000000..9f20769782e --- /dev/null +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py @@ -0,0 +1,100 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +import os +import shutil + +import cupy +import cudf + +from cugraph.datasets import karate +from cugraph.gnn import ( + UniformNeighborSampler, + DistSampleWriter +) +from pylibcugraph import ( + SGGraph, + ResourceHandle, + GraphProperties +) + +from cugraph.utilities.utils import create_directory_with_overwrite + +@pytest.fixture +def karate_graph(): + el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) + G = SGGraph( + ResourceHandle(), + GraphProperties(is_multigraph=True, is_symmetric=False), + el.src.astype('int64'), + el.dst.astype('int64'), + edge_id_array=el.eid, + ) + + return G + +@pytest.mark.sg +@pytest.mark.parametrize("equal_input_size", [True, False]) +@pytest.mark.parametrize("fanout", [[2,2],[4,4],[4,2,1]]) +@pytest.mark.parametrize("batch_size", [1, 2, 4]) +def test_dist_sampler_simple(scratch_dir, karate_graph, batch_size, fanout, equal_input_size): + G = karate_graph + + samples_path = os.path.join(scratch_dir, "test_bulk_sampler_simple") + create_directory_with_overwrite(samples_path) + + writer = DistSampleWriter( + samples_path + ) + + sampler = UniformNeighborSampler( + G, + writer, + fanout = fanout + ) + + seeds = cupy.array([0, 5, 10, 15], dtype='int64') + + sampler.sample_from_nodes( + seeds, + batch_size=batch_size, + assume_equal_input_size=equal_input_size + ) + + recovered_samples = cudf.read_parquet(samples_path) + original_el = karate.get_edgelist() + + for b in range(len(seeds) // batch_size): + el_start = recovered_samples.label_hop_offsets.iloc[b * len(fanout)] + el_end = recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)] + src = recovered_samples.majors.iloc[el_start:el_end] + dst = recovered_samples.minors.iloc[el_start:el_end] + edge_id = recovered_samples.edge_id.iloc[el_start:el_end] + + map_start = recovered_samples.renumber_map_offsets[b] + map_end = recovered_samples.renumber_map_offsets[b+1] + renumber_map = recovered_samples["map"].iloc[map_start:map_end] + + src = renumber_map.iloc[src.values] + dst = renumber_map.iloc[dst.values] + + for i in range(len(edge_id)): + assert( + original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + ) + assert( + original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] + ) + + shutil.rmtree(samples_path) \ No newline at end of file diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py new file mode 100644 index 00000000000..bcfe74dfbc3 --- /dev/null +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py @@ -0,0 +1,143 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +import os +import shutil + +import cupy +import cudf + +from cugraph.datasets import karate +from cugraph.gnn import ( + UniformNeighborSampler, + DistSampleWriter, + cugraph_comms_create_unique_id, + cugraph_comms_get_raft_handle, + cugraph_comms_init, + cugraph_comms_shutdown, +) +from pylibcugraph import ( + MGGraph, + ResourceHandle, + GraphProperties +) + +from cugraph.utilities.utils import ( + create_directory_with_overwrite, + import_optional, + MissingModule +) + +torch = import_optional("torch") + +def karate_mg_graph(rank, world_size): + el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) + split = cupy.array_split(cupy.arange(len(el)), world_size)[rank] + el = el.iloc[split] + + G = MGGraph( + ResourceHandle(cugraph_comms_get_raft_handle().getHandle()), + GraphProperties(is_multigraph=True, is_symmetric=False), + [el.src.astype('int64')], + [el.dst.astype('int64')], + edge_id_array=[el.eid], + ) + + return G + +def init_pytorch(rank, world_size): + os.environ["MASTER_ADDR"] = "localhost" + os.environ["MASTER_PORT"] = "12355" + torch.distributed.init_process_group("nccl", rank=rank, world_size=world_size) + +def run_test_dist_sampler_simple(rank, world_size, uid, samples_path, batch_size, seeds_per_rank, fanout, equal_input_size): + init_pytorch(rank, world_size) + cugraph_comms_init(rank, world_size, uid, device=rank) + + G = karate_mg_graph(rank, world_size) + + writer = DistSampleWriter( + samples_path + ) + + sampler = UniformNeighborSampler( + G, + writer, + fanout = fanout + ) + + seeds = cupy.random.randint(0, 34, seeds_per_rank, dtype='int64') + + from time import perf_counter + start_time = perf_counter() + sampler.sample_from_nodes( + seeds, + batch_size=batch_size, + assume_equal_input_size=equal_input_size + ) + end_time = perf_counter() + + print('time:', end_time - start_time) + + cugraph_comms_shutdown() + +@pytest.mark.mg +@pytest.mark.parametrize("equal_input_size", [True, False]) +@pytest.mark.parametrize("fanout", [[4,4],[4,2,1]]) +@pytest.mark.parametrize("batch_size", [1, 4]) +@pytest.mark.parametrize("seeds_per_rank", [1, 8]) +@pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") +def test_dist_sampler_simple(scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size): + uid = cugraph_comms_create_unique_id() + + samples_path = os.path.join(scratch_dir, "test_bulk_sampler_mg_simple") + create_directory_with_overwrite(samples_path) + + world_size = torch.cuda.device_count() + torch.multiprocessing.spawn( + run_test_dist_sampler_simple, + args=(world_size, uid, samples_path, batch_size, seeds_per_rank, fanout, equal_input_size), + nprocs=world_size + ) + + + for file in os.listdir(samples_path): + recovered_samples = cudf.read_parquet( + os.path.join(samples_path, file) + ) + original_el = karate.get_edgelist() + + for b in range(len(recovered_samples.renumber_map_offsets.dropna()) - 1): + el_start = int(recovered_samples.label_hop_offsets.iloc[b * len(fanout)]) + el_end = int(recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)]) + src = recovered_samples.majors.iloc[el_start:el_end] + dst = recovered_samples.minors.iloc[el_start:el_end] + edge_id = recovered_samples.edge_id.iloc[el_start:el_end] + + map_start = recovered_samples.renumber_map_offsets[b] + map_end = recovered_samples.renumber_map_offsets[b+1] + renumber_map = recovered_samples["map"].iloc[map_start:map_end] + + src = renumber_map.iloc[src.values] + dst = renumber_map.iloc[dst.values] + + for i in range(len(edge_id)): + assert( + original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + ) + assert( + original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] + ) + + shutil.rmtree(samples_path) \ No newline at end of file From e1d0b10fe46ad76a8c2dace5b9970088b28ccb38 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 Apr 2024 07:39:42 -0700 Subject: [PATCH 23/33] fix sizing --- .../cugraph/gnn/data_loading/dist_sampler.py | 41 +++------- .../tests/sampling/test_dist_sampler_mg.py | 81 +++++++++++++++++++ 2 files changed, 94 insertions(+), 28 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 8119bf9cd7d..9c76bdd4eb9 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -240,7 +240,7 @@ def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size: "This might cause your training loop to hang due to uneven inputs." ) - return t.cumsum(dim=0)[rank] - t[0] + return 0 if rank == 0 else t.cumsum(dim=0)[rank - 1] else: return 0 @@ -366,19 +366,7 @@ def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_eq if assume_equal_input_size: num_batches = len(local_label_list) * world_size label_list = torch.arange(0, num_batches, device='cuda', dtype=torch.int32) - w1 = None - else: - num_batches = torch.tensor( - [len(local_label_list)], device="cuda", dtype=torch.int64 - ) - torch.distributed.all_reduce(num_batches, op=torch.distributed.ReduceOp.SUM) - label_list = torch.empty((num_batches,), device="cuda", dtype=torch.int32) - w1 = torch.distributed.all_gather_into_tensor( - label_list, local_label_list, async_op=True - ) - - if assume_equal_input_size: label_to_output_comm_rank = torch.concat([ torch.full( (len(local_label_list),), @@ -388,24 +376,21 @@ def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_eq ) for r in range(world_size) ]) - w2 = None else: - local_label_to_output_comm_rank = torch.full( - (len(local_label_list),), rank, dtype=torch.int32, device="cuda" - ) - label_to_output_comm_rank = torch.empty( - (num_batches,), device="cuda", dtype=torch.int32 - ) - w2 = torch.distributed.all_gather_into_tensor( - label_to_output_comm_rank, - local_label_to_output_comm_rank, - async_op=True, + num_batches = torch.tensor( + [len(local_label_list)], device="cuda", dtype=torch.int64 ) + num_batches_all_ranks = torch.empty((world_size,), device='cuda', dtype=torch.int64) + torch.distributed.all_gather_into_tensor(num_batches_all_ranks, num_batches) + + label_list = torch.arange(0, num_batches_all_ranks.sum(), device='cuda', dtype=torch.int32) - if w1 is not None: - w1.wait() - if w2 is not None: - w2.wait() + label_to_output_comm_rank = torch.concat([ + torch.full( + (num_batches_r,), r, device="cuda", dtype=torch.int32 + ) + for r, num_batches_r in enumerate(num_batches_all_ranks) + ]) return label_list, label_to_output_comm_rank diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py index bcfe74dfbc3..3bfde0dfe6f 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py @@ -98,6 +98,7 @@ def run_test_dist_sampler_simple(rank, world_size, uid, samples_path, batch_size @pytest.mark.parametrize("batch_size", [1, 4]) @pytest.mark.parametrize("seeds_per_rank", [1, 8]) @pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") +@pytest.mark.skip(reason='asdf') def test_dist_sampler_simple(scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size): uid = cugraph_comms_create_unique_id() @@ -112,6 +113,86 @@ def test_dist_sampler_simple(scratch_dir, batch_size, seeds_per_rank, fanout, eq ) + for file in os.listdir(samples_path): + recovered_samples = cudf.read_parquet( + os.path.join(samples_path, file) + ) + original_el = karate.get_edgelist() + + for b in range(len(recovered_samples.renumber_map_offsets.dropna()) - 1): + el_start = int(recovered_samples.label_hop_offsets.iloc[b * len(fanout)]) + el_end = int(recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)]) + src = recovered_samples.majors.iloc[el_start:el_end] + dst = recovered_samples.minors.iloc[el_start:el_end] + edge_id = recovered_samples.edge_id.iloc[el_start:el_end] + + map_start = recovered_samples.renumber_map_offsets[b] + map_end = recovered_samples.renumber_map_offsets[b+1] + renumber_map = recovered_samples["map"].iloc[map_start:map_end] + + src = renumber_map.iloc[src.values] + dst = renumber_map.iloc[dst.values] + + for i in range(len(edge_id)): + assert( + original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + ) + assert( + original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] + ) + + shutil.rmtree(samples_path) + +def run_test_dist_sampler_uneven(rank, world_size, uid, samples_path, batch_size, fanout): + init_pytorch(rank, world_size) + cugraph_comms_init(rank, world_size, uid, device=rank) + + G = karate_mg_graph(rank, world_size) + + writer = DistSampleWriter( + samples_path + ) + + sampler = UniformNeighborSampler( + G, + writer, + fanout = fanout + ) + + num_seeds = 8 + rank + seeds = cupy.random.randint(0, 34, num_seeds, dtype='int64') + + from time import perf_counter + start_time = perf_counter() + sampler.sample_from_nodes( + seeds, + batch_size=batch_size, + assume_equal_input_size=False + ) + end_time = perf_counter() + + print('time:', end_time - start_time) + + cugraph_comms_shutdown() + +@pytest.mark.mg +@pytest.mark.parametrize("fanout", [[4,4],[4,2,1]]) +@pytest.mark.parametrize("batch_size", [1, 4]) +@pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") +def test_dist_sampler_uneven(scratch_dir, batch_size, fanout): + uid = cugraph_comms_create_unique_id() + + samples_path = os.path.join(scratch_dir, "test_bulk_sampler_mg_uneven") + create_directory_with_overwrite(samples_path) + + world_size = torch.cuda.device_count() + torch.multiprocessing.spawn( + run_test_dist_sampler_uneven, + args=(world_size, uid, samples_path, batch_size, fanout), + nprocs=world_size + ) + + for file in os.listdir(samples_path): recovered_samples = cudf.read_parquet( os.path.join(samples_path, file) From 6bf4f03eed80c81a44c4e0660cf8ff4ab041842f Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 12 Apr 2024 11:11:10 -0700 Subject: [PATCH 24/33] performance improvements, debug, cleanup --- .../cugraph/gnn/data_loading/dist_sampler.py | 220 +++++++++++------- .../tests/sampling/test_dist_sampler_mg.py | 148 ++++++------ 2 files changed, 210 insertions(+), 158 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 9c76bdd4eb9..1204ca04317 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -20,7 +20,7 @@ import cupy import cudf -from typing import Union, List, Dict +from typing import Union, List, Dict, Tuple from cugraph.utilities import import_optional from cugraph.gnn.comms import cugraph_comms_get_raft_handle @@ -172,14 +172,21 @@ def __init__( graph: Union[pylibcugraph.SGGraph, pylibcugraph.MGGraph], writer: DistSampleWriter, local_seeds_per_call: int = 32768, + retain_original_seeds: bool = False, # TODO See #4329, needs C API ): self.__graph = graph self.__writer = writer self.__local_seeds_per_call = local_seeds_per_call self.__handle = None + self.__retain_original_seeds = retain_original_seeds def sample_batches( - self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False + self, + seeds: TensorType, + batch_ids: TensorType, + random_state: int = 0, + assume_equal_input_size: bool = False, + local_label_list: TensorType = None, ) -> Dict[str, TensorType]: """ For a single call group of seeds and associated batch ids, performs @@ -197,36 +204,106 @@ def sample_batches( If True, will assume all ranks have the same number of inputs, and will skip the synchronization/gather steps to check for and handle uneven inputs. - + local_label_list: TensorType + Optional. The list of batch ids (also called labels) on this rank. + If not provided, this will be calculated automatically. + Returns ------- A dictionary containing the sampling outputs (majors, minors, map, etc.) """ raise NotImplementedError("Must be implemented by subclass") - def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size:bool=False) -> int: + def get_label_list_and_output_rank( + self, local_label_list: TensorType, assume_equal_input_size: bool = False + ): + """ + Computes the label list and output rank mapping for + the list of labels (batch ids). + Subclasses may override this as needed depending on their + memory and compute constraints. + + Parameters + ---------- + local_label_list: TensorType + The list of unique labels on this rank. + assume_equal_input_size: bool + If True, assumes that all ranks have the same number of inputs (batches) + and skips some synchronization/gathering accordingly. + + Returns + ------- + label_list: TensorType + The global label list containing all labels used across ranks. + label_to_output_comm_rank: TensorType + The global mapping of labels to ranks. + """ + world_size = torch.distributed.get_world_size() + + if assume_equal_input_size: + num_batches = len(local_label_list) * world_size + label_list = torch.arange(0, num_batches, device="cuda", dtype=torch.int32) + + label_to_output_comm_rank = torch.concat( + [ + torch.full( + (len(local_label_list),), r, dtype=torch.int32, device="cuda" + ) + for r in range(world_size) + ] + ) + else: + num_batches = torch.tensor( + [len(local_label_list)], device="cuda", dtype=torch.int64 + ) + num_batches_all_ranks = torch.empty( + (world_size,), device="cuda", dtype=torch.int64 + ) + torch.distributed.all_gather_into_tensor(num_batches_all_ranks, num_batches) + + label_list = torch.arange( + 0, num_batches_all_ranks.sum(), device="cuda", dtype=torch.int32 + ) + + label_to_output_comm_rank = torch.concat( + [ + torch.full((num_batches_r,), r, device="cuda", dtype=torch.int32) + for r, num_batches_r in enumerate(num_batches_all_ranks) + ] + ) + + return label_list, label_to_output_comm_rank + + def get_start_batch_offset( + self, local_num_batches: int, assume_equal_input_size: bool = False + ) -> Tuple[int, bool]: """ Gets the starting batch offset to ensure each rank's set of batch ids is disjoint. - + Parameters ---------- local_num_batches: int The number of batches for this rank. assume_equal_input_size: bool Whether to assume all ranks have the same number of batches. - + Returns ------- - The starting batch offset (int). + Tuple[int, bool] + The starting batch offset (int) + and whether the input sizes on each rank are equal (bool). - """ + """ + input_size_is_equal = True if self.is_multi_gpu: rank = torch.distributed.get_rank() world_size = torch.distributed.get_world_size() if assume_equal_input_size: - t = torch.full((world_size,), local_num_batches, dtype=torch.int64, device='cuda') + t = torch.full( + (world_size,), local_num_batches, dtype=torch.int64, device="cuda" + ) else: t = torch.empty((world_size,), dtype=torch.int64, device="cuda") local_size = torch.tensor( @@ -234,26 +311,33 @@ def get_start_batch_offset(self, local_num_batches:int, assume_equal_input_size: ) torch.distributed.all_gather_into_tensor(t, local_size) - if (t != local_size).any() and rank == 0: - warnings.warn( - "Not all ranks received the same number of batches. " - "This might cause your training loop to hang due to uneven inputs." - ) - - return 0 if rank == 0 else t.cumsum(dim=0)[rank - 1] + if (t != local_size).any(): + input_size_is_equal = False + if rank == 0: + warnings.warn( + "Not all ranks received the same number of batches. " + "This might cause your training loop to hang " + "due to uneven inputs." + ) + + return (0 if rank == 0 else t.cumsum(dim=0)[rank - 1], input_size_is_equal) else: - return 0 - + return 0, input_size_is_equal def sample_from_nodes( - self, nodes: TensorType, *, batch_size: int = 16, random_state: int = 62, assume_equal_input_size:bool=False + self, + nodes: TensorType, + *, + batch_size: int = 16, + random_state: int = 62, + assume_equal_input_size: bool = False, ): """ Performs node-based sampling. Accepts a list of seed nodes, and batch size. Splits the seed list into batches, then divides the batches into call groups - based on the number of seeds per call this sampler was set to use. Then calls - sample_batches for each call group and writes the result using the writer - associated with this sampler. + based on the number of seeds per call this sampler was set to use. + Then calls sample_batches for each call group and writes the result using + the writer associated with this sampler. Parameters ---------- @@ -271,19 +355,21 @@ def sample_from_nodes( nodes_call_groups = torch.split( torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call ) - + local_num_batches = int(ceil(num_seeds / batch_size)) - batch_id_start = self.get_start_batch_offset(local_num_batches, assume_equal_input_size=assume_equal_input_size) + batch_id_start, input_size_is_equal = self.get_start_batch_offset( + local_num_batches, assume_equal_input_size=assume_equal_input_size + ) for i, current_seeds in enumerate(nodes_call_groups): - current_batches = torch.arange( + batch_label_list = torch.arange( batch_id_start + i * batches_per_call, batch_id_start + (i + 1) * batches_per_call, device="cuda", dtype=torch.int32, ) - current_batches = current_batches.repeat_interleave(batch_size)[ + current_batches = batch_label_list.repeat_interleave(batch_size)[ : len(current_seeds) ] @@ -291,7 +377,8 @@ def sample_from_nodes( seeds=current_seeds, batch_ids=current_batches, random_state=random_state, - assume_equal_input_size=assume_equal_input_size + assume_equal_input_size=input_size_is_equal, + local_label_list=batch_label_list, ) self.__writer.write_minibatches(minibatch_dict) @@ -318,6 +405,10 @@ def _resource_handle(self): self.__handle = pylibcugraph.ResourceHandle() return self.__handle + @property + def _retain_original_seeds(self): + return self.__retain_original_seeds + class UniformNeighborSampler(DistSampler): def __init__( @@ -341,67 +432,30 @@ def __init__( self.__compression = compression self.__with_replacement = with_replacement - def get_label_list_and_output_rank(self, local_label_list: TensorType, assume_equal_input_size: bool=False): - """ - Computes the label list and output rank mapping for the list of labels (batch ids). - - Parameters - ---------- - local_label_list: TensorType - The list of unique labels on this rank. - assume_equal_input_size: bool - If True, assumes that all ranks have the same number of inputs (batches) - and skips some synchronization/gathering accordingly. - - Returns - ------- - label_list: TensorType - The global label list containing all labels used across ranks. - label_to_output_comm_rank: TensorType - The global mapping of labels to ranks. - """ - rank = torch.distributed.get_rank() - world_size = torch.distributed.get_world_size() - - if assume_equal_input_size: - num_batches = len(local_label_list) * world_size - label_list = torch.arange(0, num_batches, device='cuda', dtype=torch.int32) - - label_to_output_comm_rank = torch.concat([ - torch.full( - (len(local_label_list),), - r, - dtype=torch.int32, - device="cuda" - ) - for r in range(world_size) - ]) - else: - num_batches = torch.tensor( - [len(local_label_list)], device="cuda", dtype=torch.int64 - ) - num_batches_all_ranks = torch.empty((world_size,), device='cuda', dtype=torch.int64) - torch.distributed.all_gather_into_tensor(num_batches_all_ranks, num_batches) - - label_list = torch.arange(0, num_batches_all_ranks.sum(), device='cuda', dtype=torch.int32) - - label_to_output_comm_rank = torch.concat([ - torch.full( - (num_batches_r,), r, device="cuda", dtype=torch.int32 - ) - for r, num_batches_r in enumerate(num_batches_all_ranks) - ]) - - return label_list, label_to_output_comm_rank - def sample_batches( - self, seeds: TensorType, batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool=False + self, + seeds: TensorType, + batch_ids: TensorType, + random_state: int = 0, + assume_equal_input_size: bool = False, + local_label_list: TensorType = None, ) -> Dict[str, TensorType]: if self.is_multi_gpu: rank = torch.distributed.get_rank() - local_label_list = torch.unique(batch_ids) - label_list, label_to_output_comm_rank = self.get_label_list_and_output_rank(local_label_list, assume_equal_input_size=assume_equal_input_size) + if local_label_list is None: + local_label_list = torch.unique(batch_ids) + label_list, label_to_output_comm_rank = self.get_label_list_and_output_rank( + local_label_list, assume_equal_input_size=assume_equal_input_size + ) + + # TODO add calculation of seed vertex label offsets + if self._retain_original_seeds: + warnings.warn( + "The 'retain_original_seeds` parameter is currently ignored " + "since seed retention is not implemented yet." + ) + pass sampling_results_dict = pylibcugraph.uniform_neighbor_sample( self._resource_handle, diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py index 3bfde0dfe6f..3d35b9c71a6 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py @@ -27,20 +27,17 @@ cugraph_comms_init, cugraph_comms_shutdown, ) -from pylibcugraph import ( - MGGraph, - ResourceHandle, - GraphProperties -) +from pylibcugraph import MGGraph, ResourceHandle, GraphProperties from cugraph.utilities.utils import ( create_directory_with_overwrite, import_optional, - MissingModule + MissingModule, ) torch = import_optional("torch") + def karate_mg_graph(rank, world_size): el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) split = cupy.array_split(cupy.arange(len(el)), world_size)[rank] @@ -49,57 +46,63 @@ def karate_mg_graph(rank, world_size): G = MGGraph( ResourceHandle(cugraph_comms_get_raft_handle().getHandle()), GraphProperties(is_multigraph=True, is_symmetric=False), - [el.src.astype('int64')], - [el.dst.astype('int64')], + [el.src.astype("int64")], + [el.dst.astype("int64")], edge_id_array=[el.eid], ) return G + def init_pytorch(rank, world_size): os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "12355" torch.distributed.init_process_group("nccl", rank=rank, world_size=world_size) -def run_test_dist_sampler_simple(rank, world_size, uid, samples_path, batch_size, seeds_per_rank, fanout, equal_input_size): + +def run_test_dist_sampler_simple( + rank, + world_size, + uid, + samples_path, + batch_size, + seeds_per_rank, + fanout, + equal_input_size, +): init_pytorch(rank, world_size) cugraph_comms_init(rank, world_size, uid, device=rank) G = karate_mg_graph(rank, world_size) - writer = DistSampleWriter( - samples_path - ) + writer = DistSampleWriter(samples_path) - sampler = UniformNeighborSampler( - G, - writer, - fanout = fanout - ) + sampler = UniformNeighborSampler(G, writer, fanout=fanout) - seeds = cupy.random.randint(0, 34, seeds_per_rank, dtype='int64') + seeds = cupy.random.randint(0, 34, seeds_per_rank, dtype="int64") from time import perf_counter + start_time = perf_counter() sampler.sample_from_nodes( - seeds, - batch_size=batch_size, - assume_equal_input_size=equal_input_size + seeds, batch_size=batch_size, assume_equal_input_size=equal_input_size ) end_time = perf_counter() - print('time:', end_time - start_time) - + print("time:", end_time - start_time) + cugraph_comms_shutdown() + @pytest.mark.mg @pytest.mark.parametrize("equal_input_size", [True, False]) -@pytest.mark.parametrize("fanout", [[4,4],[4,2,1]]) +@pytest.mark.parametrize("fanout", [[4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 4]) @pytest.mark.parametrize("seeds_per_rank", [1, 8]) @pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") -@pytest.mark.skip(reason='asdf') -def test_dist_sampler_simple(scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size): +def test_dist_sampler_simple( + scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size +): uid = cugraph_comms_create_unique_id() samples_path = os.path.join(scratch_dir, "test_bulk_sampler_mg_simple") @@ -108,75 +111,75 @@ def test_dist_sampler_simple(scratch_dir, batch_size, seeds_per_rank, fanout, eq world_size = torch.cuda.device_count() torch.multiprocessing.spawn( run_test_dist_sampler_simple, - args=(world_size, uid, samples_path, batch_size, seeds_per_rank, fanout, equal_input_size), - nprocs=world_size + args=( + world_size, + uid, + samples_path, + batch_size, + seeds_per_rank, + fanout, + equal_input_size, + ), + nprocs=world_size, ) - for file in os.listdir(samples_path): - recovered_samples = cudf.read_parquet( - os.path.join(samples_path, file) - ) + recovered_samples = cudf.read_parquet(os.path.join(samples_path, file)) original_el = karate.get_edgelist() for b in range(len(recovered_samples.renumber_map_offsets.dropna()) - 1): el_start = int(recovered_samples.label_hop_offsets.iloc[b * len(fanout)]) - el_end = int(recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)]) + el_end = int( + recovered_samples.label_hop_offsets.iloc[(b + 1) * len(fanout)] + ) src = recovered_samples.majors.iloc[el_start:el_end] dst = recovered_samples.minors.iloc[el_start:el_end] edge_id = recovered_samples.edge_id.iloc[el_start:el_end] - + map_start = recovered_samples.renumber_map_offsets[b] - map_end = recovered_samples.renumber_map_offsets[b+1] + map_end = recovered_samples.renumber_map_offsets[b + 1] renumber_map = recovered_samples["map"].iloc[map_start:map_end] src = renumber_map.iloc[src.values] dst = renumber_map.iloc[dst.values] - + for i in range(len(edge_id)): - assert( - original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] - ) - assert( - original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] - ) + assert original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + assert original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] shutil.rmtree(samples_path) -def run_test_dist_sampler_uneven(rank, world_size, uid, samples_path, batch_size, fanout): + +def run_test_dist_sampler_uneven( + rank, world_size, uid, samples_path, batch_size, fanout +): init_pytorch(rank, world_size) cugraph_comms_init(rank, world_size, uid, device=rank) G = karate_mg_graph(rank, world_size) - writer = DistSampleWriter( - samples_path - ) + writer = DistSampleWriter(samples_path) - sampler = UniformNeighborSampler( - G, - writer, - fanout = fanout - ) + sampler = UniformNeighborSampler(G, writer, fanout=fanout) num_seeds = 8 + rank - seeds = cupy.random.randint(0, 34, num_seeds, dtype='int64') + seeds = cupy.random.randint(0, 34, num_seeds, dtype="int64") from time import perf_counter + start_time = perf_counter() sampler.sample_from_nodes( - seeds, - batch_size=batch_size, - assume_equal_input_size=False + seeds, batch_size=batch_size, assume_equal_input_size=False ) end_time = perf_counter() - print('time:', end_time - start_time) - + print("time:", end_time - start_time) + cugraph_comms_shutdown() + @pytest.mark.mg -@pytest.mark.parametrize("fanout", [[4,4],[4,2,1]]) +@pytest.mark.parametrize("fanout", [[4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 4]) @pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") def test_dist_sampler_uneven(scratch_dir, batch_size, fanout): @@ -189,36 +192,31 @@ def test_dist_sampler_uneven(scratch_dir, batch_size, fanout): torch.multiprocessing.spawn( run_test_dist_sampler_uneven, args=(world_size, uid, samples_path, batch_size, fanout), - nprocs=world_size + nprocs=world_size, ) - for file in os.listdir(samples_path): - recovered_samples = cudf.read_parquet( - os.path.join(samples_path, file) - ) + recovered_samples = cudf.read_parquet(os.path.join(samples_path, file)) original_el = karate.get_edgelist() for b in range(len(recovered_samples.renumber_map_offsets.dropna()) - 1): el_start = int(recovered_samples.label_hop_offsets.iloc[b * len(fanout)]) - el_end = int(recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)]) + el_end = int( + recovered_samples.label_hop_offsets.iloc[(b + 1) * len(fanout)] + ) src = recovered_samples.majors.iloc[el_start:el_end] dst = recovered_samples.minors.iloc[el_start:el_end] edge_id = recovered_samples.edge_id.iloc[el_start:el_end] - + map_start = recovered_samples.renumber_map_offsets[b] - map_end = recovered_samples.renumber_map_offsets[b+1] + map_end = recovered_samples.renumber_map_offsets[b + 1] renumber_map = recovered_samples["map"].iloc[map_start:map_end] src = renumber_map.iloc[src.values] dst = renumber_map.iloc[dst.values] - + for i in range(len(edge_id)): - assert( - original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] - ) - assert( - original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] - ) - - shutil.rmtree(samples_path) \ No newline at end of file + assert original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + assert original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] + + shutil.rmtree(samples_path) From eb94b72f0f9ff03fc4c86d411fa959f158118a91 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 12 Apr 2024 14:05:12 -0700 Subject: [PATCH 25/33] fix bugs, cleanup --- .../cugraph/gnn/data_loading/dist_sampler.py | 112 +++++++++++++++--- .../tests/sampling/test_dist_sampler_mg.py | 22 ++-- 2 files changed, 109 insertions(+), 25 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 1204ca04317..34e6df3411d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -40,6 +40,19 @@ def __init__( batches_per_partition: int = 256, format: str = "parquet", ): + """ + Parameters + ---------- + directory: str (required) + The directory where samples will be written. This + writer can only write to disk. + batches_per_partition: int (optional, default=256) + The number of batches to write in a single file. + format: str (optional, default='parquet') + The file format of the output files containing the + sampled minibatches. Currently, only parquet format + is supported. + """ if format != "parquet": raise ValueError("Invalid format (currently supported: 'parquet')") @@ -69,6 +82,10 @@ def __write_minibatches_coo(self, minibatch_dict): "Distributed sampling without renumbering is not supported" ) + # Quit if there are no batches to write. + if len(minibatch_dict["batch_id"]) == 0: + return + fanout_length = (len(minibatch_dict["label_hop_offsets"]) - 1) // len( minibatch_dict["batch_id"] ) @@ -174,6 +191,28 @@ def __init__( local_seeds_per_call: int = 32768, retain_original_seeds: bool = False, # TODO See #4329, needs C API ): + """ + Parameters + ---------- + graph: SGGraph or MGGraph (required) + The pylibcugraph graph object that will be sampled. + writer: DistSampleWriter (required) + The writer responsible for writing samples to disk + or, in the future, device or host memory. + local_seeds_per_call: int (optional, default=32768) + The number of seeds on this rank this sampler will + process in a single sampling call. Batches will + get split into multiple sampling calls based on + this parameter. This parameter must + be the same across all ranks. The total number + of seeds processed per sampling call is this + parameter times the world size. + retain_original_seeds: bool (optional, default=False) + Whether to retain the original seeds even if they + do not appear in the output minibatch. This will + affect the output renumber map and CSR/CSC graph + if applicable. + """ self.__graph = graph self.__writer = writer self.__local_seeds_per_call = local_seeds_per_call @@ -186,7 +225,6 @@ def sample_batches( batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool = False, - local_label_list: TensorType = None, ) -> Dict[str, TensorType]: """ For a single call group of seeds and associated batch ids, performs @@ -204,9 +242,6 @@ def sample_batches( If True, will assume all ranks have the same number of inputs, and will skip the synchronization/gather steps to check for and handle uneven inputs. - local_label_list: TensorType - Optional. The list of batch ids (also called labels) on this rank. - If not provided, this will be calculated automatically. Returns ------- @@ -242,7 +277,10 @@ def get_label_list_and_output_rank( if assume_equal_input_size: num_batches = len(local_label_list) * world_size - label_list = torch.arange(0, num_batches, device="cuda", dtype=torch.int32) + label_list = torch.empty((num_batches,), dtype=torch.int32, device="cuda") + w = torch.distributed.all_gather_into_tensor( + label_list, local_label_list, async_op=True + ) label_to_output_comm_rank = torch.concat( [ @@ -261,8 +299,12 @@ def get_label_list_and_output_rank( ) torch.distributed.all_gather_into_tensor(num_batches_all_ranks, num_batches) - label_list = torch.arange( - 0, num_batches_all_ranks.sum(), device="cuda", dtype=torch.int32 + label_list = [ + torch.empty((n,), dtype=torch.int32, device="cuda") + for n in num_batches_all_ranks + ] + w = torch.distributed.all_gather( + label_list, local_label_list, async_op=True ) label_to_output_comm_rank = torch.concat( @@ -272,6 +314,9 @@ def get_label_list_and_output_rank( ] ) + w.wait() + if isinstance(label_list, list): + label_list = torch.concat(label_list) return label_list, label_to_output_comm_rank def get_start_batch_offset( @@ -348,37 +393,63 @@ def sample_from_nodes( random_state: int The random seed to use for sampling. """ + nodes = torch.as_tensor(nodes, device="cuda") + batches_per_call = self._local_seeds_per_call // batch_size actual_seeds_per_call = batches_per_call * batch_size + # Split the input seeds into call groups. Each call group + # corresponds to one sampling call. A call group contains + # many batches. num_seeds = len(nodes) - nodes_call_groups = torch.split( - torch.as_tensor(nodes, device="cuda"), actual_seeds_per_call - ) + nodes_call_groups = torch.split(nodes, actual_seeds_per_call) local_num_batches = int(ceil(num_seeds / batch_size)) batch_id_start, input_size_is_equal = self.get_start_batch_offset( local_num_batches, assume_equal_input_size=assume_equal_input_size ) + # Need to add empties to the list of call groups to handle the case + # where not all nodes have the same number of call groups. This + # prevents a hang since we need all ranks to make the same number + # of calls. + if not input_size_is_equal: + num_call_groups = torch.tensor( + [len(nodes_call_groups)], device="cuda", dtype=torch.int32 + ) + torch.distributed.all_reduce( + num_call_groups, op=torch.distributed.ReduceOp.MAX + ) + nodes_call_groups = list(nodes_call_groups) + ( + [torch.tensor([], dtype=nodes.dtype, device="cuda")] + * (int(num_call_groups) - len(nodes_call_groups)) + ) + + # Make a call to sample_batches for each call group for i, current_seeds in enumerate(nodes_call_groups): - batch_label_list = torch.arange( + current_batches = torch.arange( batch_id_start + i * batches_per_call, batch_id_start + (i + 1) * batches_per_call, device="cuda", dtype=torch.int32, ) - current_batches = batch_label_list.repeat_interleave(batch_size)[ + current_batches = current_batches.repeat_interleave(batch_size)[ : len(current_seeds) ] + # Handle the case where not all ranks have the same number of call groups, + # in which case there will be some empty groups that get submitted on the + # ranks with fewer call groups. + label_start, label_end = ( + current_batches[[0, -1]] if len(current_batches) > 0 else (0, -1) + ) + minibatch_dict = self.sample_batches( seeds=current_seeds, batch_ids=current_batches, random_state=random_state, assume_equal_input_size=input_size_is_equal, - local_label_list=batch_label_list, ) self.__writer.write_minibatches(minibatch_dict) @@ -417,6 +488,7 @@ def __init__( writer: DistSampleWriter, *, local_seeds_per_call: int = 32768, + retain_original_seeds: bool = False, fanout: List[int] = [-1], prior_sources_behavior: str = "exclude", deduplicate_sources: bool = True, @@ -424,7 +496,12 @@ def __init__( compress_per_hop: bool = False, with_replacement: bool = False, ): - super().__init__(graph, writer, local_seeds_per_call=local_seeds_per_call) + super().__init__( + graph, + writer, + local_seeds_per_call=local_seeds_per_call, + retain_original_seeds=retain_original_seeds, + ) self.__fanout = fanout self.__prior_sources_behavior = prior_sources_behavior self.__deduplicate_sources = deduplicate_sources @@ -438,13 +515,13 @@ def sample_batches( batch_ids: TensorType, random_state: int = 0, assume_equal_input_size: bool = False, - local_label_list: TensorType = None, ) -> Dict[str, TensorType]: if self.is_multi_gpu: rank = torch.distributed.get_rank() - if local_label_list is None: - local_label_list = torch.unique(batch_ids) + batch_ids = batch_ids.to(device="cuda", dtype=torch.int32) + local_label_list = torch.unique(batch_ids) + label_list, label_to_output_comm_rank = self.get_label_list_and_output_rank( local_label_list, assume_equal_input_size=assume_equal_input_size ) @@ -455,7 +532,6 @@ def sample_batches( "The 'retain_original_seeds` parameter is currently ignored " "since seed retention is not implemented yet." ) - pass sampling_results_dict = pylibcugraph.uniform_neighbor_sample( self._resource_handle, diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py index 3d35b9c71a6..bf65e46c516 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler_mg.py @@ -69,6 +69,7 @@ def run_test_dist_sampler_simple( seeds_per_rank, fanout, equal_input_size, + seeds_per_call, ): init_pytorch(rank, world_size) cugraph_comms_init(rank, world_size, uid, device=rank) @@ -77,7 +78,9 @@ def run_test_dist_sampler_simple( writer = DistSampleWriter(samples_path) - sampler = UniformNeighborSampler(G, writer, fanout=fanout) + sampler = UniformNeighborSampler( + G, writer, fanout=fanout, local_seeds_per_call=seeds_per_call + ) seeds = cupy.random.randint(0, 34, seeds_per_rank, dtype="int64") @@ -98,10 +101,11 @@ def run_test_dist_sampler_simple( @pytest.mark.parametrize("equal_input_size", [True, False]) @pytest.mark.parametrize("fanout", [[4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 4]) -@pytest.mark.parametrize("seeds_per_rank", [1, 8]) +@pytest.mark.parametrize("seeds_per_rank", [8, 1]) +@pytest.mark.parametrize("seeds_per_call", [4, 8]) @pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") def test_dist_sampler_simple( - scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size + scratch_dir, batch_size, seeds_per_rank, fanout, equal_input_size, seeds_per_call ): uid = cugraph_comms_create_unique_id() @@ -119,6 +123,7 @@ def test_dist_sampler_simple( seeds_per_rank, fanout, equal_input_size, + seeds_per_call, ), nprocs=world_size, ) @@ -151,7 +156,7 @@ def test_dist_sampler_simple( def run_test_dist_sampler_uneven( - rank, world_size, uid, samples_path, batch_size, fanout + rank, world_size, uid, samples_path, batch_size, fanout, seeds_per_call ): init_pytorch(rank, world_size) cugraph_comms_init(rank, world_size, uid, device=rank) @@ -160,7 +165,9 @@ def run_test_dist_sampler_uneven( writer = DistSampleWriter(samples_path) - sampler = UniformNeighborSampler(G, writer, fanout=fanout) + sampler = UniformNeighborSampler( + G, writer, fanout=fanout, local_seeds_per_call=seeds_per_call + ) num_seeds = 8 + rank seeds = cupy.random.randint(0, 34, num_seeds, dtype="int64") @@ -181,8 +188,9 @@ def run_test_dist_sampler_uneven( @pytest.mark.mg @pytest.mark.parametrize("fanout", [[4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 4]) +@pytest.mark.parametrize("seeds_per_call", [4, 8, 16]) @pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not installed") -def test_dist_sampler_uneven(scratch_dir, batch_size, fanout): +def test_dist_sampler_uneven(scratch_dir, batch_size, fanout, seeds_per_call): uid = cugraph_comms_create_unique_id() samples_path = os.path.join(scratch_dir, "test_bulk_sampler_mg_uneven") @@ -191,7 +199,7 @@ def test_dist_sampler_uneven(scratch_dir, batch_size, fanout): world_size = torch.cuda.device_count() torch.multiprocessing.spawn( run_test_dist_sampler_uneven, - args=(world_size, uid, samples_path, batch_size, fanout), + args=(world_size, uid, samples_path, batch_size, fanout, seeds_per_call), nprocs=world_size, ) From 6814a6546fcd5c37200c658f71c045252542ca4f Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 12 Apr 2024 14:22:32 -0700 Subject: [PATCH 26/33] add yes prompt --- ci/run_cugraph_pyg_pytests.sh | 2 +- ci/test_wheel_cugraph-pyg.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/run_cugraph_pyg_pytests.sh b/ci/run_cugraph_pyg_pytests.sh index 0acc8aa462a..3a3e5d10908 100755 --- a/ci/run_cugraph_pyg_pytests.sh +++ b/ci/run_cugraph_pyg_pytests.sh @@ -11,5 +11,5 @@ pytest --cache-clear --ignore=tests/mg "$@" . # Test examples for e in "$(pwd)"/examples/*.py; do rapids-logger "running example $e" - python $e + yes | python $e done diff --git a/ci/test_wheel_cugraph-pyg.sh b/ci/test_wheel_cugraph-pyg.sh index ad615f0b3ff..29f5c466837 100755 --- a/ci/test_wheel_cugraph-pyg.sh +++ b/ci/test_wheel_cugraph-pyg.sh @@ -52,6 +52,6 @@ python -m pytest \ # Test examples for e in "$(pwd)"/examples/*.py; do rapids-logger "running example $e" - python $e + yes | python $e done popd From f255b617d2246b8cc315a83c75b9e07e74c0a8d0 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 12 Apr 2024 14:27:18 -0700 Subject: [PATCH 27/33] style --- .../tests/sampling/test_dist_sampler.py | 60 +++++++------------ 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py index 9f20769782e..4c10fbbc3e6 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py @@ -19,57 +19,47 @@ import cudf from cugraph.datasets import karate -from cugraph.gnn import ( - UniformNeighborSampler, - DistSampleWriter -) -from pylibcugraph import ( - SGGraph, - ResourceHandle, - GraphProperties -) +from cugraph.gnn import UniformNeighborSampler, DistSampleWriter + +from pylibcugraph import SGGraph, ResourceHandle, GraphProperties from cugraph.utilities.utils import create_directory_with_overwrite + @pytest.fixture def karate_graph(): el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) G = SGGraph( ResourceHandle(), GraphProperties(is_multigraph=True, is_symmetric=False), - el.src.astype('int64'), - el.dst.astype('int64'), + el.src.astype("int64"), + el.dst.astype("int64"), edge_id_array=el.eid, ) return G + @pytest.mark.sg @pytest.mark.parametrize("equal_input_size", [True, False]) -@pytest.mark.parametrize("fanout", [[2,2],[4,4],[4,2,1]]) +@pytest.mark.parametrize("fanout", [[2, 2], [4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 2, 4]) -def test_dist_sampler_simple(scratch_dir, karate_graph, batch_size, fanout, equal_input_size): +def test_dist_sampler_simple( + scratch_dir, karate_graph, batch_size, fanout, equal_input_size +): G = karate_graph samples_path = os.path.join(scratch_dir, "test_bulk_sampler_simple") create_directory_with_overwrite(samples_path) - writer = DistSampleWriter( - samples_path - ) + writer = DistSampleWriter(samples_path) - sampler = UniformNeighborSampler( - G, - writer, - fanout = fanout - ) + sampler = UniformNeighborSampler(G, writer, fanout=fanout) - seeds = cupy.array([0, 5, 10, 15], dtype='int64') + seeds = cupy.array([0, 5, 10, 15], dtype="int64") sampler.sample_from_nodes( - seeds, - batch_size=batch_size, - assume_equal_input_size=equal_input_size + seeds, batch_size=batch_size, assume_equal_input_size=equal_input_size ) recovered_samples = cudf.read_parquet(samples_path) @@ -77,24 +67,20 @@ def test_dist_sampler_simple(scratch_dir, karate_graph, batch_size, fanout, equa for b in range(len(seeds) // batch_size): el_start = recovered_samples.label_hop_offsets.iloc[b * len(fanout)] - el_end = recovered_samples.label_hop_offsets.iloc[(b+1) * len(fanout)] + el_end = recovered_samples.label_hop_offsets.iloc[(b + 1) * len(fanout)] src = recovered_samples.majors.iloc[el_start:el_end] dst = recovered_samples.minors.iloc[el_start:el_end] edge_id = recovered_samples.edge_id.iloc[el_start:el_end] - + map_start = recovered_samples.renumber_map_offsets[b] - map_end = recovered_samples.renumber_map_offsets[b+1] + map_end = recovered_samples.renumber_map_offsets[b + 1] renumber_map = recovered_samples["map"].iloc[map_start:map_end] src = renumber_map.iloc[src.values] dst = renumber_map.iloc[dst.values] - + for i in range(len(edge_id)): - assert( - original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] - ) - assert( - original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] - ) - - shutil.rmtree(samples_path) \ No newline at end of file + assert original_el.src.iloc[edge_id.iloc[i]] == src.iloc[i] + assert original_el.dst.iloc[edge_id.iloc[i]] == dst.iloc[i] + + shutil.rmtree(samples_path) From 9f985b538705dde6bcd904dbacb70f3a27013bed Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:25:45 -0400 Subject: [PATCH 28/33] forwardref Co-authored-by: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> --- python/cugraph/cugraph/gnn/data_loading/dist_sampler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py index 34e6df3411d..e57e195a4b8 100644 --- a/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/dist_sampler.py @@ -29,7 +29,7 @@ # PyTorch is NOT optional but this is required for container builds. torch = import_optional("torch") -TensorType = Union[torch.Tensor, cupy.ndarray, cudf.Series] +TensorType = Union["torch.Tensor", cupy.ndarray, cudf.Series] class DistSampleWriter: From 414e30d9f24a46df694b84f382dec71df5a14cb4 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 15 Apr 2024 07:41:12 -0700 Subject: [PATCH 29/33] add skip if torch not installed --- .../cugraph/cugraph/tests/sampling/test_dist_sampler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py index 4c10fbbc3e6..a86eacb9851 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py @@ -23,7 +23,13 @@ from pylibcugraph import SGGraph, ResourceHandle, GraphProperties -from cugraph.utilities.utils import create_directory_with_overwrite +from cugraph.utilities.utils import ( + create_directory_with_overwrite, + import_optional, + MissingModule +) + +torch = import_optional('torch') @pytest.fixture @@ -44,6 +50,7 @@ def karate_graph(): @pytest.mark.parametrize("equal_input_size", [True, False]) @pytest.mark.parametrize("fanout", [[2, 2], [4, 4], [4, 2, 1]]) @pytest.mark.parametrize("batch_size", [1, 2, 4]) +@pytest.mark.skipif(isinstance(torch, MissingModule), reason="torch not available") def test_dist_sampler_simple( scratch_dir, karate_graph, batch_size, fanout, equal_input_size ): From d747dffe094be32f46ae527b6814feb73fe87a91 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 15 Apr 2024 07:42:03 -0700 Subject: [PATCH 30/33] style --- python/cugraph/cugraph/tests/sampling/test_dist_sampler.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py index a86eacb9851..02676774a02 100644 --- a/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py +++ b/python/cugraph/cugraph/tests/sampling/test_dist_sampler.py @@ -26,10 +26,11 @@ from cugraph.utilities.utils import ( create_directory_with_overwrite, import_optional, - MissingModule + MissingModule, ) -torch = import_optional('torch') + +torch = import_optional("torch") @pytest.fixture From 7f5abfff754dbf8356aab3cde1f0de8af16a464b Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 15 Apr 2024 10:41:01 -0700 Subject: [PATCH 31/33] switch to yes || true --- ci/run_cugraph_pyg_pytests.sh | 2 +- .../batch=00000.00000000-00000.00000001.parquet | Bin 0 -> 15730 bytes .../batch=00000.00000002-00000.00000003.parquet | Bin 0 -> 11472 bytes .../batch=00001.00000000-00001.00000001.parquet | Bin 0 -> 15534 bytes .../batch=00001.00000002-00001.00000003.parquet | Bin 0 -> 11531 bytes .../batch=00002.00000000-00002.00000001.parquet | Bin 0 -> 15474 bytes .../batch=00002.00000002-00002.00000003.parquet | Bin 0 -> 11590 bytes .../batch=00003.00000000-00003.00000001.parquet | Bin 0 -> 15867 bytes .../batch=00003.00000002-00003.00000003.parquet | Bin 0 -> 11235 bytes .../batch=00004.00000000-00004.00000001.parquet | Bin 0 -> 15748 bytes .../batch=00004.00000002-00004.00000003.parquet | Bin 0 -> 11540 bytes .../batch=00005.00000000-00005.00000001.parquet | Bin 0 -> 15585 bytes .../batch=00005.00000002-00005.00000003.parquet | Bin 0 -> 11085 bytes .../batch=00006.00000000-00006.00000001.parquet | Bin 0 -> 15857 bytes .../batch=00006.00000002-00006.00000003.parquet | Bin 0 -> 11648 bytes .../batch=00007.00000000-00007.00000001.parquet | Bin 0 -> 15724 bytes .../batch=00007.00000002-00007.00000003.parquet | Bin 0 -> 11598 bytes 17 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00002.00000002-00002.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00004.00000002-00004.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00005.00000000-00005.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00006.00000002-00006.00000003.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet create mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet diff --git a/ci/run_cugraph_pyg_pytests.sh b/ci/run_cugraph_pyg_pytests.sh index 3a3e5d10908..88642e6ceb6 100755 --- a/ci/run_cugraph_pyg_pytests.sh +++ b/ci/run_cugraph_pyg_pytests.sh @@ -11,5 +11,5 @@ pytest --cache-clear --ignore=tests/mg "$@" . # Test examples for e in "$(pwd)"/examples/*.py; do rapids-logger "running example $e" - yes | python $e + (yes || true) | python $e done diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..33511421c24cf9ec0fc396e42e594454758a59c8 GIT binary patch literal 15730 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 literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2496cfcc3e0c89b5aeed8bffc60bbcb245f73f15 GIT binary patch literal 11472 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 literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d6290c1f4253354f2be030562df62ce7460311cb GIT binary patch literal 15534 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 YJ9~S>Inve8H-ALs(*2m9^nWV<54QTr=l}o! literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e61e92d23ac9711c70da30ada9025a37af1d128a GIT binary patch literal 11531 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 literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..cef6b4a74dd2fb63841831e06f86de813e4c08de GIT binary patch literal 15474 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 b9}^SRxN%^~R``}*j(6R^)c0`zKdAo$s`p0) literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..dd64920dc1e7f32439a922f9632ca40884ea9c16 GIT binary patch literal 15867 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e15e83be3712e52e97006e714c7f2f22ae8d5df9 GIT binary patch literal 11235 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 literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8c0cee03ea57da2be2ce74e6c67c954237e79e40 GIT binary patch literal 15748 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 OQK@7<)?4zQoBszy9mWy> literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet new file mode 100644 index 0000000000000000000000000000000000000000..5bea4f3fff31c91575cb46c5cb774175954ecf1b GIT binary patch literal 11085 zcmb{22UJwo-UaZ1p$rFU>L4H@T|h*NU_%526a^{viUSNyniM;V6+?)y?Eg8p%$wWM~m1C6JxXf!pa z?P+UjLS1QF+Kqb9p0o}1qA}EwhERKIOr2;W>PMq!XF80!P#@ZaO6c*It~7u~&~{Wo zn^Hl;X+IiEhtNnmln$aDX?NP3x=|(dr`FVp_NHBE5Ott(YDR-;AT^{m)SLR!KC~rm zM%`&++MjA}ZQV~ORmzlSe<(2peH68jGG{u<#WfM1<%e28sk>B$|ls!d+O2XfZ&z3J+l-e1yFS z7lVYgXerEuv#=9=g_CG2T8MtaOGJuxB1puE-ojQi6=6alyhW_&CEP@Se3;MJZG*h6 zg@foOI*C9LBFu%OXe}CvDA7!~$S-@%J$dg(g~C86g-lqA&SHp=3kwk{^hFoZRkZo@ zyAZ8Jd!c&=+9y6p^NLnJHqt)vvv@_MC%Y?exzAXiM5QPF8S_pmJ@L{AaG!O}1=anu z<^C2^X=E75Je#g!e@o_1nJ>~YtS@DjMwVZhr_v|%7#%^!(Ei*{81rLl!@7cQVO<)r z2C@Dn>uJnt=0?oY$Tpw(Cfna0>C|lhiS2#qSSpQx+u3gg>&eXaR2m`ovHcr*ovxwA z>~F^`jiipOuV%eHZNa)U!kV-GJq>5OH1bL#vNYmGu-$>?aJyvMk@bVj(g>Z)>`H&2 z(n$A!c__F4h4~O|&-zK`b#yZbxs1M~ZK<65F{ejaU(cLJD_P&fJd=4V^Ah?A>yw$gF*{Oe#;RcMOs~>m zw4B@L(3Lcs?KRBTn8!1ZW^TzGOQo6WJGPIcK5U=E97`v#K7`qXxiekHdNs2fjbwc| zb2aleW?MR)^-jz~rGE5VI)m-SQl@KZQ?|P?r%-7o&0xDUqxN7P&VGe-EbG5B526LM zg6*NSg!K)~(##&moK0KP?(9E@`8jiQ`Z4_n{h6Mk^XUt^ko)3HG*nWa}CbI`~DRWO6L`&KJHQhi5O8uD^Q)vZkz;-XzS2J&B zZqB@uPG)@=a}4u5I+*o6%p;f|F&EJ(bTixK%&%w_-Ac`9FiqihMl_K1rOX$Yx6@qK z4Vk4CY#y^d+n3XGtS2xxFps0V=vnH;ekC-Kb$8}PbQTlE~HJU z2m3S1T$!b^DSydlhazSd+LiSH8pV19b2{@4<}hYYdYAPiTFLqs%qyvi{*#8VUlkoq zH_|E8f&EjNr&A?OqW#%#9&;O-#kv`DI&&oRc;+3%O$))w!2b*bZO zZ>NgkPcD7CW}a)9m(ko~FRv-*hq{=)Sf>Bo$r#_INhyz)t-t!Mmz}(6KmQ+&Iepc` zxF|59)+1iE=keNri>dD3n*!y|N1SY0natXr=9qqG+2?gp!OtI56x=(tse^;J%c0*q z+V-3=zfI-cw9|Em^_q9DS-0!Rh*fnieJ3kN?pS*)b6{ou?QIk8i1r8UGR_Zaoi`+@ zCboI}$<$1bOj-7z6JxFk>zGM{9PV|BHqZRb>h}kWDk=g3T8w$Oc+tLv=p-)p^$hWlHTI&Az^W<}3mm|u{78hUp!k{9l z-|j2!UP z^*yb9O~Z=^|5~!>vT^m^*oNwi=&5DR_Ut@(A|=K9^pb_eBYL?W-{ZTn^Y4?o9jG_^ z!oOg_k&rgm>b`5WyVN{=Yr3^z)ac>&50%ZnaN91gRPEK+u=BIH>f{MN3F%XNPm9^# z5Og|Pk!gA0n=!!-%^y`wb<1?>Idu7^=KIUH1|L+UJzTl_;J}HKFYMT?zow5@k3~mH ze!g~K{izpMWbu!3uU++AXIr^)j>DZqhq;Xxjm$4!Xc8R}_p;;sZ+D&Fa`b57#~-@P z+qbM=E1%IvEiQ+pJ6aUCxO_`~uASF9<=)Ve@P`p&P5r*Ho)&3UCe8ZxygOS^2P&=V9hs%4NP2pt*+rU-q*b{z8%m>rGS2K~)-h3=F>fqsjP-`47j$T1q&trK2)tFS zz3MWVZ6%D6Yd<8Jtld{ouN3Rp5E;hJa5XGg2wj^r()Hgv5H?x^e_Cp$tN+y1T<7O| zVL*X}E`Kr#>xW5K;9Ae7y1Hj8rOxM%;nZQ)y8KFx@$|MgbZL!w#C!=Hwa8Z2Z}cTQ zo%3J84pZ>GA}PdPSN|*yh7X4QhqTbuKm802I0sM1V&2c(0}o!uxNaHfsOvx3&`IZQ zGkEa;yf@cbS08j6rn_Sum3SWxpXRD--_7N=0jG<_p1QJ3!TYbGBl5;DIJPIe!uxWE z3b|`CY)FUx*|5F{ju{6Bb9xS(gzQ)h^-EwZ4fz1Mp3}v@E7-mgKBj#(AeVBQ>aZEv z_Y;`52mW*fwmS+iVo53_&SVEupBKx(2@<=$a2ds#K0SRzA9oZK-WhAW6fUC3Nx+$L zqz=C#_prdYx~&=99|hONLeoJoI1MIbK)XEnnBFTwel{7dS`2%=gsL4Fw;w)&r)@B9 zcUlPZ7r{@q!8GkZENFhtJHp^LFf$N3B*9l{a7#M0m{9^AJ8Zaf5k{1V2QTI!A) zZVkKm!Hh^K&xOxRVA@PrxC0K}4|m>xu|L55bcQ}Artap@%>wqbgSGwP_C#1d4o>Ka z?-f;1@S9TDY%cV_2{%4~jSVpGXLW}cN5b3W!c0M?&_2k*jZjh$rLpV-c@zAp?J0QU`t$)n)% z`|!+kXWe$wH^I-Ex#;p17uX>mjvE83C&GvZxbGn}_rdz|Y!q}zg|8OF*mdxO8t7UJ zm+yj?ly17?)^&jKo#CoDxMe8x($jU5wWgI~V81J@LU&m#h6~wU+-|Z1G+ez=+I zz?ae+;PkSospJai0zHlDQW7&j1-wtU(;lwONHa})H3Tbg{{49xx36>X<+MSU}P(u zj#ArXecwX!a(`j!uCNc1c_@bA+RAKjTOj>uTiw}X+e4w&heF+NM!G+-&~3aE_wai+ zmT3;GeYe=MA;h{N#Jw&qILO^YAwALzLb_eJABC-(_H=mJv8BJYzx&VH zEj2gGpH5o(JYILJng3=teeCS@2lcw+)jv8~Pg|g;`H*C`_BKX&s+<&6fz3w6MCXj0 z6!o~oIx8jd-8v4I zsJ(%-8)W1Z2DQ`n*W8ME78fw-Gjcj%inkk?;950J&V8U^*5df2BCKk{ks0v!BVqwRfPfm z+AaQkJ4L>3_-_}V1Kqnve52v5L;l76`#*iwe~hGmaX{TOqIoax9`b$fQFBO?-+qU> zM>t=tD$LE-JVg_ovoezMRr%w!PhZ}6RepZ%Sncu0sPhXla&xp*zji*pKK{;{XH7cv u8;$-x{yu)r#WEXZa#2dEBU>E(HQNOF`1;zGYi8f~zGT|(+i{xzNc$hN;qGMs literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..84fa5ecf44c427eb57ced9fa8b8b436626ae473c GIT binary patch literal 15857 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 z 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 literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c339f26bba917fec6672f5f215326994edc62aa8 GIT binary patch literal 15724 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 a#@52pQg@+bmGr}3QK@8KIaKohS^p1+w)<`X literal 0 HcmV?d00001 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet new file mode 100644 index 0000000000000000000000000000000000000000..269856a705bf7b7ab8ad742d808274d2879c669d GIT binary patch literal 11598 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 ZJUl(^3iPk&SNwozT)BiuI{|jsCL9+k= literal 0 HcmV?d00001 From 71ea76e929d9f82c1c2e65d69303cfb479bacd3a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 15 Apr 2024 10:41:54 -0700 Subject: [PATCH 32/33] remove parquet files --- .../batch=00000.00000000-00000.00000001.parquet | Bin 15730 -> 0 bytes .../batch=00000.00000002-00000.00000003.parquet | Bin 11472 -> 0 bytes .../batch=00001.00000000-00001.00000001.parquet | Bin 15534 -> 0 bytes .../batch=00001.00000002-00001.00000003.parquet | Bin 11531 -> 0 bytes .../batch=00002.00000000-00002.00000001.parquet | Bin 15474 -> 0 bytes .../batch=00002.00000002-00002.00000003.parquet | Bin 11590 -> 0 bytes .../batch=00003.00000000-00003.00000001.parquet | Bin 15867 -> 0 bytes .../batch=00003.00000002-00003.00000003.parquet | Bin 11235 -> 0 bytes .../batch=00004.00000000-00004.00000001.parquet | Bin 15748 -> 0 bytes .../batch=00004.00000002-00004.00000003.parquet | Bin 11540 -> 0 bytes .../batch=00005.00000000-00005.00000001.parquet | Bin 15585 -> 0 bytes .../batch=00005.00000002-00005.00000003.parquet | Bin 11085 -> 0 bytes .../batch=00006.00000000-00006.00000001.parquet | Bin 15857 -> 0 bytes .../batch=00006.00000002-00006.00000003.parquet | Bin 11648 -> 0 bytes .../batch=00007.00000000-00007.00000001.parquet | Bin 15724 -> 0 bytes .../batch=00007.00000002-00007.00000003.parquet | Bin 11598 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00002.00000002-00002.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00004.00000002-00004.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00005.00000000-00005.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00006.00000002-00006.00000003.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet delete mode 100644 python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00000.00000000-00000.00000001.parquet deleted file mode 100644 index 33511421c24cf9ec0fc396e42e594454758a59c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15730 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 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00000.00000002-00000.00000003.parquet deleted file mode 100644 index 2496cfcc3e0c89b5aeed8bffc60bbcb245f73f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11472 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 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00001.00000000-00001.00000001.parquet deleted file mode 100644 index d6290c1f4253354f2be030562df62ce7460311cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15534 zcmciJ2~>^w{|E5fUXM!BO(nG6lB7)tLsC*9X%UiE(y9ezA1R`coyeLcvS%G4+gK{8 z?8eRrGxlK^|J!}P?=1NJ&i{YToWIjKFYnLy`#jHGdcMoO___Hzh?T`tHKjkk;&KJC zvgpr0?f5rmYDe2s8`_<^Q6CycwWtTxrbFpq>OgzYK-!jCQ%CAWyU+o&CGAS(Pf5aT zM4M3y+L|_{hSZzt(NNl#s!}y-O8sens!sdRU@E5Fs1hAW1Lz>?LUm|AI-K^TO=v6H zi*}+0)SmiMV`@vys4i8ZmUI|3ryb}J+L`K8f%c{$)QURM=G2vbM-`|$?MO9f8>&hD zXbb8|gQy}kp<UN91R3lhOfXeR^< zzCsrvL=Xf`!9?gNv=ZEffr7bUC-?|Mh3U@RC2Jq1^xjWAdU6Rd?^LLZ^E;32dW z1_;dsT|q@q5ZnZ1K}qluz7v`XdV-&zCp#L!pD9Dhv{IgwBGR&{YT& z`Uy>hVS=q77AyrbL0#w}xCk~v3t@=hAhZ>n1V^En5Gu46w1xgcUqMUo6fA^Jg2w;v z<5&ON<5&Mz9>4Vc*x@Su@f8=VHI7w9{AJij_tQSKGri9DR?c$Pm$UGRo?v|ltz&%z zjiz2~SEFgHe>rAeVqHFVrZT7TxY5jI%<{3dob?peiTEk^0{e0>pfYQ&sD3KAG2LPcQs*sAM0^+G5vCGJIVf4Y`0^+ z%eMJ~6dKBY>o@=v)@Wu%lb+B2Nlz+bS9lj%V;;cjXtC!d430KNe{AJi@85N#=0T%7UnU`vzcq? zDb}wsM>313eC@Y^?Rl(MGXG9%Sno=wu|Ay6W4$MH6WWG#GkT8oWz4NGwRO%OXy^}neDrneW?rU?U-%o z3f6UKKRT7|SiH@S{sDZql{q31!sC*4SUfxa* z({%P5L(j0TL@lT>+mF&8SU*5>Sr?d3Q~92u2lE`dg#9-#Z=*A53EL&ibC|m`pJsMt z7Sltl>oRB2JFFWp-(r43ThThU_olsA-%iKUNoPj`({vC4)?Zs5mdEX--Dn9F*l!h0Wj%x0 zkJ*}DqC_;8e~G2;JT8cKWc>{DVCEQlkv6dXAoF4xNXM~VQGQ-p!1f8u8gwA*deo6# zpl#T1DD!J(W9A^bfX=7UG>-bvLYlzyjAb@q)?}`vNpuTcO83xNv;~j%qn>mC+ow=n z*3UApVXmM$toNnC)ROHxnTIi#GKbJftk=_1RGaNv={(lQG52OxU=CqELapd|>db!U zsT1oL=~33psX6N%=n#67?xdZm6OY@j@R^4< z__X@es_dQQ;h~WhMY|3xIxj2^unyfd`|PjVts|Nmj{UjgoCLwJsC-s-=uc;Jw)b6p zGf~?+O7o9tTB{uIh=c5mlr6S6MYM`+Ik-s4==_QStDaDRc=x|8~E^kt2*7t zZ3ZPnHx05I<91y$+TU(QW$_L5$@kxe*RGkK*J9Ws*Wk#mOAXRPE)B3vI5V?X?gJIW znXj%bjEON{Z)JVZy)JRPnbGA=k+HAT`50&&qQ%{vG zGnwq2)92Ow>SZ&=@5);jyfb#9Uz?}y z)pbs4j}MNXlQy%RZrSXjL7moI&pdY1ta{?dh?==B?T71KFdQB5TC#6d-z6Hq?3upI zcDC2rR9%Zl+YVdZ(R@BR^36_HfBiGVR-G7k-Yv|)Az<60u}Rw>Tu{E291}Ej-kfB~ z;WLNsFUsnFJ;pd^=fK#P_QSg;KG)LFJaZ>?!_uKPKg@LQdH>AVA6kAI;(owevx8~v z^@e?OvbPkENC>=Ba%P>)*mYMgRq_X_*`Dld3ibgQlWz9hcj z?17O%aS>55%T28oL~C3y2y-;r`E>40-;H%|%GGimo)3MuRc~sa_LV1_bPCa%6<_yS zfADhE#FK$>;kh%XjT^r}(kpDvXuT=AU*!O-8)Rimd=n&&zPX{Aa~(pg;BmO zcN8?A`$=@xbwskmpkv(^+7{lppQ7f!Vo$px;}fGpyr$^XoXHapIWjMAn5Rc4W3`K_ zni?+o>s`v66ZEbgT3#Excx_>kWk5U6{O1E&TC^^F>Nw7POU`#IX7?Q2q^V}9ap;)e zYKK%8JD;r$HaMHN)p%Q#>e)9cqt~8+!2#ZnbB?WyZ(fzf{AKKMB^ccjuY$o_Pq^1-bOvwTs}mAM=3PUVY? z9?U(d8#U)@rq&t-Z(De(J$%Vgz1$nQw=YcMu686>Cl(J;5BLS1=PVS)T}!+XRYqy$)?eV!*n8qwiVA}^!q>tsp zNI%$Mi*1L8EByHbR8%&SoiE=Dw)g<8OUK5W6=g7yVE6fC0ExY z_oDp>tv`j_u^P^=f$J~BgY?~1eh z(u1GH@Vx=NW(4ES;XDht)&|b7h1u=lbr*Q7E41;1`M&Ue5VVVi{-fdavG8Ihbe;

THn|3CKf>v4F%PMB!8Z9tPuM&jmhOc^YoUc62H+xdSl1S&IKYBr7=H+w-hlIT zn#i7alp{3l1#i>zzQ}V2!N6qLW&>Qc4Nl$%b5FyS=b&F5ocjh2cEkK>lMgfRK&=M2 zS5Zs$c-C0J;j!?KvC!ZEyig0f^}{^u6Aypc2oD{B2P)u$mvHK57%%|ywtEd3CYPZ=(14pTj$V=j!D10NL77tr_*HgA9-W|3 zf0z{l_r^f&n{dJ{=yDtOxChN2!tLv^{&?^SP91}F$ddJN)gIX8IGq0p-jXhO8~@y) z-YUow)!<|ScI^kv1EARu_&5~Wt%OON;iIk4@(SCVVS%6>1wH7_c;ssnp!E#6VgdYJ z6$=V&dpLD2tgDAl@4|wPZOdJS@hQi?Qq2eld{u$ilj`iA{NwDupsC^k)yochJSiiZsz(qMw^B%nP2OOh~ z^<7PK_@oV-*B<%=z{;hXUBC#W?63$g>*u>LT#{Q$*gSSL=J1&j8<%G$fc!bfA_Z}Z^B zS1?V*OxAC=1$=K0Cptmxf$*(Ad=>%=s^Dl%bJ_7r3}AU{cx^Rou^VdEz#I2qyq<;Z zxZhhtg<;Sp8dk@_$aGkc2|bshKns_=k4ACPNMG&kR6R+x+~lr0DH-f z5{cYtZ|XrkX&>rE`%-V}Lw#vK+Mf=fesmz6gyB$>>5M{E2;7_tw-v*@-{2fw1=(Ll z^4qXqxqda~w-SE**1&T#`W-5UmHhVm$W7!(ZAIC6W}86&Sok&tew+r4W<%Hc@X7&L z#&yW77$wj?^mDjp z3C5Q_Z7_a#wZ;8!x(xOYHj%wE?z#-T)bSOY&>mI0d5~rxdbN|)fNWW!IRY13ArP0tY1Bm2l7U8 z;Em)-go zThTmq+{aHe;rtdbl;19D@>}#;Yt&V^-}SIXUfco3*uz$x;WT=V|9WYY2kQIyEsewv z`8vJkk6g}u@x@@|W5Zx>C_Kx5z4100S&82&W%F~e9g|S+$8X28`K|Us?vpF{?bW3f z=%=tAnr?(AHo*hCV8}kGbr4!{U)*p8`B@!osE6*C;a=)|3pwjH+(Dn+M}GJVbodpv z_zVYgU#!A?aT)i)V>!-FqBqTO!&P!WT+##iYEQVs1G)`|Ga_JWG}MZL`?>E8OG0kP z@q2U{^5=;#a0;xS4#PQ~Cl(;LSpd_hQz7zhxjT?YaQrW(%?_iUN*|v@F8&cFoP)Q{ z!>u(i{|Z#Q0k_Ne2T0g`)95q(G8qoB?bxP1lev=@5shxy#s-gd;imeL1mWWj?uFeDF-*$Efa!*vbtc}L8HN4r8# zcX%KYc0B+O9fpP1q1ID)=`-|F$No3DH{25leb>UE6Y$w3xb;1hgkip2oCkMqg7zhF z@KM;oNkjJf=yrylJ)mzOv=91tP_?xz?n|)AotUTsmQjuQ2!JRuZQWQu)a9R z{jyKitM;2Z{?%xjU5F0OOl>;ZQgC}aC;;-<4 zHTJvS-$9=d@QDH@;s!0~!~O27G-R8#@CG%lM2@=-v$zj#%L(0{zJ7uB8Y8TWv^v54 zo#9w77`X-7SHX%)aLp4q?J3NA4#%5dzx>J*w!IC_?!dqoa9>L-ES5;%g03*u3yw&F zPcvvXJbeZpy9iUbZ~jgL>o+Ac7}pbS90r9_xc4+HRKU6}R};Q!) zTTtUEe9{E#y@2L$bsYTh7Mv%+I?%xmW_N=tm&2cF*KNr2PQl^}@JtO<)WEtihwI7e ze#n_I&_5eW@?n$9P`CzPxL{q`!3~b<4a2;lmT0?4v&JvM#EG2uxJC^{2Gqex0D@sh5OeGM`Wd*Q2MoNggD~w zU%EEVGfHiqVmN9%)=zco7-OEUSFL;?Qf^3Rlp%7N>F-;wpjb` zhcq^P)NVZ2|FuEUu+U32HF8vRLbzB*Bv!UmG*C?lADxtvDi5)Ve+H$5@MM&m#fL{k z$A^tdN)AhkiAjx4V|Trj=*0Adi0G6sY1hA+)EiGbE;@GPs5Bg}79BM*IxIFyBvzC* zX~z4*6$yU(MR*;;nRp{pOQrlWx{{DaKp*No9o3A9!6r&#_sjicr=dJWS z@?VOt&ZBN<*?1nl>^Ra<-%(OlFFjKF%kqy0Eq_1$>h|~_-4t=Mzuu_7IxfE~KcD`I z%L>vrNn~hjpqd<>7!{ssP@+D;EH*JJdVE-9Qha(sVyc;|$_PK{2t>@lj!4*Kx71#$TYu17Z`?T$~&GOMexUGrle-M5l#Eg{Or} z`zEHx$4{~~`P;>0zcAmp*q`-(^J3x2-?$Qr|GUfdl|R-0_ME=DSHHgKH@p0c58+$G z!q<=DKlS<-9|#7auP^;q{fmpm#3zNPIXN~S@y}l;&%YY}+l$YE?&~Z5t>KGH{)gY+ z|J8f_=Scb=E-1T4q|fE+OMdG)N-v4>m(Ngk3#UYfrzNFG@1hB2@v#vp;VBu7cVBWw zcuGprxW?;`jZR68O-gL6Iyl?e+c}y^?=|_Q|JLYe=V<3(Hc4b4j!ch=F=2~|qx2XT YJ9~S>Inve8H-ALs(*2m9^nWV<54QTr=l}o! diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00001.00000002-00001.00000003.parquet deleted file mode 100644 index e61e92d23ac9711c70da30ada9025a37af1d128a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11531 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 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00002.00000000-00002.00000001.parquet deleted file mode 100644 index cef6b4a74dd2fb63841831e06f86de813e4c08de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15474 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 b9}^SRxN%^~R``}*j(6R^)c0`zKdAo$s`p0) diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00003.00000000-00003.00000001.parquet deleted file mode 100644 index dd64920dc1e7f32439a922f9632ca40884ea9c16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15867 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 AdjJ3c diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00003.00000002-00003.00000003.parquet deleted file mode 100644 index e15e83be3712e52e97006e714c7f2f22ae8d5df9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11235 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 diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00004.00000000-00004.00000001.parquet deleted file mode 100644 index 8c0cee03ea57da2be2ce74e6c67c954237e79e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15748 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 OQK@7<)?4zQoBszy9mWy> diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00005.00000002-00005.00000003.parquet deleted file mode 100644 index 5bea4f3fff31c91575cb46c5cb774175954ecf1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11085 zcmb{22UJwo-UaZ1p$rFU>L4H@T|h*NU_%526a^{viUSNyniM;V6+?)y?Eg8p%$wWM~m1C6JxXf!pa z?P+UjLS1QF+Kqb9p0o}1qA}EwhERKIOr2;W>PMq!XF80!P#@ZaO6c*It~7u~&~{Wo zn^Hl;X+IiEhtNnmln$aDX?NP3x=|(dr`FVp_NHBE5Ott(YDR-;AT^{m)SLR!KC~rm zM%`&++MjA}ZQV~ORmzlSe<(2peH68jGG{u<#WfM1<%e28sk>B$|ls!d+O2XfZ&z3J+l-e1yFS z7lVYgXerEuv#=9=g_CG2T8MtaOGJuxB1puE-ojQi6=6alyhW_&CEP@Se3;MJZG*h6 zg@foOI*C9LBFu%OXe}CvDA7!~$S-@%J$dg(g~C86g-lqA&SHp=3kwk{^hFoZRkZo@ zyAZ8Jd!c&=+9y6p^NLnJHqt)vvv@_MC%Y?exzAXiM5QPF8S_pmJ@L{AaG!O}1=anu z<^C2^X=E75Je#g!e@o_1nJ>~YtS@DjMwVZhr_v|%7#%^!(Ei*{81rLl!@7cQVO<)r z2C@Dn>uJnt=0?oY$Tpw(Cfna0>C|lhiS2#qSSpQx+u3gg>&eXaR2m`ovHcr*ovxwA z>~F^`jiipOuV%eHZNa)U!kV-GJq>5OH1bL#vNYmGu-$>?aJyvMk@bVj(g>Z)>`H&2 z(n$A!c__F4h4~O|&-zK`b#yZbxs1M~ZK<65F{ejaU(cLJD_P&fJd=4V^Ah?A>yw$gF*{Oe#;RcMOs~>m zw4B@L(3Lcs?KRBTn8!1ZW^TzGOQo6WJGPIcK5U=E97`v#K7`qXxiekHdNs2fjbwc| zb2aleW?MR)^-jz~rGE5VI)m-SQl@KZQ?|P?r%-7o&0xDUqxN7P&VGe-EbG5B526LM zg6*NSg!K)~(##&moK0KP?(9E@`8jiQ`Z4_n{h6Mk^XUt^ko)3HG*nWa}CbI`~DRWO6L`&KJHQhi5O8uD^Q)vZkz;-XzS2J&B zZqB@uPG)@=a}4u5I+*o6%p;f|F&EJ(bTixK%&%w_-Ac`9FiqihMl_K1rOX$Yx6@qK z4Vk4CY#y^d+n3XGtS2xxFps0V=vnH;ekC-Kb$8}PbQTlE~HJU z2m3S1T$!b^DSydlhazSd+LiSH8pV19b2{@4<}hYYdYAPiTFLqs%qyvi{*#8VUlkoq zH_|E8f&EjNr&A?OqW#%#9&;O-#kv`DI&&oRc;+3%O$))w!2b*bZO zZ>NgkPcD7CW}a)9m(ko~FRv-*hq{=)Sf>Bo$r#_INhyz)t-t!Mmz}(6KmQ+&Iepc` zxF|59)+1iE=keNri>dD3n*!y|N1SY0natXr=9qqG+2?gp!OtI56x=(tse^;J%c0*q z+V-3=zfI-cw9|Em^_q9DS-0!Rh*fnieJ3kN?pS*)b6{ou?QIk8i1r8UGR_Zaoi`+@ zCboI}$<$1bOj-7z6JxFk>zGM{9PV|BHqZRb>h}kWDk=g3T8w$Oc+tLv=p-)p^$hWlHTI&Az^W<}3mm|u{78hUp!k{9l z-|j2!UP z^*yb9O~Z=^|5~!>vT^m^*oNwi=&5DR_Ut@(A|=K9^pb_eBYL?W-{ZTn^Y4?o9jG_^ z!oOg_k&rgm>b`5WyVN{=Yr3^z)ac>&50%ZnaN91gRPEK+u=BIH>f{MN3F%XNPm9^# z5Og|Pk!gA0n=!!-%^y`wb<1?>Idu7^=KIUH1|L+UJzTl_;J}HKFYMT?zow5@k3~mH ze!g~K{izpMWbu!3uU++AXIr^)j>DZqhq;Xxjm$4!Xc8R}_p;;sZ+D&Fa`b57#~-@P z+qbM=E1%IvEiQ+pJ6aUCxO_`~uASF9<=)Ve@P`p&P5r*Ho)&3UCe8ZxygOS^2P&=V9hs%4NP2pt*+rU-q*b{z8%m>rGS2K~)-h3=F>fqsjP-`47j$T1q&trK2)tFS zz3MWVZ6%D6Yd<8Jtld{ouN3Rp5E;hJa5XGg2wj^r()Hgv5H?x^e_Cp$tN+y1T<7O| zVL*X}E`Kr#>xW5K;9Ae7y1Hj8rOxM%;nZQ)y8KFx@$|MgbZL!w#C!=Hwa8Z2Z}cTQ zo%3J84pZ>GA}PdPSN|*yh7X4QhqTbuKm802I0sM1V&2c(0}o!uxNaHfsOvx3&`IZQ zGkEa;yf@cbS08j6rn_Sum3SWxpXRD--_7N=0jG<_p1QJ3!TYbGBl5;DIJPIe!uxWE z3b|`CY)FUx*|5F{ju{6Bb9xS(gzQ)h^-EwZ4fz1Mp3}v@E7-mgKBj#(AeVBQ>aZEv z_Y;`52mW*fwmS+iVo53_&SVEupBKx(2@<=$a2ds#K0SRzA9oZK-WhAW6fUC3Nx+$L zqz=C#_prdYx~&=99|hONLeoJoI1MIbK)XEnnBFTwel{7dS`2%=gsL4Fw;w)&r)@B9 zcUlPZ7r{@q!8GkZENFhtJHp^LFf$N3B*9l{a7#M0m{9^AJ8Zaf5k{1V2QTI!A) zZVkKm!Hh^K&xOxRVA@PrxC0K}4|m>xu|L55bcQ}Artap@%>wqbgSGwP_C#1d4o>Ka z?-f;1@S9TDY%cV_2{%4~jSVpGXLW}cN5b3W!c0M?&_2k*jZjh$rLpV-c@zAp?J0QU`t$)n)% z`|!+kXWe$wH^I-Ex#;p17uX>mjvE83C&GvZxbGn}_rdz|Y!q}zg|8OF*mdxO8t7UJ zm+yj?ly17?)^&jKo#CoDxMe8x($jU5wWgI~V81J@LU&m#h6~wU+-|Z1G+ez=+I zz?ae+;PkSospJai0zHlDQW7&j1-wtU(;lwONHa})H3Tbg{{49xx36>X<+MSU}P(u zj#ArXecwX!a(`j!uCNc1c_@bA+RAKjTOj>uTiw}X+e4w&heF+NM!G+-&~3aE_wai+ zmT3;GeYe=MA;h{N#Jw&qILO^YAwALzLb_eJABC-(_H=mJv8BJYzx&VH zEj2gGpH5o(JYILJng3=teeCS@2lcw+)jv8~Pg|g;`H*C`_BKX&s+<&6fz3w6MCXj0 z6!o~oIx8jd-8v4I zsJ(%-8)W1Z2DQ`n*W8ME78fw-Gjcj%inkk?;950J&V8U^*5df2BCKk{ks0v!BVqwRfPfm z+AaQkJ4L>3_-_}V1Kqnve52v5L;l76`#*iwe~hGmaX{TOqIoax9`b$fQFBO?-+qU> zM>t=tD$LE-JVg_ovoezMRr%w!PhZ}6RepZ%Sncu0sPhXla&xp*zji*pKK{;{XH7cv u8;$-x{yu)r#WEXZa#2dEBU>E(HQNOF`1;zGYi8f~zGT|(+i{xzNc$hN;qGMs diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00006.00000000-00006.00000001.parquet deleted file mode 100644 index 84fa5ecf44c427eb57ced9fa8b8b436626ae473c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15857 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 z zxDJIRAhsF{&rXG>a^dUyV4q8H;?FSS0M@G-3glo}o@PQu4_SeIj5ur6N@gh^wd=S0|U zGUHpYS{1C@%R0lt6xb&Ro_+_~6v0OqV72?u)rj@}Kpl8K5k`%J2lqhleQ@n@C@#T2 zuEFlhuwS@T3>VyhkJo$!qWxtV*@q_D;mNjzR)%kj+#Sv!wZYCk(j+59xQ=oSL~0n8$-iT=$i@qt%ODs z_Dx~*N<+kvZQ%Wm&~+I6F%90^1tZH~qjH%33+xb#eb|EtXc);2`7#)|6<#lf)5EY& z%a4L3??JCi(ApaNx2+PMbcA88VSWajR{-}H!lu^P?>!m<7mS2Iya|hQ;q|xRu{E&8 zF=%qY1}(b@Y#a>xcYrye@Msp?vk-P%1@~=+-k(F;J+L^fuD+4EnGahOz_?@Z826+1 z`e7exH=dq?uS)DoFGs`tSlDwaEGmMf8)4j4IPhQ4zLGmOQUS2E6D*2^HFDteJeYR? zp1la~`!o<0KSu_^mASCI2(H};GjG8;x1rZ?54~O0aWHQN{9zlMc>>P)7Ph$ur~7#7 z?GAK@SF+&Yg|O*S=z0;JybQ13hh_E+_4cg|u!S$YHVj5Cgbs!9(+%+aVYu`tJWvjY zSm}ooL+R#8_($F+u#D^V&fl%|it{3EbbVd1{)F-Gr@es~udZ*SpO^2#^J&)^$G^+{ z`pSI7-)(}9Ti_CU@f_mEm2mzm4$#mO7VtvH4M)6z`_LUz5Knpw7OjMrD&xAHOmGqZ zZXFbZxbqa4Jr(v}3jGUVDfc(a=i&2qx(yFYte>|tuuhH+!+Mz03+tMvAJ(hr6j&UC z^=EE8){idx;Z+aJ^KbfN9&Z^4y9U8+<(MC5wZZ+Z_9=`Wg!ySpSB$gmTi~)@4fGqh zzBc+x?p}EG7M{1!);PJU_S?(2%gSgg1kNr*5N^AOq)li?in9uVs}`a)^IjBZ5dv2s zL?H7`X?McEAu>jK$rjRC+Dd;JEo&KCOGoJ^d&tJJi|j0eWh2=}_LkPNt*kGr$uQ|5 zyUQA~rVNz*Wo_ABHj_=HyR0r_|LXd+PrWBx`+fEW=#x*ahLXC)Y6?(YUfpu_$knY@ zk4Oz=HME}Z>Z*&VE~kdP8oFw#QA1yKAvJ}luA-(G^@!Efpr(|Xe8j4YtD&X3uVOxLsWHPHMHxpzM5jy z&{9KE4RJNZ)R0s|D30ybl5H+OK5L81(O*Lw%F!6Y5%1~2cDD!IS zR8y&1GSm{IrbIQRO=7z<^gQJoDUr-MY6bJ$A&6$oH>ZPW8SB+zJed~JBXm0J&7yg9 zA6?FR;~95itiBS+WPF~sVZEial=4lUSiyQbndi<+@J*T6&+?;G^`phC{|z0*#itpQBF9x1s8*j1O48ma4BpMzG#o`X0*-jQ!{ws$MNmWW6`(kMus} zHxwd)@oTg#kE6b7ImP%m%P-QZ%=1mCIL3G*%d0a^rQA7+j~I_)y=C+h8q4xDx`X*^ z)SvlxXaOD0^0V|3eMIe8Pi;9`Fz!hC4USmDcpBTi#&{#$M0e2@^c>A%y^m=M^Y79RXfn&^(PCOo6Isth)qK&7@nFg~ z7orklN18_q>1p~tkAI4OPp?pZBlhG^vHi>+qd(AXJf4~_QkgHJztZ45` z^g}w5^**HsDZdF6U$b5i?Lf!S4Ei}uV*A;23w2@nJbIM*e^U?U8`Iv@hfb$^=stRa z&gXGf(+4z=<-v44^Iy?hvJM7?GRt`5UW`A`=?DDj1JE>si?T!AhcuszXjGV%evc*9X`sEVm3Mo zqirK=lTC^_9sjaRF^^8m9IJw))F(lWWOITgIet`HdVJc55o0Y`tmKqwNzG14uw=$- z2YFg#&<<-i&XP28R2B|qZ%G_!iBC!tMr*C8vL0nkNVf>*?FJV&mpm`wX0&x_BOEuw{_BvVdZsqp;h~! z4F+$6diW-T>L!1_fS2Az9BG8}2(RB3X~)^D9Y^&DlR@;)t$9s;J0nPzl7Z+q$gFSspPb=wk zj~||voSl+7)}yU^+)y8P4}|f0ndP~x9_DzYno}%Vbq}o@d1x(0Bw3OZG|qXVgxK^z)xkAHtay zb5>fWHkNWcl9LiL&6yJ_#$fscb7p4RxQg??YRMd%l$KhN^$+y*^9}IOMw~kJGlc=Z q0lxko6NSk*JUelOJ4@UHv^GJ$ets@_+T#7vUs0-Uo1(P;d;K5OGCuqO diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00007.00000000-00007.00000001.parquet deleted file mode 100644 index c339f26bba917fec6672f5f215326994edc62aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15724 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 a#@52pQg@+bmGr}3QK@8KIaKohS^p1+w)<`X diff --git a/python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet b/python/cugraph-pyg/cugraph_pyg/batch=00007.00000002-00007.00000003.parquet deleted file mode 100644 index 269856a705bf7b7ab8ad742d808274d2879c669d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11598 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 ZJUl(^3iPk&SNwozT)BiuI{|jsCL9+k= From dd9ed2d3eccdda6e5e66469775beda74f6a11d3a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 15 Apr 2024 10:43:26 -0700 Subject: [PATCH 33/33] yes || true in other script --- ci/test_wheel_cugraph-pyg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test_wheel_cugraph-pyg.sh b/ci/test_wheel_cugraph-pyg.sh index 29f5c466837..e98bf4ab56b 100755 --- a/ci/test_wheel_cugraph-pyg.sh +++ b/ci/test_wheel_cugraph-pyg.sh @@ -52,6 +52,6 @@ python -m pytest \ # Test examples for e in "$(pwd)"/examples/*.py; do rapids-logger "running example $e" - yes | python $e + (yes || true) | python $e done popd