diff --git a/examples/mnist-pytorch/client/entrypoint b/examples/mnist-pytorch/client/entrypoint index 8d7953b59..4ea0cf919 100755 --- a/examples/mnist-pytorch/client/entrypoint +++ b/examples/mnist-pytorch/client/entrypoint @@ -77,7 +77,7 @@ def _load_data(data_path, is_train=True): def _save_model(model, out_path): - """ Save model to disk. + """ Save model to disk. :param model: The model to save. :type model: torch.nn.Module diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index d92625140..d58f24419 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -56,24 +56,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "5107f6f9", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'message': 'Initial model added successfully.', 'success': True}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "client.set_package('../mnist-pytorch/package.tgz', 'pytorchhelper')\n", - "client.set_initial_model('../mnist-pytorch/seed.npz')" + "client.set_initial_model('../mnist-pytorch/seed.npz')\n", + "seed_model = client.get_initial_model()" ] }, { @@ -86,15 +76,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "f0380d35", "metadata": {}, "outputs": [], "source": [ "session_config_fedavg = {\n", " \"helper\": \"pytorchhelper\",\n", - " \"session_id\": \"experiment_fedavg\",\n", - " \"aggregator\": \"fedavg\"\n", + " \"session_id\": \"experiment_fedavg2\",\n", + " \"aggregator\": \"fedavg\",\n", + " \"model_id\": seed_model['model_id']\n", " }\n", "\n", "result_fedavg = client.start_session(**session_config_fedavg)" @@ -102,20 +93,34 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, + "id": "4f70d7d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_config_fedopt = {\n", + " \"helper\": \"pytorchhelper\",\n", + " \"session_id\": \"experiment_fedopt3\",\n", + " \"aggregator\": \"fedopt\",\n", + " \"model_id\": seed_model['model_id']\n", + " }\n", + "\n", + "result_fedopt = client.start_session(**session_config_fedopt)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "11fd17ef", "metadata": { "scrolled": true }, "outputs": [], - "source": [ - "validations = client.list_validations()\n", - "models = client.get_model_trail()" - ] + "source": [] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "f4968b3a", "metadata": {}, "outputs": [ @@ -123,7 +128,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "OrderedDict([('9069d8eb-d009-4d27-806f-c536791d931a', [0.367333322763443, 0.36899998784065247]), ('3bc70b11-5634-492f-8fa8-e26f161a0a25', [0.4584999978542328, 0.4438333213329315]), ('235b9e7a-1fa8-4c98-ba13-b4bc2249eae4', [0.5398333072662354, 0.5538333058357239]), ('fa88366a-3f74-4bac-8ec6-870e4e947617', [0.715666651725769, 0.7070000171661377]), ('45706812-a1e1-40cc-9c39-b493c82e8ddb', [0.7738333344459534, 0.765999972820282]), ('3045a0b5-cd08-4fc9-80ef-3f75b920bf30', [0.7975000143051147, 0.8068333268165588]), ('6c211b10-a0f6-4226-b047-2c28348b783f', [0.8188333511352539, 0.828166663646698]), ('19c96500-8cdd-4aa4-8a6a-78064a497151', [0.8333333134651184, 0.8428333401679993]), ('760fe6fb-0712-4eb6-af9f-a9be5a0575ac', [0.8560000061988831, 0.8458333611488342]), ('5b28807c-0727-4b54-bde4-848fa9224b3b', [0.8671666383743286, 0.8598333597183228])])\n" + "OrderedDict([('9069d8eb-d009-4d27-806f-c536791d931a', [0.367333322763443, 0.36899998784065247]), ('3bc70b11-5634-492f-8fa8-e26f161a0a25', [0.4584999978542328, 0.4438333213329315]), ('235b9e7a-1fa8-4c98-ba13-b4bc2249eae4', [0.5398333072662354, 0.5538333058357239]), ('fa88366a-3f74-4bac-8ec6-870e4e947617', [0.715666651725769, 0.7070000171661377]), ('45706812-a1e1-40cc-9c39-b493c82e8ddb', [0.7738333344459534, 0.765999972820282]), ('3045a0b5-cd08-4fc9-80ef-3f75b920bf30', [0.7975000143051147, 0.8068333268165588]), ('6c211b10-a0f6-4226-b047-2c28348b783f', [0.8188333511352539, 0.828166663646698]), ('19c96500-8cdd-4aa4-8a6a-78064a497151', [0.8333333134651184, 0.8428333401679993]), ('760fe6fb-0712-4eb6-af9f-a9be5a0575ac', [0.8560000061988831, 0.8458333611488342]), ('5b28807c-0727-4b54-bde4-848fa9224b3b', [0.8671666383743286, 0.8598333597183228]), ('0b71fbe7-1649-4fc8-88b8-e55c8f578141', [0.3721666634082794]), ('8a7bb49d-d1bb-4ca6-bb98-f0a9fe194cee', [0.4533333480358124]), ('6c5a306a-dedc-433e-9dc0-f5627f527db0', [0.5808333158493042]), ('97e51c89-9ac9-4e1f-ac41-cbe9484b652c', [0.715499997138977]), ('8166ea86-6e54-4b86-a80b-3da14066bc35', [0.7738333344459534]), ('56ce6fb5-82d3-434b-a8ae-5830eb4218a2', [0.8075000047683716]), ('886cc4aa-7d12-41ad-8971-acd8626cc1b5', [0.8296666741371155]), ('124cc1ff-9bd5-408f-a43a-bba7dbca35a5', [0.8454999923706055]), ('784c0052-7304-415f-9c45-d93a1bc7b687', [0.85916668176651]), ('4a8cdd28-945d-45cb-891d-fbfbae0947f3', [0.8701666593551636]), ('be4e4c80-2925-46c2-a52c-0f2509e7aa01', [0.878166675567627]), ('a46e3f24-6e16-4533-abfc-9b01427f9f76', [0.8859999775886536]), ('77d57f55-4735-4037-be7e-1498b1388f22', [0.8931666612625122]), ('2a5b12f5-4545-4b2f-a2ac-5b54181b7ced', [0.8978333473205566]), ('f5dafb22-ad2c-4735-937d-d4a6fcc6ae5d', [0.9024999737739563]), ('7ab74d64-6339-445a-98f7-1d067a7ccb2d', [0.3721666634082794]), ('f39c5eda-b5f6-43f4-9bc8-f7112e68e717', [0.4533333480358124]), ('5ae4908c-6b20-45a2-b477-f843b8586ad3', [0.5808333158493042]), ('07ef0d56-7112-4916-87ba-8a8651b3123d', [0.715499997138977]), ('97ab42b9-3667-4c8f-a4f4-0f8068cc3859', [0.7738333344459534]), ('9c0a5749-9e99-4278-b78a-22638372158e', [0.3721666634082794]), ('20a217a6-3493-4eff-ade0-e5542bbb4618', [0.4533333480358124]), ('3fb5eed3-e691-4931-a88e-4ca000af3beb', [0.5808333158493042]), ('93429a58-0bd8-42b8-b969-c98ca1c3d504', [0.715499997138977]), ('4e563528-1fc7-4d9e-b098-0afcf82518f7', [0.7738333344459534])])\n" ] } ], @@ -142,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "900eb0a7", "metadata": {}, "outputs": [], @@ -154,23 +159,23 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "d064aaf9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABiC0lEQVR4nO3deZhU5Zk3/m9Vda2903s3zdKgILIK0qJxi0Q0xri9GbLKMBHf+Ep+mTDJRBKVaBYyyRtiFmfMGBnzTiZKNC6JGqIhwURFiayibM3WDfQOvXet5/z+qD6nqqEburqrzvOcc76f6+rrSppeni6rTt3nfu7nvh2qqqogIiIiEsQpegFERERkbwxGiIiISCgGI0RERCQUgxEiIiISisEIERERCcVghIiIiIRiMEJERERCMRghIiIiobJEL2AkFEXByZMnkZubC4fDIXo5RERENAKqqqK7uxuVlZVwOofPf5giGDl58iSqq6tFL4OIiIhGoaGhAePHjx/2300RjOTm5gKI/zF5eXmCV0NEREQj0dXVherqav19fDimCEa0rZm8vDwGI0RERCZzvhILFrASERGRUAxGiIiISCgGI0RERCQUgxEiIiISisEIERERCcVghIiIiIRiMEJERERCMRghIiIioRiMEBERkVAMRoiIiEgoBiNEREQk1KiCkUcffRSTJk2Cz+dDbW0ttm7dOuzXRiIRPPzww5gyZQp8Ph/mzJmDjRs3jnrBREREZC0pByMbNmzAqlWrsGbNGmzfvh1z5szBkiVL0NLSMuTX33///fj5z3+On/70p/jggw/whS98Abfddht27Ngx5sUTEdHIqKqKY+29eH7HcfzszwfR1BkUvSQinUNVVTWVb6itrcWll16Kn/3sZwAARVFQXV2NL37xi7jvvvvO+vrKykp84xvfwL333qt/7o477oDf78evfvWrEf3Orq4u5Ofno7Ozk1N7iYhGoDcUxa7jHdhR34Ed9aexo74D7b1h/d8//6HJeOBjMwSukOxgpO/fWan80HA4jG3btmH16tX655xOJxYvXowtW7YM+T2hUAg+n2/Q5/x+P954441hf08oFEIoFNL/f1dXVyrLJCKyFVVVcaStFzvqO7B9IPDY19QF5YxbTY/LifyAG63dIZxKCkyIREspGGlra0MsFkNZWdmgz5eVlWHfvn1Dfs+SJUuwbt06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WLNmDbZv3445c+ZgyZIlaGlpEb00Q1188cVobGzUP9544w3RSzJEb28v5syZg0cffXTIf//+97+Pn/zkJ3jsscfwzjvvIDs7G0uWLEEwGDR4pZl1vscBAG644YZBz5GnnnrKwBUa4/XXX8e9996Lt99+G6+99hoikQiuv/569Pb26l/z5S9/Gb///e/xzDPP4PXXX8fJkydx++23C1x1+o3kcQCAFStWDHpOfP/73xe04swYP348vve972Hbtm1499138eEPfxi33HIL3n//fQD2eC5ozvdYAGl6Pqg2tXDhQvXee+/V/38sFlMrKyvVtWvXClyVsdasWaPOmTNH9DKEA6A+//zz+v9XFEUtLy9Xf/CDH+if6+joUL1er/rUU08JWKExznwcVFVVly1bpt5yyy1C1iNSS0uLCkB9/fXXVVWN//d3u93qM888o3/N3r17VQDqli1bRC0z4858HFRVVa+++mr1S1/6krhFCVJYWKj+4he/sO1zIZn2WKhq+p4PtsyMhMNhbNu2DYsXL9Y/53Q6sXjxYmzZskXgyox38OBBVFZWoqamBp/5zGdQX18veknCHTlyBE1NTYOeH/n5+aitrbXd8wMANm/ejNLSUkybNg333HMP2tvbRS8p4zo7OwEA48aNAwBs27YNkUhk0HNi+vTpmDBhgqWfE2c+Dpr/+Z//QXFxMWbOnInVq1ejr69PxPIMEYvF8PTTT6O3txeLFi2y7XMBOPux0KTj+WCKQXnp1tbWhlgshrKyskGfLysrw759+wStyni1tbV48sknMW3aNDQ2NuKhhx7ClVdeiT179iA3N1f08oRpamoCgCGfH9q/2cUNN9yA22+/HZMnT8ahQ4fw9a9/HTfeeCO2bNkCl8slenkZoSgK/vmf/xlXXHEFZs6cCSD+nPB4PCgoKBj0tVZ+Tgz1OADApz/9aUycOBGVlZXYvXs3vva1r2H//v147rnnBK42/d577z0sWrQIwWAQOTk5eP755zFjxgzs3LnTds+F4R4LIH3PB1sGIxR344036v979uzZqK2txcSJE/Gb3/wGn//85wWujGTxyU9+Uv/fs2bNwuzZszFlyhRs3rwZ1113ncCVZc69996LPXv22KZ+ajjDPQ533323/r9nzZqFiooKXHfddTh06BCmTJli9DIzZtq0adi5cyc6Ozvx7LPPYtmyZXj99ddFL0uI4R6LGTNmpO35YMttmuLiYrhcrrOqn5ubm1FeXi5oVeIVFBTgwgsvRF1dneilCKU9B/j8OFtNTQ2Ki4st+xxZuXIlXnrpJfzlL3/B+PHj9c+Xl5cjHA6jo6Nj0Ndb9Tkx3OMwlNraWgCw3HPC4/Fg6tSpmD9/PtauXYs5c+bgxz/+se2eC8Dwj8VQRvt8sGUw4vF4MH/+fGzatEn/nKIo2LRp06B9MLvp6enBoUOHUFFRIXopQk2ePBnl5eWDnh9dXV145513bP38AIDjx4+jvb3dcs8RVVWxcuVKPP/88/jzn/+MyZMnD/r3+fPnw+12D3pO7N+/H/X19ZZ6TpzvcRjKzp07AcByz4kzKYqCUChkm+fCuWiPxVBG/XwYcwmsST399NOq1+tVn3zySfWDDz5Q7777brWgoEBtamoSvTTD/Mu//Iu6efNm9ciRI+qbb76pLl68WC0uLlZbWlpELy3juru71R07dqg7duxQAajr1q1Td+zYoR47dkxVVVX93ve+pxYUFKgvvviiunv3bvWWW25RJ0+erPb39wteeXqd63Ho7u5Wv/KVr6hbtmxRjxw5ov7pT39SL7nkEvWCCy5Qg8Gg6KWn1T333KPm5+ermzdvVhsbG/WPvr4+/Wu+8IUvqBMmTFD//Oc/q++++666aNEiddGiRQJXnX7nexzq6urUhx9+WH333XfVI0eOqC+++KJaU1OjXnXVVYJXnl733Xef+vrrr6tHjhxRd+/erd53332qw+FQX331VVVV7fFc0JzrsUjn88G2wYiqqupPf/pTdcKECarH41EXLlyovv3226KXZKilS5eqFRUVqsfjUauqqtSlS5eqdXV1opdliL/85S8qgLM+li1bpqpq/HjvAw88oJaVlaler1e97rrr1P3794tddAac63Ho6+tTr7/+erWkpER1u93qxIkT1RUrVlgyYB/qMQCg/td//Zf+Nf39/er/+T//Ry0sLFQDgYB62223qY2NjeIWnQHnexzq6+vVq666Sh03bpzq9XrVqVOnql/96lfVzs5OsQtPs3/6p39SJ06cqHo8HrWkpES97rrr9EBEVe3xXNCc67FI5/PBoaqqmlouhYiIiCh9bFkzQkRERPJgMEJERERCMRghIiIioRiMEBERkVAMRoiIiEgoBiNEREQkFIMRIiIiEorBCBEREQnFYISIiIiEYjBCREREQjEYISIiIqEYjBAREZFQ/z+py/Vb0pfBggAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] diff --git a/fedn/fedn/network/api/client.py b/fedn/fedn/network/api/client.py index 51b09bebf..51d4a9ff5 100644 --- a/fedn/fedn/network/api/client.py +++ b/fedn/fedn/network/api/client.py @@ -110,12 +110,16 @@ def get_round(self, round_id): response = requests.get(self._get_url(f'get_round?round_id={round_id}'), verify=self.verify) return response.json() - def start_session(self, session_id=None, aggregator='fedavg', round_timeout=180, rounds=5, round_buffer_size=-1, delete_models=True, + def start_session(self, session_id=None, aggregator='fedavg', model_id=None, round_timeout=180, rounds=5, round_buffer_size=-1, delete_models=True, validate=True, helper='kerashelper', min_clients=1, requested_clients=8): """ Start a new session. :param session_id: The session id to start. :type session_id: str + :param aggregator: The aggregator plugin to use. + :type aggregator: str + :param model_id: The id of the initial model. + :type model_id: str :param round_timeout: The round timeout to use in seconds. :type round_timeout: int :param rounds: The number of rounds to perform. @@ -136,8 +140,9 @@ def start_session(self, session_id=None, aggregator='fedavg', round_timeout=180, :rtype: dict """ response = requests.post(self._get_url('start_session'), json={ - 'aggregator': aggregator, 'session_id': session_id, + 'aggregator': aggregator, + 'model_id': model_id, 'round_timeout': round_timeout, 'rounds': rounds, 'round_buffer_size': round_buffer_size, diff --git a/fedn/fedn/network/api/interface.py b/fedn/fedn/network/api/interface.py index 6d73b81c1..4fb524b7b 100644 --- a/fedn/fedn/network/api/interface.py +++ b/fedn/fedn/network/api/interface.py @@ -752,6 +752,7 @@ def start_session( self, session_id, aggregator='fedavg', + model_id=None, rounds=5, round_timeout=180, round_buffer_size=-1, @@ -765,6 +766,10 @@ def start_session( :param session_id: The session id to start. :type session_id: str + :param aggregator: The aggregator plugin to use. + :type aggregator: str + :param initial_model: The initial model for the session. + :type initial_model: str :param rounds: The number of rounds to perform. :type rounds: int :param round_timeout: The round timeout to use in seconds. @@ -831,13 +836,14 @@ def start_session( validate = False # Get lastest model as initial model for session - model_id = self.statestore.get_latest_model() + if not model_id: + model_id = self.statestore.get_latest_model() # Setup session config session_config = { "session_id": session_id if session_id else str(uuid.uuid4()), - "round_timeout": round_timeout, "aggregator": aggregator, + "round_timeout": round_timeout, "buffer_size": round_buffer_size, "model_id": model_id, "rounds": rounds, diff --git a/fedn/fedn/network/controller/control.py b/fedn/fedn/network/controller/control.py index 37695f60e..71a5bcc46 100644 --- a/fedn/fedn/network/controller/control.py +++ b/fedn/fedn/network/controller/control.py @@ -114,9 +114,7 @@ def session(self, config): last_round = int(self.get_latest_round_id()) - # Clear potential stragglers/old model updates at combiners for combiner in self.network.get_combiners(): - # combiner.flush_model_update_queue() combiner.set_aggregator(config['aggregator']) # Execute the rounds in this session @@ -142,6 +140,8 @@ def session(self, config): flush=True, ) + config["model_id"] = self.statestore.get_latest_model() + # TODO: Report completion of session self._state = ReducerState.idle @@ -167,8 +167,7 @@ def round(self, session_config, round_id): round_config["rounds"] = 1 round_config["round_id"] = round_id round_config["task"] = "training" - round_config["model_id"] = self.statestore.get_latest_model() - round_config["helper_type"] = self.statestore.get_helper() + #round_config["helper_type"] = self.statestore.get_helper() self.set_round_config(round_id, round_config) diff --git a/fedn/fedn/utils/plugins/helperbase.py b/fedn/fedn/utils/plugins/helperbase.py index 595899ff6..a59ee49d8 100644 --- a/fedn/fedn/utils/plugins/helperbase.py +++ b/fedn/fedn/utils/plugins/helperbase.py @@ -12,11 +12,11 @@ def __init__(self): self.name = self.__class__.__name__ @abstractmethod - def increment_average(self, model, model_next, a, W): + def increment_average(self, m1, m2, a, W): """ Compute one increment of incremental weighted averaging. - :param model: Current model weights in array-like format. - :param model_next: New model weights in array-like format. + :param m1: Current model weights in array-like format. + :param m2: New model weights in array-like format. :param a: Number of examples in new model. :param W: Total number of examples. :return: Incremental weighted average of model weights. diff --git a/fedn/fedn/utils/plugins/numpyarrayhelper.py b/fedn/fedn/utils/plugins/numpyarrayhelper.py index 275d3b51c..4ccb3bdf9 100644 --- a/fedn/fedn/utils/plugins/numpyarrayhelper.py +++ b/fedn/fedn/utils/plugins/numpyarrayhelper.py @@ -8,19 +8,57 @@ class Helper(HelperBase): """ FEDn helper class for numpy arrays. """ - def increment_average(self, model, model_next, n): + def increment_average(self, m1, m2, n, N): """ Update an incremental average. - :param model: Current model weights. - :type model: numpy array. - :param model_next: New model weights. - :type model_next: numpy array. + :param m1: Current model weights. + :type m1: numpy ndarray. + :param m2: New model weights. + :type m2: numpy ndarray. :param n: Number of examples in new model. :type n: int + :param N: Total number of examples :return: Incremental weighted average of model weights. :rtype: :class:`numpy.array` """ - return np.add(model, (model_next - model) / n) + return np.add(m1, n*(m2 - m1) / N) + + def add(self, m1, m2, a=1.0, b=1.0): + """ Add weights. + + :param model: Current model weights with keys from torch state_dict. + :type model: OrderedDict + :param model_next: New model weights with keys from torch state_dict. + :type model_next: OrderedDict + :return: Incremental weighted average of model weights. + :rtype: OrderedDict + """ + + w = a*m1 + b*m2 + return w + + def subtract(self, m1, m2, a=1.0, b=1.0): + """ Subtract model weights m2 from m1. + + :param model: Current model weights. + :type model: list of numpy arrays. + :param model_next: New model weights. + :type model_next: list of numpy arrays. + :param num_examples: Number of examples in new model. + :type num_examples: int + :param total_examples: Total number of examples. + :type total_examples: int + :return: Incremental weighted average of model weights. + :rtype: list of numpy arrays. + """ + + w = a*m1-b*m2 + return w + + def norm(self, m): + """ Compute the L2 norm of the weights/model update. """ + + return np.linalg.norm(m) def save(self, model, path=None): """ Serialize weights/parameters to file. diff --git a/fedn/fedn/utils/plugins/pytorchhelper.py b/fedn/fedn/utils/plugins/pytorchhelper.py index a132d396d..edcf0443b 100644 --- a/fedn/fedn/utils/plugins/pytorchhelper.py +++ b/fedn/fedn/utils/plugins/pytorchhelper.py @@ -65,10 +65,10 @@ def subtract(self, m1, m2, a=1.0, b=1.0): w[name] = tensorDiff return w - def norm(self, model): - """Compute the L1-norm of the tensor. """ + def norm(self, m): + """Compute the L1-norm of the tensor m. """ n = 0.0 - for name, val in model.items(): + for name, val in m.items(): n += np.linalg.norm(np.array(val), 1) return n