diff --git a/src/decentralizepy/graphs/Regular.py b/src/decentralizepy/graphs/Regular.py new file mode 100644 index 0000000000000000000000000000000000000000..6aedddd63888b16a6edf057a1c381ae41397ea72 --- /dev/null +++ b/src/decentralizepy/graphs/Regular.py @@ -0,0 +1,32 @@ +import networkx as nx + +from decentralizepy.graphs.Graph import Graph + + +class Regular(Graph): + """ + The class for generating a Regular topology + + """ + + def __init__(self, n_procs, degree, seed=None): + """ + Constructor. Generates a Ring graph + + Parameters + ---------- + n_procs : int + total number of nodes in the graph + degree : int + Neighbors of each node + + """ + super().__init__(n_procs) + G = nx.random_regular_graph(degree, n_procs, seed) + adj = G.adjacency() + for i, l in adj: + self.adj_list[i] = set() # new set + for k in l: + self.adj_list[i].add(k) + if not nx.is_connected(G): + self.connect_graph() diff --git a/src/decentralizepy/sharing/RandomAlpha.py b/src/decentralizepy/sharing/RandomAlpha.py new file mode 100644 index 0000000000000000000000000000000000000000..c81e23345118af00ef01d9adca034a59ea264892 --- /dev/null +++ b/src/decentralizepy/sharing/RandomAlpha.py @@ -0,0 +1,79 @@ +import random + +from decentralizepy.sharing.PartialModel import PartialModel + + +class RandomAlpha(PartialModel): + """ + This class implements the partial model sharing with a random alpha each iteration. + + """ + + def __init__( + self, + rank, + machine_id, + communication, + mapping, + graph, + model, + dataset, + log_dir, + dict_ordered=True, + save_shared=False, + metadata_cap=1.0, + ): + """ + Constructor + + Parameters + ---------- + rank : int + Local rank + machine_id : int + Global machine id + communication : decentralizepy.communication.Communication + Communication module used to send and receive messages + mapping : decentralizepy.mappings.Mapping + Mapping (rank, machine_id) -> uid + graph : decentralizepy.graphs.Graph + Graph reprensenting neighbors + model : decentralizepy.models.Model + Model to train + dataset : decentralizepy.datasets.Dataset + Dataset for sharing data. Not implemented yet! TODO + log_dir : str + Location to write shared_params (only writing for 2 procs per machine) + dict_ordered : bool + Specifies if the python dict maintains the order of insertion + save_shared : bool + Specifies if the indices of shared parameters should be logged + metadata_cap : float + Share full model when self.alpha > metadata_cap + + """ + super().__init__( + rank, + machine_id, + communication, + mapping, + graph, + model, + dataset, + log_dir, + 1.0, + dict_ordered, + save_shared, + metadata_cap, + ) + + def step(self): + """ + Perform a sharing step. Implements D-PSGD with alpha randomly chosen. + + """ + random.seed( + self.mapping.get_uid(self.rank, self.machine_id) + self.communication_round + ) + self.alpha = random.randint(1, 7) / 10.0 + super().step()