From 3e559bab0ad87e41df2a1cc131b92269f35cf857 Mon Sep 17 00:00:00 2001 From: ueldn <richard.beeh@student.kit.edu> Date: Wed, 8 May 2024 11:18:53 +0200 Subject: [PATCH] add federated learning --- .../.ipynb_checkpoints/lenet-checkpoint.png | Bin 0 -> 135856 bytes .../clientlib-checkpoint.py | 51 ++++ .../exercise_10-checkpoint.ipynb | 220 ++++++++++++++ .../exercise_11-checkpoint.ipynb | 268 ++++++++++++++++++ .../__pycache__/clientlib.cpython-36.pyc | Bin 0 -> 1789 bytes .../__pycache__/device_data.cpython-36.pyc | Bin 0 -> 1150 bytes .../1-federated_learning/exercise_10.ipynb | 84 ++++-- .../1-federated_learning/exercise_11.ipynb | 140 ++++++++- .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 175 bytes .../__pycache__/cifarnet.cpython-36.pyc | Bin 0 -> 1586 bytes 10 files changed, 729 insertions(+), 34 deletions(-) create mode 100644 exercises/0-intro/src/.ipynb_checkpoints/lenet-checkpoint.png create mode 100644 exercises/1-federated_learning/.ipynb_checkpoints/clientlib-checkpoint.py create mode 100644 exercises/1-federated_learning/.ipynb_checkpoints/exercise_10-checkpoint.ipynb create mode 100644 exercises/1-federated_learning/.ipynb_checkpoints/exercise_11-checkpoint.ipynb create mode 100644 exercises/1-federated_learning/__pycache__/clientlib.cpython-36.pyc create mode 100644 exercises/1-federated_learning/__pycache__/device_data.cpython-36.pyc create mode 100644 exercises/1-federated_learning/models/__pycache__/__init__.cpython-36.pyc create mode 100644 exercises/1-federated_learning/models/__pycache__/cifarnet.cpython-36.pyc diff --git a/exercises/0-intro/src/.ipynb_checkpoints/lenet-checkpoint.png b/exercises/0-intro/src/.ipynb_checkpoints/lenet-checkpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..dc50e56a7fe293b5f12c8bae466493f54017c5ee GIT binary patch literal 135856 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 literal 0 HcmV?d00001 diff --git a/exercises/1-federated_learning/.ipynb_checkpoints/clientlib-checkpoint.py b/exercises/1-federated_learning/.ipynb_checkpoints/clientlib-checkpoint.py new file mode 100644 index 0000000..4f5cf70 --- /dev/null +++ b/exercises/1-federated_learning/.ipynb_checkpoints/clientlib-checkpoint.py @@ -0,0 +1,51 @@ +import io +import pickle +import requests +import time +import torch + + +def _parse_model(ser): + data = pickle.loads(ser) + model_bytes = data['model_bytes'] + model_metadata = data['model_metadata'] + model_bytes_io = io.BytesIO(model_bytes) + model = torch.load(model_bytes_io) + return model, model_metadata + + +def _get_model_metadata(server): + url = f'http://{server}/api/get_model_metadata' + r = requests.get(url) + assert r.ok, r.text + return pickle.loads(r.content)['model_metadata'] + + +def wait_for_next_round(server, last_trained_round=None, join_late_by_max=10): + while True: + metadata = _get_model_metadata(server) + if metadata['round_age'] < join_late_by_max: + if last_trained_round != metadata['round']: + return + time.sleep(1) + + +def get_model_and_notify_client_started(server, client_id): + url = f'http://{server}/api/get_model_and_notify_client_started' + r = requests.post(url, data={'client_id': client_id}) + assert r.ok, r.text + return _parse_model(r.content) + + +def upload_updated_model(server, client_id, model, model_metadata): + model_bytes_io = io.BytesIO() + torch.save(model, model_bytes_io) + model_bytes_io.seek(0) + model_bytes = model_bytes_io.read() + data = {'model_bytes': model_bytes, 'model_metadata': model_metadata, 'client_id': client_id} + ser = pickle.dumps(data) + + url = f'http://{server}/api/upload_updated_model' + r = requests.post(url, data=ser) + if not r.ok: + print('ERROR', r.text) diff --git a/exercises/1-federated_learning/.ipynb_checkpoints/exercise_10-checkpoint.ipynb b/exercises/1-federated_learning/.ipynb_checkpoints/exercise_10-checkpoint.ipynb new file mode 100644 index 0000000..490f0d3 --- /dev/null +++ b/exercises/1-federated_learning/.ipynb_checkpoints/exercise_10-checkpoint.ipynb @@ -0,0 +1,220 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5fa2a19a-a0ec-46dc-aeef-efacd662be23", + "metadata": {}, + "source": [ + "# Embedded ML Lab - Excercise 1- Federated Learning\n", + "\n", + "In this exercise, we will explore federated learning (FL).\n", + "\n", + "To recap, the core idea of FL is that many *devices* collaboratively train a single model, where each device has its own local private training data. Each device performs local training with its own data, and exchanges the weights of the NN model with all other devices via the *server*.\n", + "\n", + "You are one participant in an FL system that comprises all participating students in this lab.\n", + "\n", + "This excercise comprises two parts.\n", + "* First, we will implement decentralized single-device training, i.e., no collaboration between devices. This will serve as a baseline to compare FL to.\n", + "* Second, we will implement actual FL, where all participants collaboratively train a model." + ] + }, + { + "cell_type": "markdown", + "id": "c7241e36-23e2-4ce4-9d97-8ce24e923c43", + "metadata": {}, + "source": [ + "## Part 1: Decentralized single-device training\n", + "\n", + "We start with the data. Therefore, we randomly distribute the CIFAR-10 dataset among all participants. This is already implemented in the helper functions in device_data. It divides the dataset into `total_clients` parts and returns the part with the number `client_id`.\n", + "\n", + "We also make use of test data. This is usually not available in FL. However, we still use it to test the model quality. Of course, the test data must not be used for training -- only testing." + ] + }, + { + "cell_type": "markdown", + "id": "6147e564-3e31-469d-af14-3d7c95a078cf", + "metadata": {}, + "source": [ + "Adjust the following constants to the participants in the lab. Each participant is one client. Make sure that you use a different *CLIENT_ID*, each." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a3535eb2-c3e5-4e88-87c6-3f2bd44ff281", + "metadata": {}, + "outputs": [], + "source": [ + "TOTAL_CLIENTS = 11 # number of participants in the lab\n", + "CLIENT_ID = 4 # between 0 and TOTAL_CLIENTS-1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "76aa6d0f-8b95-4763-b001-2babbba0bcc0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n", + "4546\n" + ] + } + ], + "source": [ + "import torch\n", + "import device_data\n", + "\n", + "training_dataset = device_data.get_client_training_data(CLIENT_ID, TOTAL_CLIENTS)\n", + "train_loader = torch.utils.data.DataLoader(training_dataset, batch_size=16)\n", + "test_dataset = device_data.get_test_data()\n", + "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16)\n", + "\n", + "print(len(training_dataset))" + ] + }, + { + "cell_type": "markdown", + "id": "485fdea9-e0f7-412a-9528-2f17b334d02e", + "metadata": {}, + "source": [ + "You are already familiar with training an NN in PyTorch. We want to train a CifarNet with your part of the training data.\n", + "\n", + "**Your Task:**\n", + "- Create a instance of CifarNet, define the optimizer and the criteron. For the optimizer use `torch.optim.SGD` (https://pytorch.org/docs/stable/generated/torch.optim.SGD.html) , for the loss use criterion use `torch.nn.CrossEntropyLoss`. Use a learning rate of `0.001` and a momentum of `0.9`\n", + "- implement the function train that trains the model CifarNet. The function `train` takes the model (an instance), the optimizer, an optimization criterion, a trainloader, and a device (either `cpu` or `cuda` as input)\n", + " - Firstly, set the model in training mode, load the model on the device. Secondly, push the `inputs` and `targets` to the device.\n", + " - Inside the batch loader loop, set the grads of the optimizer to zero (`.zero_grad()`) and push the inputs into the model. After that, calculate the loss and call backward on the loss. Lastly, apply the optimizer step.\n", + "- Implement the function test that tests the model CifarNet, The function `test` takes the model (an instance), a testloader, and the device as input. The function returns the accuracy.\n", + " - Set the model into evaluation mode, for each batch calculate the number of correct detected and all detections.\n", + " - Return the accuracy (fraction of correct detected and all)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ebfe3586-4082-4a70-b387-a9546c673f43", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10: accuracy (0.39) \n", + "Epoch 2/10: accuracy (0.44) \n", + "Epoch 3/10: accuracy (0.47) \n", + "Epoch 4/10: accuracy (0.48) \n", + "Epoch 5/10: accuracy (0.49) \n", + "Epoch 6/10: accuracy (0.49) \n", + "Epoch 7/10: accuracy (0.49) \n", + "Epoch 8/10: accuracy (0.51) \n", + "Epoch 9/10: accuracy (0.51) \n", + "Epoch 10/10: accuracy (0.49) \n" + ] + } + ], + "source": [ + "# this reaches <70% with 4 clients\n", + "\n", + "from models.cifarnet import CifarNet\n", + "from tqdm import tqdm\n", + "import sys\n", + "\n", + "device = 'cuda'\n", + "epochs = 10\n", + "\n", + "#create a model instance and define loss and optimizer criterion\n", + "#-to-be-done-by-student-------------\n", + "model = CifarNet().to(device)\n", + "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n", + "criterion = torch.nn.CrossEntropyLoss()\n", + "#-----------------------------------\n", + "\n", + "def train(model, optimizer, criterion, trainloader, device='cpu'):\n", + " \n", + " #-to-be-done-by-student---------\n", + " model.train()\n", + " #-------------------------------\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(trainloader, ncols=80,\n", + " file=sys.stdout, desc=\"Training\", leave=False)):\n", + " \n", + " #-to-be-done-by-student----\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " optimizer.zero_grad()\n", + " \n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, targets)\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", + " #--------------------------\n", + "\n", + "def test(model, testloader, device='cpu'):\n", + " num_correct = 0\n", + " num_samples = 0\n", + " \n", + " #-to-be-done-by-student---------\n", + " model.eval()\n", + " #-------------------------------\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(testloader, ncols=80,\n", + " file=sys.stdout, desc=\"Testing\", leave=False)):\n", + " #-to-be-done-by-student----\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " outputs = model(inputs)\n", + " indexes = outputs.argmax(dim=1)\n", + " \n", + " num_correct += (indexes == targets).float().sum()\n", + " num_samples += inputs.shape[0]\n", + " #--------------------------\n", + " \n", + " return num_correct / num_samples\n", + "\n", + "for epoch in range(epochs):\n", + " train(model, optimizer, criterion, train_loader, device=device)\n", + " accuracy = test(model, test_loader, device=device)\n", + " print(f'Epoch {epoch+1:2d}/{epochs:2d}: accuracy ({accuracy:.2f})')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "amended-bachelor", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/exercises/1-federated_learning/.ipynb_checkpoints/exercise_11-checkpoint.ipynb b/exercises/1-federated_learning/.ipynb_checkpoints/exercise_11-checkpoint.ipynb new file mode 100644 index 0000000..ec4dbef --- /dev/null +++ b/exercises/1-federated_learning/.ipynb_checkpoints/exercise_11-checkpoint.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "88d20a0a-e183-43bc-8918-24d2f22ef634", + "metadata": {}, + "source": [ + "## Part 2: Federated Learning\n", + "\n", + "You already have trained the model locally on your device with your (limited) data. We want now to extend this to FL.\n", + "\n", + "Some helper functions are already implemented in *clientlib.py*:\n", + "- **wait_for_next_round**(server, last_trained_round=None, join_late_by_max=10):\n", + "Wait until a new round has started. A round is considered new if it is younger than *join_late_by_max* seconds. The parameter *last_trained_round* may be used to indicate the last round that the client has last participated (i.e., wait for a round != last_trained_round).\n", + "\n", + "- **get_model_and_notify_client_started**(server, client_id):\n", + "Registers the client at the server and downloads the current model and metadata. *metadata['round']* contains the current round number.\n", + "\n", + "- **upload_updated_model**(server, client_id, model, model_metadata):\n", + "Upload an updated model from the server. *model_metadata* must be the same as returned by *get_model_and_notify_client_started*." + ] + }, + { + "cell_type": "markdown", + "id": "d31527d0-b1a5-4369-aea0-e092609f5a95", + "metadata": {}, + "source": [ + "FL specifications:\n", + "- train for **one epoch** with your local dataset in each round. Testing is not required (but may be interesting?)\n", + "- use the same hyperparameters as in part 1\n", + "- a round ends after 60s latest. If you upload your model too late, it is rejected by the server. **Do not cheat by changing model_metadata before uploading.**\n", + "\n", + "**Your Task:**\n", + "- Implement the Federated Learning training on the client, for that in a loop do the following things\n", + "- 1) Wait for the next round to start using the helper function `clientlib.wait_for_next_round()`.\n", + "- 2) Download the newly averaged model from the server using the helper functions.\n", + "- 3) Train your model with your data, similar to on-device training.\n", + "- 4) Upload the model using the helper function\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5e98b6e3-c7bd-44bb-ad84-55f41f064c10", + "metadata": {}, + "outputs": [], + "source": [ + "TOTAL_CLIENTS = 11 # number of participants in the lab\n", + "CLIENT_ID = 4 # between 0 and TOTAL_CLIENTS-1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0d64fc72-8577-4c5f-996e-54f3c9ad9d81", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], + "source": [ + "import torch\n", + "import device_data\n", + "\n", + "training_dataset = device_data.get_client_training_data(CLIENT_ID, TOTAL_CLIENTS)\n", + "train_loader = torch.utils.data.DataLoader(training_dataset, batch_size=16)\n", + "test_dataset = device_data.get_test_data()\n", + "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "35692a25-7929-4937-8469-11ab40fae52d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting round\n", + "downloaded model -> train (round 79)\n", + "training took 10.1s \n", + "upload updated model\n", + "Starting round\n", + "downloaded model -> train (round 80)\n", + "training took 10.1s \n", + "upload updated model\n", + "Starting round\n" + ] + }, + { + "ename": "ConnectionError", + "evalue": "HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 174\u001b[0m conn = connection.create_connection(\n\u001b[0;32m--> 175\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dns_host\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mport\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mextra_kw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 176\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merr\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 95\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 96\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource_address\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0msock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msa\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mConnectionRefusedError\u001b[0m: [Errno 111] Connection refused", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mNewConnectionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 709\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 710\u001b[0;31m \u001b[0mchunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunked\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 711\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36m_make_request\u001b[0;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 398\u001b[0;31m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mhttplib_request_kw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 399\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers)\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"User-Agent\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_default_user_agent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 239\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHTTPConnection\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 240\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1280\u001b[0m \u001b[0;34m\"\"\"Send a complete request to the server.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1281\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1282\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36m_send_request\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1326\u001b[0m \u001b[0mbody\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_encode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'body'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1327\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mendheaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1328\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36mendheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1275\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCannotSendHeader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1276\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage_body\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36m_send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1041\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1042\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1043\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_open\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 980\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 981\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 205\u001b[0;31m \u001b[0mconn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 206\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 186\u001b[0m raise NewConnectionError(\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Failed to establish a new connection: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m )\n", + "\u001b[0;31mNewConnectionError\u001b[0m: <urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mMaxRetryError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 449\u001b[0m \u001b[0mretries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_retries\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 450\u001b[0;31m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 451\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 785\u001b[0m retries = retries.increment(\n\u001b[0;32m--> 786\u001b[0;31m \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_pool\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_stacktrace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 787\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/retry.py\u001b[0m in \u001b[0;36mincrement\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m 591\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_retry\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_exhausted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 592\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mMaxRetryError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_pool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mResponseError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 593\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mConnectionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-7-f7910e17da6c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;31m#-to-be-done-by-student-----\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0mclientlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait_for_next_round\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSERVER\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel_metadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclientlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_model_and_notify_client_started\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSERVER\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCLIENT_ID\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/embedded-ml-lab-students-ss24/exercises/1-federated_learning/clientlib.py\u001b[0m in \u001b[0;36mwait_for_next_round\u001b[0;34m(server, last_trained_round, join_late_by_max)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwait_for_next_round\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlast_trained_round\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjoin_late_by_max\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mmetadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_model_metadata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'round_age'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mjoin_late_by_max\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlast_trained_round\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'round'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/embedded-ml-lab-students-ss24/exercises/1-federated_learning/clientlib.py\u001b[0m in \u001b[0;36m_get_model_metadata\u001b[0;34m(server)\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_model_metadata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0murl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf'http://{server}/api/get_model_metadata'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrequests\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mok\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'model_metadata'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/api.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 73\u001b[0m \"\"\"\n\u001b[1;32m 74\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'get'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/api.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;31m# cases, and look like a memory leak in others.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0msessions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSession\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 527\u001b[0m }\n\u001b[1;32m 528\u001b[0m \u001b[0msend_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 529\u001b[0;31m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msend_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 530\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 643\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0;31m# Send the request\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 645\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0madapter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 646\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;31m# Total elapsed time of the request (approximately)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 517\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSSLError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 519\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mConnectionError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 520\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 521\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mClosedPoolError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mConnectionError\u001b[0m: HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))" + ] + } + ], + "source": [ + "import clientlib\n", + "SERVER = 'federated-learning.in8.itec.kit.edu:80'\n", + "\n", + "# this reaches 76% within 10 rounds with 4 clients\n", + "\n", + "torch.set_num_threads(1)\n", + "\n", + "import time\n", + "from tqdm import tqdm\n", + "import sys\n", + "\n", + "device = 'cuda'\n", + "\n", + "def train(model, optimizer, criterion, trainloader, device='cpu'):\n", + " \n", + " #-to-be-done-by-student-----\n", + " model.train()\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(trainloader, ncols=80,\n", + " file=sys.stdout, desc=\"Training\", leave=False)):\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " optimizer.zero_grad()\n", + " \n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, targets)\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", + " #---------------------------\n", + " \n", + "def test(model, testloader, device='cpu'):\n", + " num_correct = 0\n", + " num_samples = 0\n", + " \n", + " #-to-be-done-by-student-----\n", + " model.eval()\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(testloader, ncols=80,\n", + " file=sys.stdout, desc=\"Testing\", leave=False)):\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " outputs = model(inputs)\n", + " indexes = outputs.argmax(dim=1)\n", + " \n", + " num_correct += (indexes == targets).float().sum()\n", + " num_samples += inputs.shape[0]\n", + " #---------------------------\n", + " \n", + " return num_correct/num_samples\n", + "\n", + "last_trained_round = None\n", + "starting_round = None\n", + "\n", + "while True:\n", + " print(\"Starting round\")\n", + " \n", + " #-to-be-done-by-student-----\n", + " clientlib.wait_for_next_round(SERVER)\n", + " model, model_metadata = clientlib.get_model_and_notify_client_started(SERVER, CLIENT_ID)\n", + " model = model.to(device)\n", + " if starting_round is None:\n", + " starting_round = model_metadata[\"round\"]\n", + " #---------------------------\n", + "\n", + " print(f'downloaded model -> train (round {model_metadata[\"round\"]})')\n", + "\n", + " start = time.time()\n", + " \n", + " #-to-be-done-by-student-----\n", + " optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n", + " criterion = torch.nn.CrossEntropyLoss()\n", + " train(model, optimizer, criterion, train_loader, device)\n", + " #---------------------------\n", + " \n", + " end = time.time()\n", + " print(f'training took {end-start:.1f}s')\n", + "\n", + " print('upload updated model')\n", + " \n", + " #-to-be-done-by-student-----\n", + " clientlib.upload_updated_model(SERVER, CLIENT_ID, model, model_metadata) \n", + " #---------------------------\n", + "\n", + " last_trained_round = model_metadata['round']\n", + " \n", + " #we measure the accuracy after 10 rounds\n", + " if model_metadata['round'] - starting_round == 10:\n", + " accuracy = test(model, test_loader, device=device)\n", + " print(f'Accuracy: ({accuracy:.2f})')\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "addb1a3f-0dca-4fd4-bfed-4ce8c91f9d99", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/exercises/1-federated_learning/__pycache__/clientlib.cpython-36.pyc b/exercises/1-federated_learning/__pycache__/clientlib.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94fb1657bc5795e546b95b6779d060b33c0aa338 GIT binary patch literal 1789 zcmZ`(OK%)S5bo}I?s{#ElMoCN5(KP_6lawXA%qa(p&Yn4l97V6m(h5;ZO?diX4Bmp z>}d9abLAHRKY+i~S5Cfh&WW#j?2Q#jx4OFe-SyR1_4)ex@YX+%4qru#{mrhG0Q$FR z<|%|^lGkj~_k6<rSWJZPgGu1~a1u%(gO_X)$xue<W4SI9nZD$cL=NN-GpSsYBlH8w ze`49j1@2~hQ%)U9j3&^2Kr>%JSXS|lo%1E{xa8YxDbNe_ffZHI39N)RtfDT27Ije< z917eU?76jBD^;BzoLObuMn9M-Tgbu|S?uC@IX$VBi|V$J#)-0Z$@jGP$0shbt)3pc zke0ADFiN|S&T0CaCSa~^^w;M&9QhaiVtNCsubz&N+nE|y%9^$rtJ#5)Qpw#}y;~Ot zyT&f0YOL8c=Ha8UI#qgF8fC^0b`O<Qy0A*-wJLN|Hb>)WU1D!t9^9XwxlukZv{AW# zEX7M^1i|=_r>H|zy@~M(Px>mg6`m4k{?4TMGgxwuEeCF*6O}MK7I;>`@mFr6Du$k% za~W(i;2G|{NRF+Ye>EPzxIHfB<@iY1{ulWbs2-Orb*Wa*7Rp%T0&H@kJ#ib~8DMD3 zwt1{|3oxxZwK~MdG+4)6GHn|RE3?4G*!UcH2Mb+0u05Q+c!zf0$p8EByI3#;2IC_j zu*vlY&@YA%Q!<_ky|n`3OAJmQTIPurbO8~o6DLgXbQ~kl>m<-S5{6q|fzaoivuEOG zkl#Zw8R&M=$h<fLeY|=>{LKRYE{rQ@STMCx^DNZ2vE;Vu!r0vEqHN$>e`c~-wPlmn z@HR-A&x%u*uAn3mUAOv|qO|#8tMdlH_2=KmmP_vo_<n>Ma{UQrr^He!WHdGJeKPu* z_l5U9jO%#GW%!#|0tm3+K3EW3u>e|pPH`Gt^Z(s9{9gcyrnTkaS>AIsH;5E)*bOen zrOdcq!~0pH$yqL(x5nxlQ1wj`w@46i^?MMPpy@j_L1yZ05^rE~=QR=D`h$;gZpDl( zV#a5fnGz;ch#@O{Y77XIbB2uKa|?2c;H(R)P$Eja7Gc$A8OlO`1k2dQRnh^YWdbBA zvO+{wYSU`arClN;;5z6A)zBQ<H5o%2(Vd=1$)3KX%_^&SlV3;Lwnus~r#zG|=Ey)G zj}QGzJYDp7fB(sTwyr60>VyOZf(uRYTtO;z;zF$o>4VKhaxt45?*siQZ6+7EXs*k~ zdM9K<&(|LMb=pBeqbbSsxsSZ43AeX9=H~x>_%4nZ@-_2ZrF?~06(hdEW3KOEJ`;QT zL+XdUG31#3ryr3<X7v=I;PyQC&h%%mal^C3r;7AzK((mVH-xg;f}kAfYmg4oWQg`J D`~RKl literal 0 HcmV?d00001 diff --git a/exercises/1-federated_learning/__pycache__/device_data.cpython-36.pyc b/exercises/1-federated_learning/__pycache__/device_data.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53440f2d034116c5f75cf61cd3ae7e86fe90ee38 GIT binary patch literal 1150 zcmZ`&OK;Oa5T4z&9VcyC9_7)hLIQEX5@~oHs|o}Zxby%$phzfky_?joW0&16FS!?j z)bzjsi9f+#+AF8tICEmgNud{3ns4phd44l{zuj&v|9UWZE&zVQnZ@z@A&R+)AVIPm zdefctxa3lNfu4|_^l|qjdj(N&f|{_EkR`2PCg>T=cLd2Q@Ib&GD=$p=9uyu224>a5 zXJ%Q(Gf|^Ah9MiXLymub7EmlHDlWaR-l4FKN{rbto3IIAfnzv=BX-0GLi#fJ654RW z$LtB9wP%}IE1S#aD^byRdkoovY>b%<zluY@@+(*d%(}Uy8RquMm$8kz+mUd-)p1(5 zP?qnDyo{x5;z3~sr5+`uN{edrQ7)p?3=N@zH>-!Nsx!L`d!Sb*$k!Dp_yoT3w;sk~ zCuIKvBJTLw9mi6P#&Q?rsu<c`*S4jN^L~=2s<1{Af4^UMcgvCLX3Cnf=&I3<l2Xae zDDUL)PRG~-NxB_l?mg(L4@xJgQKoyhGf-0L*eco2RjiA&7<Q$4mnN!Db*}Ay{M}m5 zQ)82Iw7;=PRZvL*e7ZeUc9ufFCIU^THtTtr#JSm6`)8<$gNV82P!$xe)X}0_cw~&y zHZ6;%T9?|*;c>G2E;V@KT7S7TuJIUymqxj8yWCcVLEVtDGgvHMzSw;9^6nickR9h^ z2Zjn;L#~{EVAI?<kCfd!UdeLQH~V>NUGv##CT?yN7YE3vQA$QZuQ}zlpGrN4S!)l$ zHD>W#W7-4bg4)lN{YdC0skR7eqj@sA`ag<@4RZkj*eVOyf>`1q3)u?0#`JYOP3Vdi zjRCdyF^ai`U?IZ?P@|ZQKb?7*FBv_63TXUsg#4}9q;BG<YU-J$_f=OD1^OI)pC_O+ zG>xZTBDjPQv0AMjtSQvxw5c4cjIG;D+J<ris(|YoWa#Uwxb>FKbaL&qQ`4AKUafn^ ZJ9*J{h;V&W%7a{OP~o+A<VA#we*o|+AZ-8u literal 0 HcmV?d00001 diff --git a/exercises/1-federated_learning/exercise_10.ipynb b/exercises/1-federated_learning/exercise_10.ipynb index af790ca..490f0d3 100644 --- a/exercises/1-federated_learning/exercise_10.ipynb +++ b/exercises/1-federated_learning/exercise_10.ipynb @@ -40,21 +40,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "a3535eb2-c3e5-4e88-87c6-3f2bd44ff281", "metadata": {}, "outputs": [], "source": [ - "TOTAL_CLIENTS = 4 # number of participants in the lab\n", - "CLIENT_ID = 0 # between 0 and TOTAL_CLIENTS-1" + "TOTAL_CLIENTS = 11 # number of participants in the lab\n", + "CLIENT_ID = 4 # between 0 and TOTAL_CLIENTS-1" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "76aa6d0f-8b95-4763-b001-2babbba0bcc0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n", + "4546\n" + ] + } + ], "source": [ "import torch\n", "import device_data\n", @@ -62,7 +72,9 @@ "training_dataset = device_data.get_client_training_data(CLIENT_ID, TOTAL_CLIENTS)\n", "train_loader = torch.utils.data.DataLoader(training_dataset, batch_size=16)\n", "test_dataset = device_data.get_test_data()\n", - "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16)" + "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16)\n", + "\n", + "print(len(training_dataset))" ] }, { @@ -84,12 +96,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "ebfe3586-4082-4a70-b387-a9546c673f43", "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10: accuracy (0.39) \n", + "Epoch 2/10: accuracy (0.44) \n", + "Epoch 3/10: accuracy (0.47) \n", + "Epoch 4/10: accuracy (0.48) \n", + "Epoch 5/10: accuracy (0.49) \n", + "Epoch 6/10: accuracy (0.49) \n", + "Epoch 7/10: accuracy (0.49) \n", + "Epoch 8/10: accuracy (0.51) \n", + "Epoch 9/10: accuracy (0.51) \n", + "Epoch 10/10: accuracy (0.49) \n" + ] + } + ], "source": [ "# this reaches <70% with 4 clients\n", "\n", @@ -102,21 +131,31 @@ "\n", "#create a model instance and define loss and optimizer criterion\n", "#-to-be-done-by-student-------------\n", - "\n", - "\n", + "model = CifarNet().to(device)\n", + "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n", + "criterion = torch.nn.CrossEntropyLoss()\n", "#-----------------------------------\n", "\n", "def train(model, optimizer, criterion, trainloader, device='cpu'):\n", + " \n", " #-to-be-done-by-student---------\n", - " \n", + " model.train()\n", " #-------------------------------\n", + " \n", " for _, (inputs, targets) in enumerate(tqdm(trainloader, ncols=80,\n", " file=sys.stdout, desc=\"Training\", leave=False)):\n", " \n", " #-to-be-done-by-student----\n", - " \n", - " \n", - " \n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " optimizer.zero_grad()\n", + " \n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, targets)\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", " #--------------------------\n", "\n", "def test(model, testloader, device='cpu'):\n", @@ -124,15 +163,20 @@ " num_samples = 0\n", " \n", " #-to-be-done-by-student---------\n", - " \n", - "\n", + " model.eval()\n", " #-------------------------------\n", + " \n", " for _, (inputs, targets) in enumerate(tqdm(testloader, ncols=80,\n", " file=sys.stdout, desc=\"Testing\", leave=False)):\n", " #-to-be-done-by-student----\n", - " \n", - " \n", - " \n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " outputs = model(inputs)\n", + " indexes = outputs.argmax(dim=1)\n", + " \n", + " num_correct += (indexes == targets).float().sum()\n", + " num_samples += inputs.shape[0]\n", " #--------------------------\n", " \n", " return num_correct / num_samples\n", @@ -168,7 +212,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/exercises/1-federated_learning/exercise_11.ipynb b/exercises/1-federated_learning/exercise_11.ipynb index e3859e3..ec4dbef 100644 --- a/exercises/1-federated_learning/exercise_11.ipynb +++ b/exercises/1-federated_learning/exercise_11.ipynb @@ -40,21 +40,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "5e98b6e3-c7bd-44bb-ad84-55f41f064c10", "metadata": {}, "outputs": [], "source": [ - "TOTAL_CLIENTS = 4 # number of participants in the lab\n", - "CLIENT_ID = 0 # between 0 and TOTAL_CLIENTS-1" + "TOTAL_CLIENTS = 11 # number of participants in the lab\n", + "CLIENT_ID = 4 # between 0 and TOTAL_CLIENTS-1" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "0d64fc72-8577-4c5f-996e-54f3c9ad9d81", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Files already downloaded and verified\n", + "Files already downloaded and verified\n" + ] + } + ], "source": [ "import torch\n", "import device_data\n", @@ -67,10 +76,69 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "35692a25-7929-4937-8469-11ab40fae52d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting round\n", + "downloaded model -> train (round 79)\n", + "training took 10.1s \n", + "upload updated model\n", + "Starting round\n", + "downloaded model -> train (round 80)\n", + "training took 10.1s \n", + "upload updated model\n", + "Starting round\n" + ] + }, + { + "ename": "ConnectionError", + "evalue": "HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 174\u001b[0m conn = connection.create_connection(\n\u001b[0;32m--> 175\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dns_host\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mport\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mextra_kw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 176\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merr\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 95\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 96\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource_address\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0msock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msa\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mConnectionRefusedError\u001b[0m: [Errno 111] Connection refused", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mNewConnectionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 709\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 710\u001b[0;31m \u001b[0mchunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunked\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 711\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36m_make_request\u001b[0;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 398\u001b[0;31m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mhttplib_request_kw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 399\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers)\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"User-Agent\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_default_user_agent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 239\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHTTPConnection\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 240\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1280\u001b[0m \u001b[0;34m\"\"\"Send a complete request to the server.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1281\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1282\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36m_send_request\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m 1326\u001b[0m \u001b[0mbody\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_encode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'body'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1327\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mendheaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1328\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36mendheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1275\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCannotSendHeader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1276\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage_body\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36m_send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1041\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1042\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1043\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.6/http/client.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_open\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 980\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 981\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 205\u001b[0;31m \u001b[0mconn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 206\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 186\u001b[0m raise NewConnectionError(\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Failed to establish a new connection: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m )\n", + "\u001b[0;31mNewConnectionError\u001b[0m: <urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mMaxRetryError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 449\u001b[0m \u001b[0mretries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_retries\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 450\u001b[0;31m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 451\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 785\u001b[0m retries = retries.increment(\n\u001b[0;32m--> 786\u001b[0;31m \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_pool\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_stacktrace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 787\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/urllib3/util/retry.py\u001b[0m in \u001b[0;36mincrement\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m 591\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_retry\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_exhausted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 592\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mMaxRetryError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_pool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mResponseError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 593\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mConnectionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-7-f7910e17da6c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;31m#-to-be-done-by-student-----\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0mclientlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait_for_next_round\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSERVER\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel_metadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclientlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_model_and_notify_client_started\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSERVER\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCLIENT_ID\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/embedded-ml-lab-students-ss24/exercises/1-federated_learning/clientlib.py\u001b[0m in \u001b[0;36mwait_for_next_round\u001b[0;34m(server, last_trained_round, join_late_by_max)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwait_for_next_round\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlast_trained_round\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjoin_late_by_max\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mmetadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_model_metadata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'round_age'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mjoin_late_by_max\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlast_trained_round\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'round'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/embedded-ml-lab-students-ss24/exercises/1-federated_learning/clientlib.py\u001b[0m in \u001b[0;36m_get_model_metadata\u001b[0;34m(server)\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_model_metadata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mserver\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0murl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf'http://{server}/api/get_model_metadata'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrequests\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mok\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'model_metadata'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/api.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 73\u001b[0m \"\"\"\n\u001b[1;32m 74\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'get'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/api.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;31m# cases, and look like a memory leak in others.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0msessions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSession\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 527\u001b[0m }\n\u001b[1;32m 528\u001b[0m \u001b[0msend_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 529\u001b[0;31m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msend_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 530\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 643\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0;31m# Send the request\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 645\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0madapter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 646\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;31m# Total elapsed time of the request (approximately)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 517\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSSLError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 519\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mConnectionError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 520\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 521\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mClosedPoolError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mConnectionError\u001b[0m: HTTPConnectionPool(host='federated-learning.in8.itec.kit.edu', port=80): Max retries exceeded with url: /api/get_model_metadata (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35bf7a20>: Failed to establish a new connection: [Errno 111] Connection refused',))" + ] + } + ], "source": [ "import clientlib\n", "SERVER = 'federated-learning.in8.itec.kit.edu:80'\n", @@ -86,8 +154,22 @@ "device = 'cuda'\n", "\n", "def train(model, optimizer, criterion, trainloader, device='cpu'):\n", + " \n", " #-to-be-done-by-student-----\n", - " \n", + " model.train()\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(trainloader, ncols=80,\n", + " file=sys.stdout, desc=\"Training\", leave=False)):\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " optimizer.zero_grad()\n", + " \n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, targets)\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", " #---------------------------\n", " \n", "def test(model, testloader, device='cpu'):\n", @@ -95,41 +177,71 @@ " num_samples = 0\n", " \n", " #-to-be-done-by-student-----\n", - " \n", + " model.eval()\n", + " \n", + " for _, (inputs, targets) in enumerate(tqdm(testloader, ncols=80,\n", + " file=sys.stdout, desc=\"Testing\", leave=False)):\n", + " inputs = inputs.to(device)\n", + " targets = targets.to(device)\n", + " \n", + " outputs = model(inputs)\n", + " indexes = outputs.argmax(dim=1)\n", + " \n", + " num_correct += (indexes == targets).float().sum()\n", + " num_samples += inputs.shape[0]\n", " #---------------------------\n", + " \n", " return num_correct/num_samples\n", "\n", "last_trained_round = None\n", + "starting_round = None\n", "\n", "while True:\n", " print(\"Starting round\")\n", " \n", " #-to-be-done-by-student-----\n", - "\n", + " clientlib.wait_for_next_round(SERVER)\n", + " model, model_metadata = clientlib.get_model_and_notify_client_started(SERVER, CLIENT_ID)\n", + " model = model.to(device)\n", + " if starting_round is None:\n", + " starting_round = model_metadata[\"round\"]\n", " #---------------------------\n", "\n", " print(f'downloaded model -> train (round {model_metadata[\"round\"]})')\n", "\n", " start = time.time()\n", + " \n", " #-to-be-done-by-student-----\n", - "\n", + " optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n", + " criterion = torch.nn.CrossEntropyLoss()\n", + " train(model, optimizer, criterion, train_loader, device)\n", " #---------------------------\n", + " \n", " end = time.time()\n", " print(f'training took {end-start:.1f}s')\n", "\n", " print('upload updated model')\n", + " \n", " #-to-be-done-by-student-----\n", - "\n", + " clientlib.upload_updated_model(SERVER, CLIENT_ID, model, model_metadata) \n", " #---------------------------\n", "\n", " last_trained_round = model_metadata['round']\n", " \n", " #we measure the accuracy after 10 rounds\n", - " if model_metadata['round'] == 10:\n", + " if model_metadata['round'] - starting_round == 10:\n", " accuracy = test(model, test_loader, device=device)\n", " print(f'Accuracy: ({accuracy:.2f})')\n", " break" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "addb1a3f-0dca-4fd4-bfed-4ce8c91f9d99", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -148,7 +260,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/exercises/1-federated_learning/models/__pycache__/__init__.cpython-36.pyc b/exercises/1-federated_learning/models/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46da6f3ec7321fb41e867449070d82e5b9a10280 GIT binary patch literal 175 zcmYL?F$w}P6hyONA;KQOBUr?bx}}IGu(1`wu76e|NmlZ+phxmbwqC&6%4{JHyvH!j ztjcmSeOIl@c@6rd$Yq<6Q5LJcniac;io^WZ=RoJqgDyzY1%hwD4A$OhS2tQx&j?Ah v$g(2b5RX<Mw9qXWu})y)P{&}yiG0U!LdMu&lQHw_{W)Iev3J-EuaZ$;c?T}* literal 0 HcmV?d00001 diff --git a/exercises/1-federated_learning/models/__pycache__/cifarnet.cpython-36.pyc b/exercises/1-federated_learning/models/__pycache__/cifarnet.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c8d0f38d8b04d9d6fce686572a635e6cb6ad50 GIT binary patch literal 1586 zcmaJ>OK;;g5GJXI6~|7T2hwhzTcAMU1spd{Hm60gXn^$6`qG<FfKWuLkyfTsl5VpL z@5ur7lpoT+r0br1>$!)bGm@=rgrXAo4d<KTa5Nh7wBPSO`RgpX^a*)SK6qT1zl34V z0R#~=Ct)pV#zIyxPR24f^nM_M3FnRoM-pKCr4x1p{h18i6|5!G7;*DB>xuaqCX$3y zkdVD22^CbZyC8IgBiuU@y6=cfLJy*NWpI%uk)BE$)AeeU9T*tRxS&~L>4Gd-#+HN< z>trs*gHgr1_ZEbE70X(zzh=EhzMYEo#A7yCv;HIBt%~)<W3~(IHtf|A!99cBdo8_R z>0V>sY3aL_?l<;9OWy;1Uu=o)5~Cjo0+rgHuCO4h0Ron2NXyPmBt)uyT|GteCBP-H z2UbV%E3W5CfsGp*S(8G+$*Kz;!^6@u^Bbu(1FZ}=PgQC;FPT!Me^IF4C!+LXkSDd6 z)Z(-jXSH}<i}P~(`^d)E(?ZW+nRBI15GDwx2xkb-5zb5h$5hEkmn?}POV`Le0lCF_ zoJYoR{wMkSm+^HmljBTUQ>d|=T}dIN7|rrg9$k%$oeQa~85uJ<8_Qd%<J3qqJ{cua zNF7-zcn&+@XOCxvkhvMh*j-B6<D1vI2Oo@$Wj+HSbcY_%Beod>+Pv(|-li#!H|2@3 zTKJ&!U|hg3{{SpVMiz8Q-$IXOw4Pa(ISuDFGp}t0KYxLz1N!;isUmb5@1X4s@wXal zw{888Slf+vuk8)7`i*s`ZEeT0yV(Hpbe62jac{k{x(B8!ED8Kc-&mc(f57St_w_Ca zeFRX_%hJ^{pKI)0{Si{#S#-;9iXxu~y@%|_2>S?65DpMNK{!PC6rl8Mq2uealjM=L zQt8iu95Vd{+UTu*3bKZ;km)3a{v*-?mzr+@2<uXK*EslJtp|Q@22B&JLk)dAE-IQy zI4)hzp~dDo&U>8yHjnb!Qni_WhB@@ty&cOu=lmhVA=O`kU1OrvF@y^mt~!8#_6{p% z80c?6FN5l%kCoDWP{V_bdYsHvY|}zTdD(rKYrJ_&|EDUmD$v8O9~38eQRn_0UL*#0 J51=+Z=U=6ObX@=d literal 0 HcmV?d00001 -- GitLab