From 3223379d2c73c33a24750ec6a0d856de820f2740 Mon Sep 17 00:00:00 2001 From: Yiheng Wang Date: Fri, 26 Nov 2021 17:01:20 +0800 Subject: [PATCH 1/4] update nvidia flare 2.0 example Signed-off-by: Yiheng Wang --- federated_learning/nvflare/1-Server.ipynb | 192 ++++++++ federated_learning/nvflare/2-Client.ipynb | 265 +++++++++++ federated_learning/nvflare/3-Admin.ipynb | 380 +++++++++++++++ federated_learning/nvflare/README.md | 56 ++- .../hello_monai/config/config_fed_client.json | 20 + .../hello_monai/config/config_fed_server.json | 64 +++ .../config/config_train.json | 3 +- .../config/dataset_part1.json | 0 .../config/dataset_part2.json | 0 .../hello_monai/custom/monai_trainer.py | 258 ++++++++++ .../custom/train_configer.py | 96 ++-- .../nvflare/nvflare_example/.gitignore | 8 - .../nvflare/nvflare_example/README.md | 186 -------- .../fl_utils/fl_run/clean_up.sh | 19 - .../fl_utils/fl_run/deploy_train_configs.sh | 18 - .../fl_utils/fl_run/start_fl.sh | 26 -- .../fl_utils/fl_run_auto/api_utils.py | 55 --- .../fl_utils/fl_run_auto/run_fl.py | 134 ------ .../fl_utils/fl_run_auto/run_fl.sh | 20 - .../fl_utils/workspace_gen/authz_config.json | 105 ----- .../fl_utils/workspace_gen/project.yml | 58 --- .../fl_workspace_pregenerated.zip | Bin 151002 -> 0 bytes .../config/config_fed_client.json | 17 - .../config/config_fed_server.json | 61 --- .../spleen_example/config/config_train_1.json | 11 - .../spleen_example/config/config_train_2.json | 11 - .../spleen_example/config/config_train_3.json | 11 - .../spleen_example/config/config_train_4.json | 11 - .../spleen_example/config/config_train_5.json | 11 - .../spleen_example/config/config_train_6.json | 11 - .../spleen_example/config/config_train_7.json | 11 - .../spleen_example/config/config_train_8.json | 11 - .../spleen_example/custom/monai_trainer.py | 183 -------- .../spleen_example/custom/utils.py | 187 -------- .../spleen_example/data/dataset_1.json | 46 -- .../spleen_example/data/dataset_2.json | 46 -- .../spleen_example/data/dataset_3.json | 46 -- .../spleen_example/data/dataset_4.json | 46 -- .../spleen_example/data/dataset_5.json | 46 -- .../spleen_example/data/dataset_6.json | 46 -- .../spleen_example/data/dataset_7.json | 46 -- .../spleen_example/data/dataset_8.json | 46 -- .../spleen_example/data/download_dataset.py | 29 -- .../spleen_example/data/download_dataset.sh | 6 - .../spleen_example/resources/log.config | 27 -- .../nvflare/nvflare_example/tensorboard.png | Bin 98125 -> 0 bytes .../virtualenv/requirements.txt | 6 - .../nvflare_example/virtualenv/set_env.sh | 7 - .../nvflare/nvflare_example_docker/.gitignore | 12 - .../nvflare_example_docker/1-Startup.ipynb | 217 --------- .../nvflare_example_docker/2-Server.ipynb | 241 ---------- .../nvflare_example_docker/3-Client.ipynb | 417 ----------------- .../nvflare_example_docker/4-Admin.ipynb | 439 ------------------ .../nvflare/nvflare_example_docker/README.md | 53 --- .../build_docker_provision.sh | 26 -- .../demo_figs/enter_client_success.png | Bin 126879 -> 0 bytes .../demo_figs/enter_server_success.png | Bin 100914 -> 0 bytes .../demo_figs/successful_regist_clients.png | Bin 39925 -> 0 bytes .../docker_files/Dockerfile | 9 - .../expr_files/download_dataset.py | 29 -- .../expr_files/prepare_expr_files.sh | 17 - .../expr_files/project.yml | 141 ------ .../config/config_fed_client.json | 17 - .../config/config_fed_server.json | 53 --- .../spleen_example/custom/monai_trainer.py | 183 -------- .../spleen_example/custom/train_configer.py | 301 ------------ .../spleen_example/custom/utils.py | 187 -------- .../spleen_example/resources/log.config | 27 -- federated_learning/nvflare/requirements.txt | 10 + 69 files changed, 1294 insertions(+), 4027 deletions(-) create mode 100644 federated_learning/nvflare/1-Server.ipynb create mode 100644 federated_learning/nvflare/2-Client.ipynb create mode 100644 federated_learning/nvflare/3-Admin.ipynb create mode 100644 federated_learning/nvflare/hello_monai/config/config_fed_client.json create mode 100644 federated_learning/nvflare/hello_monai/config/config_fed_server.json rename federated_learning/nvflare/{nvflare_example_docker/spleen_example => hello_monai}/config/config_train.json (61%) rename federated_learning/nvflare/{nvflare_example_docker/spleen_example => hello_monai}/config/dataset_part1.json (100%) rename federated_learning/nvflare/{nvflare_example_docker/spleen_example => hello_monai}/config/dataset_part2.json (100%) create mode 100644 federated_learning/nvflare/hello_monai/custom/monai_trainer.py rename federated_learning/nvflare/{nvflare_example/spleen_example => hello_monai}/custom/train_configer.py (77%) delete mode 100644 federated_learning/nvflare/nvflare_example/.gitignore delete mode 100644 federated_learning/nvflare/nvflare_example/README.md delete mode 100755 federated_learning/nvflare/nvflare_example/fl_utils/fl_run/clean_up.sh delete mode 100755 federated_learning/nvflare/nvflare_example/fl_utils/fl_run/deploy_train_configs.sh delete mode 100755 federated_learning/nvflare/nvflare_example/fl_utils/fl_run/start_fl.sh delete mode 100644 federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/api_utils.py delete mode 100755 federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.py delete mode 100755 federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.sh delete mode 100644 federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/authz_config.json delete mode 100644 federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/project.yml delete mode 100644 federated_learning/nvflare/nvflare_example/fl_workspace_pregenerated.zip delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_fed_client.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_fed_server.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_1.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_2.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_3.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_4.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_5.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_6.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_7.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/config/config_train_8.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/custom/monai_trainer.py delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/custom/utils.py delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_1.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_2.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_3.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_4.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_5.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_6.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_7.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_8.json delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.py delete mode 100755 federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.sh delete mode 100644 federated_learning/nvflare/nvflare_example/spleen_example/resources/log.config delete mode 100644 federated_learning/nvflare/nvflare_example/tensorboard.png delete mode 100644 federated_learning/nvflare/nvflare_example/virtualenv/requirements.txt delete mode 100755 federated_learning/nvflare/nvflare_example/virtualenv/set_env.sh delete mode 100644 federated_learning/nvflare/nvflare_example_docker/.gitignore delete mode 100644 federated_learning/nvflare/nvflare_example_docker/1-Startup.ipynb delete mode 100644 federated_learning/nvflare/nvflare_example_docker/2-Server.ipynb delete mode 100644 federated_learning/nvflare/nvflare_example_docker/3-Client.ipynb delete mode 100644 federated_learning/nvflare/nvflare_example_docker/4-Admin.ipynb delete mode 100644 federated_learning/nvflare/nvflare_example_docker/README.md delete mode 100644 federated_learning/nvflare/nvflare_example_docker/build_docker_provision.sh delete mode 100644 federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_client_success.png delete mode 100644 federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_server_success.png delete mode 100644 federated_learning/nvflare/nvflare_example_docker/demo_figs/successful_regist_clients.png delete mode 100644 federated_learning/nvflare/nvflare_example_docker/docker_files/Dockerfile delete mode 100644 federated_learning/nvflare/nvflare_example_docker/expr_files/download_dataset.py delete mode 100644 federated_learning/nvflare/nvflare_example_docker/expr_files/prepare_expr_files.sh delete mode 100644 federated_learning/nvflare/nvflare_example_docker/expr_files/project.yml delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_client.json delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_server.json delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/monai_trainer.py delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/train_configer.py delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/utils.py delete mode 100644 federated_learning/nvflare/nvflare_example_docker/spleen_example/resources/log.config create mode 100644 federated_learning/nvflare/requirements.txt diff --git a/federated_learning/nvflare/1-Server.ipynb b/federated_learning/nvflare/1-Server.ipynb new file mode 100644 index 0000000000..b280e88972 --- /dev/null +++ b/federated_learning/nvflare/1-Server.ipynb @@ -0,0 +1,192 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "# FL Server Joining FL experiment\n", + "\n", + "The purpose of this notebook is to show how to start a server to participate in an FL experiment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from IPython.display import HTML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check Working Folder\n", + "\n", + "Before starting, let's check if the necessary folder is created:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a working folder for the server exists!!!\n" + ] + } + ], + "source": [ + "server_startup_path = \"poc/server/startup\"\n", + "\n", + "if os.path.exists(server_startup_path):\n", + " print(\"a working folder for the server exists!!!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, let's check the catalogue:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['log.config', 'fed_server.json', 'sub_start.sh', 'start.sh', 'stop_fl.sh']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(server_startup_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, a script named `start.sh` is in the path, to start a server, we only need to run this script." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Start Server" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please open a new terminal (please run the following cell and click the link):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " Open a new terminal" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can click the following link, or manually open a new terminal.\n", + "HTML(' Open a new terminal')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the terminal, please run the following command:\n", + "```\n", + "source nvflare-env/bin/activate\n", + "bash poc/server/startup/start.sh\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### (Optional) Close Server\n", + "\n", + "Except using admin, you can close the started server directly via run the following command:\n", + "\n", + "```\n", + "bash poc/server/startup/stop_fl.sh\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You have now started the server container.\n", + "In the next notebook, [Client Startup Notebook](2-Client.ipynb), you'll start two clients participating in the FL experiment." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.10" + }, + "stem_cell": { + "cell_type": "raw", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": "" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/federated_learning/nvflare/2-Client.ipynb b/federated_learning/nvflare/2-Client.ipynb new file mode 100644 index 0000000000..a5813c7682 --- /dev/null +++ b/federated_learning/nvflare/2-Client.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "# FL client Joining FL experiment \n", + "\n", + "The purpose of this notebook is to show how to start clients to participate in an FL experiment." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "## Prerequisites\n", + "- A server has been started." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from IPython.display import HTML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check Working Folder\n", + "\n", + "Before starting, let's check if the necessary folder is created:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a working folder for the client1 exists!!!\n", + "a working folder for the client2 exists!!!\n" + ] + } + ], + "source": [ + "client1_name = \"site-1\"\n", + "client2_name = \"site-2\"\n", + "\n", + "client1_startup_path = \"poc/{}/startup\".format(client1_name)\n", + "client2_startup_path = \"poc/{}/startup\".format(client2_name)\n", + "\n", + "if os.path.exists(client1_startup_path):\n", + " print(\"a working folder for the client1 exists!!!\")\n", + "if os.path.exists(client2_startup_path):\n", + " print(\"a working folder for the client2 exists!!!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, let's check the catalogue:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['log.config', 'fed_client.json', 'sub_start.sh', 'start.sh', 'stop_fl.sh']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(client1_startup_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['log.config', 'fed_client.json', 'sub_start.sh', 'start.sh', 'stop_fl.sh']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(client2_startup_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, a script named `start.sh` is in the path, to start a client, we only need to run this script." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### (Optional) Assign GPU" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you'd like to assigin GPU(s) for a client, please modify the script first. You may need to uncomment and edit the following line:\n", + "\n", + "`# export CUDA_VISIBLE_DEVICES=`\n", + "\n", + "[Please click here to edit for client 1](poc/site-1/startup/start.sh)\n", + "\n", + "[Please click here to edit for client 2](poc/site-2/startup/start.sh)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Start Clients" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please open a new terminal (please run the following cell and click the link):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " Open a new terminal" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can click the following link, or manually open a new terminal.\n", + "HTML(' Open a new terminal')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the terminal, please run the following command to start client `site-1` and `site-2` (two terminals are needed):" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + "source nvflare-env/bin/activate\n", + "bash poc/site-1/startup/start.sh localhost site-1\n", + "```\n", + "and\n", + "```\n", + "source nvflare-env/bin/activate\n", + "bash poc/site-2/startup/start.sh localhost site-2\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### (Optional) Close Client\n", + "\n", + "Except using admin, you can close the started client(s) directly via run the following command:\n", + "\n", + "```\n", + "bash poc/site-1/startup/stop_fl.sh\n", + "bash poc/site-2/startup/stop_fl.sh\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You have now started two client containers.\n", + "In the next notebook, [Admin Startup Notebook](3-Admin.ipynb), you'll start an admin participating in the FL experiment." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.10" + }, + "stem_cell": { + "cell_type": "raw", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": "" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/federated_learning/nvflare/3-Admin.ipynb b/federated_learning/nvflare/3-Admin.ipynb new file mode 100644 index 0000000000..bd8d16244c --- /dev/null +++ b/federated_learning/nvflare/3-Admin.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "# Admin Startup\n", + "\n", + "The purpose of this notebook is to show how to start an admin to operate an FL experiment with a server and at least one client started." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "## Prerequisites\n", + "- A server and at least one client has been started." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from IPython.display import HTML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check Working Folder\n", + "\n", + "Before starting, let's check if the necessary folders are created. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a working folder for the admin exists!!!\n" + ] + } + ], + "source": [ + "admin_path = \"poc/admin/startup/\"\n", + "\n", + "if os.path.exists(admin_path):\n", + " print(\"a working folder for the admin exists!!!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also need to put necessary files (`hello-monai` for example) into admin's `transfer` folder (create first):" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p poc/admin/transfer\n", + "!cp -r hello_monai/ poc/admin/transfer/" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['hello_monai']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(\"poc/admin/transfer/\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['fl_admin.sh']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir(admin_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, `hello-monai` is in `poc/admin/transfer`, and a script named `fl_admin.sh` is in `poc/admin/startup`, to start an admin, we only need to run this script." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Start Admin" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please open a new terminal (please run the following cell and click the link):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " Open a new terminal" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "HTML(' Open a new terminal')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the terminal, please run the following command:\n", + "\n", + "```\n", + "source nvflare-env/bin/activate\n", + "bash poc/admin/startup/fl_admin.sh localhost\n", + "```\n", + "Then ,log in by entering `admin` for both the username and password.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare for the experiment\n", + "\n", + "You need to execute the following steps to prepare for the experiment:\n", + "\n", + "- upload pipeline config folder\n", + "- set FL training number\n", + "- deploy the folder to client(s) and server\n", + "\n", + "The commands can be:\n", + "```\n", + "upload_app hello_monai\n", + "set_run_number 1\n", + "deploy_app hello_monai server\n", + "deploy_app hello_monai client\n", + "```\n", + "\n", + "Now, let's check if the folder has been distributed into the server and all client(s):" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "config files on server: ['app_server', 'fl_app.txt']\n", + " \n", + "config files on site-1: ['app_site-1', 'fl_app.txt']\n", + " \n", + "config files on site-2: ['fl_app.txt', 'app_site-2']\n", + " \n" + ] + } + ], + "source": [ + "run_file = \"run_1\"\n", + "\n", + "poc_path = \"poc/\"\n", + "\n", + "for name in [\"server\", \"site-1\", \"site-2\"]:\n", + " path = os.path.join(poc_path, name, run_file)\n", + " if os.path.exists(path):\n", + " print(\"config files on {}: {}\".\n", + " format(name, os.listdir(path)))\n", + " print(\" \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This example prepares two different data list files: `dataset_part1.json` and `dataset_part2.json`, and they have the same validation set and totally different training set. The default file used in `config_train.json` is `config/dataset_part1.json`. Therefore, if you want to let two clients train on different data, you can switch to use `dataset_part2.json` for `org1-b`.\n", + "\n", + "[Link to site-1 config](poc/site-1/run_1/app_site-1/config/config_train.json)\n", + "\n", + "[Link to site-2 config](poc/site-2/run_1/app_site-2/config/config_train.json)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tips for Multiple Runs\n", + "\n", + "After starting a client (for example `site-1`), the Spleen dataset will be downloaded into:\n", + "`run_1/app_site-1/Task09_Spleen.tar`.\n", + "\n", + "To prevent repeatedly downloading the dataset, you can copy the uncompressed `Task09_Spleen` into the corresponding place after running the `deploy_app` command.\n", + "For example:\n", + "\n", + "```\n", + "cp -r /path-to-dataset/Task09_Spleen poc/site-1/run_2/app_site-1/\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Start Training" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, you can start training with:\n", + "```\n", + "start_app all\n", + "```\n", + "or can also start server and clients separately:\n", + "```\n", + "start_app server\n", + "```\n", + "\n", + "```\n", + "start_app client site-1\n", + "```\n", + "\n", + "You can check the status by running:\n", + "```\n", + "check_status server\n", + "check_status client\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Abort Training\n", + "\n", + "You can abort training for the server and/or client(s) by running:\n", + "```\n", + "abort client\n", + "abort server\n", + "```\n", + "If you only want to abort client `site-2`, you can use:\n", + "```\n", + "abort client site-2\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Shutdown\n", + "\n", + "You can close the server or client(s) by running:\n", + "\n", + "`shutdown client` or `shutdown server`\n", + "\n", + "or type `shutdown all` to close them all.\n", + "\n", + "If you only want to close one client, you can specify the client in the command like follows:\n", + "```\n", + "shutdown client site-1\n", + "```\n", + "\n", + "This command will kill the client/server connection, and this command will need input of the admin name for confirmation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Other Commands\n", + "\n", + "Please type `?` to learn more about all commands, or you can refer to [the official guide](https://nvidia.github.io/NVFlare/user_guide/admin_commands.html) for more details." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Next Steps\n", + "\n", + "You have now started the admin client and learnt the commands to control your FL experiment. You're now ready to create your own FL experiment!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.10" + }, + "stem_cell": { + "cell_type": "raw", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": "" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/federated_learning/nvflare/README.md b/federated_learning/nvflare/README.md index d8fbfe869c..0abd4ba53a 100644 --- a/federated_learning/nvflare/README.md +++ b/federated_learning/nvflare/README.md @@ -1,7 +1,55 @@ -**Federated learning with [NVFlare](./federated_learning/nvflare)** +# Federated learning with [NVIDIA FLARE](./federated_learning/nvflare)** -The examples here show how to train federated learning models with [NVFlare](https://pypi.org/project/nvflare/) and MONAI-based trainers. +## Brief Introduction -1. [nvflare_example](./nvflare_example/README.md) shows how to run NVFlare with MONAI on a local machine to simulate an FL setting (server and client communicate over localhost). It also shows how to run a simulated FL experiment completely automated using the admin API. To streamline the experimentation, we have already prepared startup kits for up to 8 clients in this tutorial. +This repository contains an end-to-end Federated training example based on MONAI trainers and [NVIDIA FLARE](https://github.com/nvidia/nvflare). + +This example requires Python 3.8.10 + +Inside this folder: +- All Jupiter notebooks are used to build an FL experiment step-by-step. +- `hello-monai` is a folder containing all required config files for the experiment (in `config/`) and the customized trainer (in `custom`) and its components. + +## Installation + +The following installation steps refer to the official installation guide of NVIDIA FLARE, [please check that guide for more details](https://nvidia.github.io/NVFlare/installation.html) + +### Virtual Environment + +It is recommended to create a virtual engironment via `venv` to install all packages: + +``` +python3 -m venv nvflare-env +source nvflare-env/bin/activate +``` +### Libraries + +Please run: +``` +pip install -U -r requirements.txt +``` + +### Prepare Startup Kit + +NVIDIA FLARE provides the Open Provision API to build the startup kit flexibly, the corresponding guide is in [here](https://nvidia.github.io/NVFlare/user_guide/provisioning_tool.html). + +In this example, we simply use the `poc` command to create one startup kit, this way is also used in [an official example of NVIDIA FLARE](https://nvidia.github.io/NVFlare/examples/hello_cross_val.html?highlight=poc). + +Please run: +``` +poc -n 2 +``` +and type `y`, then a working folder named `poc` will be created (the related readme file is in `poc/Readme.rst`), the folder works for one server, two clients and one admin. + +## Build Experiment + +The following step-by-step process will be shown in Jupyter Notebooks, please run: + +`jupyter lab --ip 0.0.0.0 --port 8888 --allow-root --no-browser --NotebookApp.token=MONAIFLExample` + +and enter the following link: + +`http://localhost:8888/?token=MONAIFLExample` + +Then run `1-Server.ipynb`. You should follow the steps in the notebook, which will guide you through the process of building an FL experiment based on 2 clients and 1 server. -2. [nvflare_example_docker](./nvflare_example_docker/README.md) provides further details on running FL with MONAI and NVFlare using docker containers for the server and each client for easier real-world deployment. diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_client.json b/federated_learning/nvflare/hello_monai/config/config_fed_client.json new file mode 100644 index 0000000000..98bb905fbc --- /dev/null +++ b/federated_learning/nvflare/hello_monai/config/config_fed_client.json @@ -0,0 +1,20 @@ +{ + "format_version": 2, + "executors": [ + { + "tasks": ["train"], + "executor": { + "path": "monai_trainer.MONAITrainer", + "args": { + "aggregation_epochs": 10 + } + } + } + ], + "task_result_filters": [ + ], + "task_data_filters": [ + ], + "components": [ + ] +} diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_server.json b/federated_learning/nvflare/hello_monai/config/config_fed_server.json new file mode 100644 index 0000000000..94cf06090c --- /dev/null +++ b/federated_learning/nvflare/hello_monai/config/config_fed_server.json @@ -0,0 +1,64 @@ +{ + "format_version": 2, + + "server": { + "heart_beat_timeout": 600 + }, + "task_data_filters": [], + "task_result_filters": [], + "components": [ + { + "id": "persistor", + "name": "PTFileModelPersistor", + "args": { + "model": { + "path": "monai.networks.nets.unet.UNet", + "args": { + "dimensions": 3, + "in_channels": 1, + "out_channels": 2, + "channels": [16, 32, 64, 128, 256], + "strides": [2, 2, 2, 2], + "num_res_units": 2, + "norm": "batch" + } + } + } + }, + { + "id": "shareable_generator", + "name": "FullModelShareableGenerator", + "args": {} + }, + { + "id": "aggregator", + "name": "AccumulateWeightedAggregator", + "args": { + "aggregation_weights": { + "org1-a": 1.0, + "org1-b": 0.5 + }, + "expected_data_kind": "WEIGHTS" + } + } + ], + "workflows": [ + { + "id": "scatter_and_gather", + "path": "nvflare.app_common.workflows.scatter_and_gather.ScatterAndGather", + "args": { + "min_clients" : 1, + "num_rounds" : 100, + "start_round": 0, + "wait_time_after_min_received": 10, + "aggregator_id": "aggregator", + "persistor_id": "persistor", + "shareable_generator_id": "shareable_generator", + "train_task_name": "train", + "train_timeout": 0, + "ignore_result_error": true + } + } + ] +} + diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_train.json b/federated_learning/nvflare/hello_monai/config/config_train.json similarity index 61% rename from federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_train.json rename to federated_learning/nvflare/hello_monai/config/config_train.json index 7fd42b425f..73da66da19 100644 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_train.json +++ b/federated_learning/nvflare/hello_monai/config/config_train.json @@ -5,7 +5,6 @@ "use_gpu": true, "multi_gpu": false, "val_interval": 5, - "data_list_base_dir": "/data/Task09_Spleen/", - "data_list_json_file": "dataset_part1.json", + "data_list_json_file": "config/dataset_part1.json", "ckpt_dir": "models" } diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/dataset_part1.json b/federated_learning/nvflare/hello_monai/config/dataset_part1.json similarity index 100% rename from federated_learning/nvflare/nvflare_example_docker/spleen_example/config/dataset_part1.json rename to federated_learning/nvflare/hello_monai/config/dataset_part1.json diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/dataset_part2.json b/federated_learning/nvflare/hello_monai/config/dataset_part2.json similarity index 100% rename from federated_learning/nvflare/nvflare_example_docker/spleen_example/config/dataset_part2.json rename to federated_learning/nvflare/hello_monai/config/dataset_part2.json diff --git a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py new file mode 100644 index 0000000000..39923cd695 --- /dev/null +++ b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py @@ -0,0 +1,258 @@ +# Copyright 2020 MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from typing import Dict + +import numpy as np +import torch +from nvflare.apis.dxo import DXO, DataKind, from_shareable, MetaKey +from nvflare.apis.event_type import EventType +from nvflare.apis.executor import Executor +from nvflare.apis.fl_constant import FLContextKey, ReturnCode +from nvflare.apis.fl_context import FLContext +from nvflare.apis.shareable import Shareable +from nvflare.apis.signal import Signal +from nvflare.app_common.app_constant import AppConstants + +from train_configer import TrainConfiger + + +class MONAITrainer(Executor): + """ + This class implements a MONAI based trainer that can be used for Federated Learning with NVFLARE. + + Args: + aggregation_epochs: the number of training epochs for a round. Defaults to 1. + + """ + + def __init__(self, + aggregation_epochs: int = 1, + train_task_name = AppConstants.TASK_TRAIN, + ): + super().__init__() + """ + Trainer init happens at the very beginning, only the basic info regarding the trainer is set here, + and the actual run has not started at this point. + """ + self.aggregation_epochs = aggregation_epochs + self._train_task_name = train_task_name + + def _initialize_trainer(self, fl_ctx: FLContext): + """ + The trainer's initialization function. At the beginning of a FL experiment, + the train and evaluate engines, as well as train context and FL context + should be initialized. + """ + # Initialize train and evaluation engines. + app_root = fl_ctx.get_prop(FLContextKey.APP_ROOT) + fl_args = fl_ctx.get_prop(FLContextKey.ARGS) + num_gpus = fl_ctx.get_prop(AppConstants.NUMBER_OF_GPUS, 1) + self.multi_gpu = num_gpus > 1 + self.client_name = fl_ctx.get_identity_name() + self.log_info( + fl_ctx, + f"Client {self.client_name} initialized at \n {app_root} \n with args: {fl_args}", + ) + conf = TrainConfiger( + app_root=app_root, + wf_config_file_name=fl_args.train_config, + local_rank=fl_args.local_rank, + ) + conf.configure() + + # train_engine, and eval_engine are MONAI engines that will be used for training and validation. + # The corresponding training/validation settings, such as transforms, network and dataset + # are contained in `TrainConfiger`. + # The engine will be started when `.run()` is called, and when `.terminate()` is called, + # it will be completely terminated after the current iteration is finished. + self.train_engine = conf.train_engine + self.eval_engine = conf.eval_engine + + + def assign_current_model(self, model_weights: Dict[str, np.ndarray]): + """ + This function is used to load provided weights for the network. + Before loading weights, tensors might need to be reshaped to support HE for secure aggregation. + More info of HE: + https://github.com/NVIDIA/clara-train-examples/blob/master/PyTorch/NoteBooks/FL/Homomorphic_Encryption.ipynb + + """ + net = self.train_engine.network + # if self.multi_gpu: + # net = net.module + + local_var_dict = net.state_dict() + model_keys = model_weights.keys() + for var_name in local_var_dict: + if var_name in model_keys: + weights = model_weights[var_name] + try: + local_var_dict[var_name] = torch.as_tensor( + np.reshape(weights, local_var_dict[var_name].shape) + ) + except Exception as e: + raise ValueError( + "Convert weight from {} failed with error: {}".format( + var_name, str(e) + ) + ) + + net.load_state_dict(local_var_dict) + + def extract_model(self) -> Dict[str, np.ndarray]: + """ + This function is used to extract weights of the network. + The extracted weights will be converted into a numpy array based dict. + """ + net = self.train_engine.network + # if self.multi_gpu: + # net = net.module + local_state_dict = net.state_dict() + local_model_dict = {} + for var_name in local_state_dict: + try: + local_model_dict[var_name] = local_state_dict[var_name].cpu().numpy() + except Exception as e: + raise ValueError( + "Convert weight from {} failed with error: {}".format( + var_name, str(e) + ) + ) + + return local_model_dict + + def generate_shareable(self): + """ + This function is used to generate a DXO instance. + The instance can contain not only model weights, but also + some additional information that clients want to share. + """ + # update meta, NUM_STEPS_CURRENT_ROUND is needed for aggregation. + if self.achieved_meta is None: + meta = { + MetaKey.NUM_STEPS_CURRENT_ROUND: self.current_iters + } + else: + meta = self.achieved_meta + meta[MetaKey.NUM_STEPS_CURRENT_ROUND] = self.current_iters + return DXO( + data_kind=DataKind.WEIGHTS, + data=self.extract_model(), + meta=meta, + ).to_shareable() + + def handle_event(self, event_type: str, fl_ctx: FLContext): + """ + This function is an extended function from the super class. + It is used to handle two events: + + 1) `START_RUN`. At the start point of a FL experiment, + necessary components should be initialized. + 2) `ABORT_TASK`, when this event is fired, the running engines + should be terminated (this example uses MONAI engines to do train + and validation, and the engines can be terminated from another thread. + If the solution does not provide any way to interrupt/end the execution, + handle this event is not feasible). + + + Args: + event_type: the type of event that will be fired. In MONAITrainer, + only `START_RUN` and `END_RUN` need to be handled. + fl_ctx: an `FLContext` object. + + """ + if event_type == EventType.START_RUN: + self._initialize_trainer(fl_ctx) + elif event_type == EventType.ABORT_TASK: + # This event is fired to abort the current execution task. We are using the ignite engine to run the task. + # Unfortunately the ignite engine does not support the abort of task right now. We have to wait until + # the current task finishes. + pass + elif event_type == EventType.END_RUN: + self.eval_engine.terminate() + self.train_engine.terminate() + + def _abort_execution(self) -> Shareable: + shareable = Shareable() + shareable.set_return_code(ReturnCode.EXECUTION_EXCEPTION) + return shareable + + def execute( + self, task_name: str, shareable: Shareable, fl_ctx: FLContext, abort_signal: Signal + ) -> Shareable: + """ + This function is an extended function from the super class. + As a supervised learning based trainer, the execute function will run + evaluate and train engines based on model weights from `shareable`. + After fininshing training, a new `Shareable` object will be submitted + to server for aggregation. + + Args: + task_name: decide which task will be executed. + shareable: the `Shareable` object acheived from server. + fl_ctx: the `FLContext` object achieved from server. + abort_signal: if triggered, the training will be aborted. In order to interrupt the training/validation + state, a separate is used to check the signal information every few seconds. The implementation is + shown in the `handle_event` function. + Returns: + a new `Shareable` object to be submitted to server for aggregation. + """ + if task_name == self._train_task_name: + # convert shareable into DXO instance + dxo = from_shareable(shareable) + # check if dxo is valid. + if not isinstance(dxo, DXO): + self.log_exception(fl_ctx, f"dxo excepted type DXO. Got {type(dxo)} instead.") + shareable.set_return_code(ReturnCode.EXECUTION_EXCEPTION) + return shareable + + # ensure data kind is weights. + if not dxo.data_kind == DataKind.WEIGHTS: + self.log_exception(fl_ctx, f"data_kind expected WEIGHTS but got {dxo.data_kind} instead.") + shareable.set_return_code(ReturnCode.EXECUTION_EXCEPTION) + return shareable + + # load weights from dxo + self.assign_current_model(dxo.data) + # collect meta from dxo + self.achieved_meta = dxo.meta + + # set engine state max epochs. + self.train_engine.state.max_epochs = ( + self.train_engine.state.epoch + self.aggregation_epochs + ) + # get current iteration when a round starts + iter_of_start_time = self.train_engine.state.iteration + + # execute validation at the beginning of every round + self.eval_engine.run(self.train_engine.state.epoch + 1) + + # check abort signal after validation + if abort_signal.triggered: + return self._abort_execution() + + self.train_engine.run() + + # check abort signal after train + if abort_signal.triggered: + return self._abort_execution() + + # calculate current iteration and epoch data after training. + self.current_iters = self.train_engine.state.iteration - iter_of_start_time + # create a new `Shareable` object + return self.generate_shareable() + else: + # If unknown task name, set ReturnCode accordingly. + shareable = Shareable() + shareable.set_return_code(ReturnCode.TASK_UNKNOWN) + return shareable diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/custom/train_configer.py b/federated_learning/nvflare/hello_monai/custom/train_configer.py similarity index 77% rename from federated_learning/nvflare/nvflare_example/spleen_example/custom/train_configer.py rename to federated_learning/nvflare/hello_monai/custom/train_configer.py index 1a50ec9af6..1ef5767b38 100644 --- a/federated_learning/nvflare/nvflare_example/spleen_example/custom/train_configer.py +++ b/federated_learning/nvflare/hello_monai/custom/train_configer.py @@ -15,12 +15,8 @@ import torch import torch.distributed as dist -from monai.data import ( - CacheDataset, - DataLoader, - load_decathlon_datalist, - partition_dataset, -) +from monai.apps.utils import download_and_extract +from monai.data import CacheDataset, DataLoader, load_decathlon_datalist from monai.engines import SupervisedEvaluator, SupervisedTrainer from monai.handlers import ( CheckpointSaver, @@ -29,6 +25,7 @@ StatsHandler, TensorBoardStatsHandler, ValidationHandler, + from_engine, ) from monai.inferers import SimpleInferer, SlidingWindowInferer from monai.losses import DiceLoss @@ -47,8 +44,6 @@ Spacingd, ToTensord, ) -from torch.nn.parallel import DistributedDataParallel -from monai.handlers import from_engine class TrainConfiger: @@ -58,17 +53,18 @@ class TrainConfiger: Please check the implementation of `SupervisedEvaluator` and `SupervisedTrainer` from `monai.engines` and determine which components can be used. Args: - config_root: root folder path of config files. + app_root: root folder path of config files. wf_config_file_name: json file name of the workflow config file. """ def __init__( self, - config_root: str, + app_root: str, wf_config_file_name: str, local_rank: int = 0, + dataset_folder_name: str = "Task09_Spleen", ): - with open(os.path.join(config_root, wf_config_file_name)) as file: + with open(os.path.join(app_root, wf_config_file_name)) as file: wf_config = json.load(file) self.wf_config = wf_config @@ -76,7 +72,8 @@ def __init__( config Args: max_epochs: the total epoch number for trainer to run. learning_rate: the learning rate for optimizer. - data_list_base_dir: the directory containing the data list json file. + dataset_dir: the directory containing the dataset. if `dataset_folder_name` does not + exist in the directory, it will be downloaded first. data_list_json_file: the data list json file. val_interval: the interval (number of epochs) to do validation. ckpt_dir: the directory to save the checkpoint. @@ -86,7 +83,6 @@ def __init__( """ self.max_epochs = wf_config["max_epochs"] self.learning_rate = wf_config["learning_rate"] - self.data_list_base_dir = wf_config["data_list_base_dir"] self.data_list_json_file = wf_config["data_list_json_file"] self.val_interval = wf_config["val_interval"] self.ckpt_dir = wf_config["ckpt_dir"] @@ -94,17 +90,29 @@ def __init__( self.use_gpu = wf_config["use_gpu"] self.multi_gpu = wf_config["multi_gpu"] self.local_rank = local_rank + self.app_root = app_root + self.dataset_folder_name = dataset_folder_name + if not os.path.exists(os.path.join(app_root, self.dataset_folder_name)): + self.download_spleen_dataset() def set_device(self): - if self.multi_gpu: - # initialize distributed training - dist.init_process_group(backend="nccl", init_method="env://") - device = torch.device(f"cuda:{self.local_rank}") - torch.cuda.set_device(device) - else: - device = torch.device("cuda" if self.use_gpu else "cpu") + # if self.multi_gpu: + # # initialize distributed training + # dist.init_process_group(backend="nccl", init_method="env://") + # device = torch.device(f"cuda:{self.local_rank}") + # torch.cuda.set_device(device) + # else: + device = torch.device("cuda" if self.use_gpu else "cpu") self.device = device + def download_spleen_dataset(self): + url = "https://msd-for-monai.s3-us-west-2.amazonaws.com/Task09_Spleen.tar" + name = os.path.join(self.app_root, self.dataset_folder_name) + tarfile_name = f"{name}.tar" + download_and_extract( + url=url, filepath=tarfile_name, output_dir=self.app_root + ) + def configure(self): self.set_device() network = UNet( @@ -116,12 +124,12 @@ def configure(self): num_res_units=2, norm=Norm.BATCH, ).to(self.device) - if self.multi_gpu: - network = DistributedDataParallel( - module=network, - device_ids=[self.device], - find_unused_parameters=False, - ) + # if self.multi_gpu: + # network = DistributedDataParallel( + # module=network, + # device_ids=[self.device], + # find_unused_parameters=False, + # ) train_transforms = Compose( [ @@ -157,24 +165,24 @@ def configure(self): ) # set datalist train_datalist = load_decathlon_datalist( - os.path.join(self.data_list_base_dir, self.data_list_json_file), + os.path.join(self.app_root, self.data_list_json_file), is_segmentation=True, data_list_key="training", - base_dir=self.data_list_base_dir, + base_dir=os.path.join(self.app_root, self.dataset_folder_name), ) val_datalist = load_decathlon_datalist( - os.path.join(self.data_list_base_dir, self.data_list_json_file), + os.path.join(self.app_root, self.data_list_json_file), is_segmentation=True, data_list_key="validation", - base_dir=self.data_list_base_dir, + base_dir=os.path.join(self.app_root, self.dataset_folder_name), ) - if self.multi_gpu: - train_datalist = partition_dataset( - data=train_datalist, - shuffle=True, - num_partitions=dist.get_world_size(), - even_divisible=True, - )[dist.get_rank()] + # if self.multi_gpu: + # train_datalist = partition_dataset( + # data=train_datalist, + # shuffle=True, + # num_partitions=dist.get_world_size(), + # even_divisible=True, + # )[dist.get_rank()] train_ds = CacheDataset( data=train_datalist, transform=train_transforms, @@ -225,8 +233,7 @@ def configure(self): AsDiscreted( keys=["pred", "label"], argmax=[True, False], - to_onehot=True, - num_classes=2, + to_onehot=2, ), ] ) @@ -235,7 +242,6 @@ def configure(self): "val_mean_dice": MeanDice( include_background=False, output_transform=from_engine(["pred", "label"]), - #device=self.device, ) } val_handlers = [ @@ -274,7 +280,9 @@ def configure(self): ValidationHandler( validator=self.eval_engine, interval=self.val_interval, epoch_level=True ), - StatsHandler(tag_name="train_loss", output_transform=from_engine("loss", first=True)), + StatsHandler( + tag_name="train_loss", output_transform=from_engine("loss", first=True) + ), TensorBoardStatsHandler( log_dir=self.ckpt_dir, tag_name="train_loss", @@ -296,6 +304,6 @@ def configure(self): amp=self.amp, ) - if self.local_rank > 0: - self.train_engine.logger.setLevel(logging.WARNING) - self.eval_engine.logger.setLevel(logging.WARNING) + # if self.local_rank > 0: + # self.train_engine.logger.setLevel(logging.WARNING) + # self.eval_engine.logger.setLevel(logging.WARNING) diff --git a/federated_learning/nvflare/nvflare_example/.gitignore b/federated_learning/nvflare/nvflare_example/.gitignore deleted file mode 100644 index 8447e9a17e..0000000000 --- a/federated_learning/nvflare/nvflare_example/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# virtual environments -nvflare_monai -# workspace -fl_workspace -# data -*.nii.gz -# pycharm -.idea diff --git a/federated_learning/nvflare/nvflare_example/README.md b/federated_learning/nvflare/nvflare_example/README.md deleted file mode 100644 index 28ad39fe3c..0000000000 --- a/federated_learning/nvflare/nvflare_example/README.md +++ /dev/null @@ -1,186 +0,0 @@ -# Federated Learning with MONAI using NVFlare (without docker) -The purpose of this tutorial is to show how to run [NVFlare](https://pypi.org/project/nvflare) with MONAI on a local machine to simulate a FL setting (server and client communicate over localhost). -It is based on the [tutorial](../nvflare_example_docker) showing how to run FL with MONAI and NVFlare which using a docker container for the server and each client. - -## Environment setup -(If needed) install pip and virtualenv (on macOS and Linux): -``` -python3 -m pip install --user --upgrade pip -python3 -m pip install --user virtualenv -``` -(If needed) make all shell scripts executable using -``` -find . -name ".sh" -exec chmod +x {} \; -``` -initialize virtual environment and set the current folder (see `projectpath` in `set_env.sh`). -``` -source ./virtualenv/set_env.sh -``` -install required packages -``` -pip install --upgrade pip -pip install -r ${projectpath}/virtualenv/requirements.txt -``` - -## FL workspace preparation for NVFlare -NVFlare has a "provision" mechanism to automatically generate the fl workspace, see [here](https://docs.nvidia.com/clara/clara-train-sdk/federated-learning/fl_provisioning_tool.html) for details. - -In this example, for convenience, we included a pregenerated workspace supporting up to 8 clients which needs to be extracted. -``` -unzip ${projectpath}/fl_workspace_pregenerated.zip -``` -*Note: (Optional)* If you need to modify the fl workspace (changing the number of max clients, client names, etc.), please follow the instructions [here](https://docs.nvidia.com/clara/clara-train-sdk/federated-learning/fl_provisioning_tool.html). We included the sample project.yml and authz_config.json files used for generating the 8-client workspace under `${projectpath}/fl_utils/workspace_gen`. After modification, the provisioning tool can be run as: `provision -p project.yml -a authz_config.json` - -## Example task - spleen segmentation with MONAI -In this example, we used spleen segmentation task with a MONAI-based client trainer under `${projectpath}/spleen_example` -### Download the data -Download the Spleen segmentation task dataset from http://medicaldecathlon.com. -``` -${projectpath}/spleen_example/data/download_dataset.sh -``` -This will create a `${projectpath}/data` folder containing the dataset and pre-assigned 8-client datalists. - -## Run federated learning -Two steps for running the federated learning using NVFlare+MONAI: -1. start the server, clients, and admin under NVFlare workspace -2. start the actual training process with MONAI implementation -### Start server and clients -To start the server and clients, run the following script (example with 2 clients). -``` -export n_clients=2 -${projectpath}/fl_utils/fl_run/start_fl.sh ${n_clients} -``` -*Note:* Currently, `start_fl.sh` will run the clients on all available GPUs. For further control, modify `export CUDA_VISIBLE_DEVICES` command in `start_fl.sh` to set which GPU a client should run on. Note that multiple clients can run on a single GPU as long as the memory is sufficient. - -### Start admin client -In new terminal, activate environment again -``` -source ./virtualenv/set_env.sh -``` -Then, start admin client -``` -${projectpath}/fl_workspace/admin/startup/fl_admin.sh -``` -*Note:* The user name is `admin@nvidia.com`. - -Use the admin client to control the FL process: - -(Optional) Check the server status -``` -> check_status server -``` -Expected output -``` -FL run number has not been set. -FL server status: training not started -Registered clients: 2 -------------------------------------------------------------------------------------------------- -| CLIENT NAME | TOKEN | LAST ACCEPTED ROUND | CONTRIBUTION COUNT | -------------------------------------------------------------------------------------------------- -| client2 | 9d2c2d14-cefb-497d-bf13-042dd3e7965f | | 0 | -| client1 | fd9a8872-2dba-4e25-829e-db0a524a66d6 | | 0 | -------------------------------------------------------------------------------------------------- - -``` -(Optional) Check the client status -``` -> check_status client -``` -Expected output: -``` -instance:client2 : client name: client2 token: 9d2c2d14-cefb-497d-bf13-042dd3e7965f status: training not started -instance:client1 : client name: client1 token: fd9a8872-2dba-4e25-829e-db0a524a66d6 status: training not started -``` -*Note:* For more details about the admin client and its commands, see [here](https://docs.nvidia.com/clara/clara-train-sdk/federated-learning/fl_admin_commands.html). - -### Start FL training with spleen_example -Upload and deploy the training configurations. -Then in admin, -``` -> set_run_number 1 -> upload_folder ../../../spleen_example -> deploy spleen_example server -> deploy spleen_example client -``` -*Note:* the upload_folder is expecting the config directory to be given either as absolute path or relative to the `fl_workspace/admin/transfer` folder as shown in the command above. - -Inside the server/client terminal, deploy the training configurations that specify the data json for each client -``` -${projectpath}/fl_utils/fl_run/deploy_train_configs.sh ${n_clients} -``` -Next, you can start the FL server in the admin terminal and begin training: -``` -> start server -> start client -``` -(Optional) monitor the training progress - -Server status: -``` -> check_status server -FL run number:1 -FL server status: training started -run number:1 start round:0 max round:200 current round:1 -min_num_clients:2 max_num_clients:100 -Registered clients: 2 -Total number of clients submitted models for current round: 0 -------------------------------------------------------------------------------------------------- -| CLIENT NAME | TOKEN | LAST ACCEPTED ROUND | CONTRIBUTION COUNT | -------------------------------------------------------------------------------------------------- -| client2 | 9d2c2d14-cefb-497d-bf13-042dd3e7965f | 0 | 1 | -| client1 | fd9a8872-2dba-4e25-829e-db0a524a66d6 | 0 | 1 | -------------------------------------------------------------------------------------------------- -``` -Client status: -``` -> check_status client -instance:client2 : client name: client2 token: 9d2c2d14-cefb-497d-bf13-042dd3e7965f status: training started -instance:client1 : client name: client1 token: fd9a8872-2dba-4e25-829e-db0a524a66d6 status: training started - -``` -(Optional) shutdown FL system: -``` -> shutdown client -admin@nvidia.com -> shutdown server -admin@nvidia.com -``` -(Optional) clean up previous runs -``` -${projectpath}/fl_utils/fl_run/clean_up.sh ${n_clients} -``` - -## Automate running FL -Alternatively, the following commands automate the above described steps. It makes use of NVFlare's AdminAPI. The script will automatically start the server and clients, upload the configuration folders and deploy them with the client-specific data list. It will also set the minimum number of clients needed for each global model update depending on the given argument. - -*Note:* make sure there is no server or clients running. You can check if a NVFlare process is still running before starting a new experiment via `ps -as | grep nvflare`. Shut them down using the `shutdown` admin commands as described above if there are any. - -First, start environment again (if not already activated) -``` -source ./virtualenv/set_env.sh -``` -Then, run the FL experiment as above automatically. -``` -export n_clients=2 -${projectpath}/fl_utils/fl_run_auto/run_fl.sh ${n_clients} -``` -*Note:* This script will automatically shutdown the server and client in case of an error or misconfiguration. You can check if a NVFlare process is still running before starting a new experiment via `ps -as | grep nvflare`. It is best to not keep old processes running while trying to start a new experiment. - -Here, you can also use the admin client as show above to monitor the automatically started FL experiment. Just open a terminal and execute -``` -source ./virtualenv/set_env.sh -${projectpath}/fl_workspace/admin/startup/fl_admin.sh -``` -(username: `admin@nvidia.com`) - -## Visualize the training progress -To visualize the training progress, run tensorboard in the server/client terminal: -``` -tensorboard --logdir="./" & -``` -and point your browser to `http://localhost:6006/#scalars`. You should see the performance of the global model to be the same at the beginning of each round, as the clients in this example all share the same validation set. -![Validation curve for two clients](tensorboard.png) - -## Further reading -For more details visit the [NVFlare documentation](https://pypi.org/project/nvflare). -For more examples using NVFlare, see [here](https://github.com/NVIDIA/clara-train-examples/tree/master/PyTorch/NoteBooks/FL). diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/clean_up.sh b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/clean_up.sh deleted file mode 100755 index 335c12da4c..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/clean_up.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -n_clients=$1 - -if test -z "$n_clients" -then - echo "Please provide the number of clients, e.g. ./clean_up.sh 2" - exit 1 -fi - -rm -rf ${projectpath}/fl_workspace/server/run_* -rm -rf ${projectpath}/fl_workspace/server/transfer/* -rm ${projectpath}/fl_workspace/server/*.* -for id in $(eval echo "{1..$n_clients}") -do - rm -rf ${projectpath}/fl_workspace/client${id}/run_* - rm -rf ${projectpath}/fl_workspace/client${id}/transfer/* - rm ${projectpath}/fl_workspace/client${id}/*.* -done diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/deploy_train_configs.sh b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/deploy_train_configs.sh deleted file mode 100755 index 1d27e1712f..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/deploy_train_configs.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -n_clients=$1 - -if test -z "$n_clients" -then - echo "Please provide the number of clients, e.g. ./deploy_train_configs.sh 2" - exit 1 -fi - -run_number=1 - -for i in $(eval echo "{1..$n_clients}") -do - echo "Deploying train config for client${i}" - cp ${projectpath}/spleen_example/config/config_train_${i}.json \ - ${projectpath}/fl_workspace/client${i}/run_${run_number}/mmar_client${i}/config/config_train.json -done diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/start_fl.sh b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/start_fl.sh deleted file mode 100755 index 5b8071281e..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run/start_fl.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -n_clients=$1 - -if test -z "$n_clients" -then - echo "Please provide the number of clients, e.g. ./start_fl.sh 2" - exit 1 -fi - -n_gpus=$(nvidia-smi --list-gpus | wc -l) -echo "There are ${n_gpus} GPUs." - -# Start server -echo "Starting server and ${n_clients} clients" -${projectpath}/fl_workspace/server/startup/start.sh -sleep 10s - -# Start clients -for i in $(eval echo "{1..$n_clients}") -do - gpu_idx=$((${i} % ${n_gpus})) - echo "Starting client${i} on GPU ${gpu_idx}" - export CUDA_VISIBLE_DEVICES=${gpu_idx} - ${projectpath}/fl_workspace/client${i}/startup/start.sh -done diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/api_utils.py b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/api_utils.py deleted file mode 100644 index 33d6568c56..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/api_utils.py +++ /dev/null @@ -1,55 +0,0 @@ -import time -import re - - -def api_command_wrapper(api, command): - print("\nISSUING COMMAND: {}".format(command)) - reply = api.do_command(command) - print(reply) - assert reply['status'] == 'SUCCESS', "command was not successful!" - - # check for other errors - for r in reply['data']: - if r['type'] == 'string': - # print(r['data']) - assert 'error' not in r['data'].lower(), f"there was an error in reply executing: {command}" - if r['type'] == 'error': - raise ValueError(f"there was an error executing: {command}") - return reply - - -def wait_to_complete(api, interval=60): - fl_is_training = True - while fl_is_training: - time.sleep(interval) - reply = api_command_wrapper(api, "check_status client") - nr_clients_starting = len([m.start() for m in re.finditer('status: training starting', reply['data'][0]['data'])]) - nr_clients_started = len([m.start() for m in re.finditer('status: training started', reply['data'][0]['data'])]) - nr_clients_crosssiteval = len([m.start() for m in re.finditer('status: cross site validation', reply['data'][0]['data'])]) - print(f'{nr_clients_starting} clients starting training.') - print(f'{nr_clients_started} clients in training.') - print(f'{nr_clients_crosssiteval} clients in cross-site validation.') - - reply = api_command_wrapper(api, "check_status server") - if 'status: training stopped' in reply['data'][0]['data']: - server_is_training = False - print('Server stopped.') - else: - print('Server is training.') - server_is_training = True - - if (~server_is_training) and \ - (nr_clients_started == 0) and \ - (nr_clients_starting == 0) and \ - (nr_clients_crosssiteval == 0): - fl_is_training = False - print('FL training & cross-site validation stopped/completed.') - - return True - - -def fl_shutdown(api): - print('Shutting down FL system...') - api_command_wrapper(api, "shutdown client") - time.sleep(10) - api_command_wrapper(api, "shutdown server") diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.py b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.py deleted file mode 100755 index 2d53c57555..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python3 -import os -import argparse -import time -import re -import sys -import json -import shutil -import uuid -# use source -#src_root = "/workspace/Code/clara4.0" -#python_paths = [f"{src_root}/common/dlmed/src", -# f"{src_root}/train/automl/src", -# f"{src_root}/flare"] -#[sys.path.insert(0, item) for item in python_paths] - -from dlmed.hci.client.api import AdminAPI -from api_utils import api_command_wrapper, wait_to_complete, fl_shutdown - - -def create_tmp_config_dir(upload_dir, config): - tmp_config = str(uuid.uuid4()) - print(f"Creating temporary config from {config} -> {tmp_config}") - tmp_config_dir = os.path.join(upload_dir, tmp_config) # creat a temp config for this run - if os.path.isdir(tmp_config_dir): - shutil.rmtree(tmp_config_dir) - shutil.copytree(os.path.join(upload_dir, config), tmp_config_dir) - - return tmp_config, tmp_config_dir - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--nr_clients', type=int, default=2, help="Minimum number of clients.") - parser.add_argument('--run_number', type=int, default=1, help="FL run number.") - parser.add_argument('--config', type=str, default='spleen_example', help="directory name with training configs.") - parser.add_argument('--admin_dir', type=str, default='./admin', help="Path to admin directory.") - - args = parser.parse_args() - - host = 'localhost' - port = 8003 - - # Set up certificate names and admin folders - ca_cert = os.path.join(args.admin_dir, 'startup', 'rootCA.pem') - client_cert = os.path.join(args.admin_dir, 'startup', 'client.crt') - client_key = os.path.join(args.admin_dir, 'startup', 'client.key') - upload_dir = os.path.join(args.admin_dir, 'transfer') - download_dir = os.path.join(args.admin_dir, 'download') - if not os.path.isdir(download_dir): - os.makedirs(download_dir) - - assert os.path.isdir(args.admin_dir), f"admin directory does not exist at {args.admin_dir}" - assert os.path.isfile(ca_cert), f"rootCA.pem does not exist at {ca_cert}" - assert os.path.isfile(client_cert), f"client.crt does not exist at {client_cert}" - assert os.path.isfile(client_key), f"client.key does not exist at {client_key}" - - # Connect with admin client - api = AdminAPI( - host=host, - port=port, - ca_cert=ca_cert, - client_cert=client_cert, - client_key=client_key, - upload_dir=upload_dir, - download_dir=download_dir, - debug=False - ) - reply = api.login(username="admin@nvidia.com") - for k in reply.keys(): - assert "error" not in reply[k].lower(), f"Login not successful with {reply}" - - # Execute commands - api_command_wrapper(api, "set_timeout 30") - - # create a temporary config for editing - try: - tmp_config, tmp_config_dir = create_tmp_config_dir(upload_dir, args.config) - except BaseException as e: - print(f"There was an exception {e}. Shutting down clients and server.") - fl_shutdown(api) - sys.exit(1) - - # update server config to set min_num_clients: - server_config_file = os.path.join(tmp_config_dir, 'config', 'config_fed_server.json') - with open(server_config_file, 'r') as f: - server_config = json.load(f) - server_config['servers'][0]['min_num_clients'] = args.nr_clients - with open(server_config_file, 'w') as f: - json.dump(server_config, f, indent=4) - - api_command_wrapper(api, "check_status server") - - api_command_wrapper(api, f"set_run_number {args.run_number}") - - api_command_wrapper(api, f"upload_folder {tmp_config}") - - api_command_wrapper(api, f"deploy {tmp_config} server") - - api_command_wrapper(api, "start server") - - time.sleep(10) - # deploy clients - for client_id in range(1, args.nr_clients+1): - # update client's train config to set seed: - ref_train_config_file = os.path.join(upload_dir, args.config, 'config', f'config_train_{client_id}.json') - train_config_file = os.path.join(tmp_config_dir, 'config', f'config_train.json') - - print(f"Deploying train config for client{client_id}") - shutil.copyfile(ref_train_config_file, train_config_file) - - # upload & deploy on client - api_command_wrapper(api, f"upload_folder {tmp_config}") - api_command_wrapper(api, f"deploy {tmp_config} client client{client_id}") - - api_command_wrapper(api, "start client") - - # delete temporary config - if os.path.isdir(tmp_config_dir): - shutil.rmtree(tmp_config_dir) - - # Keep checking the server and client statuses until FL training is complete. - wait_to_complete(api, interval=30) - - # shutdown - fl_shutdown(api) - - # log out - print('Admin logging out.') - api.logout() - - -if __name__ == "__main__": - main() diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.sh b/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.sh deleted file mode 100755 index 3cc9f1af04..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/fl_run_auto/run_fl.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -n_clients=$1 - -if test -z "$n_clients" -then - echo "Please provide the number of clients, e.g. ./run_fl.sh 2" - exit 1 -fi - -## Start server and clients ## -${projectpath}/fl_utils/fl_run/start_fl.sh ${n_clients} -echo "Waiting for server and clients to start..." -sleep 30s - -## Run FL training ## -echo "Run FL training" -python3 ${projectpath}/fl_utils/fl_run_auto/run_fl.py --nr_clients ${n_clients} --run_number 1 \ - --config "../../../spleen_example" \ - --admin_dir "${projectpath}/fl_workspace/admin" & diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/authz_config.json b/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/authz_config.json deleted file mode 100644 index 12e8d8408d..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/authz_config.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "version": "1.0", - - "roles": { - "super": "super user of system", - "lead_researcher": "lead researcher of the study", - "site_researcher": "site researcher of the study", - "site_it": "site IT of the study", - "lead_it": "lead IT of the study" - }, - "groups": { - "relaxed": { - "desc": "the org group with relaxed policies", - "rules": { - "allow_byoc": true, - "allow_custom_datalist": true - } - }, - "strict": { - "desc": "the org group with strict policies", - "rules": { - "allow_byoc": false, - "allow_custom_datalist": false - } - }, - "general": { - "desc": "general group user rights", - "role_rights": { - "super": { - "operate_all": true, - "view_all": true, - "train_all": true - }, - "lead_researcher": { - "train_all": true, - "view_all": true - }, - "site_researcher": { - "train_self": true, - "view_self": true - }, - "lead_it": { - "operate_all": true, - "view_all": true - }, - "site_it": { - "operate_self": true, - "view_self": true - } - } - } - }, - "users": { - "admin@nvidia.com": { - "org": "nvidia", - "roles": ["super"] - }, - "client1": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client2": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client3": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client4": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client5": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client6": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client7": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - }, - "client8": { - "org": "nvidia", - "roles": ["lead_it", "site_researcher"] - } - }, - "orgs": { - "nvidia": ["general", "relaxed"] - }, - "sites": { - "client1": "nvidia", - "client2": "nvidia", - "client3": "nvidia", - "client4": "nvidia", - "client5": "nvidia", - "client6": "nvidia", - "client7": "nvidia", - "client8": "nvidia", - "server": "nvidia" - } -} diff --git a/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/project.yml b/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/project.yml deleted file mode 100644 index d2896f6106..0000000000 --- a/federated_learning/nvflare/nvflare_example/fl_utils/workspace_gen/project.yml +++ /dev/null @@ -1,58 +0,0 @@ -# org is to describe each participant's organization and is optional - -# the name of this project -name: fl - -config_folder: config - -server: - auth: true - - org: nvidia - - # set cn to the server's fully qualified domain name - # never set it to example.com - cn: localhost - - # replace the number with that all clients can reach out to, and that the server can open to listen to - fed_learn_port: 8002 - - # again, replace the number with that all clients can reach out to, and that the server can open to listen to - # the value must be different from fed_learn_port - admin_port: 8003 - - # admin_storage is the mmar upload folder name on the server - admin_storage: transfer - - min_num_clients: 1 - max_num_clients: 100 - - # don't use a config_validator - config_validator: - -# The following values under fl_clients and admin_clients are for demo purpose only. -# Please change them according to the information of actual project. -fl_clients: - # client_name must be unique - # email is optional - - org: nvidia - client_name: client1 - - org: nvidia - client_name: client2 - - org: nvidia - client_name: client3 - - org: nvidia - client_name: client4 - - org: nvidia - client_name: client5 - - org: nvidia - client_name: client6 - - org: nvidia - client_name: client7 - - org: nvidia - client_name: client8 - -admin_clients: - # email is the user name for admin authentication. Hence, it must be unique within the project - - org: nvidia - email: admin@nvidia.com diff --git a/federated_learning/nvflare/nvflare_example/fl_workspace_pregenerated.zip b/federated_learning/nvflare/nvflare_example/fl_workspace_pregenerated.zip deleted file mode 100644 index e3207599e2274c43724c8f8ede1d14ea6f947bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151002 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 0: - IterAggregateHandler(interval=self.aggregation_iters).attach( - self.train_engine - ) - - # Instantiate a train context class. This instance is used to - # save training related information such as current epochs, iterations - # and the learning rate. - self.train_ctx = TrainContext() - self.train_ctx.initial_learning_rate = get_lr_values( - self.train_engine.optimizer - ) - - # Initialize the FL context. - fl_ctx.set_prop(FLConstants.MY_RANK, self.train_engine.state.rank) - fl_ctx.set_prop(FLConstants.MODEL_NETWORK, self.train_engine.network) - fl_ctx.set_prop(FLConstants.MULTI_GPU, self.multi_gpu) - fl_ctx.set_prop(FLConstants.DEVICE, self.train_engine.state.device) - - def handle_event(self, event_type: str, fl_ctx: FLContext): - """ - This function is an extended function from the super class. - It is used to perform the handler process based on the - event_type. At the start point of a FL experiment, necessary - components should be initialized. At the end of the experiment, - the running engines should be terminated. - - Args: - event_type: the type of event that will be fired. In MONAITrainer, - only `START_RUN` and `END_RUN` need to be handled. - fl_ctx: an `FLContext` object. - - """ - if event_type == EventType.START_RUN: - self._initialize_trainer(fl_ctx) - elif event_type == EventType.END_RUN: - try: - self.train_engine.terminate() - self.eval_engine.terminate() - except BaseException as e: - self.logger.info(f"exception in closing engines {e}") - - def train( - self, shareable: Shareable, fl_ctx: FLContext, abort_signal: Signal - ) -> Shareable: - """ - This function is an extended function from the super class. - As a supervised learning based trainer, the train function will run - evaluate and train engines based on model weights from `shareable`. - After fininshing training, a new `Shareable` object will be submitted - to server for aggregation. - - Args: - shareable: the `Shareable` object acheived from server. - fl_ctx: the `FLContext` object achieved from server. - abort_signal: if triggered, the training will be aborted. - - Returns: - a new `Shareable` object to be submitted to server for aggregation. - """ - # check abort signal - self.logger.info(f"MonaiTrainer abort signal: {abort_signal.triggered}") - if abort_signal.triggered: - self.finalize(fl_ctx) - shareable = generate_failure(fl_ctx=fl_ctx, reason="abort signal triggered") - return shareable - # achieve model weights - if self.train_engine.state.rank == 0: - model_weights = shareable[ShareableKey.MODEL_WEIGHTS] - # load achieved model weights for the network (saved in fl_ctx) - self.model_manager.assign_current_model(model_weights, fl_ctx) - # for multi-gpu training, only rank 0 process will achieve the model weights. - # Thus, it should be broadcasted to all processes. - if self.multi_gpu: - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - for _, v in net.state_dict().items(): - dist.broadcast(v, src=0) - - # set engine state parameters, like number of training epochs/iterations. - self.train_engine = set_engine_state( - self.train_engine, self.aggregation_epochs, self.aggregation_iters - ) - # get current epoch and iteration when a round starts - self.train_ctx.epoch_of_start_time = self.train_engine.state.epoch - self.train_ctx.iter_of_start_time = self.train_engine.state.iteration - # execute validation at the beginning of every round - self.eval_engine.run(self.train_engine.state.epoch + 1) - self.train_ctx.fl_init_validation_metric = self.eval_engine.state.metrics.get( - self.eval_engine.state.key_metric_name, -1 - ) - self.train_engine.run() - # calculate current iteration and epoch data after training - self.train_ctx.current_iters = ( - self.train_engine.state.iteration - self.train_ctx.iter_of_start_time - ) - self.train_ctx.current_executed_epochs = ( - self.train_engine.state.epoch - self.train_ctx.epoch_of_start_time - ) - # create a new `Shareable` object - if self.train_engine.state.rank == 0: - self.train_ctx.set_context(self.train_engine, self.eval_engine) - shareable = self.model_manager.generate_shareable( - self.train_ctx, - fl_ctx, - ) - # update train context into FL context. - fl_ctx.set_prop(FLConstants.TRAIN_CONTEXT, self.train_ctx) - return shareable diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/custom/utils.py b/federated_learning/nvflare/nvflare_example/spleen_example/custom/utils.py deleted file mode 100644 index d0c1252a19..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/custom/utils.py +++ /dev/null @@ -1,187 +0,0 @@ -# Copyright 2020 MONAI Consortium -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import math -from typing import Dict - -import numpy as np -import torch -from ignite.engine import Engine, Events -from nvflare.apis.fl_constant import FLConstants, ShareableKey, ShareableValue -from nvflare.apis.fl_context import FLContext -from nvflare.apis.shareable import Shareable -from torch.optim import Optimizer - - -class TrainContext: - """ - Train Context class contains training related parameters/variables, - such as learning rate, number of gpus and current training iterations. - """ - - def __init__(self): - self.initial_learning_rate = 0 - self.current_learning_rate = 0 - self.current_iters = 0 - self.current_executed_epochs = 0 - self.fl_init_validation_metric = 0 - self.epoch_of_start_time = 0 - self.iter_of_start_time = 0 - - def set_context(self, train_engine: Engine, eval_engine: Engine): - """ - This function is usually called after train engine has finished running. - The variables that updated here will add to the shareable object and then - submit to server. You can add other variables in this function if they are - needed to be shared. - """ - self.current_learning_rate = get_lr_values(train_engine.optimizer) - - -class MONAIModelManager: - def __init__(self): - self.logger = logging.getLogger("ModelShareableManager") - - def assign_current_model( - self, model_weights: Dict[str, np.ndarray], fl_ctx: FLContext - ): - """ - This function is used to load provided weights for the network saved - in FL context. - Before loading weights, tensors might need to be reshaped to support HE for secure aggregation. - More info of HE: - https://github.com/NVIDIA/clara-train-examples/blob/master/PyTorch/NoteBooks/FL/Homomorphic_Encryption.ipynb - - """ - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - if fl_ctx.get_prop(FLConstants.MULTI_GPU): - net = net.module - - local_var_dict = net.state_dict() - model_keys = model_weights.keys() - for var_name in local_var_dict: - if var_name in model_keys: - weights = model_weights[var_name] - try: - local_var_dict[var_name] = torch.as_tensor(np.reshape(weights, local_var_dict[var_name].shape)) - except Exception as e: - raise ValueError( - "Convert weight from {} failed with error: {}".format( - var_name, str(e) - ) - ) - - net.load_state_dict(local_var_dict) - - def extract_model(self, fl_ctx: FLContext) -> Dict[str, np.ndarray]: - """ - This function is used to extract weights of the network saved in FL - context. - The extracted weights will be converted into a numpy array based dict. - """ - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - if fl_ctx.get_prop(FLConstants.MULTI_GPU): - net = net.module - local_state_dict = net.state_dict() - local_model_dict = {} - for var_name in local_state_dict: - try: - local_model_dict[var_name] = local_state_dict[var_name].cpu().numpy() - except Exception as e: - raise ValueError( - "Convert weight from {} failed with error: {}".format( - var_name, str(e) - ) - ) - - return local_model_dict - - def generate_shareable(self, train_ctx: TrainContext, fl_ctx: FLContext): - """ - This function is used to generate a shareable instance according to - the train context and FL context. - A Shareable instance can not only contain model weights, but also - some additional information that clients want to share. These information - should be added into ShareableKey.META. - """ - - # input the initial metric into meta data. You can also add other parameters. - meta_data = {} - meta_data[FLConstants.INITIAL_METRICS] = train_ctx.fl_init_validation_metric - meta_data[FLConstants.CURRENT_LEARNING_RATE] = train_ctx.current_learning_rate - meta_data[FLConstants.NUM_STEPS_CURRENT_ROUND] = train_ctx.current_iters - - shareable = Shareable() - shareable[ShareableKey.TYPE] = ShareableValue.TYPE_WEIGHT_DIFF - shareable[ShareableKey.DATA_TYPE] = ShareableValue.DATA_TYPE_UNENCRYPTED - shareable[ShareableKey.MODEL_WEIGHTS] = self.extract_model(fl_ctx) - shareable[ShareableKey.META] = meta_data - - return shareable - - -class IterAggregateHandler: - """ - This class implements an event handler for iteration based aggregation. - """ - - def __init__(self, interval: int): - self.interval = interval - - def attach(self, engine: Engine): - engine.add_event_handler(Events.ITERATION_COMPLETED(every=self.interval), self) - - def __call__(self, engine: Engine): - engine.terminate() - # save current iteration for next round - engine.state.dataloader_iter = engine._dataloader_iter - if engine.state.iteration % engine.state.epoch_length == 0: - # if current iteration is end of 1 epoch, manually trigger epoch completed event - engine._fire_event(Events.EPOCH_COMPLETED) - - -def get_lr_values(optimizer: Optimizer): - """ - This function is used to get the learning rates of the optimizer. - """ - return [group["lr"] for group in optimizer.state_dict()["param_groups"]] - - -def set_engine_state(engine: Engine, aggregation_epochs: int, aggregation_iters: int): - """ - This function is used to set the engine's state parameters according to - the aggregation ways (iteration based or epoch based). - - Args: - engine: the engine that to be processed. - aggregation_epochs: the number of epochs before aggregation. - This parameter only works when `aggregation_iters` is 0. - aggregation_iters: the number of iterations before aggregation. - If the value is larger than 0, the engine will use iteration based aggregation - rather than epoch based aggregation. - - """ - if aggregation_iters > 0: - next_aggr_iter = engine.state.iteration + aggregation_iters - engine.state.max_epochs = math.ceil(next_aggr_iter / engine.state.epoch_length) - previous_iter = engine.state.iteration % engine.state.epoch_length - if engine.state.iteration > 0 and previous_iter != 0: - # init to continue from previous epoch - engine.state.epoch -= 1 - if hasattr(engine.state, "dataloader_iter"): - # initialize to continue from previous iteration - engine._init_iter.append(previous_iter) - engine._dataloader_iter = engine.state.dataloader_iter - else: - engine.state.max_epochs = engine.state.epoch + aggregation_epochs - - return engine diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_1.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_1.json deleted file mode 100644 index 3aecb2ff62..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_1.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_40.nii.gz", - "label": "./labelsTr/spleen_40.nii.gz" - }, { - "image": "./imagesTr/spleen_44.nii.gz", - "label": "./labelsTr/spleen_44.nii.gz" - }, { - "image": "./imagesTr/spleen_38.nii.gz", - "label": "./labelsTr/spleen_38.nii.gz" - }, { - "image": "./imagesTr/spleen_25.nii.gz", - "label": "./labelsTr/spleen_25.nii.gz" - }, { - "image": "./imagesTr/spleen_13.nii.gz", - "label": "./labelsTr/spleen_13.nii.gz" - }, { - "image": "./imagesTr/spleen_6.nii.gz", - "label": "./labelsTr/spleen_6.nii.gz" - }, { - "image": "./imagesTr/spleen_19.nii.gz", - "label": "./labelsTr/spleen_19.nii.gz" - }, { - "image": "./imagesTr/spleen_24.nii.gz", - "label": "./labelsTr/spleen_24.nii.gz" - },{ - "image": "./imagesTr/spleen_31.nii.gz", - "label": "./labelsTr/spleen_31.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_2.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_2.json deleted file mode 100644 index 626f6a51dd..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_2.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_12.nii.gz", - "label": "./labelsTr/spleen_12.nii.gz" - }, { - "image": "./imagesTr/spleen_47.nii.gz", - "label": "./labelsTr/spleen_47.nii.gz" - }, { - "image": "./imagesTr/spleen_28.nii.gz", - "label": "./labelsTr/spleen_28.nii.gz" - }, { - "image": "./imagesTr/spleen_61.nii.gz", - "label": "./labelsTr/spleen_61.nii.gz" - }, { - "image": "./imagesTr/spleen_29.nii.gz", - "label": "./labelsTr/spleen_29.nii.gz" - }, { - "image": "./imagesTr/spleen_14.nii.gz", - "label": "./labelsTr/spleen_14.nii.gz" - }, { - "image": "./imagesTr/spleen_63.nii.gz", - "label": "./labelsTr/spleen_63.nii.gz" - }, { - "image": "./imagesTr/spleen_59.nii.gz", - "label": "./labelsTr/spleen_59.nii.gz" - }, { - "image": "./imagesTr/spleen_33.nii.gz", - "label": "./labelsTr/spleen_33.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_3.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_3.json deleted file mode 100644 index c786fb4bc9..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_3.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_52.nii.gz", - "label": "./labelsTr/spleen_52.nii.gz" - }, { - "image": "./imagesTr/spleen_9.nii.gz", - "label": "./labelsTr/spleen_9.nii.gz" - }, { - "image": "./imagesTr/spleen_10.nii.gz", - "label": "./labelsTr/spleen_10.nii.gz" - }, { - "image": "./imagesTr/spleen_41.nii.gz", - "label": "./labelsTr/spleen_41.nii.gz" - }, { - "image": "./imagesTr/spleen_60.nii.gz", - "label": "./labelsTr/spleen_60.nii.gz" - }, { - "image": "./imagesTr/spleen_56.nii.gz", - "label": "./labelsTr/spleen_56.nii.gz" - }, { - "image": "./imagesTr/spleen_26.nii.gz", - "label": "./labelsTr/spleen_26.nii.gz" - }, { - "image": "./imagesTr/spleen_17.nii.gz", - "label": "./labelsTr/spleen_17.nii.gz" - }, { - "image": "./imagesTr/spleen_8.nii.gz", - "label": "./labelsTr/spleen_8.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_4.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_4.json deleted file mode 100644 index 4dc6e4c0c8..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_4.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_16.nii.gz", - "label": "./labelsTr/spleen_16.nii.gz" - }, { - "image": "./imagesTr/spleen_20.nii.gz", - "label": "./labelsTr/spleen_20.nii.gz" - }, { - "image": "./imagesTr/spleen_18.nii.gz", - "label": "./labelsTr/spleen_18.nii.gz" - }, { - "image": "./imagesTr/spleen_46.nii.gz", - "label": "./labelsTr/spleen_46.nii.gz" - }, { - "image": "./imagesTr/spleen_27.nii.gz", - "label": "./labelsTr/spleen_27.nii.gz" - }, { - "image": "./imagesTr/spleen_49.nii.gz", - "label": "./labelsTr/spleen_49.nii.gz" - }, { - "image": "./imagesTr/spleen_62.nii.gz", - "label": "./labelsTr/spleen_62.nii.gz" - }, { - "image": "./imagesTr/spleen_53.nii.gz", - "label": "./labelsTr/spleen_53.nii.gz" - }, { - "image": "./imagesTr/spleen_21.nii.gz", - "label": "./labelsTr/spleen_21.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_5.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_5.json deleted file mode 100644 index 3aecb2ff62..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_5.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_40.nii.gz", - "label": "./labelsTr/spleen_40.nii.gz" - }, { - "image": "./imagesTr/spleen_44.nii.gz", - "label": "./labelsTr/spleen_44.nii.gz" - }, { - "image": "./imagesTr/spleen_38.nii.gz", - "label": "./labelsTr/spleen_38.nii.gz" - }, { - "image": "./imagesTr/spleen_25.nii.gz", - "label": "./labelsTr/spleen_25.nii.gz" - }, { - "image": "./imagesTr/spleen_13.nii.gz", - "label": "./labelsTr/spleen_13.nii.gz" - }, { - "image": "./imagesTr/spleen_6.nii.gz", - "label": "./labelsTr/spleen_6.nii.gz" - }, { - "image": "./imagesTr/spleen_19.nii.gz", - "label": "./labelsTr/spleen_19.nii.gz" - }, { - "image": "./imagesTr/spleen_24.nii.gz", - "label": "./labelsTr/spleen_24.nii.gz" - },{ - "image": "./imagesTr/spleen_31.nii.gz", - "label": "./labelsTr/spleen_31.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_6.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_6.json deleted file mode 100644 index 626f6a51dd..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_6.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_12.nii.gz", - "label": "./labelsTr/spleen_12.nii.gz" - }, { - "image": "./imagesTr/spleen_47.nii.gz", - "label": "./labelsTr/spleen_47.nii.gz" - }, { - "image": "./imagesTr/spleen_28.nii.gz", - "label": "./labelsTr/spleen_28.nii.gz" - }, { - "image": "./imagesTr/spleen_61.nii.gz", - "label": "./labelsTr/spleen_61.nii.gz" - }, { - "image": "./imagesTr/spleen_29.nii.gz", - "label": "./labelsTr/spleen_29.nii.gz" - }, { - "image": "./imagesTr/spleen_14.nii.gz", - "label": "./labelsTr/spleen_14.nii.gz" - }, { - "image": "./imagesTr/spleen_63.nii.gz", - "label": "./labelsTr/spleen_63.nii.gz" - }, { - "image": "./imagesTr/spleen_59.nii.gz", - "label": "./labelsTr/spleen_59.nii.gz" - }, { - "image": "./imagesTr/spleen_33.nii.gz", - "label": "./labelsTr/spleen_33.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_7.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_7.json deleted file mode 100644 index c786fb4bc9..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_7.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_52.nii.gz", - "label": "./labelsTr/spleen_52.nii.gz" - }, { - "image": "./imagesTr/spleen_9.nii.gz", - "label": "./labelsTr/spleen_9.nii.gz" - }, { - "image": "./imagesTr/spleen_10.nii.gz", - "label": "./labelsTr/spleen_10.nii.gz" - }, { - "image": "./imagesTr/spleen_41.nii.gz", - "label": "./labelsTr/spleen_41.nii.gz" - }, { - "image": "./imagesTr/spleen_60.nii.gz", - "label": "./labelsTr/spleen_60.nii.gz" - }, { - "image": "./imagesTr/spleen_56.nii.gz", - "label": "./labelsTr/spleen_56.nii.gz" - }, { - "image": "./imagesTr/spleen_26.nii.gz", - "label": "./labelsTr/spleen_26.nii.gz" - }, { - "image": "./imagesTr/spleen_17.nii.gz", - "label": "./labelsTr/spleen_17.nii.gz" - }, { - "image": "./imagesTr/spleen_8.nii.gz", - "label": "./labelsTr/spleen_8.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_8.json b/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_8.json deleted file mode 100644 index 4dc6e4c0c8..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/dataset_8.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "training": [{ - "image": "./imagesTr/spleen_16.nii.gz", - "label": "./labelsTr/spleen_16.nii.gz" - }, { - "image": "./imagesTr/spleen_20.nii.gz", - "label": "./labelsTr/spleen_20.nii.gz" - }, { - "image": "./imagesTr/spleen_18.nii.gz", - "label": "./labelsTr/spleen_18.nii.gz" - }, { - "image": "./imagesTr/spleen_46.nii.gz", - "label": "./labelsTr/spleen_46.nii.gz" - }, { - "image": "./imagesTr/spleen_27.nii.gz", - "label": "./labelsTr/spleen_27.nii.gz" - }, { - "image": "./imagesTr/spleen_49.nii.gz", - "label": "./labelsTr/spleen_49.nii.gz" - }, { - "image": "./imagesTr/spleen_62.nii.gz", - "label": "./labelsTr/spleen_62.nii.gz" - }, { - "image": "./imagesTr/spleen_53.nii.gz", - "label": "./labelsTr/spleen_53.nii.gz" - }, { - "image": "./imagesTr/spleen_21.nii.gz", - "label": "./labelsTr/spleen_21.nii.gz" - }], - "validation": [{ - "image": "./imagesTr/spleen_22.nii.gz", - "label": "./labelsTr/spleen_22.nii.gz" - }, { - "image": "./imagesTr/spleen_2.nii.gz", - "label": "./labelsTr/spleen_2.nii.gz" - }, { - "image": "./imagesTr/spleen_3.nii.gz", - "label": "./labelsTr/spleen_3.nii.gz" - }, { - "image": "./imagesTr/spleen_45.nii.gz", - "label": "./labelsTr/spleen_45.nii.gz" - }, { - "image": "./imagesTr/spleen_32.nii.gz", - "label": "./labelsTr/spleen_32.nii.gz" - }] -} diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.py b/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.py deleted file mode 100644 index 26e34c9ee7..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.py +++ /dev/null @@ -1,29 +0,0 @@ -import os -from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser - -from monai.apps.utils import download_and_extract - - -def download_spleen_dataset(root_dir: str): - """ - This function is used to download Spleen dataset for this example. - If you'd like to download other Decathlon datasets, please check - ``monai.apps.datasets.DecathlonDataset`` for more details. - """ - url = "https://msd-for-monai.s3-us-west-2.amazonaws.com/Task09_Spleen.tar" - md5 = "410d4a301da4e5b2f6f86ec3ddba524e" - task = "Task09_Spleen" - dataset_dir = os.path.join(root_dir, task) - tarfile_name = f"{dataset_dir}.tar" - download_and_extract( - url=url, filepath=tarfile_name, output_dir=root_dir, hash_val=md5 - ) - - -if __name__ == "__main__": - parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument( - "-root_dir", type=str, help="the root path to put downloaded file." - ) - args = parser.parse_args() - download_spleen_dataset(root_dir=args.root_dir) diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.sh b/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.sh deleted file mode 100755 index 16c0ac61a2..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/data/download_dataset.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -DATASET_DOWNLOAD_PATH="${projectpath}/data" -mkdir ${DATASET_DOWNLOAD_PATH} -python3 ${projectpath}/spleen_example/data/download_dataset.py -root_dir ${DATASET_DOWNLOAD_PATH} -echo "copy datalist files to ${DATASET_DOWNLOAD_PATH}/Task09_Spleen/." -cp ${projectpath}/spleen_example/data/dataset_*.json ${DATASET_DOWNLOAD_PATH}/Task09_Spleen/. diff --git a/federated_learning/nvflare/nvflare_example/spleen_example/resources/log.config b/federated_learning/nvflare/nvflare_example/spleen_example/resources/log.config deleted file mode 100644 index 6b9761569b..0000000000 --- a/federated_learning/nvflare/nvflare_example/spleen_example/resources/log.config +++ /dev/null @@ -1,27 +0,0 @@ -[loggers] -keys=root,modelLogger - -[handlers] -keys=consoleHandler - -[formatters] -keys=fullFormatter - -[logger_root] -level=INFO -handlers=consoleHandler - -[logger_modelLogger] -level=DEBUG -handlers=consoleHandler -qualname=modelLogger -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -level=DEBUG -formatter=fullFormatter -args=(sys.stdout,) - -[formatter_fullFormatter] -format=%(asctime)s - %(name)s - %(levelname)s - %(message)s diff --git a/federated_learning/nvflare/nvflare_example/tensorboard.png b/federated_learning/nvflare/nvflare_example/tensorboard.png deleted file mode 100644 index d6407352d03e5fc3124de186d2c40ae2cca78bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98125 zcmdSBc{rBs+cv66l+014GFHY&$XHS+L&}^fAt6I4^H7l_giM)22qB@!JS7PUA@h`Z z9?SIYchC3xZQJ|3-|%j0t!-^<`Qv%Q?Y^(;Jdg7@_G91or#|P`4t;a^ahIm)RPbv` zSq|2!cUF@ZK3=k{)8+k`&!uLZ&^>)DM4?5~YK*NQG&R*M`PWL#!ba@OdfLH|yS^Jm zh6V=p&8J438k}P9yjVEZxWE*A`tWI7&VT>fL3)sU+rPdcB4!}b{`WUVW%oUI{rfv& zrvK`%;)}X1W`)%8mqtWvK?=5%g!hoi!w>pu=}%p7+o0f3@{s2VuE9RrR;F z(`~>1vapbGE6~F;g7BfUP5p;=MJjQH)UNJ+tb-pA^<8NT^xQ?2GCDp!u<%=7UtjL) z_J7_?{)~O<;gH(PmoL-qId|d09@d?LdkKHxI{t_LEhWiLyjGG$)xaROvS04}`ClU= zqQb&uc02J3X*yRKg*OiOEPIThj0iMQ+Pce|}E?_&^td?D#_s`{~G$3{&E%jv1AyJcW`p^DeK zr--zP5GF=_uhY}(K7a1JUEuhYi|Oy8xQ-vCc26mPcxHBTza)zQAK$(JX1w(HOA`|l zF>&z=7cX8pN-Grkw2vinL89F^z2A}C@6jXT2y+_z_`oFw1_nn-md)#Y zoSeI6L}Z2Nmve}6(I_W$c&%?KK)AqWv9<;ztyH9pnGrY0t@Q&XvYYinzH=`4S| z(b=*cjERZClGfMPlf;iS#?kNJf7ij`?8I-;lzzN?Z>{qIB9u+?9*=k zN_s=ra^viGIXS(~dnN8o8f9y5+qR9G-^S9i&Ny3}_s8cTc3(L+H@9dpw?Fo3Jeh{2 zvDL=Ah>15l({8TL_VZGavq&C2a>Sv(!h2}Q1e+|DLQK2vvxDd8Q3Vy1&AFOGK4b^k z+%rgNxZY~N85$aLAKp((`#du8=B-=%dQw2CE#WTE*$PUV~1-)Ey zU4BH)?7Y4@H`bi8;8?Vqg5~w=*Sz{47f0eeHi_~KFI_4#&Q?-VlKv7vPe(T}+g0UD z<6ET|!o}+Kv$Hej-8<=cizfjAX4%@))6+9~WK85E(;jn>}fA{X)g$oyK%l;-b z4!Pg!_iq0B8mXwLhy|ayxn?iUJT1P-S@QcABk@B!ywPx7xWnDMW8>qoG9En@6~>e8 z*}Hb_ikk~q_`SZkxL9y!1eYl-KX*xKmU(!-@g6$VQpiRm6e6Po|vBg zq)N4W9|MQeGD0XRDe2LpM*@Z=RyS|5hSWYJ-gj9`D=RhCY2#1c^XJd;JLCt010$_J ze{xfj93XoX5D*X@%`}&ePaR<7+vEN2W^?j6Kf1Z!uJ=!SdR*1l=i}qsXjYY}e{u4n znp$>A$>!o%GrfR;9ErD=mzbDXRaI3)M1;1swy>z^;EkNRZ~-kXEdg%s`Gtjv$w@hq zCUapKnNqyzF>dZ3KYo1r^vR&ud8sz!h=4&+-@Xp~$Z^M^yUgs*R3oW*JDC zexcp9%lpNP7y0@5=~`I>e1qF@KI0@DrpH^;R}<6I(|vq=9z2k>ww~@OcIo{2lTtP; zEDWy{IdQ`B)~#YheWT3Q`uguXUeAh)i{s+r9zFVm&z<%CCV;GXXQbhzurR7ZMtb^{ zD_0l=jd!ZZlN{sW$Wqgjg67SXO(WgC^u4Qzg?xy@2L7BDypuo?$)hazV4L4 z!Y!#+Quqyu+P{5!R@vWG;wHhyHh?WE?(Atwl&}B#6`!3HAD?Z}nufLEH7sFb9h#ad zHm-hBQ6YQi&>;r@UsF?3*FTY+J6Da>Y;SM3Y|A`Dz&a@P=Xo*>ioXos&N3(#$I)DI zNatyKM#;yQQB@^3Ft{|)R#;ew+OTW;8B^1w(}xd;ShdggSGKmc9+GkILLKUr@JGm^ zs_fnCcjh6nl+*mHw6r}Q>Im!f^vb|HPLe%_9vgVQsg;$LnHhqGn}=sE%T{of*w4>z zrngkas{Jj3h2)SjCuh<`Tb7HH6SgH<%0=_++3Rb|Q>(s$?;Yoik;QH_#@;kH-$_h7 z-JYG8nHf+wtP*jYm5nVSGn1T^mWnDHFQfK-9v7FDlCpv`p`)uSa`Gg0Ix-^S=&@rP z8!NqzD_3=OS)^T$^6*%inc-gEHZ-WXzI*kp4izPB{P1A@HwZR!G@z^Q} z4*vdRKacxr|86hJNTqCE+Hmpw zd9&a1!~XvM_Tn4qStYu;=2WugRgbBB$eG{0eY-l5RoZU#J~8pSi3x|dY*TCNK2p-A z=4MNCbEKRDqSksIE5$e|si~y9rDwM|sK>B*zkmNGiQloC+;yQ|v@uSm6dyH{Gv?pb z-Cer1>4IG@beQ?_`STm?Y~zhTOEZZt8e$}Tc>E&lPP_g%VfGbOuw1QWc6N59&BZV{ zj6Lmkf0e7p^U%;au{Y!67Nm@6F){kKwzJ>j&o(zV<3Oe;MN+e{1W=B5FOw*7(XcL7 z(;I%St7G@FLMUJAi_SV9*Agq!Xo35>*<}IK7pL!dy^|m zuYiq*=VD@$0!MIUWCz~v56QYOa6)Q-}+p7r*NfAi+)L;7piu5G_>gnTL2Mh1Aa ze}AZ#mzRFwz4}8gMtnUnUKV& zgolQnJbrw1bkwt_FD}}L;!vh`c0z8hx{gjqWhFZo*RRp0L@BPJt8b0&fB4|w>MEJ( zfb6KM+W7tZW!K7DqvLe^dXFjhkdSC2Y6hzPkZ+LhefBY$nVOz-UNk57$uTN_u%Ab> z&zD;(%U}a9dHk5f^<#|q-90Pvr%CJzx||k%Ik~uOEqB`F>#%th6%`$&y`ZG@b$P0D zV}0Gi!opTQ9>-BZQL($&#i9JcE);UPmb16JySqiLyAE%s6JtU6ddxaX0^v4t+1SkV z_4W1K2yvv{vnw#RJ^Ol1rhei2`ufi8+wOhS^1*!_wPl-WBB>_{5{UG1(}$d z;#z!-`&e16MAm?u?%lhGs=KnXQd5dv1Iq{ufEu+tH>Y;xN~M$pEiLV1p}v40D51s0 z`YI}!h|+SSBFDMytQ<#<9O2)cRp1yab*XhsVu_k9kYyhP$ zVjZ94)frz>A}xDVK!74HLN!*>$9~ScA}zft*y)_%*g)Cgj^f2nqOMdP*WRo z6Y)(+Ong}QWpH;>Rc&TsB8u*Ub-Hh5ze2>x&4U60lq7(G=L48hk-j%ygsq0LC*RiL zrHhW335$-7E+{xfwWa&sN=IJaCpI>A^~ZzI@Ni^v>yCHl@T1kiq?a!}2gi(6`0>6H z5)$GuDqJB83k!IO?TtMseK_Vl9-4nQo>)D%qNzy@MOs7SDF~|S)1zo z;7wyEw}XDi7O#MSjj8GW0|&%zG(;b}l8hd-f9m4Ji-4m@kMeSI9GslL*Va5Xmf8j` za_W)o@s>?&nsuvwf2$Lr3S9mZ*M;`9Fc*=s{eE9Z4yv9MJN2&Z+e%os#XU>97>-`U zu++U6XX(uwUZf11aTKoWpPr&PJ~P>y@6^Y|8qLPZ>FrUbO#9)oD_dU}FDp}pgwy;G zPR`>h?BRgm;jQCeQ6F^;4YLvxX(%ZV14iO-Nrv;;i7?B!OCC9LV|lW}Ml#Ad{2*)Y z^%`=vUkY7irJWYzbFwtGIV>dX0&*Js*czr-8RMbPK}S@g4~W|XWm{`#ghu>eW0H#y zwdwif&uD33fqPq?AFczmQwYAUtNZh3p5-koE8C|#0(Y06l6LzeEG8DAO}%ML*czj< z^E{NY+}zv%zB2-5tYenSz@Dhh$S1gWE|uuVrS%_jbCH&j*r`mNJq$Bmy?TX~Yj&%# zrRDiiVt3j{Qf_}1k)vo!R+`(|05C`99LvkgaXrspF_PFF@udV4u^M~r+siXR&uIQT zIy$g|1qB7gqUS(en7l*Eu~n0QdO*-|*2sJ~j&ApEpHLnxXGh1rOS1CvyECn84QUoe zo7nloQKNusC}pvEz|JJ`e@oGAuWzr_5^YPP02K~<{rvgUR`fQRPi+<2tkWc@Im06( zXy&(oN7T9V;^VhDXsizS3CtQhzFxmtrq4Zlz(vx@f3{;06(7J>tEIzhWM{QYjnVPP z0qS{qd5+QH$;oEOEBEfbKYiHT+`O!=G{vGqe%@baFhC8MEMLC$>dLC)k$-kb5eP^{ zh1^%J!iFs9ZF~T;1Yj(#H#D?$gz@wrNk2wL#)}s&00F&ZyCkdN#fCPEBeE4=~XsECGu1DAD9IZY}cqqobQl&z)di)tnnVg(_`t<3> z+RC8fB!HtL2X#~R%cP`XzE2Mo6f`y8r=}|E>b`h<#{S;Dff2R*19GDK^qvBcn%0F; ziCQ6v+_ba|2@O?NP%yW#i4(cSK)ps8dLe0#1J{k54jdY-d-s;TNNH5!q+?J??ME-| z*s+7b|GmeSyRlgb5Q$_jYK+y58!59Jm$6ZEMdYsB?!Sk_A3uIH`pAXGaGo2S-a=TU1ok-ksa&{6Zrl z@@@NN5kud;U844F$vPgwj!_D1K#&F>u2aWWPyud&HE4J8ZMb!ygJy!(|a&3MDdjek0AN>7T2 zgaN4l8s564tf=_=alNYg@Uo@x^=|^Dn}5<{V!Bb5lqk@KD*Y?q%mVJ=6t!kjLilBh%$-dV0}uaWV*ivp(ee>FI%OK9`l9K6`dB+|d1g z8liVDlNY@^uC6vCSS{%H;K6n@zYbBUucUaDl$Ei3AFR7CBsL|h#9Y`(wR8J67Pk#_ zai2b&cXIlTv%b>QxLxMA>*A=|)vJu*b#9yMzfrtq9c}c;)?54Ux*oz|r zMOXH7aB=Zt&+I9_FDs-W*%_v3!z=Z9`|@7}#=tFSJ0U%rUk`q_eo{`T!Hz}brz4C@a* zu?QS{rUy97@(|$O7NiHujb<=LV0h$Wl%aMH}f=BNQ!WXN=$hP(m6a zCMHHtxmte=fIi@mjKSs0AY$@zb9*9|4tcCMb$4f^rh*(Co0-|NJG&!+n_lJXN=i`? zlj@y9vw8+n#&KVoBMosfz1`jDK-~sE?d#&%9Y-$p(|`gHu*@SKT$Kuk_0QZf05o(J zAKtyI@G#|Iy8f3foGnRx{rd62Io8b&HvSy_g(7Gj6%;=I$heASeDL6bo}QlVA22}Z z1%9-)ata8@n0%%r_qn34ubgxlwFy_7fWqd^v@^V}*kLC2{{3y!m%q2R-W_RR26kC@ ze+EWjU|@jt?4v&Ob1p6}_@Sj``su@E0-UT|?`bv2*xA|pr`WxKWs$+$Enlu~pu>0h zJ#XsZ@BuXwH40D(Jq6NOoQ#LTl`Ge8-c;lYL5U5x0$eK|lZiBC($duh+UIk>?PrsB z$Z7B2FJE=2+f7tt!^+AEx~FtwnbDneFHu~km)Fiyr%n++Jd<=e>D4Reuhf5u*;&#t z`Lcxcbicac+hWl_erU28;f%y>BhmJ3B>qdf63uoTu4Ef2|KRNGyxK}k{y-)O~D^A#nS@wX7D@xNcQ0xR)5=;mp^t6br9Ir+jifyrA^ z*H>KE_X*_}*PepHqR4vs)7}4iHPM#tA$x_#*>BXNLoEW$&rvK}>L|ZC{_>Hog)fI!ycO`S4?YNoN z(#yNJwB&&t3~> z!U*A;muGezrG0`wMYj!Vbo-7SV2^FZLoXngD66P6eEs?~AV5S|m^O~zLgG+UO5O~b zM|9mi`F89H6nS6fc5Ly@;+k@t5VSYYB=@%G?KcT6P z4Gj$=4Ka1KwP@>}78gqemE7tS>8~f=wX1l+?-h`Qkx^fsWt;n-u_LSEe~<9D8izKD z5dTnWjdg`*J(I2GnipE!>&p*PQl91t!ExKQy&RYTXEio1Zc8BT;vUmaPY8ScmIf~S@gn>8QgFxAV;;zxYq@Caxf_R{kUA3sh)Mh0A=2pqr>St9s#vD=|{sv{@m)hiP;y5O*`=G$IF zGM9zQg1=cp?RKn1dtO|BAW|F zesx)y4h;*#S`@cQ1qUk97ZTwP0f9i<*yUn5U=S8g*-J3pUOQc& z*T5|jaMjtfhoqdJqy7R0jgB6@mOS8wlMOv4H8m9%4)F4~AGN`S4wpaNeQt}hKS^WW z?^R%60ac6OI1ru9YszH_jl}`ZA3oD zfhHr~!77*1j6coD$e@x%O8}sV-T)W?hq99K)up4nbalPGGN(@cUYjYU@A(CG_s*R= ze7wArvWPhx2rRdXqT<}*B1cISXhuhrWb7T@Ku%otbAA03b{=hpot>Sgrsh`a0U;-B z8g2=Y8y|(;6VtzPxyg+iK9pedz%?>L;P9(vzzOiF^nLpD4Yp@Nj1ildo<69;|Ni}Z zRII&py!p;c7S`6*mo7bn-qGWT_??~g|Gh9`_|g8DfWQpOJG*=U$Ml`;+qXkWxpMik zq@?7gA^TYRY=!0Yb2{p0H?*Q$$^M{;MdT7H3nHrCd3IbT7sB96b*)p6== zX6To?ccU>`HNSQ(K0ba9ybkp-dvU45hx^cB0?D8xquLuch$+5777-VJu^RE>#h-f7 z-p9JDUqX45xN_v%NYyl&N9d~JmZ}UUCMLkF3{LbT?V+ddVOs(JH`SiK6nBV!B$QZON5`6*n_H#Nfwl_kho+fQmi_$G(dlVKMp#ggZ$QBGReeqbO)tZ^mb<~k+B#2j&*_;9kldlQ?XO`z34Y@%Q|IXff$0Q!RdY8qQa8A7jt zwpdP1ZuR$XD#IJVr`VAi6QQ{pX)XG@h73p(5fP)meuc%xvK%~^3Q17z^6fi!!g+NN z*3<_M90g^E3kUy3%z&TbCO6RNOL2DgEag14^K}UXll|S6w}h4P|nZJ;!XDK+4D2^W(dv}hxd^$eZPLazg`mn z?JV!Z2On?mrSx52YHLYX2CQ%13W>v??noS(`#yVWO2S(<5+Q=K(z|jd@p39s6HZlrH=9>rhgB7dRO)gE7QP33Dkw!#H53b(Fe-{i z(Q+~pW>)tC+4f1BRDn-?D5h6{pLO~bg03p{AAGpY zZ{^;?S=Q2-JaGw$IS0e_hX)*!m1t;asC|)P90=`zw+jjea<3l0!+1+77W)4E`{-tn zL;L&tkyj3LZ3pV%=jLXMUBb2Q+P!;gzD@uiv-)1|;>8JU8Z{Vry+&|16I2((RQIrpt4VldlA`i_Sn$Fgr7I8d|0*I0Q*2 zq0LrE4k5w8P^DC(#Rv>_d^{+QLTpW8A!x+vl|oQL*lKjK`&GI=*cjrzajE!Vbgn2} z_(O_A(!8L5Q#!5|Iod%u*VSd1KG@UVF6Oc6>dHe+LsMxY1Ub)pgo^fx<3Q$1WPAXY zb$1L38S-y?gJo&7rKRj@|5;m!{>DVI~F2264109ZduJv;*0 zf3R=(cmDns{;1KscWP>C%>ECMuJq|L2no4pQy?8xXg!2NiDY{zb!&__IWh4BKqF*Z z9Hi&r;WoV`-7PKlkj)bs@+k~w64I1zBYmO>Ixg-b=a-Y0zbF=@9N1;kl~17h6}}@O z{-J}p1z77Y))aal)6hqk6(l-fWH&+87Q#)kr8ZIw(lZ(9i=H1vp0*O?v5{ z!Y%ow)HbfOvl9drwr19U1-d785gc7ok||g%+0X6m`3VUR9FOYi=_w^$URqq7RkD(@ zPFkMs?)?7!Hgur%?8L-DLZB79d_b}@FfhRW%ne=AK6h?cNuITpmHnMNd&$W`1(d1I zBF&ir}yz7L{|4C;?w`>)5isK zsp@Hv$g|n9uaK}x+Mbt%8VFeXNotm~D&Er4va+)(C^<8eALrP~$qA{(Sa;j~)3#`A zaZ6}BMkZ$6!OwoGF))9PB~q{2_o8ospL2 z?03qodT8_0kJTTM)Qnw_h``qf=09p2p<$kY44)n!F9^pB+5ndD!{k0^l|FU!^r)}} zfliAH30)4jg@X_Ndr*cFs^NJgD>Vw4e(BdaA7jiXNDAoK^nYMQ`@u zle~ZWTX%Q;@NIww9E?9}t)>0~&yp6`1l1S~zhylIpVU+-dzcbzyRWX4fB@vOVA*&R zGcyo);f*6vk&*sPr-Y6keVvm-Lvfu8N|V3E6ZB(F*4Rpp%T4T~su@X0U&ajz7FJaUJ3i zxW~FMKDj;oPr;=Wa`uVTJ+Gq? zr)Rgg>zbMbAuiVlqSjaSF3nB(%+5=)WMyRRv++`xnVt>{4z4J;BNok4=XXpp+W{#D z94d>bb#z9?Ei7Gqlqd=|uajSeRHLu!@bEBX59djj>(>WyHle4(5rh9i?E|8k6H@0s ziR6z)5oy0-MawPOucJYJ?$~spZQ}j_3y@l<|2ZqfYk*$;=Nks+U_Kx~MUbuN$9S|d z`yTmsiuhDgk?chNLF83EF%i=FdQjd=7Mxg|l*=Oz@7)1#N-j!sdaF+Lq*w$tYp#Ak zp7}a1)!@uzvjO!HMBD18#GhGRhQ-ccfmC?~Aa(s&vK&YpihT0!S|u?m4h01Tn_0_Q zBw8TtYNlHW+ZIb^m!0w%7#V9#gzQwHq8Ng4SLY6`H_Ot_28mvBK*qi3!-p00zLHW> zYfqj1Kq%q}T})|CRp*XWdL+$2NGz*fJLnwwg%yprfs=zpu(BVSb5E(F3ibXB$-2$P zLY<~B6I$mvsC{MQ`!t|J!<_TF6)kz5Rfo{YlX*ZsYN;(yrN9Zi?U?-dQJleFQ(s@| zMgtSd!+P`rnC78{-$1;MmOv|26eRH=OVJ#GP=ZLWyDrQPHGnVFzGirNiSeg3S#w(AfNga0F!pv9iYe`Obkvu7WMhVGwR zcLD}LGlT6%`U5}#dS^G5%BPdtAKPAtlL8}9SCLcB+qbhgS(4CYag*TvIIPqHS)^{; z*|C1PX<^|!{3TSHaX-t`!Tx?Vya3{Tct^nV$4#iH#a^EUqGLr9|d2|_YAI~zQ|p>0mhkuO6VR2Lmc4C@YvcA&HgwPxm=5F0v4&O^Q$+bx%xIQPakAA_H(w6R!XWE zbzU#DLSADvkldQ6B9H5rEnbUOnTIDmA%V^78<)r-_naV1$A%gTs6biOt; zu%P{$4)v#mR7h}37#Y39LC?!udbE!bNBO7)**z_-Hc-Jq(a}YyO6G>BRQRu~;Jpvy9ln5dWKtiwr$NFKde08_Xo*TcfU%!r~2d)FyEZ$^f2A=293RX&?YWfDH4ssJe|P!8al~vetmH)3Ho~v4-Z_058iP2Fj037frpljxbYH_6r0cYdDS!X6E{~8=j%*vV>9!^S3gdgV-B?GP*9mV5n zurRoAG^c~3qwuf!(qPw*D8E>Qj|d)PGz0irPgD6Dj@hm(Yy9YsM@J)`J)6BBXmH`e zm)x7pfIR?%-p$a{!0mj5XbN(Gh9(3HJqL=WDpdX{DjZBge^ytub#(k0PI9Azg=-}6 zkjy77;MN>~wu6j}yLawfjBwDDO-M5X@dTh5Y;yy82r@&Jr-0Y92M;Qc-QY9mWpjY2 z1nO+i&2@FQA4^ZRZyz%g6ZHRMuGJGUsYATHyl9l@7#Mzj|DLdHND>bU32%b}jO^G{Nd zcRGX|sMB8LiRfrOJG< zf8lI1M0eokwgDx?&I#SbNPU#UpT(P9F`YFvH9b9>XmIoeMg z_y-Rk)|%YLm1%1qV9~<8+(B{2MnSh~X;Ifx-r!8LnC;t3Dr#(DAr5H~(W)i}*|)j6 zdKl;4_|c&!U%Jc7<8yLOz;AV!(yFJ(36v(Bo$$Ayj{=XmKO}WXPhUS(eH^5$7Y&xY z(k!P9pMi@45`<5R#YV>M2n@{%NtXe2f#;jQe}@wcR6WrC8@+(qiO4A7tpjF8zX}9yD=f_lF8??O zVJd(q&WB{oHl+lVjAw?d|2ghD+oIG`1k=P%Zmu`wOO}DS{V|Y&~0b-Go%o z*Rs9uihN2lY#WnaFt^GTw-`kdu+ywzdofJuhEm|{(kJFKqpi`&KR`&`k&y?PnQxh!AC=Z`xhI{VYS|0E`W_Tz zyTS8p0N#O1Tl&S$8eiwPzP(Zm!C(UNlgle~s|5F}h{!Utravx(vGD=;gR-(RY0F!n ze9*kTfIB1TXqtr_oTy6+3lg`7NP=$9_MOobfGfhur(mUF(LemKqL_pP9NYXyj*Ni! zUtV68`-3v$wZeJy=xDbA2ikS=L(AA$$Ry^6$svny&g-gTA-Ma%V?xt!4L&1S&6H;zMc>D z9z-Yz4XH4lY-4Y52(W$vd6dGdvyV}vZxQ6NN~Dk}Ooad-D4DPpzPy}j{Qcam-OC%` z1D--$WMpQRvKx@=CmIm#bsgm3K=DBm{W?EW1?Fu|g$nya+`w+_>bp8!ID^Wo%(XT1 zMEiY+qmB9JBh%YHFHGfIve=N~%-jn2nt7 z%KrDN|dw^{G?ov5BUO#(cG4?f#SY6wF|L7y9WMZbCkgMe*G% zMlwJhZ2m6p0Jn{cWRY=?j*V?F5rQx5XptufQLk;!@81M@1n>?z9CE8PIszEo@D?t- z3+Uq@_z*@Bpu35QwRd#rsHuU6g((-6{6)2~hL)Dkqer-Lh=582$)K#{A~cs@$mMX4 zI81j@so0>K_+zNY-}dR#FEqWzVOt~EPfA%DE~Qbbx1)Bwn^bB?pTnC3BTq=(Ftx97 zT5{t>(0SFsxj-pi%}`O|_C$)`wZM0QtUfj|g|C%*9Z8)NZAv#p0Fu%8fjh)`1$W5# zCj)jaa91x!OF4>iFE|DrLxNlpmXC zbt{HXu#|B82=@9vsw!<=-GM3)?Ko53j~;=7=Hlc;d&KGmv;ye^4oi$b z5mT_}X=~>@%orF)VU1ijw>~x=_^VFgMhA^9KsQJG1hN`+l98776$n1jSbU(Q>vaHO zKr*lx5}*;W6~1fHo}Qin5@5DK7xXia<@`^?se7<>{@2AR1*U^ulyQypp#;eubU*3T z8v6Eu!9fH_H7`LK!bHpb{B6>34@O_8Vb#+Zh zNWk0$>|XeXx`qaoEG|(+MFls2o(1x1$g5eogE%7hz=4}LCE%^zzJ2SScNJ!YwyZ6B zQwZw+9}%jCG163eZW_lL{Ex8^wFhai99A0Bshb^tg;4=8)+E}zz$Yh8EI@#T-<>OM z5S$pyR~W-13>tx3t*ERFWI8nf$b-9Pf5w;WmCzu7k^l<`st6RA^B&1pXm${mf*ZyFn8rV;%Rfod(Z1(5m(_ZcRGV#GDhoMAnF{4JVt z85tQ#NmtA=RLOY)41l4l3K2xRjSqr)#wjJm+#80~?FL(g{7#q|+gzK8da-$8&o6Z6 zD1fN$N?b^W*TD~v#6y&EadsvQB#VduWkA`1vJPegoC*@(@X!#3pLXxs)h{8wd-rbc zPzHcCU^b*E^jk+#wv-kGG4V;~=Y5F5Pq(-+v446x7V1By^t7}bKv-Z9P9;|I;MO>l z2aG>}oJJA7q^Svk0#nG~E72b!rAvvsfGB{i|M}yHXSGAf1}OJ1%|P8jb^@gWuN{IG z-b4*eO?VNIm>E=aKA_Kszdbisxa&kwcD5bT>FVYYF0MzlCSl>>dmGu0CeKFPzkdel zA1(!`(cqTBux12~XdVp%Wq^nXg|TW_dzKPY((fbRgofB|T*k%or$oKtw;8d-nE( zfP*Ovx_?7m9mWONW104(zkXfz;RjL~bT-)6F)hAI8Ve!@=_4&|97KROz4fhI`bCa{ zvY)G~&nYYO;jqbs%Ewcxo{5Q$2GpHxOwgRki7G~~9u!0+C@LL#p|z=rRg>f19#*g2 z4U4svmDfQ6`O)!>V@&nf|I2C>h06cqYSo$2hWr&d_0Xj{Fzo4RX+6d&y&l0XGZ!zF zLN`M=e8|hAdT6=oD&2&+)b2v8DeyIfuo*kj0b4P!c5IvPo+)rJ`2V>6^GK4!^t9~ZB_S&IE~1r9w^({qVUm>dN_K>|Au zj_>x6f~1LO%^<1AM71GLQqmg#77hqVPAK?_uFV7q1M|R=*DAa)F7iev=Tlo-c)rZ< zUb~b_vt}3*#Kc!V?D2pbkPRh&Fnjb)ZFpTdObH=(?~3@RUQ_f?nCuP?4fUoum(gIdu?@FWA7l!cqA+qX7ozwT9-4?tXJzqNg~ODKV)IqkW)`llG43^l8Ngv$ z4?Q0g3i$SrIWV22Xuu&7mGScBX;*MrlWw*c42Bkgn%mRU1F5oqc=()B!x26{X5=?O z&#m=^#)|aCNPaVkL)ABOW>927{K#x9Hv62iHW4})c=))82m<_5V#4E^u>r<{)k}{t zkBj-1SzpgAmg2JtTVAiZCwdKO_m~novpW{9o?UB2JD2=0NsU|pmR9cEZo*_nT>gjV zLPD+J4+j+|VO&LW^=hXETu!ypHagl3;**XExOt_Ub zYb!;I3I3(Bu%!ghQExWb`3g)PRHeZJ4oX>oR#)k`10!9P04XbAgaMroB`_Q~fZh28 z8yzNc^z$rQv5TnqJWQ))=bs*!Tb;Y^^(-&%E)MI>o5$iBkFdOk?-$%Z)Ry(2^NDUN z-3}lOLH+;v^9O+jI~~58{1oP*z5aEM~Go56pXZcwO4d_`K|%*Mdvq$DywJhXdN zv(Z_?dZ;sCk(iixmTcO^@0rdFwWfv!m}{zVcC4qXJMP{cH0H`ougvYC&;LlAf7W^k z&($CzBGF#F+8?uryS$p{1v%#Pz312|tp-fc}y9Vog8pMZb{(7I?h&oTQ*!+EC<>ZGPd-q5fY zrAb~MCw?ERFx;?Fix;=+{C*)JI^A!NBEMN}M|;+gCsLY2E!Neufv? z9YDE4KgJv$$ZKGANDJ82R`vr;?d^`3wqusK7l95dB4T}YFc3(NEmP7MA~&Jo07L%e z3&?3TFzMLz8nuXb?*N(quL>r9I%+MP3iI2qYHM3{zULDb&P_`4Zr?6DimHqmM641} zLhSKt+gUUg>2_+Aub@g0BsFe=KpWxk+ZT-tj$>4ZZ4nIFnfCGMvq73 zowS4OEmJ;ehrO)nO-fVdNp?QKVG@rCkXP;ccsCvV5^PbcAE4qjHVPa*e3*+X8G}=( zW58kd;`(2s_5v@XM;Ec_S;y0C;I{+8ZVmiqB@$I@LVe|;x~3*F7zQHPz1(4~!Y}); z+GE5Ut!oL)!8oXRnuDSusXWur@Gt>p9XX<C*Aev}zwr7ln961O$Msh6f33ke2=};ccSymb!1i<+irtP%)n8AQII*^7=K_%ewt7 zo-6P`i3@ZDRNfWphT};8`H(YkJwlOs>gu#~bdP+(@YI!P3?oCt!gGKyN2+zj!#9lq zhSb^`b~sQ27*388<`7i?UG44c3hV}n=YHwd-f^(C9i5z{J&{z6gN72d$^WFUaQ-HYydzt{VJ5>% z`roCN^lvbE$;LnS_}#nP|GwI0VDTDxVA_Q(qD`sh8$!oIdK9*^k{0jWc1~?_-~PRO zepL6|)6(DHy^(Rtq4lm-H9ws?FOTt=GjBZ;4u8Kmx=mJLCh|pO?em4T!AF#`-|UH3 z-C1INA|+OO3Qjp#-)@u`DatZ~sS^Wu?sYagzN4?NA3sp?XFR=z#l@=n$$l&U#Lvh) z79vr~Tp=ncSJGSGoR9@^C7-1d@D|T}xFa5e#Q&uk;rZpumu)+UU#oMcx9VQGGPva2 zYH=4hM^^U1?GN^K!y|$1xt#UJKczQXqDHK5-ifX*csSVmLXzXl>kh4v7jr9X1RmDH z;z9Y#S`$>hn=GSv7>hn0WHdCxIoiBvds+!8 z-q7$64b2rTt&}2KlAZ2}^Lob*@bd8FbWTBi;O0&{^%68K=ETr+yl$C){TBd1!)md} z1C+0?d|PZ_*9Bz*UAdamWdjc>q>XYPVDj;C zz&lUxYU9-O^aV%B3uYIh>glMc;xDH%k;|jMgy|bXy>l_TVv9U+etvS#jI_!3goa0|PH+H*Q!8zks@%-U<+u);2M9&*kRL)L^m%G_7z!KzC+k zJ#(SJrdRr5`Lo#AO~&j4K9xbi!3k{>8Jg*B6H@lecR{}6XklqPtgNAD@bFwoV3dxt z0T!Y2<2-h(c4Pq!1(BHE`-^M|m(22Xfz#^m9fq4eA(7YUnlQtXb8)@di34QrrKO<3 z@Oe5t@KbU=iEp*2H_NFTz6{lC`OWXKpF9E{qmkhP2O^zxOOt2icuFxPW zFfcId_3KO9>0(|lV0@hLRpoik2fGC*i9u61$*@3VXTO;XtEA+Bz|GDkh*&wNbgf%2 z8E$;$)7r49@GiJs6UZWMYp(11>Wt;W>in|C=HkT1n5#c*41Yd9rk`~A7%MRmcjyI0 zfs|M0Kwnw+#6Q2RnE1MR3=;#lM52QAh47%Y#$S}Oxm~R`&+D(ulf0Mwb@qt;(HV1L zhNy5nmxqU<%lbpjV8_S1mUW>!?t2RPc@bg{U(W1CYM3^>SBN*d+`iqj-i(Kj57fdw z3JR@Mbuh=b=u+BC7AK}ImTtbS4kiRhS{h+?U^$9g5T+wx(~t6Z$hMzG$TyEoHm3xZ z8{s;19^}S|$J}K*K=z{km*zq7sOy~nERS4^O3chfoXgV4N5I2zRl) zskWTxcAws~%pm{z01;>8AEZQ&+!3VYg;_>(o71#Q}F4c9E0I zr?+ymOF)T(Cj=qy?p}g0>-lMxa|+J_snb9mA=xQT#jlp$O6Pa(;3;Y{;?SxDpG>+# zhYaxr@Y&vOp3{L`_58IQ>?wySu{ZY$yA85FV73S~ZvELmS3-67c`^?pPw1H!K3Yem z?!`4~85m?1G0@YG*ozmgJP!Sn3}EM8YM9cDkU2Vb0_cnIrXM+AFqM7W;6I~q;R3uX zohbE~wx*!4iA+z>F)?`+yor!f!e4Q5ahobHIlG}=B0<6N?L~>3z%#TC3E_Yd&R78T z6w|hNjzCAh8*YiYSh#rI9mg7P+*-kYS&kk2XiD5a@pM#p>0X&^hNh2#ziNz1 zO|$Ah`%e2p+b-mvS3H(g@!3HqOTvl=2NHMU@jFLf!M=RdBe{bXueB!|H7OgI%xN_1 z#7B8Q&uNs7+O`+>AZ}*QYZTu_oZ31LCk}Ja89Jzhc7@&X9nax-K*uy7{{-3eF=np1 z90&a`m{NY?#RrZa_;%mZ`}U4kms1f^Dk+61NRY)Kx>TIEg5NATKR;sXw47WqJ7&Me z)3Y{VeaX|!(9O_HRe!2ONk!Epcv|6DXHM*M95UkV_tBDJE;_Jgq3G=Q0;H*jQyHDzbie3Sek=Ho_XcsLXq_ZXEM&d%a826A#OgC3s|zc`jLco^5j zKH`TeDa~W{^+9_@2(iMP^z-VETqj5G^NB&136Dm>{$^;-0B6GM=3cs$*JiK=GHSzp z3y&~JR*hpp_9od0OHqM&6Whab+wxuXMGFlQxDr&WSh%sSs7jr*?K^GS2ue-Mz-jnK zoEset&5piCkIe<&Be7y|o?{w?;K}*WVFd~URDp+?85dFLh5dMI7M7mzSseGw{DCK( z)`hnKaPAelLCplrbXo4W0Y4gA%gxX1f!H{r2q*vmRFg~2HU5kajZ!NSO39}W+l~ea z=)4;OD297yG2xt_I(I9xLzmrj!N~g#UIdj9;U7>Ax?Nw9)y;)wy6P0G|vpTQat-W)H0+IS}nzBO>(c+dg1?+nQ` z5%`@J*aIbDKBG)*dOi8WN(7o6?4Mazl9f_1P4&*SE<{yY=hCHF%uO`DILQNQFY-pL z6IKLOErSV`9-*lEi~v}oNm+{wX7Cx1^a(R^Gws=f7<@t?LKa>j%=Xpsec;u8YlLuVl7yi=qd5GhDcr8L9giHCd`)n9Giml}jrTUKj z-lAQ$m0$!|9Q(E*+C-vIPR}O_M%9B3Cp`Kg&Sjb~+eBc``+W`>yfrHS(Ch9pdTsWh zf}ET_skU%qM~k_z()Bag$eQbAvPqXu%3PX$f}uN42m|YB>6uUb{dXM)4+icjQYjgt zBq8!K??hzVtSrh0TjaqDwmnWGc|R9mR47@WuVb_+vcoRm*)`+12t33H&s+=&3nMl{ z{M2`*sdFPJ%nd+o3JC+iCSyL0%GxRDBmHR}=SR@aW zVfEHOlx|D~$+O&C_>7!~Je#5%MckL*$M1|A)#ulOKAbK}a30hQ7OeERW9!%IsLzX)A0{$NLh$gLOD^X3c3SI=;;C1m>W!LTg!{z1qYLh@MMqb=;i z{pvYij?MPB+Prw`mUf%S`EHClK!-5{+rN=YN#(jtv? zmw41nes1~;><9$YK<4K22+iV05IF?dA!myo zM_}7Su|{Q%o2!UJTGj+<)JkbT+M;S9hY*O5J+6^G{jnx7L^W>fjA1nsDOz9}Spdo` zKH?X;6~-L>As9EUfaNBToie*=06wgf(e$4H7&Op*%$L#H*kG)oTdIZxvfDDhH%)_8 zNU+2LM(0?D;D!NVIIxw~6jUMvVZH=klJ~Jp7q0xP`rtuu2SHk}OiA|qIh|i#aj{Cn z1NfX^KLk1)%-|Bix1Vk8dh{f>qj+lCtl%jJdkJqI9?3xQx9nJ5-uWL-mx~E>4#Hr; z_N5;!EiEXAW>MV-F2SEH{txv{n#X3bsqv`g&Ncu%8{>?wrlNnQ7ELy{w&}E={-|NE z1njBtKItOB6gdA4@+Cl0D4%{C6i1$)739rpq=O9W1d9?d>N8Dtim8Ym+wnYZNBolr zP}Pc8f)X@-{{A}leN_EpU}um!IP2ioR6#QUCW|1P00v1>GC0YcAR-q#;Ivm<3qmqr z35)-BI}@1YKXo46akObV=@tcld-OdsSTF_qc&aohKt7K@Xv;;qVfn|9K=4bXa_FX8&Bc_Jn1BG6V3+2>%J{6aTyX zi4p!d^gkEvI*a}vQ}ySf2>2Tw{P{Kt51Kl-vHo0&y#{T6(<|`XA{hVIt=W5i$s5+r zf$`p%a==fprH2>na7tNAsR66H;2ePtGg@|J44k(=zn+mXjVl16?BuMhBgSmybndgD zUjoS)=m@Zh8M&Y-WaQ)1${Z=9bB|g&0-+%?Py-MAz^xfnKJ5TcE2p?T$ZY_rDBDw| zWZ(xH#j1@9DKRnKIosx7dZJs(1s2%Ap96jDS4^_SXaQnAE~bA27?cNFTQWc*bVS58 z-Hy2ks883EbC}GB5Zr}LLNW;608HWp1qJ!}lVnFwT|mwd@^|!$FJRyZYC{&Q4&-br z3Z|BVeF{D}9-qPCauZwb>Vi@_o`PhF4Fua4?u#F;FruY5oEvAxn}wxkCL+5eUj3Ow zaM%j}uP6Qg$MyVwdh3RsA@oE`C)FBQCsg$RZq0@cRnvvz#lqZ}5|ClN|GPVg{%G(y zPZFc3PW!X}?AdWD_+dfEPdh=Ixic*Zewbv;GmT+?zVP4O>$G?(FGzaGXkN_%6GC+~ zsK2J5_J8(p@)q;V!saRKkd7tsF3Nv*dEOb?r6woL1>FDsFn{vgifMSNv&=4!{=Wmy z7#c{n_tn|O(6J`+!6OQ2`10TLu-nwToflNKl07z2};XF zJ%r?Vxh8W1nF-)!lEsP@fHZkUa?(^w9p zg=(qKNms7QYq0FU68YqQIJ5QG7x^z^cJ#YxvL6ZtTJZ849frIPzf!cf$|0k^O^b}1r?XLkt;Qi+Ne*96uM6m688z;e2h>2Sk@tp5EEq}v54R>@OkFt9{ok7! z_xT^a(+WW>2vET}q84C8J~2PS^jQ!IAQU`NIW`4U~&ahJ}~0gNVmS-P@Ul!$gFL0MAcI5=HQ$uF9`7 zDV=Ap*Bn4mzB8k0&4p7sXys7CaX-Bc*cZ~K&jN}9-fWq)>Uy5s6kjTUD3p#D`LC6; z8_+v~^XeMvp~*t%*a%iXk3K4&SFNrZf{>S*T2Icle-4QIfI1eILAqw205Bl{?F9Ir z&=7nje%jRw3>;m>Mn%O9egtg{h#Y~=^ZsB2RhtRasKN8`IRCPMcQJr^P%=?1?yOfn zsHU(Kx5mst&SI&*)F>y5IrCF4`A&~y9mDCD%=h}{)^|I>8~^+Taw+b2~0~f{I_R zUQjsw0=WRBVYwSztK*`ei2`AiFn_4OG?gX-vm>w7fEpskua@0{_fNOSLgxq%$e9wx z7e@p*bG$nsAI(qKXIUDQC1>D#0RWl8guQpS~Ii129d=^9FTk#=;SeZm~%uEZ0 z`#4tH^u^amz-=DCL*asHQ~6Fls>2~haytIpRIj{lRH!?!)EPRXoyu>gp#78utM_`K z=$ZXg_ZyQHp_(iqmm92LI=@E%Y$^mXRPO?h&p%hTS4l;v0=l+Y>%lBSmDK07k6@d`YUm%D{DXY+rNlMzKLn_`b&4z0iLtECuim+1P)bSAep=n;f$Kep1njO;Pn zjdnU5to|+?0vsPt@eO-;Ib~;_AdywgQ3<(oUSF<_Dl(%Pl)Q7%G2%mRBkRr~tX3pHZXm(W+!BdcZ5KTwOpER zx;;dwm>L~3PGA2!kczuMow9vy3>yaszH{vf)>*sC`GHDaLdW)9f*Vi0P>((xqo?M& z<#@8o`-&;|4xiXoHn-z0(a_(HUr8)BdfsG>p$Hp?U@0GZ7$pyq%}47`CPzB_#&Z23 zAi~s{ChQb9dv@8M(J0D|j_6+j+KBCoh8@g>u}>>ebg>*lU|UYxcY>5vWY8pLgjW}j zUQ9FB?5W_zqQ5t`z#3Vp^Jd%aGSHn|7BB+VJan>w zzEkpjxZNx}&dC&4gQXnzRk@c{zX-uZgZ5tll^5(iqa}2ce39E!<^Jx6i`9=1Fa-#R zRNLgss3~@$#D6jw`D<<%=TV6tJC*esWNLsrt0BZXrnpdu`@56KCq9p`pI? z9(XNDpvV2`x)dC+w+G;U& z>&Vl_>02f%pud_{=Vz-!H1`o*a`DtIqze!nD7+q~f?fT^>y3~n`p-M=ewXKr5qer% zWW%9FX8@7UjD^=>Zu5KRi6)o9<6qOHwDr{%nfFU)qq@Nl&*>-m*xv|F zpHIZ}L*bxk!7G=MV{?SM5CBW#CzZbKhp=zv+Ex>Tx;nS9Z*ET`g-JU81_p|Vt`F^) zlTj_l4l9eiTtKp>%%H6I@^|l@5eX09E1O{F`iFK|lhBnuhB!$v*-2cD(v;@%j*&c- zZ!|;0j|*r~6&2fUk@~@ThWKMEOL&#~C<6=t6@i-|`%8=4%+MXyiY;=VW^R*(6<$>PVjYUo|)2VJ08 z+|LyT9q~1nV%>8qApQ$j#+l@7mIv{~OBt5bb}Zqra#UoA=C+1$*syZKPO-7Lxhp$ zIRqbylBO*_+RSSlG`K8Y`p*@7)a9rm%F(GJRDbsC`GwrA3G==FoLVa~RDz1>dBkz< z7@NKF%h~F}qG#$43x4|L6445l7YswCJbW}UsVIhjGl0Cg@j6fDC++LWe#68b%r?XE zd3U8*owYH>oXPxCgl;p`gU?Rlmqa}kGl8KlDns3Si%WGGzfqQ(AmujlB=`nqdQXL( zWWYHI8kPP^1qEmRAfChOPt|$8!x8@*a1yS(ybrcbecT-Se-9zTH=&;v)~**E0aCs@ zk>9^v5oAxhsKErXn?15nUxX@;DpOvNOdCuh6+Oz;nyzj9q#l}47ql>8g~cDI_?Nwq zsFqK>G1^(Ynu=<8cnctZTp;T)o#!tZUMWD{6tloT=$bX8PYm7WzB)^3*b|!mFt6%I9q&!jN?NKly zVKqq+QoU*A{c&r5TafIt_}B*O@k10?7_ZC_m!u@`hqx%Y4~lrO67Pf?bX-hsw=6q5 z4kn^QyKCM!VpseBjWRPh_wyVD?u^=V6JOuIMJE4gcztH>RZ5hcF?Fv>rf-{s-xm5h zc8*}**5)&>gv( zyhgG=E?R|f8D@1e*SE>yu$-56yl61xl?uI|Qks3TR12|N(zMkq1+w+ni7L1DD-gVO z6wfWvo!s8)_-CF(EY~n-wD$ktJH35B&Fu&mtuCN8yjYe#4*6rGYI895j@#g<)^f0< zq{LluUjwF%pD@K=a5y}M-?h(bcMrh-b zswdgv8Q-K2pnBY?`hM8g6)6C-;ZbfeW<|4f-loR4sH?&MP$Yw=Y=iwT$t5{`7)mhp zVYoK28Qb2&QF{4kFVTvM*j4*9Cmw?GQkhbfU~Up`=6TsRkBeu`S>>RLu*zA)-Nvm! z-koP7s(#y-&^UOlLhC2v;K4O6vk$}C?E16c@{^~(F)+iCua1#_V3CA@7Q$BkDiNUA z82=Rq?!dZ|&d1>+7v@=Aj=R}s=J=vSg`Dn5sYC3=Poz-UPe;nB4V~4T;9o&y%=RalLBlQQFF0odrhqKBIeg3iqqyNczfd#W}&%Tf%qT@co}#YDZ|6!OZHS>KlJ3$b%jTE{e#`kjdFaGFKczTjBmmTaeTB zs=(q{*3HFNh_=%3yN}R}{j&e8{l*jS$|FPR7j!3FTb}g@9{Ytb^}C;nPv!T+0;%^` zLVWc5)Wy3O^oXrICT6i2cz3Y)lyvC8uV=vW_IhBkq8Fvwg3IXzO;*(-2NgYF8M?1$ ze;4fIb$t2F*Tc0*^b!f^U5ZP5!AeVk*2Y&D;N8(SF*Y7Fk;R?y;M#aVks2%l6>6 z@WE${up&AeZ-!lIt{7g4EWgSwky}IUdL(Z$V0tffmn_TK=5v?oB}+fk$RTRuVX2pc zQbU7e?fchO5#boZevH6^NR&Pjk!<|2a%!OIivi7gP?2EsZ)r-8tout* zjVe)BB5ShP$6V%`L0#qBZ8wc3tZf&&f5RY?MqPhOfhCW)`&M`)x~Z_Cr=fkRZ44Wj zHxK`OKc<#9UH%ocT09AFG&$w^<5a~Lci>Iwi`glATZy(=SV*v=d1}vF{B+V1B*Pgs z*)Wm|$%`;Uy}QU${qWM)4}%`-r#CtaM&cAe`UC|hGSEQ@k@B$OBCEw_RLb|rj~_)u zYJLV>TGq31^<}B3@DR1mEA_qq>`m}@n>!NQ&aTgeQ7q#a{8-)WNfY?Jz*t#7RiNYx zH9JqUw5e^H%M(-tCRvX@UTIV{@6Kdoi}gwbu+q0t_h^U)W(?D1tRGc) z6H74MqQc5pj;U^S7mP z4@@}xT*C&sWVSeC>B9~C#Au#FhC9Vf%C5u+9ssgYIzlW1_>-Ye49F1ne%>E z0H}FB2IwD6TD$d>@8AQ@Hv00iuyd`!O^?eeM}kP*FfAHgAp=)1zkblf(~=qsY>PPM!Xk7BwxKF_b^u0h3!$~qkm-s50w{h zeLT54yTIUnE90YsMhGu#txNIbfQX?Svt1^A1z-(AP{Bh62@kb?Fu^{Cg*Fh-v%Jbd zcEAPd9Y~;wa=Wn0zSY@}Y3t%||Lq4m^CQ)pi9|qbQ^9T|#OeyeQWv=B^G!FdDLhEA z*_6Ea23HnZDblccpcgE(sDQCN;!xRr6>RO1-H@Y9ZEp|h^w@>$mpC2eIhI32<$Og; zo{#~#L^$9hDqt?eduBbmXL2G3qy`u5U*p4nm01DLMA!Ho7blJFg9jI?eUW^Bq;v4R4HT0E$Q=>Hx=7VOg~9=nwVP!~*U&{00|>bX9I&sA zDO{>3J1C35VnOxah{Un!q+ug5tRErZcVcI;e49S+d{949a1<@e*(@pE6oh^oKAezAMt?i z0=0A=Um_q^w8fSQSEx{Vv8OB~(YTW0bd(<>tD(7_*)B-Mx|3?~dTt8d57x?A%PdvZ zCO}%&ODnuGaF53uQw8{I&LyH#BP0RByv2D8Ft&Gn=71`$X8c~je|C9+-m8r}`GEu_ zB#NAe)YGmz168s51yph>rKM)DDc4*P@O)dJ-O-LSdV&*Zv9zTA@oIO%aEQ!)?hu`` zkP#6Y2bcGO@-;@A|H)fGi#}-|$$!#(@J^h!7)vCHzua804xXDg(wdWdebEXK#L>{O z%URmZPW4Q8T~-;PK~(A|6N(;wMBeZZ(9%%TgH+Kz8^tXPglTA$mQvOj11H`f6xS{v zSTB(U*oXNct8y17 z(ZKdRm5omS&*lug8+uCzx~dA8%Nu>Z0k7hHOs!1(#2v8#F&aQB_EJz00njT0#eg+9 z$)JR6hi#q#$C*yjf%A1};Y`s6#jhFp4zC0=MvzzKpPp?k0o4+!c!;L+FJpiCqt!es zQ^>Gk#8C&3f&swvYO4&ZnV$;o&eVT@HjBUUq*D+O)YRL&Ky>r^7dJT)Pgf{0#ls4( zr!YlzdIzX|JOi+V?XyUc%{y=*fd9gq-Y?)2oA#9?n0nI!ELJkRQ9t@xTi?p^0G-q@ z!ZI+xxQaF_|Fa}Ku+D{Iyut|>-issRzvf{G?aoR}R0Gs4_sO8Wystis6ZuIe@n|?5 zp;A(yLt3@ZQ#{>n)9Jjcoi@1Z#E^dTcVu|L;!9(oIx%x4_JSNVA_^+#Kmbj5Toq@S z&!I%j#lIY4J5H@d-uoI2_>sU^a(i}EqWkF#kV2X={{RE9A;5$$M0aP%zfzy6@(tP* z@VO?JhY`gd9F}`Aog!;2`y6-{i3E&%0~EA)%+)EOV8Rc&hT<0}>lMuDAKn~rtqWgW z(8@N~u$f68Y z<2=%&dw=vAKxkhw_*tH(nb80t(%Nr=^0~hKjj?%2xvfqQda_Ct#l(UW$*kmI?v)B7 z+B$xpHzA%{Z>lxU3x+yd6O;_ z|JfL+i%)~odw*r%NSBXc(9mp((`f@p8+m;}9c71KQA6C8EsE0y%G-|q)GIH`PcT2+ zL2OR@fZRS3N}qh}p6FMjf`Q)Ty>%b!*hICw0%@oyn>7rQ zvUlRUy2j%7%!v}}W}(7+CYXp&9a%{5FZD6MUuM7?HI@r%f7`azWEVl=c)tA|AEC?C zCw_xkK9IMvcsg-<8sw(u`EY+GFL-gD87A=fdrV${3<=Kl6s&x1w>@0V#~RxS0(J-I zlj0D}()DF1{AfkG5(S}{o%a;xyF&bzN*(P@i3e{yWOsUq`XT(T60L744d*--EnWkG z5Ad?lS&89q)h(#e-vebOokJQFlIkqbjWft{)>%S9Jn43jBml!*@X_D(#d>HpFxi6v z8%{ztIirWg%euokaUdTQXtv|rca_4Actj@Lc z^lqu?hF`MP>V5rL3v&&GaB29o*5TGge;_9z=bNnj%Z$W^PA9y~u?*~Aynx=OU3k~C zX8to(c9k~*8xf+sr6RPx452AaiS~1!01=zpcMD`~N3lpZRu2K+5cLR*h9KloZmh-N z!v0Q75S%DE#PGUwAC(2RxjvXVwS7MCCP04|$ZD?BvYdo&(xgi(28$0P5}0Ei^sf-b zs7C@~%neS7#27Ttj126?h35nWKmQiBfHIfDBrY6i?-1UW?pXStb?H-NlyJOK9#yy8 zi4o;f{E+hc^?BD^vaYv-t2$@xQ-RBr2P_+p$Wy!1OTX>jZl`DfE75VegpKzZw5Sly zw(I!SACFqM^Q;;SYrzx=DeTkQ#4#;!N}GTkafJ$?ktXVGz=h+P?(SlsQ`>E%e&77Ao{Ml=! zjM$S$&mo%`smbmRdVvo>96JMPTLGn3HdsINGLFLQ^_qhODl=Pq_-9)A!CzV;kbg~$ z&^v$$pV*QkiAsNK7 z(6JnYy*dN=$C^UE*ub*CoXhX7N-vMch%O) zzy`=X1V5;;m|{vD2FY$=<*Dzli7E*O$GNz_@U9I-mY!QJ&7==n2)y-CfGLYPTrgXh za+F_1MT2BbCAXgQ)l!v<@}1v!f?|A#3o%owL{K=_#})=3Xx^&iiNcYk9plUfjO|u0 zi=s|hd4rCY8-EH&7Z)aH$tw5&k2|d$`cO+rr-TDLelVljWS6N+smZ+CblT;=N4-Tj zGn))HB`Sa{{S!wvOsQ17R1F}Eif(B(u*RA|naFoU_@HHhO7iDmmdVwuptY%jsruGL z?6f6d?6uP!vVap>HDfu{lAC2|^YXLY5_!kxpankqkas#hFN^2WKcFo(cm)ir&)yB1 zp}nX8G#X6z3h=zW#ttUqUL6$JFSQa_-tN77Cg25tN*KDOQ=d$D*GWNH!N{Z}PX;&! zKZSR6(HayR8_{+rc8q!tD*>s@@s6ObA{-VGk=JRT5!mMG(GG7~t4#y;uhH$a!D}li zfdZ#s_tFhWx&U8kzyePFu5OxYA*h@3j}9U$9S^Em;N$<{aDY@_u%o-b)Ma;vNfPYx z;&?I0>RkLn&`sB>&`*IwmrtNrUQW_wnZX5y1BTm9%11W%NY29(a|rrE}UwRIBs(H+Zz&YUr-ShX+((Q-G&oH zikO{Jux2MkT`Sr@nf~Pism@1g=sVGg%E_40f^JcQW8LgGpl;@f+5UWTiY=e)T@BEd zA4_bF+2Cb9UCE>bcb@L^hA!KDg&u%08oH2t1yKQph<{{HIS#9VXy?SI>W{|8#J3R! z4wU`QUE33zhh|g;#fqd^R|8SS(s`Gmzhv%@nfTEkvfhOAe9&N&IWnLe}ehNLl!jC#_2nguJ9~ zfPLF<$PqIL%$o*z-><*b+wOZ5HCFkNo+0dbd5>-4EFCY@(C?5eom?@)0o z>e+1S%UyH1Pl!$W@G?7|E@chk7aH|*A8I1UX6HXyl~?C2Dj%I{EIhi`mbSF39a&d3 zJgENpr>WCjGD-fMik4B2lW;iQWr6+`TjH0HU?S@{-nARGSZ1x~NO1P{w_!p~#LzII z$9XdrZMK~+4nsW6Sy}s!cTd*8_lRE1Z>6|MsB#*ug8^1gIV1hX>JtQOjS1Ii_+Va8 zx)?DQ$vlP?i5}nZsD|lEs0ryhDu8wLVq;SpfdQjRR#?u>rFmkFYi~SNW>39pRX8=b zh8P+cBs!qcHi8UfHLJq;D&)%@5?Qf++Ff`o^ zeY{$?4ph1t{9G;n%LTAPVBo}4ec0OI$?rJ%TA=f6m!DBo&m{?4CcMFq~ra?S3_47|x-eb(8<{&pi zu6~S;|8vPd@hb4Aqr2ykDFx4|IWp379$A)OEiqLjtx-UQ>L2saGXs91;#K zD#fkF8#MX$#KL)@w{$e4yQ8V0?qm2hdxHAN>-6C1nDLb}(VN#V-(<*Y1}hTb zcT|l~TUEWYVBKM$mNl$ zeX}wp<_@FQs+idKs;T~FEq@acHH_*TgNE+LNiyvuJ+Bdc@AQB$uBbsx6`19)wXtC` z!lfIMi5OVK33hm(ST2sz*q7uYT520sf3)nnRu!L_KCjf~SVKm$#)nx$5KK>m}R4EPl3X;G?*~8rL3yY+*qfs=L5D@tC1%JppTt&N4 zO-2_hT-GhR0kD#ZgV@D5t@vPle^kPR{2`h)Y)h6U5P7ZPbTjt?9Z})am365j zx{Ur%MR+%%&>y&2;LBT{Ju>hXOEr*EKtzo0%Mak{YDzZ`6R*^MPpi8x;^zS=`$?i659{KWfxTy3qJ}pq#btr(*Su0ol@m*7ZzxSdl(lv#P~uJ12r;&P`!q@ zcEZhD2uK$k%?zoK1cV=NV+Mx$Ll1CFjuAHyEilHl9_~6k3wwlwt9_t-i^V!VXLk7p zK+O8o@u&Z6Od?MqkD7a@XMo+~Mep;83le;-XgUh3?`2qCh_K;!{>Pk-kLa4~W!pAU z5+VH~gx4#s4MHjBle0LfdOsdYQ#*2fVy}II5e09QABu99O5M)(mk+N>iAK5-NJOMH z^x%a%i6i>ic^`$jVFBA6P}>sZ4QMQQ>q-lhv{P^~fcy|<^QqfST40p40D_t;TXI7R z3?&sY^p-lq{4Nwvr4?l+5k0F)uzqLs>>Rf32a_XXg#$#Y7Bw3l5g%oqy#^ENqKZfV zelm7?Nk<1p|9kmPZMmgwT1H;*k+-x2Ayn^j(&OQ+ZpFWnvXjE2`_0c>`@`VViGcOB zDfpvQ*N=-dfb<)QZx0J!OY)p<{#0){3W~pn^*tA{0dcuGz9-T{SO{wL0I!`bKeUvS zjJZ+-->UR=(G|Op)6Ewu&eFHH0qKv*^|tc_VFr8sCHs1NMFD6qZRrqHlXnZBa|D}x zzIWw8jxRWeP%+FPrxF|vhVRz?c{7qfu(@2-=buI(`5~cF*%uuyv{?-E3o>jv^rF;^(s6O+rXNe z#as&C*-5oG&Nxz+u?YgI4)f|({%7c7zAvx4U)rxU+E2Jt=m$HF!`ez6c*b*PnC;gt zu+Pl_<-+1* z5+xT{gf}s{xvnb z83W3F(sXH^iHm~Vmz8M0;WB!FD^W@4;e6Jyz##|B*fneEP%>a&sMyXn7^w9lp-%ib zLJlfgvESLUAI5)%R)v-}?`XKY<%XBKr9#U?4HnE|(6z9zR`A!?4ae9vY{UqXlX3nK zG7NLdk*tUf{*c7er`}ChKLcU7Ak-&vIsT&cnK#uXS}=Fx#f9dSgaV zTwh#XDMp@RUF_hl^U0~IX=dt`By_J)xC z0&@jy7My>z=z~gARKOSm{&?8N<*3*}@;Uoc9m`yvikH(K@=N6ofyZSNn^G<1@f!~p z6KN^?tj98o^S;m0@U58QH_7Pg(-87>`LQvHFgAMQ#Z449nOGFNyDybfQ9#|rdX=y4 z@u9qV`mgRVS^O#fv;@IQI?Hk!58KVBzF4x(!=}ro;6)PwOR%p9JH{2L5MPw7meyu} z1!-&I2W1g5f%{Nnm$3#l{|eux3)xp$+9<*#{>_pGw!5DRptijO&ti9 z`00nD@J)c@1!sJ&|M-CB2hV^aS~&7sO!^`Rp;|{~sN~RK5b_ud(pWyhJTET|Q&BrX z)AgW}R)2ExzWPiPphOuGpd(s{lRpC(=bHM1pz7+C%Ph&{8DjU|c*f#^o~kWFuG^iy zthp~Uq0OWY=l-&pNT!ERS-N;qp2~EFt=92HYkw@+{Q}Q!Lk=CqH>+0SWB_nNM9-;n zREGgfRFObk-JKQY2N>vfr0=@-!ICulMj29bupwB&CUlTH>!bv3CYUzfIw$43z~U25J?guu!2r!8vKY0PJZ*Sw7unMJgISgTdnZFQsgzhVw3Q|#b;g5IMDOQ(LY%JrPM@Wp=7{0pKJ~d6L9p#&EZzs~eZ(lv3}UJ{Qhbn{%J~Ly2D(Vu3mgrrr}#oQzD~-I`BKc3*L9NU4ueElu7UR zhe5~A>rkuw?`42~A$mI5R?jdHXpqYe-Ys=Fz~cGa zvDR70GNzFd$Oy&Ip=Z@@-M(ba|8e^w_UO;p3msgxWl=!Ws6^>QumAabI{*gYc;d-B z$FvU)na>RrfvD9Y0?c;`s2_NV)D8-TsE1RO2G1iXkWV&6UzfQq0DeQ)e2sy!_-ae7 zLYCPNwu54zs+j$OeLnj4 z-cLeMMb8NFsXoIe*b~0w5#0`Hd)#&=09mJNcN%T0Isci1fk!y}QdJ4?*)!1+e6+*8 z>YS7_(U#@~sadtvR?PU1E+(i{<@uJfO4@VL0J(<)sJMDv;Cpy-R6fDW>6X?#6EvH6 z<=;hWsf$7gZB0!^wyGlECMs<`IG}TKhYs6?6(gtsuUF$`wjU#@yXblfMtTI_6ujv? z{gO9vHoUO1J&IkOS=VDeWkt!wc%lPB=W~vNZm4#r2E~H3wKjFKYTgHsyOO+J5!AcA zY4PfnH?fJU_@=@u6JqQ#TS#vx*Tp5PKN$BjAvOr|(r+V*eDs5d7Oeo`KGT$MD;jX2 zf#3ZlPyrGD^UvGTU()f1hC<>0H+<1{Rp9q?(j{ED<8^VKAKgn0g>qq>ObuQ#-`{B& zp6RkU$ogmMOziYu5|qCWdu+D3<4f)qiN}N?xAbZ2m>7ReuUD^@JWIby95+^Yz&o_UKvC*zNa*YVE62sn(kG zQPO?OdKHAthYSNJg`083)?9qllk#>Ai2K^_q}O1H1@;+s&zfAiU)~9Z@i)@O=Rm2H z6Psu#XkV2XD~SMDcv`^Bl%Ubi0b|(U-_iBXt9O*F*7-w-p)R2pe4e}fs$cv?(m};< zlrGC&2O4PT{l#0cl&k`6hnzZ#S$hEro98C_Bto>C9K!vf4E^ z)^`I2>;^1f=@~?>R$V4$p`nVyKQ2e2tB&{|mxmV{0MEnQ(dRL?5JF``U8lv@C%^T! zTTYG2jR?s17Dp#Y;CfRv%A|&|HC=aqI~uGCXj!%eo8Ep>j-AN+?A6 zBxA(h2YMdReR=ysP3B@_O!xL@d)ZDcN82SV*#*?^K9svnMOit}`=MSu2r;R1G7 z`+uv;pbQ`TQU7G1omgK@#roW4LEYHvQ8_jjWH5Mz@{ziEj0v8t`(5V}DVw-bn$>*u6Slamr&L?OXx=EVgR(qc7hKvlf@Zz@ zcBva@*7yGKD<$EhhL-B2Ug*oSjca<}I8gPGtNeOlTO$QadwcQb zY?9b|F#E&qcc;tdQmsdy!15>4P`3sfB;Hk_SLv(_cwGy_P8@Ro$%lpIOkhg(V7sQ;}zldYDDx6IL^YSPI#4fA`}Z8@j8 zquY}?3>*C%s%n|B)nD7caQnF+ox6wl1!ZM09SO+#sSN74C}u>?soTU_&l?X9YF5^g zjbH>T9R|On-ms4iMs*6wZBEaYdI?pl4b~`>po?54jn&yWP#iaoH7`OF(q1(&FM3i$ zeQYo>y|);7%^(pg?BDfy3sTbRq6z7k(&P51^TNG8@lBjG&Se;?F|UxT;AcSV&UU~> zW~A*Dlo|HlDRo;=YINO{KfoHdWYCOQZghKZvgp*l>5*)cns1|ITJ^uN#@!_GA+wuC z!$0HTeDBRpilaQE5%bX5QyYK2YSuF?AmnXI9SOrIpT+&ALGr2XQ_mTRcOL%qV~QC#S`1f<;5gGB+WP{hDPl-9hw$t*1C;L*ij4cpDWXeZ zNjMxbg6kSQG}(n}+%Q})+v?K@(_5S7S3O_-cvQ3>O8Q!T>eHX}E^A?Y8XN|7s^Noc zyb{jiuW4_*fZOa320wnhL{Y_|n~z$&{EewB>+J7rVqGFi{YfG+KI19b^HFd8aU>IQ zf~Ob`^`A)!dTz!GzmJR$+xYryRjWsK&%x(xq!=NY+tFZMK*+1-Ak3DT=(MaiXqVNz zccFNXpVSm>ZY5#e;0I~wuQ>LxIu|1fdMbM3-W`uqF|OmCWD8TRp}nu`AJoOF*G^F= zzU)vdH;8~{j7}nl0P@JJZHbN~0rtTKw7fyb5a%PJB{U#h} zMQ)!Ci!^_&)O-|X<7a?@0LcdCBr=+6z2cns6{R>>Gn|gfxg{G!kR7{`nTT!4fM8Xz z+=4QN|5{mbF@B~QC(`Q)DGXZ&6YF`4hGyO;HL}GFf~H0O`_HLl^>zDtI1JJmI1IE* zJ^EtOntMj|u%wAt45LNl`qFB>ceQwskcXi+0-+l%d)}v;@IDG91Miya4JVs7M>Iv0 z2+S%gP)8!zUTz@yHHx@{##E%~7MHw6kIXb-hdUvU08M5c!p!ev)Axws$ZNOuu-1A8 zf>1tgA1X^+_g4-in$vlcT6GWOrsHC=c zF0)irP9pTTe}#zQE(&tIwI;+5D;>)ZxxFLCx}oS5tgCZ8fd(8^SknlC=jCj*14BWz zUmSh`)hnSSIu^owdSlVg@0h!rKC8XBo9H8;u|lsn<0mg^i`I=qQRaqWhYPLEc zn?8i9AK}y`PpZkk7i7l}-}j86DhjLF&YVOJPfJ*;G_mGu{ulABs4+LTjcQ;J85O@I zT&AXbOlYw#_y4R|SJq6&jk0iaHhbW-MvQ>bsMvUu%lnm9AN@>d>l>_&>ju(4@JkGZdqs%Fr2FagYzo4WjHE!1dCHI+~Qg zoAIV>OY(_)@&BAwc#*_g9j*V@x!t!GZA^{XD()hVC7{8@1#Q2o`IG7d`Zb z!J3E-t0k4GDY@R%QF(9B>#u6CBBLbTt5jG9OxhsCZ8px#Ap}a{;b(Z_Xnw6y^?!D? zn2Ospx?roBJpVsu9@LXP5%W~r3{0y;#}?uF><2~IEGi=NyJg(H2}_M&d!;Tmhnb5FykoFXH$NO7DC1!}y)Bu(+Dl?z%?7 zhB98UQJ$DQj{J`e<}3`=zS1A8;Eng<6+)4hi6cn~gmtrG!oL&$&;fckJ3C})cye7e zhYBjSkn#V7CSZi3%;SPh_u#JFT*9(sSj1RGZMTrxnttxH)IjQbZnl*wq%y^`Pm$w| z)n?E>0*=(B+I%e6%W?ba^6Qbk;Q#Z=a={j;EWsF;S+c&ztQ;{SFh~2+^GuE;(rQ;5tpXs1rW& zK9?OQ(lHy8t$)%GHYPA@W{fPRfAlt2SCiq%8q6PE>kx#qSknuhv@M5&M@=)NM-MRP z?$;5n>!36g3gjfu=D;@g39t?A@?qzd_`JxGSUJ@4DGJh{N&8yGv;mtT=lCr3X{zQR z(Wcdl;JEqd@pwWFbKY^xX|2>7)C^#=ll^fDexpBxOSjND25?oHYG@xbc1wkx}>|iQyNL>=D+UeoclTN@BPdN zxL9jlbIviw93ve?|Fm4Pw=CqB$8GAf~b-QTlrsTlEH${OhN!*IO*t5aaE_)QQii};`X^vlu zoQV)b#0D0K63BD+!FeKj7?dpjy?o#A&R)BwL$kvj49Z_Vqeru5+NXf|RqLODK^*y0 z)c?F4lK8kg$}~Tf?TcoK?LPiUw@#8fzCCWu-_EivhHH>fe=A_MXg}xXLvJ1 z@3=Q?B!p<|x0b64@dW0CCb+ltWQA?7<{!`e*{bx1(#(o}<6QlM<{C!pklq?u^pxST zvTXKm=&AAsO3OX|O@L=*Guv3l)N4m)-TZpSzPU<^+d`-37HvhWwbT*w&*3$LjFn61 z>DDm12o$i8G)pIu?MyrI;g5pMP|*8Nk!k7QK0O2S_ylNAeSi0G|KZW{>z2`C>iUcu zJRH9|Imtg6qbzoF|8U$ae<=8$YfJN4vTrxO+B-Z>pDp4no#*YX;)uUx$@ht(P)vS# zIU_mteADCzW$q}Fx?Owb%Ci3VNa;c?sU`e1Jd+r;r2|T#b_*M1Bv4fnCt;b|@T6Ep zUr)XTI8DOSa6FAGm#oyd137}xTPtf0%TgRP>5l~us8V8S3T2NvMEcv<$JH+j%MPpxgT%*#+~`d7l%K5C@c zFV-UUP|G;G;LF-M%M3PHuDLH9^9@bgT^$5zlr^IyY8z>miX0t2s%P-x&{O2MCwHvn zn>yZnP^M4M+FUBnM);Os+azP$yuNzVS6c_7Ybl?~j8W@%LeSLXJdsA_i07I7!TZN) zHhOxAz`G{kht5?nG3-aSOzw*}&a)Su3PirpEpDQJv*DoId zKI3Uh-I+tez7lPK#6s9j0jJvw@ZmP9(FRg{rauhv0|_bq{{Dblr4`e53gBHNND%>O zjChI86alL#K$7wz!59fKvNJz7j(I?69VV$Qy9hY!=p=V0u8(W@QS6F5%#eR|4v-HR z-2tL9kZg8d*mA6cs}*j)mhk59iAFg0u9EGim3>rC{?)cW+*#i2N;moI*^&O^)=6SO zxCgqs)<#8H!AgwKlm=2;#cfX)f7_v(yNk=vd9XECaiAbMdh$s1&dBHTO4h+UW)a8h z4vg9Qzz-y0dslN04-aEj8Hh z7oPcVE$Wabi=Fkh8`Z5E<2`xG4eZ7Cl9(0%IWGrpcYp&JbdX4B35{c7d?u!?`AW82 z2SbsS)on*rWGP&15*{EYu7J&91eC@Ri9*t$Gy7N)-roH z$S5h%UA`Xoz^Mc#7sO2ZF`gmWKUn*?m_rIC#T{?&?zBp^YY0%mG%l*|OIdP@iy2#~ zCDZ5oV_l0iiOo!9(o44htM+XrkyuN6`+q!$fh?zK6|Pmlzi!I7q998j1ms5nDNoK$ zPE#L-?o#RKf7aIvh>Gd~Pc>(DA4nYe!B@>OH8aDe*zU(|kMZ;TPnfy%@6sP03AQ>D z224()?77a>d^muWx^#Po1&`fwqXr*UT+~N(uA4iRmQ)r`ihXRSZW)7Qo!==zmo+#| zDSkH@OO0Q?Q^~U#oJ1q`R5@uAHn=_NEu!?SbxiKyPJ`l7!9v(57XhxgdBflY_oXx z76thDX2!==^z=#}&VJ^Mq9DEg(!a|yXSbrAI&`-0e&bYc-^?n$e)GfRMI>5K6F%*+ zcgEuidFO@y*R_1A1*hJ1UjJu67!VE)kl8)TC;f``^t?qu^n0pYdoLZL#R|o`IAQmP z+mlbfZ&}StR|09Hy;PqP5!kEIG+jm!+D0S5Lmdd;1yV>rQr>Sse7bI1#CxBX%~ipU z8b4D4l9%cHfsj_zS%f-j=u0h|r%o!jRma}aHo$Gmd$E*X|JRVu#=Cc35 zaPKA4#c?R6%CXVA%LeX$wlw@CFYpZA7UI+6UNk20gn{-xo>%Lo+7vmC$}ZwQuNHHz z+=6&wIR>I6#3v(4(EDh-Y=!cYeY46xy>tYkDj!em>Nnjz$da z`L?yvD`({%p$$HyZ0+24zeUcmYh5NpG@-afuKvae^SF0YZacye5D{zQH@reUSg;rQ z8pJMO>z&`?wY-peQ-ir@ZH>Z)$%5E9XbWOj&NF=Tg|E{aJV`)n;DL>o;?}a1KU=~g z=6dnxr?npE4VUERNF^z3pd#-Du@2d8jO_)7wRE3=DY>9Km(uF+hXO*_1pk}>^z4|( zwxw2f@{)X-+s4-cQQ?je4nW{?Z?%^llXQ zxuEy>0*sA7Tx1N}Ykhz;khq)#!bgh=`lsD`?l!7__w|@zvE@uk`Q`EBT@z%aHM6dc zot?Dg?s0X+?lZ@0mizTdS7qNRYSi z(TlpW>zU8VdwVm^&mIl>_c z2bjOcMO^ZFk-XN6=1{?f-N|e=(wGu=A>+`q&gYF*ElYy%&kEiNd z!DR%^88a_EN1T3k=gRZ$O%9`1y)oz9QwzW4iCrP?vaaY37~$F2QUf zv()r&g{pU0`Bgwf~sEoJVH1E~7;l)5Z(_(Tci8%$DcK2AZ_T^7TjhC7vpyKzkO z3_+Y6tQ;(VtehlYHU+aVGlkcQsvJoi-+VZdIDdxx8DxrF;-NFRVU@5v#Bf^-T7Gni zeXIzoBfl7IZy=cg84UA*ocD(wYijx6^J0A6z+Ran6V(d?-+}5;B|! z9T_5!eV*^aUwmv%5Bnd0xPH^JOzM5)2#hgAOk~tIuiwZO4gJ+us#0@UD?ML(M>ZBD z+PWcdZAGz`s@3E7eC)FPN5tpNa4=B(i54b4d4UQW9>_`VD}K_ysvbmdG{cA5?B!X% zuUfGn`?@WC<%b0^*AZGpYjf|)dOCK_pyPhT&e@;YIuI2;IVfCtx)@4IVL4R|KQmsw zy}ik5>cWhQ(W-aVxUCqeSjKsHM^WbO?b~FQ1pAWuIaLjpdB>*M)3fe+;8m_Jo&WQz z{#WJ5t#4aT9hR9+VuScf`}G+vN8=G`t9{f-jyK8SV8}Om-Toi(Y$1cDy@C=%(vG4$ zKZ9ei=U13UGawZ&oCSI$Nw7ipf%|0bYwnY)GWyZC@&7`~A@U?1M|23~1wYB9%JaK7 zpfvrGvbf>=ts5cEP{4KqrGu-Ko{rGW1`FwE(dO=N3dv>aON1w~=9#M3^}O{JaBq=c zpO4H*QT(C=ozW_QW%Mf!?4tcev%UCYM?CrGf&bCt;oqay<{T%aT4uaB+qC8^!uI{` zI&r*=`!BRC_xX2LkFeEMvGtpo!JWtLh>)APZIm61C&o{phCl!_jBt%O6kL4LYMP<9 zeu&&!xz9RMH1o3m`dAcV!`&{i+uC;hgdY7nWBEBU64?p&W5%j72j1=P!-OpflFHp+mWt(T8ojmsh^5{rrCaF}_F49JpP7 z<4j!$%&dc?m3+4aoC|Ebe&f*Xzd}zFYx8%s5B29^nNi?!>KkCJi@G<)o<$VJtvhLI zsW$rl87yp8wOM&xyG+ftN?-O%@8Fl3u6tzt->;5?7+okn&-;|@Chu+QwkR}l&350v8&QE* zN44ncS$G6_!6O(hi2n-#Cvb?B+lYe?ay9`HWN2zj<@)u26=>l_RC}L%{Q))26p`qg zFA!?EpeU}>WV9<=X4G`i3L-SH&xgm&VZOC9{)~o*pAz!A6-%9!aX+L#*A(Og z)n6U{8;_Uv_1#m_Px7u#17dezEnie0{C0qju{!ZD zc;blV{79$T7+9gCRb9+wKX2pq5l8ZEWatQ)?tJR+owG?1Xvu=Jq+msx%u-VW=<|(D z>mZ4)mCx1xa8U>9ofx$}8VscxutbOyVk|}x!*fUX17TRYz)TH@yynivr|cXA-u$(i=j z!V~}oj@)J@hX|x=q5l6l>K^TA8nQlk!7o^Eu%k_~GnK){8c9&CzHqQiG2w06pUeE3 z0FF-|FdaU5*fqX8#_3y~y}wt^+n@mK znX>Erj%)1g%NBsg@u=r%NA_0{x!!?$nd2(<5`H}UVO>Qzr;U1lS;syn>Pu&Lwm&Ro zO@<^b@L6V(%s?cz`cuv95so5_ce_+6fUvT4cX*10$74+_WB1ivz3mMqe^9Q15LTZ-L6n+2dyyAXlsoS)h_8p^|MBTC(I!J%xQI#{1@c2h*fGy6;LBuQYFo@F6fDai1vQL zF-PONmNSTEpn_8@2KTPCEbNHn$KxjEG6L^otH(}^){E6vk*V}+bSj&d$nVL}`f396 zf*J~~tJL5L`*(y-!M+aS!83_fS2j*Uid}c&>|qS^j%?RetLa6J&nXj7@Mf^uvlq-np-%7*3g3Y%{(n$gHo;_N{AWU(sWYY8 zO6ZUUTSrSAYB>yAW%w(ZfB;P1j8O*Il5SFh-9*!Udjk1weBY|@!RgZ<2aJ=#`au?I zbzVd5usFP&cNXZhDlUO@6N(C4YKe@Gb7L4Lw}*IN4WH-2>Yu9MUWa?A=I=8;va4c} zM)|B>EwYPy-}F$uXp-Gv2Mp!!@euO|sC`Ksoa5(dbe~N+;N0p@PEQbWhux08 z#Knw&ijk3>%Sh1FOXSDUQ+pqaoyuwe=@m}g;9EZTM5`wNm%l(I0Ac0mjjZ`9y}KAey+lkP6DSkWjd?Eo>#UCTSeKO2>86wx zN~JJS3m|UUPUO@+XUeD>>=n@@l1LcV0UIQ~B_W}6J=gB3 zKfI_$*;Igu9~2EB>045~U3%p_wue@!hBI3>$hnV(sC)fR2EyOctMQ@eVX5{oealLZ zlLltNO5^AWLj^r!DWj6kF(w~^Jwkl{eqbEzvaD~9{|X~QI`t!f{`dQx$OQ_xGEss_ z@}QGi!s=y$J*q{-=F#?x6h3eo9n7R-DN^=$SsnE2a~}KBRBIwCy>{|mhF%?C7O`bT z-nPubtVi) z_@$iu=uRHl!<(DMjb;9)#jKRai#5XD#_R-Af5-j8W&PWQU|ag;R^-9_-*Gt69S*(ELzdp)!vdL=e(-8%2S%oWV?@de zQ*uytIl>|A+tX1cfpLq1$TWBFj# zSanktReiH`3MaN|US7Y+wo`8}=w`i~G^}nQuN2>KCvCmw&R00uK;Uj%;oq0}zlg$Ny6vCHyT8!=V}Tj>kR7&6(Ci zXLUX{Mfcm*K9{Tc`<@h4C5ILX81?kCxWPn&)xY$IdyGftrEQ@MV2E}K>@Ilc9?tT* zQ*8JA!TYbm6QCjnIQ4@t`Uq(?W5#w*DturD1eDz7g$LizVul{Mj-^m;4}RD5Uq`!@hCU!%JtjBy-MiWyhUQ^7?kW2~p;p@jq{k-Y2f- z4im3uv1d>AZ%>|&`3tr90@6tP6kjtxvNN zvFCk*TO^?=E4U~3qsGJjQKdL=M5&CtU*8Zh)h&wzA4U9K`gHv30S=#yWnvs3?@ruR zgQkW)>;nMjS!0j1z3F`rpPRM1QlK+Hr)T`q+{RG#D%-H4nU0&Ko4RwH5epNd-$4v% zYbpZ2RekL1W-(a7%rZ6VdJVH6hOkV#5Hb}9lHFdg$+ARODTw0~gIVQV(K2Hc|6ABq zJ9no4Okb&FyB4u)y*ICCb(=?u=5v;R%K=~HylVs$K!6kpHdTU`z<#~&E(BLT){Wh5 ztPaM5aMI_3vQS9F@>sffeEhmYFTC4Ir#%GZj2bt#<1F_|aYKN%)U7Z7NwjvTbuWLc^R5PD>*SFPO?(;i2L9A+{B^(Vs&4SX!`{D|R`004M)vLC} zbPO%^$Wg%SjbSMTO5$ccS-P0BvneH(r->Dc*h-AEvj*F{0V1`y@yo#Tj&MVr= z9J{hUk_IKFv~07B>#n?T8&U4VT9}Y5?Fv$7?)Di|deUmse2 z=$6k8i;ulM>IzqB-tg;QuMWtZ{9fWE@qCCCw3SEZOOr3Yr{h>OxN>}gRHwcjXeCNZ z$@l_2=ksnTT*MLHD8=a&wq4)QXgu)y%WN+%H~1#>$-RQ=H?Qe@>uul6q(Sqe&$2r3 zg;aZ@JUz-T=GhPOZ2TQlZ$9FSal=IWS8RrfOBTHOY5ORjn zlZt8~V`c{`Q%pI0OMI8Fbd^BT$q zLnO+!o5&PD1mlw?VoVM%<9N3LqaC*zjx!k2wqWJBbqM!bH#m_t7vDSUOV^YrDNOz{ zE8ah}&L7<@qGg)c`dAhcU%q;tb2U3N2WUMQ=sD zV}I{F5fOv(*7Q@>zgniVw_0Fo^e^!Pmpm^qF2Ap*FgpdpMo_GIzSoe0JnYtM=QzZ; zGx}57VzBy{n4u+R&6iOg`c;x6=X1Vl%a_(qH^Wk;ggO`RCnYA~;Okvt`ghl)<&5W2 z@Bd^UvX>^%gk*jI^dyFq3j79kyBKzb1O5(OQrbNS_W15TlCY{=Z`k9Jxr(=}C!uQg zWL1&Nt^9@=Bp-L+VRX1M0@pzQekQ@Kic#$7vl${M zhWoc(ZF`Fsol=pMdsB}$8?%e>NCTCaA69R_8U98e+mn(d2$giBkxsI)LjD%R3KRI{ z>%9{M*WqoK^sKf{lR{8;cRXaEZKn7H=XL4T@*-#F(w=_MGGHic!iXAuiW}LU*Q%+4 z-tAB=d2NCdd~BS1T*-cai47Hj^4Jv)p}1v)uewhj;eZ4!3Hb;Y=+_PR`x1q-E>n#X z41|51CWlI%Rg;czZW-Z|W$7j9>_@jZC=K@IrAX8af05oqspc=#!TP_We-RpEX!=T( zBj47aeetY46XU^BZ@g^a*Opjg*5dkhUP{d zljU(sSdAUJSnO0soR5<6<$h|`z`};y>8Y#?_j-!gI_8X1pPzc@b!bCfb{S%f@|1De zt?Rz-w6EW&iMDyC zND^ab1!KsYsgplFj$)~WQ0&I}c-chAERJ-z^bWt?#aZ8Y(n(a?`f#jZ2EiW-NPqi4 z{X%$961}m!*R&zK#s(xqrWQh7#y(18L=IL&;6+6n8=6K12L(={hW_9p!spEY-l3XZ zQIQCsoe!yO?3+!6|JODe>+f2o)hoV)A?wlX@U&-}XvwU+C)Jm4>|;kVssE^b>^9pFaye*4-yQNR_ZUQZ_IOwE3twMO}peEkD`tsD-DcG0wiF}{tNq`BTC3d^syPLw(6tuZ0I;I zC{XrK^X;qHzz>ew_GSND!25HXRqmd~W0-@Psf@k?(!9@#aV2oCD6G>EY3-hC+lrM# zzmJOir60RsgAXgLG7^i3yU#l?r@H2{#phE*N{8<;^ZWbCw)?8qKLZ0X|1xS{jf^vG znD~yeW_0&PP!oLcJ=c3@NkvYY-r?$Vm=?XAhr}kae1?|TWiuvw-HcQ`c^(YsS4iRo^U>Q7^*9iyKNIkE-})AA8=pR{Y3e)j_@wn*bVsr_HTG@rLG6 z9;k>mpT>3hC-)}=`R@L?n+s>>B`f%gSfu}*XktPStk9&DvKS}P`=Y=4waY9f8%oqp zA>B#$53{`cM~nF_Dm+l1rBpekfnFL==6}oaHnx%HKZK|f47x;d5_*Hz5 z!$>MA!#gIh#Cq-5Fs%DeJM+txgX|5BZ>HBejPYdcQiHH{T3fP&jI(^ikO8_RsL$Za4#}KLX2;<)xYrRQx2Z((f&T__?*YrA#t)2xa6R2I3Mr>ouC@Rs z$k_H9++(|uO=eQUgbVKAgE(SBeC1^kOeurzlbk|Lh86AcM{)*od;{)kSP;9q9i69> z=5ntaa-W-or>p#@zbs^Xv~}*IEu-E?gBf>A2~AC&)9L@C=Cf+{4&k<#IN{ z&+3ZmPkFw)XI%%$FE4OpD@GD9kmJcqDTKIu2`**XJkln2Si3iL;=fnFB1L35{FzZY z3Mm&)O;w&KxmHspahLnPRG=*hM=t(OcVl;COR?*GeeM?ojOc8_aC(+>-m+4NRx|n9 ze1-zgZ^EJif*EM#*(dV&J8>4xAB4|_Ow5c($&sbqkQxQIpVw(_W0AVuMOOFnML*Yo zNfSW1)NmF-?X!x+ikV7O+?n0@9-Tg z{kp>fm9#(fjYk;*a%?u+_VttBpX!#~sxHq^a93K*udHJYT$@Bk#jn<%Zp3{oD{>3H z^Zt=)$W*)3AGt~p9iOvcedm$FZYYOSA}z8c0nUnI1} za=h~&P5*;LnW(G(MnIX9bwxFY2z=!OiIUS#ntNlLykRCI!jfuZ_V@NU9}KxfvQ4s> z$rYSB_&)wh?W{ZX9b!y13b!U);Md<&WEx&N+dwQx5?;byo|&A}YfMO6V>pMiR`92z zNr!)Kbs|t@9cwz?$Lr$7^eF^?E_;3GlJ| z_`j0B?Nr)MvNQZ3B+(f+G!OD zp}*b{LmLm<;@9_-NwyrQsGYE@X~9WxCI1MFjZ^GiC`x*=iE0(9C}}%sOQwsBA6{aV zGCTk)CHQ9VEAj#q#5Vu8oBeydaR#bRL+eTo5txN}{s45qaIeeW$swph@;Bl%Lq~bt z^^OBQa-iJmgbDe4Xjvd~jt-3b9T)Xu+b9~zXp5z%_%A&jEN*6q0XAgXh^4+*;+oCj zLRVN8)eVSG3VqwUh!x9cl^+?$rk9;hO_s&K?%0FD;4hwcE%#ch*Rxb!i&kk)EF2;t zB0N0fPC!1Q9vcv|o4C*muDYB0zzzc9QcbwX!es$%T=?LYlK_Pk1!TLRcJXks>?Xt{ zt92}M_<8TdSt_gEN*D$AwWsh>sAKm`-E=-z^@yH36BM6gkn!N##|zO+woD#r#8+u*P>F(N`m=827XGHAwF2 zJJ-4q{p)fIa|lqv2;N)6hxKJDWor=zIrLwnk5fK3tc8?}hNC*H8~QtCxOwTKS>(Hz z_viMyKDUt*ao9j)@xeG!+mB@Y;TgNW@qDs?Np>HfY=DXqRI$Paa0OZ~Zk+3BYi>7w zoK}~{yW8ms!K`Nu_sRU}A8!+`ABsAE2R|0@k*W^iky5&JU(5acA|m8)_wXpccBE&Z z9*VbYdU*R;z*hFZxHn{o4`4vk-+ z5+lRtSH-;7YFw?OPc2ug#UHhZh&ES$?ca6=MXow@j`RF-Uvp(+>Si;Arb#@;}akOHB7#0BGoZZGMQk<*Lo;}M2^j~>-MOlfsTrZUK z;p|nJK(L{Mg9FUG_6;K6TcvDno)PzFTMCh`rXeiafXs65CXl*g^suQnbxx0)HI;D6 z)VHox_%_QS+ykjjd~SM~doS-bCqP+~GI8B8+J7rN_Hz@S-niU%o-IS-ToRshm`L~$ zb=GHiTJ=jx$buY0~$RI(kKyZK;S$uTdQsKm}1j5cT=&Vpz)C7P=-yEQWS zLyFI_dC^2b9(B%gJRp9O`*#hjlpsueKa+a&n={yl*6P>cr*7r@9J^eD$L%K3<3~bU zs|0&01umvFcfgEIwdOJ!*<62cZVoXhUWtlEQ<2&X@*mg%nDgVPeQ2rF zFH^c|oUeC=k?!vp=_10y!XhGMZ_+IOV%XwQkcVC1vHq=Bp+5@m1ElT6ECXbY^q3II z-P|~Bt+!fQ%3s@woHsf;{D6H}#Tf>X^gY%ut~B>PzKwuH;Ci~|NslCu=vzle*>j4y95Qff zm|=fOm2fm=?cOJN5qz<~6(}_Sh2iX4zYV6Ja)Q;O|EHDC=fPHfzwmUWYCTz);w39G z7LomulBW8D?$u?Ifvu=BVv=yHCw1Rlk{jXOc^gLd{1}7#<*G+jtL;=qjFxH)v6TI| z;Xa2h9-=hQ>AQgpItE72w{HW3gE>u1^?vN193pxedw=RPW@TFZIGm{WOfcoG+>?&> ze5-Kl2?S6AQOU2@qCdcD)02XX6_YmiB62pxyBfmATNHS=zDIW*|BVkBsNV=V^ttY| zJKSMR|9o4kW1o8e=W?)?Qsnyb>QGjk9#}T`H!9wP&Trs=V>a?3Fp$kAtS;4YD8=6 z;wnR+S$`qqINb!g8G7ZyxBtx(DS+*L4f1DqMWiv#KZ4?GAy(N(=g7!hW{?f$GgkT} zGeh?hw{#`;D0|-0YHKC!JU3SyvaT+tH{axYI+2-*(JabBGff4y-(newFi8{rbGMx? z>wb<8G5iapd#8yw-dY-y0oz^_oSXO&V8{p^AWQqw0|zuD=iirh@g&R&uw|zXKqixaKd@OYS(HU>cOO3y zc*t4fC;RCsPLC~*g}%w& zQur>zSj3PXJA`|9-$~UMz-GEJy1_+p{%%H=@boHnG%{8&rdYkE`6k~@ z$Vw!lSQ(z>YU-O-Zm~6{fCv8 z?%s`ZiNKG*L>k+ZcJrn9^W$OJ_`)wUMz!(*1EQu-P0#%yl@K2`x0WT2S_rmd24!%j93H$;`Omf;3(9 z1MSDYkd%!4pZ=ilpLlAU37>%^%Uji3aOAD=kXs{btK#eunPDL3pC6=ZhHvk+{yPU7`>Es?Y-#a;K7vRK z-eao{p5GIt@uF zH-4H(TkAAaXCiPrlEXYOkRC<4ggcxkmePT)hMum2l8hV~aOMir2F80EyZ`m_M+j#$()a1F~z*Ej%jrkfx(pQtHxz5Xo5>-(fplb!F z3iZJbkLPigh()YmCM7AwInlL2Gz%@iz<*&>IwfUt1ujIQ$QI17eO)q#ZPz`AeWBjF zJMzm~M9^Yci^0<8Ctbof_>~pGrg=t+>4x}mJm*4i91<`jM@>gkLfznb-#C)cNG}U4 zKoKcHQvR(Aqoih$ibC>H&%lOUBbBWq!5H!(a+eqFkn2=)|LyreTHd$K zywWaUKpeVkhEFj=T@u2A(1K6H;pg>|t6^=Q<=+zJXT4(|a8`@l4+Z%lH7-oCe*5ne zk#z@ChvZ>GXlK#;vh@AHS3s7`IsO{&d%NNRttL~y&&<$g@Xpu(Y;Y-6ZkyFWx@Lel zA4TOb;5q;zcLSw@|v078oLW%9S2yGP4BQW}1>s|kUI zNL+OVci(WMY(p=?n~F~1fc*0nn-7nlj1o~xqE^{(C8_IU=8_Mac18K<5q+v!(>iMC z(1|5EIN8wgodzuTXXrhF1fQ}?;4Z)yfQrB+&xc;+K_%RH3hg=mr7YgUv-Asze=p8R zC*~vhi-N1^+a@H7KfJ#i{LV6dUvTr9|P^2WA|rt>GGCf}jgTO8Tj zPSv_?js_2jCyf9GtHbPHUK8+a=!cCJC$c{f)fL(s=>lxhLc)T^mE=Ns6$fE#a>d@u zwE_gNy0U@3_ndF9H*|mJX`fms5%CeCr`5NJ1nmkbN@_LjKI4j~Pqw!PWb7N`>5cLS ze!t4l4J!?^^oF588R293V9y5HYAXDfbo)oDhp9GjUh8aawp+O1HxH{$o5pycJf}~o zEn4Q%K=dWk;z@J!ze^A5PNEdXe>G_xlCXe=?=okaV!tphV;wQNK{6d7tt`$5of&<@EzHdWL7$wFl^zU}a5&-*vs_8ZaS)e@TlT4x1 zZW`N2=69*#-Xnq}fcUCfeR_!)c>g{cIbwOhK-ndbVLm3WnSEn?D36DGISWbV8PJ~m z7xG8lwL@bHp@s#V;X?}OP3n&@9X_;f|Cz9<(aDRVY%(-bQVNv$ph^{j*#P`leUK-d z4rWu2ocY^91f40_&`6(|7y{$Ue$6|PSI-HC0GH2|J?q4N*MVPPa2dq=V~z&wT+l1O z>5!Xs;}ne-JeRub#mRCy`JQW7+I&Y4?`Zd9G%Jnv+y{k~=IhR{v0)c&O^0AW%`5?W|rArRABDMSvs`=i|njjfX>$O0Y~ z;35I+XIC{xWTMVh|H&41wcU;-dxHRW)oENN4l^$Rp?5=6q(o z2j)rJWzyZ7+&D_c031wBo*PXy+brU_$uaS&ytQx*wXqQBrEHowE%hr?dN&CRKBjgM zrB<~)Rsb6K;ioyXdM$ot0~-%$g_Iep@TG!{(KV6B{XGNq#>i*Q|1D}E@-NBaL~V76 z@CnibSThYBv&N}WD9?ZDu&Xth3hm9qUBYNhZTtcm$6=GV`oak2PKtH{Cl`=e0fOUa zuxkyx#8Y@X61d$Iw&{5uvs82DS)gHUAE3mLNXjEr=CjG#grWO6x25_`pqL}srLioz zFs0JO*oW6zZ_NA=S!=s#U^V3V$EZQOJpmt+pRAh>M#?7I4(uB$T-#X@Lpoj@TEf&U z(6pg4cqzx*)=&3`537%@j4NK?|Gwa3tHh1;;k!oB)+x^E@z8I|lt?RaH~d|S5v!}#C-CbY)@T6s2Bj!{HqEk;f-w5Rej=~;oa!P0N}T;+XA8iIExMX` z;W5ez38`Yr3fP25NDM-w2DIh#li!>bP#-#u(cXTq<(3Cy11dNqHXhlh2Gf_l?w2pg zjy~wo{VUQ&QVqp?C(rmQ##TB4CyLE8^(L-@L)#ryAYNNLIwS9L(50uCG`qH9Oo2ZQ zt1iGIA_bpT60}i3&H#@qt>UutE(AQzerv>mQgKk#r5 z?U&`V31E*PWCmN2&$f(k1X1{YN|Q^24}22BD6H9@%^`rk>wG$WmHuz-YI_=8@d)B~ zO51sK2jS6SdotEt(H<6+HbUhqbLSk_>j&v8(l&3!D%8AU1tOeZ8ZauQu5SwU$L{Mg zx|tX(R-`j-lAmAag!$P`T!5q^tskfx9SU?5;(Ls8dL@THVLm=|T zKJkS>V=Ny^6EJ+;br&mkQ5pD0p@d;_+x}=>XvNl@S}L1DvYUthLfl<~Vc|X>@m6*e%#s1}Q{=uSNt)AWr~o{MN}pYofgPOLF%^ zt#NB@*4W_m(LTug5A~jLhnQlZOt%#Q^hMQA*+Bc)S`$&~-dCYM^BL(BX<_-y6n{#! zYSu+j*&18K`H z+_C8D4cHK?eSHZ7fvh3ly2OkuENrB2c|xeH92{O|bFM`jY)FIYM~%6qBvdGO z$3%p0tT@dUcx-k$HQ1KaSXx7wU=xqb9p0F{_`*|F9S(ZA)JP8#{^ z40jG9g%R}tK2-ZgMhg5Jg$l9>kLh|+zn4s}y2*zH>@@iSyLR)yg|Eb!p?|PH2C~x3 zQ+0GStC&HWEdpgsgdQF?a@xFSU7(LGve~DzanmDqu7Rn~HUT4{LIkz-r@xc2IbbYE z9(|WjgBDCWq!__u(2hK{-3-4QGGgj*oHX>4OdqKRJxi@Qi`o1PB6ZVbq2Cb!SODPV z$vPO95``C8>RLF>)vx=>)Za<}P-1X6Y5}%(nF7sUbT7ZS(9*79j+Wl*&zld967lQq zz^CCp5Cb`!@6oQf66Xa(vGBgo|A25<#D}(AoEmcF>=)@?9aZ9^8g9q00G7kK?7Nba zo2C%uzQqNXFE-lfy#LUL#X_5lFjQ#@Hq0uk#~)KevNo@ha+>}b0N-kAKscG3jr;D> z`gPCZJ_p&atm^-+b|k48Qk8t>ZfCE`L8kojAZ4KZH4!_^#{RObxD=I=*>I<@rsgzn zP?Wywt9g=A0?-06Lo0K%-UoI&zlkh5MOye49>_ujqW$6O)I-=V`Oh~RV3TKgmlqh% z$x0*iY3Jy}cNZ!o^px603RN_n>&E%dOmicz&YMcHLu33U^CoWKRfwf@ITBf#7{?!7Y5-O*spsqODHkDqn%C~3FY&6<=e# z#;c+lg+M9A^r$&_lX)&E5**(L7nPw^AC6QyT_Hex$27C)zgd+K|BtP=42!C5qlSkr zk&>Z7x`vRJ7O9(7YUrW6yIZ=XJ5)Lb5ReY(M!G>j>F)ftxA*hCKi=1$9*2i}_I2$u z)>`K}`=<*-GiHL>$gq@M@WXE;n~DBDG_n&OH5oX^p@1B2q(?1SYr0FmHt$v3dH2 zbyALv6kJuqgntO)7PME?paMg4SdBl*7WhnoDLlUqc0~&d+X!C1*`S9gEU@dzKQHTw zaUuT&lvJ^u&y-Y%Q$UlMmmvsh<$6O+6ia^cQ7*r-@y2VOA!>|gT=FfS!Mfw?fNhru zN^oD8L`Uy!>HR-oYH#4*xapy7*Y-i^jb6Dpk!qCeFqCW}>b?FodVd|nOl=?}0J=YQ z&35zuJb)Zf1dK-z*xfFLmdyXd-{_W!&kCvMXAY<19y92##Y0L!&dY1sJlMJL)-*xI7!hT%33iTkZlxI%ybVuLloj9Undj8idj&Pt*zt zASPIz<$bM;(T>~8aOHi0&d+Nl8@1~D8mFue4buiK^z$SQG`_A{W#uPIl!n-Gw+lhu z_e2dwJ?g@8FB(m~sH~I!{Q?=BY&5mEWTR4t>N%RO9sVM2$5d28R9Zp7#`;SleF4?= z*)>w&&Ykzk`b=G%V|#9h>yiZZ{T9YepCh5L!vuu4vVbi|Cby@5{oV zAgPiYT5B6v46u|54mVO9(uS+(RKh9Kqmzv|V|(HhH2~&_4-QL^av)FpL5S@-{a>h& zXyi8e?nn?|XV2)MdAgMA_tYON=Dq3vI6LrI(p}>dq9%RxJQr=ZvPFrn|L1j#VUFIa z;^g4FnjN!LJP0@({mnb;s#&kuI#8eO9CUL*S|dFSWz&a0Or8MpgXAG56*b_latD4F zo4_oteq(0yG#D|vZ-MAH#mglRmqi?r=j>^*Hm5!IIhyi0a24hn*~+%GI-Y?60>(7E z6z6hg6;-j@bq?L@5r31n6J1Ru@a^>Qy-T)$L%sf93FT-+q-%EXX@&nv9UB;p1bCQ- zS9oics7GDuc4SwLGvP6;Z|vxH>QnozeVD-^4%-Q>@Wm#U=*NynGMs)?EpmbvMmq4~ zN|$5^RH5i%{sej$Bvb{<_u=I;=dwD&4v0nG5wg{UJ5*_R7QjNKKFwk)^r{NReWAs1 zN0X-gr-(%YKK_gETZ4jq!%A&4$uh2M5_(BEYa+dk`s^O#syrlRGA z3NKBnROH`Fq)1mv*nYL6fPi0c@uHqHR{`kD-{24WE)AdiwjE@Q@nG*oc8tT;O4V+z zqfmep}?Oi&Cc|> zxfDCkKR+d2682*IQ`3YF^IOeZd!J;VSP$V7_uQNP%}q7I#Q8esyQ;^9=IJH5#wwq! zz}&~p^(Mi+>&M5Z$CXxZ_kl}-KdEHttBNuT$n-5dEu6l6d+u)UHpF@DJj}oG)PKqG zt^o($vbQof~eytfkX1J0MglLi?iP{``FgYdP-hEKsJa(id=29Yf$(Ea|!n zXV~QIEfXu7wt1Tndo(}z;l3nCK2EKoI?xl!P>R#@*q)lZvtJRf?CNT!Q(PZCP!!uH zy&H&_h(d|72(n2Z-ts5LAWX)m;lGzR*Nl2nczG#2!XKDJs(OO1-qs>t$RNGU8DPKy zN$IjGfq#2?tkU-#X=}ePQ}(%?^e27xfzop`A_`1QL2|cE^>DcQ^xYuiNwVVKT>Coh zPFQZ<5+gmFAx=Q>?Q}(e-)$IsnAf8ELEPhIjMz;KlKr=Wo)Q5O@WZ%!v)kj%C;!Wh z!|Emh3E;#t|kg zttZ_c&1L$wy-7S?<-@D~{zuIvN)(ZS&rOc^Ay3?@-)bhM*YO1KLP#jAtrLZb|MWHe zag@S1#lKuN-fsjc^uF&1U2Z@UzEa)GAzS)d^2plmGrbr0JF<7?Qcw^*S|OnrRQMO$c^J4iP>A9{;93}_-1>%tT0Xt4uhmzUj>D38B(A9{_(1b z%sN`sg+SR($_hDF*BK?<=%LSy{ZK@;Ly30ST;G4lNMN|fW&ofYZYwP%vE^IcPK0lk zT5Cx>w$I5sy9DBR^bRS(gC5YiXkJ2`DEdS!%z^SnOchyp|7X@hTJa^upq`IVHX&<4 z5$9b%olyH^>9M%D>M^aZ$-~bd6BG0Fc;vfZ^?0icyprF#Mc6nv*dtjsTYJYT8D26y+lI{%+IGz9YRqka^*=!Fp7}$S)5ic(w7y!q#|I` z`Q5&Yt;6Eycvg=#hT87paNhX19bANjlkZlr2e>$elso%HcQWv!?P5mVIH zzUXnCi8I}?d+4+!UhWHGV8DZOflxwe*zo3Dcx&osf>$sIG4thDGDWjd%c^Ar+Qqnl@*2k+;CS)`n7=+}_;6O`znb2~(0?aCmR@SdGMwRK=V_Y@6&V@uNXf}x)cmH+xr3WrE+}O$vWSQH(<%qv z(SrI|9=3$vky20`Y;QvcNi_hM4Ts|SpP`Gs)uUcl%T@Ky&lR!lz0NphszdCa!sZFitOBSQdbMN9s5GO>mX2mRyc>j$~ko= zwaeQ*Q4MUHy?>}Ewtu|7sA|55)I3h)K|>9YwRK)Wa)N-PBx$7K#4*}PhclA|LeIbE zdUg6fUY|So|F~uz-uT7$d!)*G4^zSa;&|$+`K_LDgxIy?s(~2a@hI!=N==a&OTta} zccc!Xs^Vq!C|XkFg33~;Ru0kok|YwV%pv8nNG}yZf^2jPGG270Y($y}lj@>n+E0!h z`P=6vr!5+LGZyIKuUR*G%3sekHG;pqpG@bLF``&JWmm<+MzSoj_T(T0RwD9{>fH*K zm67Qh`=(C>N|cp4vch4Igc3&7wZ>!)c?i7upR9aOa_HK|kgRdZ-TdAj6&@L5aYZ;M%*qAso z79u<$pGl0D334enU%YupWBNAeak_3vHSIYsjG7E_1l|VDbwkZ^s^I1}AlZDD(v~gZ z1^K7LGAX#qV16B+9(8c=_Yt-c=XUe+o8LHXx6=(7{u=5UO1&JFUQUg=m0AZ-_EhWT zCfCJ!+r*m=xwGqyIB#J}l3n>z?spd#7ueYEHQksC$+NSwr>Cd?e76wrVw0XJhBFQi)H;_t)($JeG(Q?mXU4 zhZJa~T$AZL#N&{mXGQS6~VFV=j}eMC_bE9q37g}0<)Rznr6 zThCp0D=Ti7*1fWAnBb+@G9R;IEE+hj^ciJn7!l0_SDU<#>cIx@>{BDc0%L83=3C6z zvw*=gQ`0RjyEfbL`%n23vZpqs47l=0cMbLn^?oJqs%9&w{M-0F1b01$>MJ@*CeY78 zvxh4ht(228MdOW$mS*ny>^mwiwU2Cug_oB4N_qOdZm}yC1DhO@iPk+l8+s zUsI3vo?W2IjNLT+bols>y`wp>C0KB-XkGX*rXmLTfVFRVSFBFp0uB$nV)yI8zfO>F ze17NHh)7*}d$pZz*{7Y_R9uYtUCsgS6RB9fK%QPt-a=Xx&KU5zIG7GJxEah}8MtOW zdlwxTIw>{zlj1`4gbwx^g{3F386oEekFPXRyKI@N*rs&FpVcP^UDn;XgG)5x!?m9yn(iAKdW^)Htu=>* z)daUZ<0Ak75=6h0x@vUELIjlQRA2G8hn)D;>&=#z;$a?82!^q-qYqu_0{^>ycW0+( z+us?}3sWOtCplLw8~y9X{^t|Qew#R=?=*G17t8EW+a53M{g0Z(KuPbZ9)nkJ62)%z z#2)8z{jaaY{1$Eb?U$Rh_;LW`=NR*}YV6YQYP;Wykn5?Xm-jWEeCwG!2mNG~IClbN z6R3D5#*Ic|*wrVyuL-8kzk(%)*7y41Js#uX-mJ(~bA!*(Y*nkd`G(BVf|si~wzvg( z$2!vsIgVkOX+FdSeUq}2^mP(ZT@HI!t-I%w z&u?Mmq96%0(|X{rgk3N3FdHneQn~~O1}l?^K=fAge71Q$47AHsqtVk_fd5o_NTJ3%CilNnQn9rDoifV#g!vSkm;r$3oR|MN zv9~~Sp(`%j@KjIs%8jyFK|a2oKY4^nbS_p|a@@8Sq_k;`Ru?wDMZ;A#1)iVajOw?F~IlwOd@8=hIxg8j_)*lM!%ar#I9)mle-3kwX0mx5LHtwIGDSkU&PF*XqKmlhgi8G@M+6f~P41n=W)XdEdLB7MX5CA~Cf5LTP|+=g zB91Q5Ypi_ldhZC~e4;3VV}yK2(pXMRwmJv}Mi(rV%Emmy!l687%dv@5LYhTO-F2v^>etA~e@ zf(jD>m?D64%Bhx+DIJJ{wh1`m6<)l6Xjsdm6WW=!U3WY9z4@;5roR1U`pl}RF!GXn z#X(Zr#@LSkt;H{Ue^n|UVwH=EmPg;3*~GePSo-aoXDKj8uV?6ziQ=Ccgnva!!^4q@ z47d^z93lZ5X$PU{8EKqjF19rCvF;cS*$a5>3nS?aC_TSZ0o7U?OYJZ6>hn?N?RyUzwmD6B} z@TFbFnbqVQa;4l>8Gm2jaY-IJ>GidZD(BAr!6E!v?4fhG{jo&U8CiwQt;FD_`1aFS z+1^n?YYtGepJIaD4=fNzk&S#49VhXBs4zH7ITK?nR>I>`;^}M4dT?A~y4Cljf8E(x zRRj}s1f24FN&WvvOW1yw&AxWwow4e^As8_5uI7XJGlOD>Qu~&p3~Bow7}H5k6=joT zuI09H9!u-gBIf6;$S(mO8l_6j@W1rk?ugW>bxN>6A~P+g7KtGD$uqta7F?)FyD zua&$S`d$EBXa;u%o7L~Y)1*M4UrAR-aQ9-4e(f}(O}`rN$itsh{L3z^zdvyqlk^b8 zzMovIM3!Z6;X#Mr2?lhYiOVQ%Y5H%mtgRoOh}}%=$RC%SuXzU4$MB`*hATQJgrST# z>Dw+KZJYb4-O6bFY-tc?Uipp~{sPD`{ai7JHurlKj*m>>G1Nh#SRTZ2m z$tDAv2>1RN3KRg$kG^AVIG*byPREPGz@G42mizlGP6Kv=dUL7d`#Y;%( zPB#t;y!i{N0oAPlH-c_MW$z#|1=XvuvQ~aj(<&xkv#Ik#ZmS#GF+Wc3-ATj*;S&@9 zuAugs@Nk9!>mmP#We|r*N}upBgV~A>EgQ8|p2C^uoJMG9QCHJ3HsK_`kyOZwQuw%b zrl*qaj$Gn`GYFtBXctEaA@~8>BW%<$wxGau34i;G=D;yAUj&Ow^%gUk$sYMy;3>|NYaHj;KY2E}(8(alSZ-Yuo+qZmZSnx>ENE&*QWAQYrjc zGpWz8yPi;q0ekHuX4DrW7RYE!-wz5MkjM{f^{TY*yPL$E#jT2MawM$(9&iZZ=BFpm z)4Hdt#=G2|#C#B?n9%d3CVHW&Oj4AjzP_e|8E#{wUr+64yNd1K8c;lrG;wmVx-~A1 z2?_83v-#cM7cpgJ_L_$*A{4V6Vj6>evXX49F+ezE0&-CvLG?UQGfLIs3&4^oTxpRI z5_B>JV?x-s z02*KPe0R(ja>h?Jjz-0h_%7yPSCLA^|DN9UsQLIG(tg$sibc}E0gqB4+)qB*68Cih z&lL-Z&NdW_K=f?X@@D>F7f51UzCky%qkb4nKUbWaU;wsJAVhl)y*jTdwzZ`?b zfK6QQ>|yq|S|SWv_~S6YE(;?=p`g$-J9aDvrcEeJo40C%W_5&_ z0Pm;m@!*8`zZc!GhZvKdVS~BmO`7RwRIBQVT5rA?;6N9SYwT(nDS_tgG~~@fzUsAF z=htvHWpO^+?&k4DbY?Ek6~U^xtLv-V@7BooKs~m7rWbul!~u;)5+GOeGzB(IR8hT{ zJHUL!2cGz>*I8iAgt%|TOpI4x;HMx{2=JKl_moz%bpfL8Sso_8=5@UjtO;kOW_k0; zK^r%=5GPUeOfq3je)VmcwohU=`hZS)`mIPx(XTMkPkwuoyMvjg?)unEjmFa4Y*kQI zo4G6PpwQuhR0M(-PDV^!x3-{%S{4Wcl5Angza(y#oOAIirfY7r;*f=~pBeeL(obf+ z;?_2VmM4%IT5o!hq?@Ero`m z|H(|I7YnHPR%2d0GHaXF)JE^DE zZFgrnBY{?@5w9jRz{&#Y+{2G73bl%?cy@j4CU-j5r|PkaW4q*)`nm>x`{?P^FmEVE zSwOQH26)TKzxhY-cMM$Y1$;>NcOxz2C|#9)A0S}8${V9jFZ>Ihvkt63s%XGv2P}jQ zNua~KXZ%4@dP9)Tg5L$2%gtpsSNg3a*K;^ZqW*?XH)1I#0ye8A&LZ-#iKP<;i#HRj>g*|FxKjg4gSSER&SSz_S*TQNc3JjdQ-feg0N(8bQ#poU0pxFhz@laNdxg; zITkedH6)D`t%BsR^;);=dZ9{pSzqrp=|3x1J*huPTC;M?p`A2>*i#yfY6vn&r9QiZ zI-s1pf0%82dzyHSB$Od?lQXH*BS z7v_))lS_cDR)ur8d3HCRK(x>(ME(c5-13kS%YS5jm#t~bUi3X2yOYNKX_Y#thbtZn zb0_lQ>Oj`$7gs-xR#OW@&i1Q0rUlXT8E)Bq7& zzWQ8?EUM&{xHV#FlfJgZUrJLWJlL0eR-`G7xM%2Nd0!qW+V{HeRYtG6B9&1~jTQ|_RMB}98(fC3Nk{@3jqE*k;8%#F@0QLH}a2#3yPB+$; z=&BcnM4OnY!na8=k%X`$L$*ID2W#+R&wRP8fiJp*ntWGOl<#NZ|4TFsyps>jQWP#= z{D5HUbAfE;!GZKYEr6k`5up_u6ZCUUP$=CII|26_>TDeje2Db%XNT||K)?K_ZUC5Fn8MP^2wi7jhLoaB#X`isx%9zzwhBq~xMRZj?fMsg zPC!UeKkyhbK9>M-8k1qJY$sc5%+(GG&&DxkaHWAJ2~VOEPT(79!l42*-GgY2hOf;Z zy(`gNo=9lkh?7l@L=H~3VUX7B@SPMUOjX=YRj;C&5$lp#4bFn#|Z;m z(d*7_a%1;A>y7!>WXoLyx*4_q(hqV};7fISq zAyqd%&=d4XoP6=WlW(rtEmrz`p>rfg9L?b=8^r^E$tpbU32tmHwEIT%<-8kxIn1Vl zpR&$QF$(ssi>`g4SHZXvhL>GmcV>cuWsuXZ*mqG93^5i9H~g-ozJ+vNZ9d%GL0Sy& z(6L>1&PlZ?y&DCU8neo=XNIaruYL%VV)5SSWF`a;1!G|DkjBCd(Zm@>)=+|s#dAwh zGahK5e^m+PpJ9&b=5+&M+-5Ob0~_YOfvgMn+^Ap^9f@6YWGvtnjRzw9Kq-62lC>Ln zrKfu2c%jt0`mmLHf&ah{Fpo6IShT`yE9yFvd2aeZeSDy0Pl|+if>-yqUejhzdPD0;q1UPBF+euzkIth}>zUcTcR8sZhYY0T&@D=zUrSA7HtT0|Z zy!5U#c=WDdSUT^HGU1{FTE8vQIZTE*SN%|w)@2}WS_9Jb@2XfkIoyQcANV!Gn}}(# zIH6h%*m+fp=wRO|Sur5&{(JjRocz%pm?~`=ge!;Y>FGXso@Tv*r?Em6qC1vSaNUzj ztx?ZmV_kbKK>5yS(2R6Fr939QM8R~D_$ATHC)|ieqTdrbhYOj?*-Nhapr9@GR4YX^ zqq+f_ey{%yf7&$O5y$A@HJbR2Nl>kfZ11qL zF}4i~(9R^lUQx^%KLqT)=#+piUt0}#rdbpp-$1;VisK{BPuJX7j4!5n$umxtvq;fU zliDX3EBOD*<-t2>^V2`e99RefUu#tk6mndleV?@a#5J6K8;5A6A&+ii3jvqIIqxqI zGW`G(=nn>urvSX@!JKOYNK4|&_Tin9JQ!1+woCfXO#;WHAR&Om;t{`nBbW7))s%rO zzb9CtrCyO=QBw90b&Y(KVlskh5J(x&$12q=)l4^}racsV26_`VH7L*5&K48ZNt}Wg z6q%-Cgc`il^W0O2P38=28(;U+jQ0oD!%vn!KRxRNjhB_u(@6gPq`wGEQ6XQtPQ~+D zKo*nY8Ea6%&OTHhF>JL%_t^0vd~fPijbDlWt(;X)rhu0j41-`&Q>2{R2Se z4+}52gg(0%_x4JVdi&9`i3cd(>j4yU^?QM}0OJ0@ERGTRtLb`QwF(8SI1GM~$NP*| z%gEDdMO_kC*(hpz(#-ip8bSaF^3#JR6o2LVb93W7iKF8`7L z-}M2+UYG7upbJWV(ksDi@-TPI{ZHxF#NbvfjUBJZ;9GY^J=tB|~K#r<}AV(vSlANB0>wmBhJEE3p z{TlLLkjaAKAzr#_B-&CjDNl|>|2nB9=%~>7eHp9}gIL<7IGr`0NBDy4wbe3IKYAo4 zhojA!>bPSlIM=_a;Tw*5VUVqqfSr}11yE8fR;jkGQw9X%jHUN%;Xx2zQiA32AiJF! zHNaDrZvR^zdhZtch5(DgFqfr+Va43SIQVrIY(4N)7kw!Di*%v|@ zZ`8X~F~nXg3r5kAP>>6k9}GmeEn0 zk#<#jv!lZL1eD-BD^dgs;^C1)V6U2Z#UhP&F&zAywho?mXsIpnxy#5C$F(+CqUNyW z?Q@Rt?c{v$-+~ljIA$K(RlSZ<)6PjJhY$?pSLL!Jqe(P*xJBbN$|&aaTx?8U{JhWo z@A}o6M)vdx`{t*$5Jf`^!O9}U04r8O8e|K&KcV{iuMABj$Q)q-qYQ|i5=_5QyNLgD z1QWcD0whqeaG>1b8@BF)R{O-iPJCLP9m9tRTN|_LzIegqFe4Yf4N>x*xD{f% zgpsggjLVv!6 zghR)*6t)YZCtD-rJic7mL=!>{DnWh8m4h=IY8OD{L-~qV!aLRDlJC?zEfG7!-GRn{0#2~=q8tagt^1}qAX)ZR}^HrOb?-wt% z;#g=$4@aZFF5WCkdJpzrjzvk@=d%~&DAl}ow}2*MOOiKI>Dwy0Gb!{+{y(e|Sx8vTR0?6EaY18;dukGv- zmsO#(VR##c)P;Z{fCQyJ5z9Lot6k;98^O#YBab)ATN}q?Um?*`#pYL0xo5S+!Oy}d3 z;VQOdAc`D1QkLC=NCLVDvjANi!sSyNAS-k z84A4}t4)i|3H6UFtls+>9`7NU>z7VAf|lO8xL=JNRaanA(#t0vhodD_zmq-xGAI4Ol3BN#csr`J*+F;n0S8dEMrU z-i5B-9$XFa{d*$MagYO>SY~gVO3Pt}%Q5Lp++NY*K_PmBk zY~e-44c1i^$f&^>I`TM|@rv*2;^u?Cs6o|krrLBs*|T2Ge}cM#YyCmLG+=-UDHsR} z>JjHOq>*qNseq67<)S6^jis;xr(?D2;In;1o_o!rQ>9C$lix=8GMP?bwBz;OfD+Ih z&!9gFipxj<48eP5P!TY1!R;I*@e)@NRHt6KzpwEPf*j@I_3QJVi=g?_(>uzEQFa-EXf}$SkZ%2B4HC$h?TqL>FF*e)})L>!@WNTod3-xBv1tsb-j19 zNxw}8^R;J?ytXCY+0Sa}V4N?Uz|j@0RNE$++JFTy(S`lLrod56>y+ZT9xHO3*)i&d zK=+96(3I4NR&N9GNmhFK{##eqdGIw0`RnkGTYngAAs+K5?~q;7dND$ z8IV?=YSgxenzi#`On=1lFc*3Et?VD|lbm&N!~Yb765IAiXT#mi{OXzP%hgwSatI~Seuvv7A4)?HnLO^4>jK>b znv0AS<^}IBFD}&8)w8M6L9&u^f);mt*L!;F5!F!yr^fcxzEa^^bd#W0-b%|F4s-8UAcjyX2vU z?=Cd4>pkbn6m1>gkGVlQ3SwYQw!Q9xZBdp|(X$Ksj=c-Opal>@a8LQQukNu;Hd__- zCU!i!*44V#FR+;NWMya&4mG1?@H`=5LvITNWSQw;sKM#)W>A` z&U3$hKjmP1Vu3;$lpcA}7TViQK#KH3G5d1%=)}WE)PP3>f#jm9zr8|InWsaa?IO!34ix=J;@gFa+q0w9R9w zfz0Jq!8sApu>)j{_zw z$=W|uG}S&TT+23}R&*aYfkp@A<}<3HHlDvZgfe~Ovf}j7zxVY) zfrgeX?3#H%PplFC9f=y|FH>h+SyxwW389)CF@9@k3`=07>5hd>Oa)F#3HBU&T1BDX z?Uz@0m55D=)uq8+O(7Lu7NA5$Sm0YgBMIiPubh6O_+I~WQMj5nh=z-;lgY z&h#7h;C<>OU{(7Z$aW^g1gh?;Y#~F?< zU0pjrJC;GpPn@g(UsC!bxLMBcjeG`+=4@~URJDxWM9{xSbykJ=TaEEy)pdU@NK;m< z--rk30?REs3!Y;(gruoFD^mEZ8KPI==Zu_!iS-|EN1Z;?7xojnQ_;zs_GHMVoTjsTmD1P_Ls9nwOY}z};rLNTO8`}6=k@H*x z7YFjsR3@*B0YS8dBe1G>@t^e+TmZLr6YIZ*Q#OK%9~uTZIfD9%N+Cx$bxO}5A$7f7 zlz)cRm;ozxCTJEp1`eQIV)&mn0IDDRJd}$x%*bEn0NCmj%>qm=()M=zysWtKA_v-( zP_i+JfAo4`5;!?*yA=S%wz~O~5d1ZD`x^!i+ey8$bJ4R zKLpquEwK778a)^qUr?ynRkY|mU0%klR_w>FuFXiu=Pn7TcUXcplTB!13T70ciE<{D z$79eJFz+pkslwlGG$oN1_)NSLtGY_q!H^bHlP1e&5J1{?N($XR!3+4%Q!@xO1A@G& z35LP33oI`)hLJZy!+;t@B<&iYN0v-TMKrMkonSnX0!1d#= zH@`pLSD^eo%^UJv9K<`Jvu{5$8G<5Ci{a4zjvyOJ*$1OXJlByy55Z?d6NCVn8xZt{ zTJTfYSR(HQ1d{;IDAF{=OR?pNZ>#dhNx0~#8sLl%yt3%#L8qfQh>`KSb2AgH2@vz~ zWzP)TVMHLijyZ}SG;8(FffujJ*fbp;M7Z#~7QP$cY+ImL01}I2g!{QzqF4Y8fMcDKFSyKEXs^63qHh6Rz zvE&#<#Ad!`S<>}J>!=lz7KWtYs4pUK_XJ6RW&gl|7nGWnqOw%ps46R@Gq$OC^>u`H ze%ZGj2Bikqyd;>02MJg|M-~Y`;^9OQb|0wekcs?q3~n$Yi6r^&l{E%Qq0cq2R{?(G zF6(qXLmv`pQv!P^7BSU=m7@{r@dX$7-#8M2#l02jIf;i23<1nMxoXBrjs3$(IPfEL zyhT$kex=hs%SJ0s#EjbNaG41KSHK+*6MPCY_1+SZL7@*XHCIA(MX|a}l`Cr@RY!%N zL&`ZDjjNJ0A+&$-JJ7N*AmBjKolG}p$ZBS@U%+HHjt=bk_2C{B3?eA(Dlk29t+N9W zZ!_;AK?e#$efWV^XYm7m+k%?#$VXZUGiZZeoh_mZjU4+&RVYo0;R+2USib=){0rCF z(-becA@C8p=;jKeGXZ3Eh*QVEV^-r@W|-%?>?B2mU2_0=j*nO4^A|G`pXn&5Ev(_o z?R#Ua0spq|%TFaHgs@cq1r{9q{2Ah)w0t<>3nMzzMPgv-s01bWZL5l0A+r|N$E{L$ zK>0;szBC{PLHcwj3AV&I(bOhf24Ma;oUi~9tv*HHQ~Dpw>hA_(%S>EQ@*&5wh+g@B zLXk$~vTX{idWwhL@W0_6P}tquj>pm6duRL5)dOS(!`r#Y{-fH_`r#9fg} z2ImT&!(t`LchBoIpFxoGZH{L_lBeoWfP}%^a4S7f)c;IxqLuKV4ruORoM~y%MF9^K zD7B1$sAzjj*YMnF6x!<7}P&{(QHcHSo3a|REM4klSi_o(&h|G{;Cg23y){58R)*uu6UUg1AF&Pg*6*7Nex;~hbHDz_N?oahVT!Lj~Ip)B(9fi{nocL9bN)Y`&P~h zp%hY`>oEGPoa=$7($HQV&I^ohOVx!yGuQ5~g~_mLb3OvY8jF=mH8UDd3bcs~csd?$ zSm#~rh8_55=&WImo6G#; z=5U%R%yBVAIFRUe!ai8THgm3i>`|~HFTUFEhg)C8=*FprK>s44k+#JCweRTDy`ZKc zwQFfvnyz5E$m)nE0QhFXUd?@Clm^uq*j-^ryf*wo`&;OPtXw!8^)Isx=Tf{Pa$7>) zZAoq1DI7qvyl6g4N|*e88=8x-bd&N^W1+g|J=TY)=a?kuqXdu?KpCQBg)QDH!>+FR zijwL%qqqlNXO}f{lvZ^i$;dzgI=pBEXZzC_sMMF67k`Zg-86(NNa`z0KHLM~PyQAL z$UsSf(5Gmoz|XM=o$MP^0J$IZC*l-PJy8NIlC7HNvc{6!vU+KK#E&2ehTo{6p8-w; zooR%dCXL4nL!|(GnyI+tqx>{4C*c0m)ujpGvSxm9g;bxXk1DS;Z~>5UIiTtN zpX)t*Y&udKOa!>jO=d9xJ|-Fe{lC9qx#|K<4I}LxM!;ZiO{U#*WKF4o-bV3ZV(5|} z2aTlIQ+#ZwdZ^Cw{la^Vi>jRd}&o>=N(@Lrx1ASes>jQAl%d{n}>3}5j!(07;TPd%GZ zd7sFZhzF1@mn@Jac7QSY@O}6^SQs0A1SU~>!z7gSo|0-9m?ZKPlLziq;lCQw{H52z za1Tjzl_OUK;{;OzNbjeCu@+omg7AtDZ#-JO5x*JVwfMwW{=R^U$(1aws{Q=(2?H~o z*i6vwjGn?ZdD9Z(HO@S0;!liTZs4-n0ZqYuJqsjy$4uar4!mDFr2A9T9cSL<%FFM} z=v(1c&&P={z$G?l>7PT;tug;CSOzIJzBM`kkMP?Oi4+hC)U+JQJe_T-(M)nzvmi(1 zW>X>oDvm0u&50wB)oR5QU&^;#UB&KWl+3E_;tE9RuE~;N$k5ky(?3UN)_+zMkLdXr~|tHT4x#U884Fall}&#y^dbBTVVpbNC(rxcxZlb|+Rb9%|F#QClNsQi7co`ITcNqnli%ym@7EQRciwo;MB?gw%ASgNcA8 z0cz0x2yv)5I2;-O{ zsKW0mrS~-|_%^{GZK`(}z?XlJ5pR57*UyYJ?)seWTwJC9j-gl?x+pM}KC*A27YnQgpnW9~) zw_7p@c28fvw7n?aettg{4@Q1=A{OnPv5@mqW#oRMS*bXuI7JSA46uPCw{ff z$_#xLR_M*}Q`ZERpm4nDkI-^ELQllIsZs$T+Rt9#y?D>fKkouZ%Tq(bdYRTApPUt< z9#e(-0`k#jx8j>D937!~@t)k16m}HD6(6M185nDou&Ly5wKacO&n_82^#E4aV> zRn+S!Q?QTKcJ z^H`)I6)+uo*MdmowKWee9uC$UbS&awODqNMkUiKQd+^0~<|j6iEGIT|hXY2X>Wy|#Dsl!3{lMGX)R3Y@l6 zy~eul%+_&hxDCMOW!K+HiSKJ>{Khn{W=(m+*P&STrNHSmJ0(S_>nFS1NZ>9uMP#O$BYgG8ISj23~K9AEwu{#&Un<#(y^dYXEI)Fu1Mfo^x=+2 zq{$VT?J`G)h02d2c99y_q1*gl%t!6hu2Z8EFOjQjoqiQRY0N0mExGGn=-4QI8kN4T+VW`H%@=C&KySjq(#c+AQnmS%QcBuhE4 zjeh7p_RNfOpHWAAkOsWpsFjFDvcI%8&UF6(Na=?COKT9>K%wZrT|fsQT^rX@)pGpl z8Nm9PN)mUF%wQ(f>e7%d88OKu1JgQY`n_SkN+V_b%*?O#^@(}^R;SgRr47I_`{qHk zYL@ojn-f8Ph=Xu!50mkJjvbN}`RCpY>?895>p}u8xUyvLShG|8kU#u? zRDE?=RbSBVJ|NwobO-{{9nwgP64FR_clS}cQ5vMAOOTL;LnGbY-Q9V&{=V zk^vw>CL0jmEBs9Eb4izZ=sCyH{MB-);7^bbSh@;AgI4T+OoSoRH&IaMvrmNYY!atf zGl7!)i|e*A`nB2{DS7y!=Dc;MIO5|ZW~&j;<`EWd#I8>4C2#+bf})59@sAh9^j>o{nKIi>+sN) zC@em&rpC?D(b3ymJ7^Ub-G%Dw@r`%l1Fz5F{j=fykm-9Agd*qkprAulKFdnW`Kx39#BM13L42LU#OZM21Ge1)7q;9lZ|UD* zZ}#3wiwgx~=J|wYq*h6N4$6;Cf2?zQ&0x^Kk->0rMoJt7kBZ3pJ(l7+?3--v?d|RT zBh5j7^@+->4k;u=RJ)U5=PtoFzPtNbizxa}*Esr)4~O7&WIo+Bs%bvJ6WO2HKCMMp z(mA52G@%|U5*avyKutBGTv7U5cv*ts(Y87KUM4SP4rI!J7y!jMmdp(6$Yv&?+T`Hu z(ZQtKfmAE~*V@+IPCnh}$izgQ`V@ckpa=Qd@^$#WV;y*TwU!SFbyMq#{rKc$(1>Ww zl_nE@@kB4*(PQ2>8dMbPpda3;Z)yc4R5gDhd4EqFO>~8sbJc6JWDH5`jLcbDS>fU0 zvIId9jHm|d${BL%XR+}}#!g3c8ZJ#t^Q0vu;fD8&f-r{YdRT4i6nK(d5jXhFDXa8@L$8IsJL~ZQ2sNM=Z|3x%AK< zDk&~5&U>dxnusjAX<=<9;0e${UQS6p*XpfqWS`N-6y|KVYSMS0emF%vA~Mb(`F%X>4XmJ!Qtb*j?`-LU26+G zgOq6e@@&1=WTq%BDw?UeS{84qC4dfX4T$5kp z^zk!zNbd&P%FD~iw=Ho`GbDF+o9m$Ng6ZTtmOsN+q5X4ocC*BZK@OtSUq`Z@Ej#l| zQsKBrQk2hF6TE}1MhVzH4xyFVEdA~~y22t!U^m)S0s0bre#Z1AYBwFHSm8IFT}rpy zPT(=*jvk!MUyNxv^MBfVi%hvdWjs$BJ003*LC~A>=zW9J&`nXC@VM4%V8cU5TnZ>E znjPJN!_Emm=(B5=!2x9?0#guJf3cU~CkSv-SimGI_by}r&)G3f3w|OONK%OkNn&ZK z__Kq6&5}>F03SdL2e{1=Zs~88+7Rc)5vDCZn5Y4~f$=c3h!jDYA1?x8Fbk@IW%I8M ziH;gEp9@>QS8ybs|LUf&aM_aM)nT01k63UzI&iK+rp!S?;g%C0stwJn$RjPU^G?B* zYU#sN^U)gymM8WqQ^Sd?h|1rn?rnn$)-{G>6X1N)8gMkzvk>{=r=c?bdGB6lE=1Ht zGh`sv85O9wVjmeY|%ia z=rFLpcHb2gLmqy9Wvxl3N!KO=LE{)6rhku2>HjgCS8;q8`DH#QClgg_m|+S@6Ftu9 zC5cG=ZNSJ*q>}8T%SDK53eB!D2fNdq$J?fCR(SksR|VfDJlOfU4DhBoH5FYyVxYFD zMwf%-1#nfHRLBx{L58y82!uu=W?HyPHIR}&ZNjZxe1gOS@X`0AA=mOZ`g?7jYOkgxVcSB-e z0wmC1U8EJX^bl5Y{F*r6<@TJlt6Py+C~D^h9_{`dZ?bjY7KE0A8={ zJq-G>iaY>&^!(~m>6$rXaG-`*n)p9g$Y~K!u|S9+%TEZ=+(KMH4Fy-u`&+$!e)m-9 zdWIcv;-Io4#9Lb7;rtOVZMBbZ;giy3DE$=$)}QqiP*iOTkA~`~fd& z)^WQ3fD7leZT-5KDw#x|$&A>AgfeFbF3X=Sf9ME}1s=y#Lvd7241y+xO!=V4_E}Oa zpOGbyv8}hCtwxJ(J+w@IVphnq@VbR}GoWH1g75`Y7*oTV*;;hW6Z^4U7GScW#vS#% zQe9J0^rY(G!bjnsK^})k?wO#Hs}+H{C4zHUIBfZK{K`jrwW>Zu#taRFrKi5&e$83$ zkqi(`kK@2*#_HyfH3A?S5mW#Z9~wi^kTkNz4~wr2>Pce+nWXr}qCb=qu*DFwS>lj! zkUe+@2G0h|r$1WX>f6yk&G5}=0uo}WIHeF?whYdg*)6S~rx!T^N$gy>_^(8&FaVaO zyeYj}&Oos?32ShOIF@_})zisJD>DLyTFq0xzA9A;JC~!a+IgeF2+@cve=h4_s}wRP z)6dmTebGUhakGFJd;(-<7=Rf}Ls*{4KxwT1-*U*xGAN3F!S~4RpDR>|!P>^BFVVxL z?3T^?qJbnH>ihgyak&$^h??*Sc|T~lWC@n1zSCzM(EutY0r`O`pCD1FgWnUES16vB71TcY5hGOT{4JI>BNrqoog7j|(l7}R%T@Oe^?V2nBm!qx z?=s-TP8*zYO#>=_jBH6?h`4Et-y5)xF!Uz!yfF`;p-ga1q03$E6r_NP6J?F$D`wz` z4gQ#Hwb*cd&-Po6kEsVHkA#;B#+m0BrgrNo9&M*WJ1%$}WZ2v#ctxvx+-`vv06|ZxfFvUR; zoZ#Fy^LChC2M^A@4YX+EqS-y(zbF_lqXMd~E!0&z2*`2W?#gbTMAG{A4|~P5HivhlmtF zgs-Ir52Hb&{Ce^6s5>8mOn*eXrIe2Vphf4!x(<&7z%TP~z7es*+e{wB0DjO8*9rzf2nb9)qT+wI7?Crks^)MmF6Eo2Z!u4E8qRIY$aueMYzk1DV;-&gEAsD3IVW*JfHgoj}7b z8!D6O;g9160WnT2uiDVV^HkmlgO4m_q=rZT8$v-}&^8fIb!`>TCJyHhBscWW<3??mx*3ZRfpF%VwKdBH^6qpP)T&2AJs+zs78`^osEx& zrJmVo45hj`m9)W&rY6WYNg`YL%OU}nYMe|3=iEg4|H7XCdxNI29gNKP+;R@4?|PDn z@V~Et_Vt0Jzkgy z2LcSK2~k7}2f|o-D1J*+`g?a7ym$Ye_^BZ3!(X?O`e#sW(4dfjzV_8>oji7^ z_UXw6C#RFr6^8(o~_HPpkunRXOF;!<^N^)l6$n*Z#)kgaDann8zR{E-s-ltB*d z$O2#<-Nj=47eFZz(Y`;1t$^R6oE1D^ZUKi$nKNJ&f(ekyO=0&MyhWr%)xZ|(S$3=) zMbsCo_-Um;;HY5_+dYNQan?Ov+CZR4`T6oPhqo|#Mk)Gvy8VrJ_-*H5DxsYB=j6ct zsMYN)AhYp-00BA`=Q=zp1_^I1ZST!fOEGwh%*RUmjA>8>4^rPKDvW>L$4`=LZLSFgC7#5=uH`2hFYIdV9G^n$j>wa$Y)|% zVeG^CaFowc!T2tr2s13lbxf>Mo*6fV`()ezer$ruCt!XLGl;=k7(mV@!Z(IyK@q@R z%5vAsylvSf2jGM)M|0*$9o=~`xIRyXG&&eXiH$CZ(6w^myEF;6iy(txELPhk}R z4+Ot32VWfL-#rLMBI9Lx-iBu3kKLbTa@Xre9L6cL`iiRnMOg_kqLH5?^lkktOHF-I za3QMipMKL7OJCZU$Kk?u_`Qyr9tIGkaIUl8paaSTZ>btyN`LOmcYyMav$b3`_J#6c zsiB01WSzOjSc>S62%d?(2OU%<)z6wx*`lr;S6fr+UohkZ_ayw#-rRdW0H*JxZ08&n zz}7y=bn4DSO{kGDME@ z{sjZ@JNn0$PqsUx=cKkm5%3ZU@x)|ERQLhyo(3Xxjp3n*|6Z#x)Zq^9=%^6emc*KT zH%1=EGR2i|El=MxlkT-5!t(5VZJ+e{^wAU12m^3|S+;O+lv~r%RJ(%Xiw%$nt%VNOOCngdy_vxwRYmEYK7l_?zv`RN296Il;D5%37@(Xd1*m{0KU|Vx!v_&xuJO>&|xXWWw?>VF%4? z`|*0mG*=bB5--QeO{Eym_R?-#q8#3l1*$aKYRHu**H%M#I7_6a`|ULhiUR+@NXY)y zGkm<|@5_QDQ1z{{P7=LE03K?R&>aGP{jXtb4Ifp#7ZJtel)=g&i97MBJeg9x+IL)* zTMmViOjpW02;turJI`vAoqI%OgkFfG+IN!N0pqhm&&!cVKBJ-mIPC?swg^nPI&GE+ z_6$uUOn%z*`q-wR zS}f@UM2@-&XIS!WsdzxTgIg-(zZA;ItwDQ5rEs-n{TlTKF2R+3OC}32`p2_Al6@2Cz0%=pDG^|5p8H_q4RX z81Wc(t^#;Qj<23hC@l`ekQG)y2#@Z8VU2zl`5(fq-dk@SZ|! za+<~NE~qGyz68=-*=_CkqU!6glo$!b<~bM6uvEn{T|s+R_!kx5#a3M@mei&=zXyoO z?W;0|6q*hQE%Pox_+ua`K7ei_L$)Xd{|Q$NC}=m}sM49?s->n5;}6Al)NP|KSw=@= z1r#yS{(vM!Ej+00uJfNc}H-GOtw_1@kaZw`!8g&1#6lo=h17NDR_)`C= z+xCGul`EsnJvkNqen8|GJLin*m8*$`kBI@eDFKB_l-D>ePbS%Bkpp5X+BJ(#*0>F4 zSS3F)Z8uUs#&~iaDQa4&|&ZlyTZOC1YnEt--~BY zBAA_VFVQ3@*2H`cECT1G;b5ZyGmxd?ns+OpXgTIjC%3Bhtc#P+)&2Xah~{%BOmbM2?d9opbq3^m^5L_9^+ z+6gz@HYL>^^!IFAwNZzs{2tS=S7r_Xp*EY<&7OHNXUC+ieYvcmv?`CFVGTi#g zSn(zcMyFDHeRHm|Lf#~W3eyKOA0-HtvFw4K$fLz?*p&KNBKesXNdY1KF*g* z$8nfhdy4Q=i&0F*Rh`6CQ@Z=p-eWmhk^#ssK4>}4uAIR^Q%u1`I9nIQr9&0aCj6@iw{T zAvKDW(myiB*2&aU!ZYp%y*?$pqLI_bt!JwE)o06JEg7NX$R2LtMaYnFCoBAC(Xyys z*Lv1F?H{sMxoJKV`2JCELQSk}FFoZx0`%LvUhyeY;*{2ziJ4Z7?qF!&Y%YHBG~*TM zB3Sn7Wdic@uJSXo=aRu@1tdr|n0(S=l$Gh;O@Aw;&v}9KK1~8dFsftUW#8)@BhoBT zKQG@-dAK{nXG(fC-+Yp1#cMO~I61X8Td!rS$1yQ=pWW#>@Uxxp~Md20_VgY2>KSZA-)7t34?n~`9HwuZe6TiblrnYpBxr7~srO2jy-Y~FwBKzdCu?Sv*x;GT@2@AJcBM*LNUmfOcH!~hn zTW$$=i|1x90KGeMfM*w%`umJ^quS-g173FAH_KG75fU%v$Yz$Kizq5QC_Bn04-LQG z`RA#Gq&8|VYJ7XFpA|?TqeO8H4j8lsN{XwD#bJ+9u5gStj>b4@V1xNsu8#=M@Yl6B z9^Jj~)05EEDyyHzQymsJ7uR}?K1cHQHm;+?F~T(n{(yNQ8qM+5D^r7aGEMD$HNc;$PWlC7 z+H76K1JfHK77zR88?$$`3^YIPJ-5EqTycBC>&)$?byukLb3c}y7{ z1~VSI(ZG{UZ}{pWtH)3SsW><)Ozu}ZLh-0@;@|GLfSvs-_UjuPAJxx)_x8$Ge<~f@ zL7XF5(%9sf7NQDzM{L!{S=!7FK;cteDMAvi)`Oc$N=mY_-WIB0#<7G6-xz%vL(DYY zy5b(>ssAy*>E;O!NaTezHWvMC89t%F1A>**hYO><+stp`Pu>ZLs1q|@cPR*o{A6ue zC-$0G1UeCJG=qha^yT}Qi`ldCA~nvI%q;yLnmqghFDep$H?qAJoBtz;3yC6=!~o9w z$CrMp&^y|^(HC^h6!THT9UK4VO{TbaqJA}xxwWXaY@LdSB<5F76*}NdMP!jqDD)EhR5dlV8k3z z3h4xRIz=!@2yGrAoSF>&wQY}~kDeH;!{ee|qg$je0ABqbFK_BQ)ug6@{)4e!R+_;wnC$ zYTz)5Q&?=KC1`KnJtdJe>XiS-(4j)}gCA+gK>y^`b}qMoKq?%*4|aKs47JcTFMIhn zh_{5Jpi*!KpLmqrs;IlHXUEIOwYll(0;NJwHQO%P18rDZQQ>%fyfXg6hb@dJ`Ga^c z=0U5?>9>W(^AMip7tODSd0juZ>YH0ze|Y~s`{%X|ct&SoUd%5U%H}Xyd$GrhTBBZ~ z(WL)aqK2XSbkraooHrn{dPwV9`jWc&xIhhV?*EYe-JbP)=07jT{10qgSd4zK7nJv^h?>`f0HFitY zmJ_poV!My#ycEqv%m(}UoXkc~UakMQn*FT=h-W|N4F1htEm8J$a#qM+=xB3u2vYth z@nm5Mwk2tT^NmxBn-64H+4!^OAZV1qfx>lrT8ewqr7b3STPN{l_OX<2s8ju%f`=Mh zybW__9;WQjgctSVNq@Q2AxV%OpdVo%KBiO+Ut%cery_#Vy{4he zdAdCp%^f2FYu*|KSg$eu&V>WE36h(Mm|>x_dDXH&4yX27Jui01^H` zCsRE|Ie<-TpgynbKGFX8z6|Z*9ji8{;hzExpyhV8BPBZsb8c&jPcBjzP#(M88IJ12 zdRr_;sYaP7kX@1Y4B*;Q;kmdApm?8^#Q+xPQIEaIQ!&du(Xs(CpM&A>17aTcF33y( zTjIpbm@1!NsEADa{w_h1E+|7o@GuZj0v4};%yO47BmI;M)!cH6^lM{1#P3Ib{yupV<@+7}(R;-T?D{=@%~nLvAI2d-Clk zt4O~VTmT&M4HlA)`BoZ1=2S16d2xUSvHPMLU@brP4K+SUvJ-x})2tMgPsIcw zX6zv%wfY4t5K9Ay2@ai{=cMHPv~!M_&{$oTx#-cHAP`0ZXn&jZ>vmxhMgYoKY#odv zfx(=rm;T?ei@A(=h7JRM_a*G!2Fo4q2xaV zO%m~5>>7))l`s6g_+%~TRbKS7Px-&zD4D>6AZKhLabH(%EIn5_p!9C0gF3B$|CHI= z$F90MGE+5jK*!P%lEj}QGE^>u0JLCTOtgA|WGjeP0CQcx!#8;4%VHj4pRmM`QFf@> zl0FeM%7Hfd@6Av&wKTL5EPs^!!(Hca5P8AH0q{gG?QQuN`+s-ce?$Z}wf!a^EM7q} zw?DvsjF8Y-noC^04|oPQuYm!*@F&9m;$CX~@DTgsf8i9#_eC{~-!FK8;ogqy)rp5I z#UN>cOM#3o|Sa?7x)0xnC#$j3bd+^6`UAX|JG%n}0wPk|jZ|?Rt`ZuiRN?e@?R#$3>mt9qU-V`~!Q1D| zHeU}kMJ|e-i3_|Z9*#y!NvG_9qMHCPzM64}K4_a~(!}-4w@zNlS=b=+Ji$d15a3B< z5oQ!&>A@+1%_ zFNnY+Qco5JYX96R!-cEmVT5XUY-!-Mf3>`eJfgrp|h0T#9CIwpbPZ`fioJt}g3Nc4YwW4nYV;GEU& zkZuh&OxO86BF5JM|J0TkaR437cU{`HDDX|hfX3+Mwp))3=5g3q|K3R$b+_d{Aobd% zMIr>dT;{Mw$Z79dB6#j;kNfphMv0&O#t2>fb69|}&7FnfZD0T;_#)6>l#j#f&xTBf z`}FANp-2xT_vXzTK7$p2Bc-V&%s`C~^M9jBbgj?l=u1_&S~FQxG@B%%>;y^?m*lm1C(TH&i5-fKoOwUauK5WH4@(NL9pYe%gVX;N`cP+gn3|$AJA6I*do=n= z9p&nL?@Qi59C04zmMbT3T$?Qdz+8$%xrNRX(3=;D`RpEu=cWm8J|%_&=@3L}@E7uq zv>HVrJAYFc+sHwz7#U%=g)yPvJ6^Qt<1laNuR7lEPxUOO^zD%2A8UU#Bc)gC{E}DA z+0*^=YjDt{9N$IpAtrKHop7aEBZTPnEE?O?xlj`5Z4kZ)XZ6aIyn6M;31&=qcV1(U0GU8*N^q< zEL0Nc_v^#g<#b2@t(dd-(^2k~-9Xw*oVkQ5p%ca5NTCh^)}*W~=9i$$*!l90!AJE!3WrFr&4poKas2)U zk9(PTA|Yj}95^6cj+joT`hL*i)kV<=3URzM^giV|({m*_Cm{eVg$94{fgzCx50Ii{ z7L(Z?jN{G))zRgD`>Vy>MGFNQ`e&9sG%X1ylY)zn>AGtJ(3q8>HgO$x-lhZQ7tD+4 z#G;Mo_m^nIX0L5&@yeR)R;!sOgU+3pgfW1!G6{c3CK3Mn{+Kwj#&jSJB`q+lB&Q5I zbDSmgpCTdim)Jc=<4Lre`OM(#=!uY06yOfu*t*k{B+xSo!?Hz$nd(hB7$tw}%mWD5 zn2};qhZl(O>&My6&@u8k{3#EU|i z)*4X43qA%O`>*|)ibqJ0b7x-P70>&UvtTuNXp80lE}QBNAgTTx?(q#_sh${Yy^-(e zc}FQ^(1Q$&xvPTuDxdb^LSh*+5~2po5c;(@`KP1_Hkm34CG)eX45w-4a&7?1^W8HL zdlW^MSrp7DFaPEG@czi=o3evTv|R4Fi`ytAz)gPlJVt|@cC@zxu(bXe{+nV!ejilB zD$B$}Hgtm{p0TA(tQ)8Qj1fKs4F9MsG!nKNe z?q0@e-6<%X9_-alwR7QsA}Dr7TaYoljA<18*Tx1`JuRX}oYW6yF05f_>GvN>{X-ar zzE+Bi$YKmr>A&Rzt(aCHH2*+w8SFM4*H_5c0~J5}0-AQ?b9}dJq9#xxY@C!hvB=tG zcf^EbKXbhOlUaAzD(B{6u$~-MWB$DLGes{k7K=#TL*m!MuVKC;@dA@@un3wgk?glP z8=tB0BNg^N`OAxMzOfq2(ry39jQql)bnQnwA0m7tORB4m2_h{@+Zv68HCnD*CQ4(Ju?z_7z4sqD>m2z6T*=Ap z%v$YmJDy9JCoVvimZv`CUv23hK;&dna2ls_`3 z3My#(_!J5DPXggz8`6$FJj5}GEeB_P$1w5~-{K+YP&>C~B92MEB?!G22e4yh%v{P0 zPYPR&-tN8aspDEHU=FTJ7bpP+K&Qv%(D(<%&L&B@?++TjZ2G0>G=n)-ho|viDRSxN z7pbUYZR3L`;Q=TcLB^d~^$nbEe)@Vnr8~Yq6MBsvmEoOqb+fQ0-cLND<*R`JBx*wf z89L13lC|yjna;u-yO}>RB;(vKqZt`nHloK0RKyx7pp0?a@AoSqkSJawp zOsm9?RfG#)oK&HE#?Jt1?UdA|1@uCD86ZpB(;4*_Mw7c{ws~GXVZzrM8Ll!;nJwKK zEGBkaiijASbL!(PySusZLA~;+-S}9BpMwzSB9X6qi4!ta$vh}%i(wnFF~~YxOS|U0j|~Akvc@* z$ShD;_)l?_k8dp^Y>5C%pr(DUOJZ13j39KqpQnw81*u=Ez{T0~is$mKhVTN;B9@;N zD5HnK#{aTtVm>e@VI_OQwr*%^pXV`(rd(dYn}NQsJ(@n*pJ4EcM5KD{6f z2xzC0P!z^F-?%g=)8x$Vrl0lxjIEAh!?{~J0DCD&mhOkeIhDcTDp<>lCeoPdGc2OP z38Y)OuYqz8-k`^vrJsD5`i^0TAd{FrgHea-Ko3Tibur5uNX}oeHs-DWUk=%`--co< zt;k7&u1&bbt5J%)v5}7Y2cuM%uWzmCMb<2%RL5^?u%iMDF>v-vRkqB$*l_q#`8Aaa zOg84)*IkPom1wXEfv)cj<{PD{j$x653nmFIEzP@&duBH|40=$nhxt9MXLi?ci@?=Q zT{p$?ZJo%=d1Uv8d6H#azsw!VEFak37LM%BUCm}tg%_AjA>}J;;tK9J7bmkix%j|S zjq$Uzm;i0AB-+&v@^~=Ic z9lnWH{pn^U#ibhqR#4dn0WBIKKm0-Fa1tv>3v_t zsbj=SHtU+#u3*=vdAGlGWWOHoQ~N0E>QY#Mgi9stA!+(47(scD;pW!@FkP}Iwse}& zGKf^}>^xsf&Fo`|T<327Nt>GcZ>j@#{dpoZuy5mUJ7w|!zTZnWZ;efbqem10fv5D5 z>EnYM5${Tau`<6iMfpJ)en;bD^K(SqS*6nq=1$jW3Ru}D#*|gggUxHbIo;dALr1`F zp3QPMW>PPYm4rO|TS$p5I9j7RT&jzwrA*;cJ&R=GgVr;qFJwwaXx#b^RkO{bT+%)rlx*P5vztlRVP=kD@F`;_J+u;jt|C>U7BW$KC!6X9@*(Ds$P>)xr&$>DIbwhK^ZuO!z#K7eo4NjNaCp z%ITH5$iN}Ju@=)izYM$k2lag5es{D=tLydmIZ;X+9UiL7vv%&{Q_B>1{5~u-O>N=Q z5Az&05{aD!)GnB1t-Dgl;jb~(K9zYoWz1}#B?kL=ECu`uwULur{%)r`Fy#ldl-&rw zXzXj!tGIEin3;015dpg@$BPAITlj6aU+Npw96v0SAMpCwv%!9uOZ1PS4c)arx@2DflNkk0H*jr2 zc85&x_IDlBni^QzA*)p!K=ozRne8Dxx8CEDkZB^TEWM`RQw~q|3j_J$)rb5W^&{Ak z(N~8bON|V-Q|dqR6Mvn5T>f6>75#LickIZe_}gh>v_wmGRLomY z+TQ%RxN*U>i&HvnsM|R|0aNHJOry~}QR@E*sNuq0u#_q2_60klI2joUhdEh6`JkW8 z6__tka~TiQzG>fY&HUcNC#`kc9+pYYSStjt`Y~3=;2F9&Is_?gu=niBmTW=35A1(b z!Tq|h_Vl+Uw#j7k)r9Lgcmv_Gi#Ri=GabB)tE_|7ZV&j#+r5;3^>F$59auWsJVU$m zPOaaR{5bOtBo?(VQ`NB(Q2|+QuVqah8+O1~pVM!{VVXH@VaP(9it4!m!1G=3Np$B1NN>Zin{2*XUh#arZD#(`o3? z=ND8^UteETRJ0)kHj|rHj<6r5woB_Qyy|66H{*%_DWuC<;{8cb@HDi}!UBimnKn;q z-^BKP=lZtvq&mw`@$JoXAE|MK^vk2ulRe=#N)|5NbnS~R2DL*Q<#n@GBCMQ-0}g9p z5Al`C@lOk%(3eLk>&*+xq~+6*>ySkQM-~SsdGM2L^;~g9zet_lkY%rKd{&F3@oN6M zuhCZ`#SUc)_4@PB{84%3vTebTr=wA;oodxsuW6u90pal?W-nn0aW&Z4Qhf_E@_OHV zAu+fJ-^_B>`sK}ul|?o@YNSzz@#4p=#`4nD46WY4IX8un1{z*NeILR!`TPajqc-jg z=hEW#HoEkQ25;evv7PMi z%Aa{zh8aE&wK8z{R5(_AxAEX%mxV97WzkVlwnQz{)mDjMmwaUo){ht9|Cg7?)c+7* zB7a;oxJ&sWMS%qU_;EG(wYjuJ&+l`LYW243O3v!R*^0JV%ybU+-WtT~%{YfGoDxALEPY?xqe4#U{c3nRF0SYJh_lw^ zxosDT2Wr3x!$_Y~m9CLw)~}u0wKIwISu!tgucSH3d1ahLRT0m0nJnql27>gw6u+w& z=8TYi+Rg?)`ZUip8WWZ6h7^*O8}w-veg0%UIt#1Ej-CT6fRN)gv25Sm%%DZ=(GFRH zQYwY$w@>H6h4mjleuiAVD=8>g{@%9{=bSyIs-`9j&UKRz(-|pl)U`7)$yF-cKVi-n zD}e`|6Akzlhu6=7lh4%DdW|`D!-NU##;2w@KP4_8Eg>@Fqpn^>1_dG3%pIJ#7yKun zNJ(}5uYkf5I582FG@UdUEGR+swO~VplY^rxf=Jx#ot=RDapu3X3AgGjddm}~xkGj= z74;8*)UK)mYk$49`D(${fR`|pf~DTPNv}HxrKY0K7wSbzxS(imsL0zGPl~Ph|L!?luXTEJ@udP zTlA%du?wnQTny266{Pl-)RKD7eX_p$CQu3_Nre4L{G~a?XSK_ThsRAUCvb#_mw#IG z*tW-@RKsF)W^0vPJ z`{vx2#NP?meAHBz+a;7Osk|x-j$s&eDVNX=!qhaA9N(8R~C~*Qq^d zZpUGG*r86e@>#x!;Q5ySv=z{>sRO3PB_*W7-fzIu4-r4)Xve^h02Qm$|5r^ZofJi1 zhIV$mTbnFfs!blLpy$#fh?(Cob{T2Aejo~vjs0Jzl^BDx6%QNGL&lKmu0H4@PAUqmh3DIj>D_&OdzVfbz68x#k{-u4^pm=R&hcC~)rwO2< zcs^DhHir^>5L%lyd%RdWdEu=Kd?1TTRFMqQMT&5~_U3Bm1TB}x_uM6wyp+I$JrMSUb@hRUWe`!&55E3tOp5Mnok(4g0 z?2JN0J>7$%Z#KnC16l^ub9jw8c8sD$Mt28OZ7m<-AJn6TMY|);(XHA8i_qO_doTA` zqmCG=ftb)4yllxU>2XGRo7Fwc>i%Y!p>hm&3I;`VR$Yt?gbN>kHYj?c)H69T{W`|( zzIf^UI&qd6>uP6yxy^G6U8HZ?;g?_p6JLB zwmn_3>gq%gkQ<0R;3)|t@iv&}JSJvj6#TBkQv0Mesk$Lj0tb^ClE`VEQ0Cc~5-DFz zVk0t>ms;tUZd3uj%r zw%=`~IJa!=PxQEX3QgV#9jaL?xR-GV1{^dT(niy7cnqo9vWFJLM1PuM-NR=H51svf zM7fiWCz>LY)8t~vvb$WG-_|<46i)5V$cbfcaMCu*7;N!Ow0jf`f{0diw~2TmkO+5` zSk2HRx|z7P&lpa$Hd=A3T@9PlK)YK6FLps*rZPzCXT2<|=7pjD(^V_BxHanL0<3Fb zw=msc&Gc82#N*-EyeW8JYtX_qa_XD1v`f!OXR&XtdVv?k+0|xn_!~EkARWeYSE5lm zv2k~h68j{ei11Pj=W<@P-Htp_G{fj`d4m17EM=j}eSH%Y?cu9ye}CV(#}-$yN51c` z&coLx!wvqGagXUx=-npd{9Z=X4v{df(l>)cK$dqc>=$k^4&mZ?*u9Q#PI>L}P`+ z8%)_jiWK(4RSpnotdnAdA^xtX5$he=dKdyNa_Ri?|effbj zil0K_Q|;>3w6M0-xbZMaMsgqQ2E&4(0RXwl-(CP=oPu#SR)7uAm&FK*Z14GFJw45W zK0eb(f>F^k&COc0+?ufQnYnLfo5;E=UWR1my^i}+Saw4n6ID>OEs2o!Qt08TS93do z9jMX1GuCiUJo+Y?K?dHtrVXc!+3Z91+waeTsr9F*Qa$}%6YI+h9o-^4@cy}E9mLc- zu%J%ZQpG|ed@L4zBP^nq)Y8V$U0%og@>LCi0;dl3U8l&&&e{F3YqJS=QP>Qbg6K~{ z1(?{=I4=T7zfY*SHL3+6!i&`70jWM|!a$l#!ffrt_o=j zIz}#2vw|+J3ZM#RH&w!^ny^HJFSP&DyAEtl1p9<8pOimIW_-nU+9Dw%o z-m@FtjN{n5FIiz#U#(YcWb8hc`>a!6hWo9hy{;?7XMIRnxRG#>P%B-qDX+7#A@>JO zb~Qdbe}Sn`J)vWD#&ruv)@&+UEBN*`8Xf{8ul7v&LsXDA&^?;J)t}-YF|XLG8^prR zeDbs9{sc=et!Sp=as`$}YPuSvB2{`ecDr19`5Qj$Fv zU42=@6prux-^6z_q74fUNRW2n&$n%AFJ0auhsMci1-xhJ{ycE~$f>I}c;(%FWoukF z20A!S2L7#YSCPpW9F4-W%MWJU`cRqvt|7z9L|4MFT?gyMNGA3)ziXzlVi;PBvD?E+ z30~PB)of5GVtlxDKY%xCyE(Lj=nuNY<6rsoVcIcsKzc%y8a83w@&GU&C-5|Pg+vn_0`7Ye!ErqOyHjy%g{;hb35JQ+# zmP-YIBVHw&k{RD=Wpcvr(WsV?8QX1T;_%7ii`pcA9W1ozvs*I~41Y11bL)1|s{xc- zep_gaSNBEbX`oRodrV~|O{p7R_?=wbC9x$A)Z^p)(pkLzjJhY3K@PFs84gkZX~)

F|SfQ7c-MB42nvd=@(*S@W%{KWcD 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 diff --git a/federated_learning/nvflare/nvflare_example/virtualenv/requirements.txt b/federated_learning/nvflare/nvflare_example/virtualenv/requirements.txt deleted file mode 100644 index b22c2a971d..0000000000 --- a/federated_learning/nvflare/nvflare_example/virtualenv/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -monai==0.7.0 -nvflare==1.0.2 -pytorch-ignite==0.4.5 -tqdm==4.61.2 -nibabel==3.2.1 -tensorboard==2.5.0 diff --git a/federated_learning/nvflare/nvflare_example/virtualenv/set_env.sh b/federated_learning/nvflare/nvflare_example/virtualenv/set_env.sh deleted file mode 100755 index 4ef5610490..0000000000 --- a/federated_learning/nvflare/nvflare_example/virtualenv/set_env.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -export projectname='nvflare_monai' -export projectpath="." - -python3 -m venv ${projectname} -source ${projectname}/bin/activate diff --git a/federated_learning/nvflare/nvflare_example_docker/.gitignore b/federated_learning/nvflare/nvflare_example_docker/.gitignore deleted file mode 100644 index 81ac0b529b..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -# data -Task09_Spleen -*.tar -*.nii -*.nii.gz - -# virtual environments -nvflare_monai - -# demo artifacts -demo_workspace -expr_files diff --git a/federated_learning/nvflare/nvflare_example_docker/1-Startup.ipynb b/federated_learning/nvflare/nvflare_example_docker/1-Startup.ipynb deleted file mode 100644 index c4896ecbed..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/1-Startup.ipynb +++ /dev/null @@ -1,217 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In `Provision Package Preparation` step of the README, we created `audit.pkl` and `zip` files for all the provisioned parties (server, clients, and admins) in `expr_files/`. The zip files are encrypted and the passwords are saved in `audit.pkl`.\n", - "\n", - "In an experiment, you need to send decrypted folders to each site so they could run it on their system. Therefore, in this notebook, we would decrypt and send folders to all the provisioned parties. After running this notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import shutil\n", - "from zipfile import ZipFile\n", - "import pickle\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['project.yml',\n", - " 'researcher@nvidia.com.zip',\n", - " 'download_dataset.py',\n", - " 'org1-b.zip',\n", - " 'researcher@org2.com.zip',\n", - " 'admin@nvidia.com.zip',\n", - " 'org1-a.zip',\n", - " 'org3.zip',\n", - " 'server.zip',\n", - " 'researcher@org1.com.zip',\n", - " 'org2.zip',\n", - " 'it@org2.com.zip',\n", - " 'prepare_expr_files.sh']" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "os.listdir(\"expr_files/\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, `server.zip` will be used to create the server, `org1-a.zip` and `org1-b.zip` will be used to create two clients, and `admin@nvidia.com.zip` will be used to create an admin client to operate the FL experiment.\n", - "\n", - "First, unzip all the packages with the following code:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "demo_workspace created!\n", - "unzip: server finished.\n", - "unzip: org1-a finished.\n", - "unzip: org1-b finished.\n", - "unzip: admin@nvidia.com finished.\n" - ] - } - ], - "source": [ - "startup_path = \"expr_files\" # this is the path that contains `audit.pkl` and zip files\n", - "workspace = \"demo_workspace\" # this is the folder that will be created to contain all experiment related files\n", - "\n", - "if not os.path.exists(workspace):\n", - " os.makedirs(workspace)\n", - " print(workspace, \" created!\")\n", - "\n", - "used_file_names = [\"server\", \"org1-a\", \"org1-b\", \"admin@nvidia.com\"]\n", - "\n", - "for name in used_file_names:\n", - " zip_file_path = os.path.join(startup_path, name + \".zip\")\n", - " dst_file_path = os.path.join(workspace, name)\n", - " if not os.path.exists(dst_file_path):\n", - " os.makedirs(dst_file_path)\n", - " with ZipFile(zip_file_path, 'r') as zip_ref:\n", - " zip_ref.extractall(path=dst_file_path)\n", - " # change permissions\n", - " if \".com\" in name:\n", - " sub_file_list = [\"docker.sh\", \"fl_admin.sh\"]\n", - " else:\n", - " sub_file_list = [\"start.sh\", \"sub_start.sh\", \"docker.sh\"]\n", - " for file in sub_file_list:\n", - " os.chmod(os.path.join(dst_file_path, \"startup\", file), 0o755)\n", - " print(\"unzip: {} finished.\".format(name))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['org1-b', 'server', 'admin@nvidia.com', 'org1-a']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# check the created workspace\n", - "os.listdir(workspace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With default settings, the experiment related config folder `spleen_example` should be copied into the `transfer` folder within the admin package:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "copied spleen_example into demo_workspace/admin@nvidia.com/transfer/.\n" - ] - } - ], - "source": [ - "config_folder = \"spleen_example\"\n", - "\n", - "transfer_path = os.path.join(workspace, \"admin@nvidia.com\", \"transfer/\")\n", - "if not os.path.exists(transfer_path):\n", - " os.makedirs(transfer_path)\n", - "shutil.copytree(config_folder, os.path.join(transfer_path, config_folder))\n", - "print(\"copied {} into {}.\".format(config_folder, transfer_path))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far, all required files are created in the workspace. Before starting the docker images, we can update the permissions for these files:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "!chown -R 1000:1000 demo_workspace/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next Steps\n", - "\n", - "You have now finished unzipping the provisioning files and copying the experiment folder to the admin's transfer folder.\n", - "In the next notebook, [Server Startup Notebook](2-Server.ipynb), you will start the server container." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/federated_learning/nvflare/nvflare_example_docker/2-Server.ipynb b/federated_learning/nvflare/nvflare_example_docker/2-Server.ipynb deleted file mode 100644 index 4ab15722b8..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/2-Server.ipynb +++ /dev/null @@ -1,241 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "# FL Server Joining FL experiment\n", - "\n", - "The purpose of this notebook is to show how to start a server to participate in an FL experiment." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "## Prerequisites\n", - "- The [Startup notebook](1-Startup.ipynb) has been run successfully." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "### Start Server Docker" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from IPython.display import HTML\n", - "from multiprocessing import Process" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running cmd demo_workspace/server/startup/docker.sh\n", - "Starting docker with monai_nvflare:latest\n", - "\n", - "=============\n", - "== PyTorch ==\n", - "=============\n", - "\n", - "NVIDIA Release 21.08 (build 26011915)\n", - "PyTorch Version 1.10.0a0+3fd9dcf\n", - "\n", - "Container image Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Copyright (c) 2014-2021 Facebook Inc.\n", - "Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)\n", - "Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2013 NYU (Clement Farabet)\n", - "Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)\n", - "Copyright (c) 2006 Idiap Research Institute (Samy Bengio)\n", - "Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)\n", - "Copyright (c) 2015 Google Inc.\n", - "Copyright (c) 2015 Yangqing Jia\n", - "Copyright (c) 2013-2016 The Caffe contributors\n", - "All rights reserved.\n", - "\n", - "NVIDIA Deep Learning Profiler (dlprof) Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Various files include modifications (c) NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "This container image and its contents are governed by the NVIDIA Deep Learning Container License.\n", - "By pulling and using the container, you accept the terms and conditions of this license:\n", - "https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license\n", - "\n", - "NOTE: MOFED driver for multi-node communication was not detected.\n", - " Multi-node communication performance may be reduced.\n", - "\n", - "\u001b]0;root@sys: /workspace\u0007root@sys:/workspace# " - ] - } - ], - "source": [ - "server_name = \"server\"\n", - "workspace = \"demo_workspace\"\n", - "\n", - "server_startup_path = os.path.join(workspace, server_name, \"startup\")\n", - "cmd = server_startup_path + \"/docker.sh\"\n", - "\n", - "\n", - "def run_server():\n", - " cmd = server_startup_path + \"/docker.sh\"\n", - " print(\"running cmd \" + cmd)\n", - " !$cmd\n", - "\n", - "\n", - "p1 = Process(target=run_server)\n", - "\n", - "p1.start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check Started Containers" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n", - "08492335d003 monai_nvflare:latest \"/usr/local/bin/nvid…\" 2 seconds ago Up 1 second flserver\n" - ] - } - ], - "source": [ - "!docker ps -a" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Start Server" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start a server, you should:\n", - "\n", - "- open a terminal and enter the container named `flserver`.\n", - "- run `start.sh` under `startup/`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " Open a new terminal" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# You can click the following link, or manually open a new terminal.\n", - "HTML(' Open a new terminal')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The commands can be:\n", - "\n", - "```\n", - "docker exec -it flserver bash\n", - "cd startup/\n", - "sh start.sh\n", - "```\n", - "\n", - "A successfully started server will print logs as follow:\n", - "
![fl](demo_figs/enter_server_success.png)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next Steps\n", - "\n", - "You have now started the server container.\n", - "In the next notebook, [Client Startup Notebook](3-Client.ipynb), you'll start two clients participating in the FL experiment." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.8.5" - }, - "stem_cell": { - "cell_type": "raw", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": "" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/federated_learning/nvflare/nvflare_example_docker/3-Client.ipynb b/federated_learning/nvflare/nvflare_example_docker/3-Client.ipynb deleted file mode 100644 index 88928ad542..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/3-Client.ipynb +++ /dev/null @@ -1,417 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "# FL client Joining FL experiment \n", - "\n", - "The purpose of this notebook is to show how to start clients to participate in an FL experiment." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "## Prerequisites\n", - "- The [Startup notebook](1-Startup.ipynb) has been run successfully.\n", - "- A server has been started." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Edit Docker Script\n", - "\n", - "Before starting the docker script, you need to edit it to ensure that the environments (such as dataset, GPUs, memory, ...) meet your requirement." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from IPython.display import HTML\n", - "from multiprocessing import Process" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "client_name_1 = \"org1-a\"\n", - "client_name_2 = \"org1-b\"\n", - "workspace = \"demo_workspace\"\n", - "\n", - "client1_startup_path = os.path.join(workspace, client_name_1, 'startup')\n", - "client2_startup_path = os.path.join(workspace, client_name_2, 'startup')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Please click here to check the org1-a script](demo_workspace/org1-a/startup/docker.sh)\n", - "\n", - "[Please click here to check the org1-b script](demo_workspace/org1-b/startup/docker.sh)\n", - "\n", - "As we can see, the default data directory is `MY_DATA_DIR=/home/flclient/data/msd-data/Task09_Spleen`.\n", - "\n", - "Please modify it and ensure that it equals to the actual path that contains `Task09_Spleen`. If you downloaded the dataset via using `prerpare_expr_files.sh`, `MY_DATA_DIR` can be set to `$(pwd)`. In addition, you may also need to change `GPU2USE` and add `shm-size` argument for `docker run` command.\n", - "\n", - "The following is my modified script for `org1-a`:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```\n", - "#!/usr/bin/env bash\n", - "DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\n", - "\n", - "# docker run script for FL client\n", - "# local data directory\n", - "MY_DATA_DIR=$(pwd)\n", - "# for all gpus use line below \n", - "#GPU2USE=all \n", - "# for 2 gpus use line below\n", - "#GPU2USE=2 \n", - "# for specific gpus as gpu#0 and gpu#2 use line below\n", - "GPU2USE='\"device=0\"'\n", - "# to use host network, use line below\n", - "NETARG=\"--net=host\"\n", - "# FL clients do not need to open ports, so the following line is not needed.\n", - "#NETARG=\"-p 443:443 -p 8003:8003\"\n", - "DOCKER_IMAGE=monai_nvflare:latest\n", - "echo \"Starting docker with $DOCKER_IMAGE\"\n", - "docker run --rm -it --shm-size 16G --name=org1-a --gpus=$GPU2USE -u $(id -u):$(id -g) -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group -v $DIR/..:/workspace/ -v $MY_DATA_DIR:/data/:ro -w /workspace/ --ipc=host $NETARG $DOCKER_IMAGE /bin/bash\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check the Connection to Server\n", - "\n", - "Run telnet with the server port. A successful connection should give a message as shown below.\n", - "\n", - "```\n", - "Trying 127.0.0.1...\n", - "Connected to localhost.\n", - "Escape character is '^]'.\n", - "Connection closed by foreign host.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "metadata": false, - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Trying 127.0.0.1...\n", - "Connected to localhost.\n", - "Escape character is '^]'.\n", - "^C\n", - "Connection closed by foreign host.\n" - ] - } - ], - "source": [ - "!telnet localhost 8002" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "### Start Clients Docker\n", - "\n", - "After modifying `docker.sh` for `org1-a` and `org1-b`, we are able to start:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "metadata": false, - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running cmd demo_workspace/org1-b/startup/docker.sh\n", - "running cmd demo_workspace/org1-a/startup/docker.sh\n", - "Starting docker with monai_nvflare:latest\n", - "Starting docker with monai_nvflare:latest\n", - "\n", - "=============\n", - "== PyTorch ==\n", - "=============\n", - "\n", - "NVIDIA Release 21.08 (build 26011915)\n", - "PyTorch Version 1.10.0a0+3fd9dcf\n", - "\n", - "Container image Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Copyright (c) 2014-2021 Facebook Inc.\n", - "Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)\n", - "Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2013 NYU (Clement Farabet)\n", - "Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)\n", - "Copyright (c) 2006 Idiap Research Institute (Samy Bengio)\n", - "Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)\n", - "Copyright (c) 2015 Google Inc.\n", - "Copyright (c) 2015 Yangqing Jia\n", - "Copyright (c) 2013-2016 The Caffe contributors\n", - "All rights reserved.\n", - "\n", - "NVIDIA Deep Learning Profiler (dlprof) Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Various files include modifications (c) NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "This container image and its contents are governed by the NVIDIA Deep Learning Container License.\n", - "By pulling and using the container, you accept the terms and conditions of this license:\n", - "https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license\n", - "\n", - "=============\n", - "== PyTorch ==\n", - "=============\n", - "\n", - "NVIDIA Release 21.08 (build 26011915)\n", - "PyTorch Version 1.10.0a0+3fd9dcf\n", - "\n", - "Container image Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Copyright (c) 2014-2021 Facebook Inc.\n", - "Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)\n", - "Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2013 NYU (Clement Farabet)\n", - "Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)\n", - "Copyright (c) 2006 Idiap Research Institute (Samy Bengio)\n", - "Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)\n", - "Copyright (c) 2015 Google Inc.\n", - "Copyright (c) 2015 Yangqing Jia\n", - "Copyright (c) 2013-2016 The Caffe contributors\n", - "All rights reserved.\n", - "\n", - "NVIDIA Deep Learning Profiler (dlprof) Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Various files include modifications (c) NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "This container image and its contents are governed by the NVIDIA Deep Learning Container License.\n", - "By pulling and using the container, you accept the terms and conditions of this license:\n", - "https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license\n", - "\n", - "NOTE: MOFED driver for multi-node communication was not detected.\n", - " Multi-node communication performance may be reduced.\n", - "\n", - "venn@sys:/workspace$ \n", - "NOTE: MOFED driver for multi-node communication was not detected.\n", - " Multi-node communication performance may be reduced.\n", - "\n", - "venn@sys:/workspace$ " - ] - } - ], - "source": [ - "def run_client1():\n", - " cmd = client1_startup_path + \"/docker.sh\"\n", - " print(\"running cmd \" + cmd)\n", - " !$cmd\n", - "\n", - "\n", - "def run_client2():\n", - " cmd = client2_startup_path + \"/docker.sh\"\n", - " print(\"running cmd \" + cmd)\n", - " !$cmd\n", - "\n", - "\n", - "p1 = Process(target=run_client1)\n", - "p2 = Process(target=run_client2)\n", - "\n", - "p1.start()\n", - "p2.start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check Started Containers" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n", - "96c8f9406303 monai_nvflare:latest \"/usr/local/bin/nvid…\" 2 seconds ago Up 1 second org1-a\n", - "6b5d9eefc699 monai_nvflare:latest \"/usr/local/bin/nvid…\" 2 seconds ago Up 1 second org1-b\n", - "08492335d003 monai_nvflare:latest \"/usr/local/bin/nvid…\" 40 seconds ago Up 39 seconds flserver\n" - ] - } - ], - "source": [ - "!docker ps -a" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Start Clients" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start a client, you should:\n", - "\n", - "- open a terminal and enter the container named `org1-a`.\n", - "- run `start.sh` under `startup/`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " Open a new terminal" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# You can click the following link, or manually open a new terminal.\n", - "HTML(' Open a new terminal')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "docker exec -it org1-a bash\n", - "cd startup/\n", - "sh start.shThe commands can be:\n", - "\n", - "```\n", - "docker exec -it org1-a bash\n", - "cd startup/\n", - "sh start.sh\n", - "```\n", - "\n", - "A successfully started client will print logs as follow:\n", - "
![fl](demo_figs/enter_client_success.png)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start the second client, please open a new terminal again, and just use the same commands but for the `org1-b` Docker container:\n", - "```\n", - "docker exec -it org1-b bash\n", - "cd startup/\n", - "sh start.sh\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After a client has been successfully started, the server side will show the following information:\n", - "
![fl](demo_figs/successful_regist_clients.png)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next Steps\n", - "\n", - "You have now started two client containers.\n", - "In the next notebook, [Admin Startup Notebook](4-Admin.ipynb), you'll start an admin participating in the FL experiment." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.8.5" - }, - "stem_cell": { - "cell_type": "raw", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": "" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/federated_learning/nvflare/nvflare_example_docker/4-Admin.ipynb b/federated_learning/nvflare/nvflare_example_docker/4-Admin.ipynb deleted file mode 100644 index 749be69c26..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/4-Admin.ipynb +++ /dev/null @@ -1,439 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "# Admin Startup\n", - "\n", - "The purpose of this notebook is to show how to start an admin client to operate an FL experiment with a server and at least one client started." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": [ - "## Prerequisites\n", - "- The [Startup notebook](Startup.ipynb) has been run successfully.\n", - "- A server and at least one client has been started." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check the Config Folder\n", - "\n", - "The config folder should be in the `transfer/` directory:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['spleen_example']" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os\n", - "from IPython.display import HTML\n", - "from multiprocessing import Process\n", - "\n", - "workspace = \"demo_workspace/\"\n", - "admin_name = \"admin@nvidia.com\"\n", - "\n", - "transfer_path = os.path.join(workspace, admin_name, \"transfer\")\n", - "os.listdir(transfer_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Edit Docker Script\n", - "\n", - "Before starting the docker script, you need to edit it to ensure that the environments (such as dataset, GPUs, memory, ...) meet your requirement." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Please click here to check the admin@nvidia.com script](demo_workspace/admin@nvidia.com/startup/docker.sh)\n", - "\n", - "For this experiment, please modify the script in order to use the host network:\n", - "\n", - "```\n", - "#!/usr/bin/env bash\n", - "DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\n", - "# docker run script for FL admin\n", - "# to use host network, use line below\n", - "NETARG=\"--net=host\"\n", - "# Admin clients do not need to open ports, so the following line is not needed.\n", - "#NETARG=\"-p 8003:8003\"\n", - "DOCKER_IMAGE=monai_nvflare:latest\n", - "echo \"Starting docker with $DOCKER_IMAGE\"\n", - "docker run --rm -it --name=fladmin -v $DIR/..:/workspace/ -w /workspace/ --ipc=host $NETARG $DOCKER_IMAGE /bin/bash\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Start Admin Docker" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running cmd demo_workspace/admin@nvidia.com/startup/docker.sh\n", - "Starting docker with monai_nvflare:latest\n", - "\n", - "=============\n", - "== PyTorch ==\n", - "=============\n", - "\n", - "NVIDIA Release 21.08 (build 26011915)\n", - "PyTorch Version 1.10.0a0+3fd9dcf\n", - "\n", - "Container image Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Copyright (c) 2014-2021 Facebook Inc.\n", - "Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)\n", - "Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)\n", - "Copyright (c) 2011-2013 NYU (Clement Farabet)\n", - "Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)\n", - "Copyright (c) 2006 Idiap Research Institute (Samy Bengio)\n", - "Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)\n", - "Copyright (c) 2015 Google Inc.\n", - "Copyright (c) 2015 Yangqing Jia\n", - "Copyright (c) 2013-2016 The Caffe contributors\n", - "All rights reserved.\n", - "\n", - "NVIDIA Deep Learning Profiler (dlprof) Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "Various files include modifications (c) NVIDIA CORPORATION. All rights reserved.\n", - "\n", - "This container image and its contents are governed by the NVIDIA Deep Learning Container License.\n", - "By pulling and using the container, you accept the terms and conditions of this license:\n", - "https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license\n", - "\n", - "NOTE: MOFED driver for multi-node communication was not detected.\n", - " Multi-node communication performance may be reduced.\n", - "\n", - "\u001b]0;root@sys: /workspace\u0007root@sys:/workspace# " - ] - } - ], - "source": [ - "admin_startup_path = os.path.join(workspace, admin_name, \"startup\")\n", - "cmd = admin_startup_path + \"/docker.sh\"\n", - "\n", - "\n", - "def run_admin():\n", - " cmd = admin_startup_path + \"/docker.sh\"\n", - " print(\"running cmd \" + cmd)\n", - " !$cmd\n", - "\n", - "\n", - "p1 = Process(target=run_admin)\n", - "\n", - "p1.start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check Started Containers" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n", - "3de0f6690d8e monai_nvflare:latest \"/usr/local/bin/nvid…\" 6 seconds ago Up 6 seconds fladmin\n", - "96c8f9406303 monai_nvflare:latest \"/usr/local/bin/nvid…\" 52 seconds ago Up 52 seconds org1-a\n", - "6b5d9eefc699 monai_nvflare:latest \"/usr/local/bin/nvid…\" 52 seconds ago Up 52 seconds org1-b\n", - "08492335d003 monai_nvflare:latest \"/usr/local/bin/nvid…\" About a minute ago Up About a minute flserver\n" - ] - } - ], - "source": [ - "!docker ps -a" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Start Admin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start an admin, you should:\n", - "\n", - "- open a terminal and enter the container named `fladmin`.\n", - "- run `fl_admin.sh` under `startup/`.\n", - "- input admin name `admin@nvidia.com`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " Open a new terminal" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "HTML(' Open a new terminal')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can accomplish these steps by running:\n", - "\n", - "```\n", - "docker exec -it fladmin bash\n", - "cd startup/\n", - "bash fl_admin.sh\n", - "admin@nvidia.com\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Prepare for the experiment\n", - "\n", - "You need to execute the following steps to prepare for the experiment:\n", - "\n", - "- upload pipeline config folder\n", - "- set FL training number\n", - "- deploy the folder to client(s) and server\n", - "\n", - "The commands can be:\n", - "```\n", - "upload_app spleen_example\n", - "set_run_number 1\n", - "deploy_app spleen_example server\n", - "deploy_app spleen_example client\n", - "```\n", - "\n", - "Now, let's check if the folder has been distributed into the server and all client(s):" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "config files on server: ['mmar_server', 'mmar_org1-a', 'mmar_org1-b']\n", - " \n", - "config files on org1-a: ['mmar_org1-a']\n", - " \n", - "config files on org1-b: ['mmar_org1-b']\n", - " \n" - ] - } - ], - "source": [ - "run_file = 'run_1'\n", - "\n", - "for name in ['server', 'org1-a', 'org1-b']:\n", - " path = os.path.join(workspace, name, run_file)\n", - " if os.path.exists(path):\n", - " print(\"config files on {}: {}\".\n", - " format(name, os.listdir(path)))\n", - " print(\" \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This example prepares two different data list files: `dataset_part1.json` and `dataset_part2.json`, and they have the same validation set and totally different training set. The default file used in `spleen_example/config_train.json` is `dataset_part1.json`. Therefore, if you want to let two clients train on different data, you can switch to use `dataset_part2.json` for `org1-b`.\n", - "\n", - "[Link to org1-a config](demo_workspace/org1-a/run_1/mmar_org1-a/config/config_train.json)\n", - "\n", - "[Link to org1-b config](demo_workspace/org1-b/run_1/mmar_org1-b/config/config_train.json)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Start Training" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, you can start training with:\n", - "```\n", - "start_app server\n", - "start_app client\n", - "```\n", - "You can check the status by running:\n", - "```\n", - "check_status server\n", - "check_status client\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Stop Training\n", - "\n", - "You can stop training for the server and/or client(s) by running:\n", - "```\n", - "abort client\n", - "abort server\n", - "```\n", - "If you only want to stop org1-b, you can use:\n", - "```\n", - "abort client org1-b\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Start Training (multi-gpus)\n", - "\n", - "If you would like to use multiple gpus, you can start training with n gpus (where n is the number of gpus) by running:\n", - "```\n", - "start_mgpu client n\n", - "```\n", - "\n", - "The default `multi_gpu` flag is `False` in `spleen_example/config/config_train.json`, if you need to use multiple gpus, you have to change it before the `Startup` step." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Shutdown\n", - "\n", - "You can shutdown the experiment for the server and/or client(s) by running:\n", - "\n", - "`shutdown client` and/or `shutdown server`\n", - "\n", - "If you only want to shutdown a specific client, you can specify the client in the command like follows:\n", - "```\n", - "shutdown client fl_clients_2\n", - "```\n", - "This command will kill the client/server connection, and this command will need input of the admin name for confirmation. If you need to shutdown the server, all active clients need to be shutdown first.\n", - "\n", - "After the shutdown commands, you are safe to shutdown `Startup.ipynb` to stop all containers." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Commands\n", - "\n", - "Please type `?` to learn more about all commands." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next Steps\n", - "\n", - "You have now started the admin client and learnt the commands to control your FL experiment. You're now ready to create your own FL experiment!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.8.5" - }, - "stem_cell": { - "cell_type": "raw", - "metadata": { - "pycharm": { - "metadata": false - } - }, - "source": "" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/federated_learning/nvflare/nvflare_example_docker/README.md b/federated_learning/nvflare/nvflare_example_docker/README.md deleted file mode 100644 index 69a43c619c..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Federated Learning with MONAI using NVFLare - -## Brief Introduction - -This repository contains an end-to-end Federated training example based on MONAI trainers and [NVFlare](https://pypi.org/project/nvflare/). - -Inside this folder: -- All Jupiter notebooks are used to build an FL experiment step-by-step. -- `demo_figs` is a folder containing all referred example figures in the notebooks. -- `spleen_example` is the experiment config folder. Some of the experiment related hyperparameters are set in `spleen_example/config/config_train.json`. You -may need to modify `multi_gpu` and some other parameters. Please check the docstrings in `spleen_example/custom/train_configer.py` for more details. -- `build_docker_provision.sh` is the script to build the docker image and do provision. -- `docker_files` is a folder containing all files to build the docker image. -- `expr_files` is a folder containing all files to be used for the experiment. - -Inside `expr_files`: - -`project.yml` is the project yml file to describe the FL project, it defines project name, participants, server name and othe settings. You can keep the default settings, but may need to change the `cn` name to the server name as: -``` -server: - cn: -``` -`authz_config.json` is the authorization configuration json file, it defines groups, roles and rights for all users, organizations and sites. If you modified `project.yml`, please change this file to keep the consistency. -`prerpare_expr_files.sh` is the script to do provision and (optional) download the Decathlon Spleen dataset for this experiment. - - -## Provision Package Preparation - -We need to build a docker image for the experiment. It will be based on MONAI's latest docker image in Docker Hub as well as `nvflare` library in PyPI. - -Please ensure that you have installed Docker (https://docs.docker.com/engine/install/). - -Please run `bash build_docker_provision.sh`. - - -## Build Experiment - -Please ensure that you have installed JupyterLab (https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html). The following is an example to install JupyterLab in Python Virtual Environment: -``` -python3 -m venv venv/fl_startup -source venv/fl_startup/bin/activate -pip install --upgrade pip -pip install wheel -pip install jupyterlab -``` - -Please run the following command: - -`jupyter lab --ip 0.0.0.0 --port 8888 --allow-root --no-browser --NotebookApp.token=MONAIFLExample` - -The link is: `http://localhost:8888/?token=MONAIFLExample` - -Then run `1-Startup.ipynb`. You should follow the steps in the notebook, which will guide you through the process of building an FL experiment based on 2 clients and 1 server. diff --git a/federated_learning/nvflare/nvflare_example_docker/build_docker_provision.sh b/federated_learning/nvflare/nvflare_example_docker/build_docker_provision.sh deleted file mode 100644 index 1c9302a687..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/build_docker_provision.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -DOCKER_IMAGE=monai_nvflare - -# check if image exist, if not build it -docker images |grep ${DOCKER_IMAGE} -dockerNameExist=$? -if ((${dockerNameExist}==0)) ;then - echo --- docker image ${DOCKER_Run_Name} exist -else - echo --- docker image ${DOCKER_Run_Name} does not exist, building it - docker build -f docker_files/Dockerfile --tag ${DOCKER_IMAGE} . - echo ----------- docker image ${DOCKER_Run_Name} built -fi -# using the built docker image to provision -cmd2run="bash expr_files/prepare_expr_files.sh" -docker run \ - --rm \ - --shm-size 1G \ - -v ${PWD}/:/fl_workspace/ \ - -w /fl_workspace/ \ - -it \ - ${DOCKER_IMAGE} \ - ${cmd2run} - -echo ------------------ exited from docker image diff --git a/federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_client_success.png b/federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_client_success.png deleted file mode 100644 index 8994afbff28305441501e97a4efe424b54831655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126879 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 diff --git a/federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_server_success.png b/federated_learning/nvflare/nvflare_example_docker/demo_figs/enter_server_success.png deleted file mode 100644 index 664d26df3fa6ea79f9da135bc0399c2fb8e90e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100914 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 diff --git a/federated_learning/nvflare/nvflare_example_docker/docker_files/Dockerfile b/federated_learning/nvflare/nvflare_example_docker/docker_files/Dockerfile deleted file mode 100644 index 61d3f78ed7..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/docker_files/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM projectmonai/monai:0.7.0 - -ENV DEBIAN_FRONTEND noninteractive - -RUN apt-get -qq update -RUN apt-get install -qq -y zip - -RUN python -m pip install --upgrade pip -RUN python -m pip install nvflare==1.1 diff --git a/federated_learning/nvflare/nvflare_example_docker/expr_files/download_dataset.py b/federated_learning/nvflare/nvflare_example_docker/expr_files/download_dataset.py deleted file mode 100644 index 26e34c9ee7..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/expr_files/download_dataset.py +++ /dev/null @@ -1,29 +0,0 @@ -import os -from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser - -from monai.apps.utils import download_and_extract - - -def download_spleen_dataset(root_dir: str): - """ - This function is used to download Spleen dataset for this example. - If you'd like to download other Decathlon datasets, please check - ``monai.apps.datasets.DecathlonDataset`` for more details. - """ - url = "https://msd-for-monai.s3-us-west-2.amazonaws.com/Task09_Spleen.tar" - md5 = "410d4a301da4e5b2f6f86ec3ddba524e" - task = "Task09_Spleen" - dataset_dir = os.path.join(root_dir, task) - tarfile_name = f"{dataset_dir}.tar" - download_and_extract( - url=url, filepath=tarfile_name, output_dir=root_dir, hash_val=md5 - ) - - -if __name__ == "__main__": - parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument( - "-root_dir", type=str, help="the root path to put downloaded file." - ) - args = parser.parse_args() - download_spleen_dataset(root_dir=args.root_dir) diff --git a/federated_learning/nvflare/nvflare_example_docker/expr_files/prepare_expr_files.sh b/federated_learning/nvflare/nvflare_example_docker/expr_files/prepare_expr_files.sh deleted file mode 100644 index e8bba8b496..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/expr_files/prepare_expr_files.sh +++ /dev/null @@ -1,17 +0,0 @@ -# prepare provision files -# refer to: https://nvidia.github.io/NVFlare/user_guide/provisioning_tool.html -DEMO_PROVISION_PATH="expr_files" -NVFL_DOCKER_IMAGE=monai_nvflare:latest provision -n -p $DEMO_PROVISION_PATH/project.yml -o $DEMO_PROVISION_PATH -cd /fl_workspace/; chown -R 1000:1000 * - -# if you do not need to download the spleen dataset, please comment the following lines. - -# The docker run command in `build_docker_provision.sh` mounts the path of the -# current folder into `/fl_workspace`, thus the downloaded Spleen dataset will be -# in the current folder. -DATASET_DOWNLOAD_PATH="/fl_workspace/" -python expr_files/download_dataset.py -root_dir $DATASET_DOWNLOAD_PATH - -# prepare modified data list files, if your Spleen dataset path is different, please -# modify the following line. -cp spleen_example/config/dataset_part*.json $DATASET_DOWNLOAD_PATH/Task09_Spleen/ diff --git a/federated_learning/nvflare/nvflare_example_docker/expr_files/project.yml b/federated_learning/nvflare/nvflare_example_docker/expr_files/project.yml deleted file mode 100644 index fb29d5e985..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/expr_files/project.yml +++ /dev/null @@ -1,141 +0,0 @@ -api_version: 1 - -# org is to describe each participant's organization -# schema change: org is now mandatory - -# the name of this project -name: example_project - -# homomorphic encryption -he_config: - poly_modulus_degree: 8192 - coeff_mod_bit_sizes: [60, 40, 40] - scale_bits: 40 - scheme: CKKS - -config_folder: config - -# Server enforcing role-based rights on admin users. true means all admin users are in role super -disable_authz: false - -server: - org: nvidia - - # set cn to the server's fully qualified domain name - # never set it to example.com - cn: localhost - - # replace the number with that all clients can reach out to and that the server can open to listen to - fed_learn_port: 8002 - - # again replace the number with that all clients can reach out to and that the server can open to listen to - # the value must be different from fed_learn_port - admin_port: 8003 - - # admin_storage is the mmar upload folder name on the server - admin_storage: transfer - - min_num_clients: 1 - max_num_clients: 100 - - # The configuration validator class path. - # This line must have ONE indentation. That is, it must be - # inside server section. - # - # Server does not load configuration validator when it's commented out. - # - # Users can specifiy their own validator. For example: - # config_validator: - # hello.world.BestValdator - # - # User can also provide args for their own validator. For example: - # config_validator: - # hello.world.BestValidator: - # arg1: abc - # arg2: 123 - - # config_validator: - -# The following values under fl_clients and admin_clients are for demo purpose only. -# Please change them according to the information of actual project. -fl_clients: - # client_name must be unique - # email is optional - - org: org1 - site: org1-a - - org: org1 - site: org1-b - - org: org2 - site: org2 - - org: org3 - site: org3 - -admin_clients: - # email is the user name for admin authentication. Hence it must be unique within the project - - org: nvidia - email: admin@nvidia.com - roles: - - super - - org: nvidia - email: researcher@nvidia.com - roles: - - lead_it - - site_researcher - - org: org1 - email: researcher@org1.com - roles: - - site_researcher - - org: org2 - email: researcher@org2.com - roles: - - lead_researcher - - org: org2 - email: it@org2.com - roles: - - lead_it - -authz_policy: - orgs: - org1: - - strict - - general - org2: - - relaxed - - general - nvidia: - - general - - relaxed - org3: - - general - roles: - super: super user of system - lead_researcher: lead researcher of the study - site_researcher: site researcher of the study - site_it: site IT of the study - lead_it: lead IT of the study - groups: - relaxed: - desc: org group with relaxed policies - rules: - byoc: true - custom_datalist: true - strict: - desc: org group with strict policies - rules: - byoc: false - custom_datalist: false - general: - desc: general group user rights - role_rights: - lead_researcher: - train_all: true - view_all: true - site_researcher: - train_self: true - view_self: true - lead_it: - operate_all: true - view_all: true - site_it: - operate_self: true - view_self: true diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_client.json b/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_client.json deleted file mode 100644 index ed09a110a3..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_client.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "format_version": 1, - - "client": { - "outbound_filters": [ - ], - "inbound_filters": [ - ] - }, - "client_trainer": { - "path": "monai_trainer.MONAITrainer", - "args": { - "aggregation_epochs": 5, - "aggregation_iters": 0 - } - } -} diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_server.json b/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_server.json deleted file mode 100644 index 3853030b77..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/config/config_fed_server.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "format_version": 1, - - "servers": [ - { - "min_num_clients": 1, - "max_num_clients": 100, - "wait_after_min_clients": 10, - "heart_beat_timeout": 600, - "start_round": 0, - "num_rounds": 200 - } - ], - "aggregator": - { - "name": "AccumulateWeightedAggregator", - "args": { - "exclude_vars": "dummy", - "aggregation_weights": - { - "client0": 1, - "client1": 1.5, - "client2": 0.8 - } - } - }, - "outbound_filters": [ - ], - "inbound_filters": [ - ], - "model_persistor": - { - "name": "PTFileModelPersistor", - "args": { - "exclude_vars": "dummy", - "model": { - "path": "monai.networks.nets.unet.UNet", - "args": { - "dimensions": 3, - "in_channels": 1, - "out_channels": 2, - "channels": [16, 32, 64, 128, 256], - "strides": [2, 2, 2, 2], - "num_res_units": 2, - "norm": "batch" - } - } - } - }, - "shareable_generator": { - "name": "FullModelShareableGenerator" - } -} diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/monai_trainer.py b/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/monai_trainer.py deleted file mode 100644 index 3149c9ecf0..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/monai_trainer.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright 2020 MONAI Consortium -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -import torch.distributed as dist -from nvflare.apis.event_type import EventType -from nvflare.apis.fl_constant import FLConstants, ShareableKey -from nvflare.apis.fl_context import FLContext -from nvflare.apis.shareable import Shareable -from nvflare.apis.trainer import Trainer -from nvflare.common.signal import Signal -from nvflare.utils.fed_utils import generate_failure - -from train_configer import TrainConfiger -from utils import ( - IterAggregateHandler, - MONAIModelManager, - TrainContext, - get_lr_values, - set_engine_state, -) - - -class MONAITrainer(Trainer): - """ - This class implements a MONAI based trainer that can be used for Federated Learning. - - Args: - aggregation_epochs: the number of training epochs for a round. - This parameter only works when `aggregation_iters` is 0. Defaults to 1. - aggregation_iters: the number of training iterations for a round. - If the value is larger than 0, the trainer will use iteration based aggregation - rather than epoch based aggregation. Defaults to 0. - - """ - - def __init__(self, aggregation_epochs: int = 1, aggregation_iters: int = 0): - super().__init__() - self.aggregation_epochs = aggregation_epochs - self.aggregation_iters = aggregation_iters - self.model_manager = MONAIModelManager() - self.logger = logging.getLogger(self.__class__.__name__) - - def _initialize_trainer(self, fl_ctx: FLContext): - """ - The trainer's initialization function. At the beginning of a FL experiment, - the train and evaluate engines, as well as train context and FL context - should be initialized. - """ - # Initialize train and evaluation engines. - config_root = fl_ctx.get_prop(FLConstants.TRAIN_ROOT) - fl_args = fl_ctx.get_prop(FLConstants.ARGS) - - conf = TrainConfiger( - config_root=config_root, - wf_config_file_name=fl_args.train_config, - local_rank=fl_args.local_rank, - ) - conf.configure() - - self.train_engine = conf.train_engine - self.eval_engine = conf.eval_engine - self.multi_gpu = conf.multi_gpu - - # for iterations based aggregation, the train engine should attach - # the following handler. - if self.aggregation_iters > 0: - IterAggregateHandler(interval=self.aggregation_iters).attach( - self.train_engine - ) - - # Instantiate a train context class. This instance is used to - # save training related information such as current epochs, iterations - # and the learning rate. - self.train_ctx = TrainContext() - self.train_ctx.initial_learning_rate = get_lr_values( - self.train_engine.optimizer - ) - - # Initialize the FL context. - fl_ctx.set_prop(FLConstants.MY_RANK, self.train_engine.state.rank) - fl_ctx.set_prop(FLConstants.MODEL_NETWORK, self.train_engine.network) - fl_ctx.set_prop(FLConstants.MULTI_GPU, self.multi_gpu) - fl_ctx.set_prop(FLConstants.DEVICE, self.train_engine.state.device) - - def handle_event(self, event_type: str, fl_ctx: FLContext): - """ - This function is an extended function from the super class. - It is used to perform the handler process based on the - event_type. At the start point of a FL experiment, necessary - components should be initialized. At the end of the experiment, - the running engines should be terminated. - - Args: - event_type: the type of event that will be fired. In MONAITrainer, - only `START_RUN` and `END_RUN` need to be handled. - fl_ctx: an `FLContext` object. - - """ - if event_type == EventType.START_RUN: - self._initialize_trainer(fl_ctx) - elif event_type == EventType.END_RUN: - try: - self.train_engine.terminate() - self.eval_engine.terminate() - except BaseException as e: - self.logger.info(f"exception in closing engines {e}") - - def train( - self, shareable: Shareable, fl_ctx: FLContext, abort_signal: Signal - ) -> Shareable: - """ - This function is an extended function from the super class. - As a supervised learning based trainer, the train function will run - evaluate and train engines based on model weights from `shareable`. - After fininshing training, a new `Shareable` object will be submitted - to server for aggregation. - - Args: - shareable: the `Shareable` object acheived from server. - fl_ctx: the `FLContext` object achieved from server. - abort_signal: if triggered, the training will be aborted. - - Returns: - a new `Shareable` object to be submitted to server for aggregation. - """ - # check abort signal - self.logger.info(f"MonaiTrainer abort signal: {abort_signal.triggered}") - if abort_signal.triggered: - self.finalize(fl_ctx) - shareable = generate_failure(fl_ctx=fl_ctx, reason="abort signal triggered") - return shareable - # achieve model weights - if self.train_engine.state.rank == 0: - model_weights = shareable[ShareableKey.MODEL_WEIGHTS] - # load achieved model weights for the network (saved in fl_ctx) - self.model_manager.assign_current_model(model_weights, fl_ctx) - # for multi-gpu training, only rank 0 process will achieve the model weights. - # Thus, it should be broadcasted to all processes. - if self.multi_gpu: - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - for _, v in net.state_dict().items(): - dist.broadcast(v, src=0) - - # set engine state parameters, like number of training epochs/iterations. - self.train_engine = set_engine_state( - self.train_engine, self.aggregation_epochs, self.aggregation_iters - ) - # get current epoch and iteration when a round starts - self.train_ctx.epoch_of_start_time = self.train_engine.state.epoch - self.train_ctx.iter_of_start_time = self.train_engine.state.iteration - # execute validation at the beginning of every round - self.eval_engine.run(self.train_engine.state.epoch + 1) - self.train_ctx.fl_init_validation_metric = self.eval_engine.state.metrics.get( - self.eval_engine.state.key_metric_name, -1 - ) - self.train_engine.run() - # calculate current iteration and epoch data after training - self.train_ctx.current_iters = ( - self.train_engine.state.iteration - self.train_ctx.iter_of_start_time - ) - self.train_ctx.current_executed_epochs = ( - self.train_engine.state.epoch - self.train_ctx.epoch_of_start_time - ) - # create a new `Shareable` object - if self.train_engine.state.rank == 0: - self.train_ctx.set_context(self.train_engine, self.eval_engine) - shareable = self.model_manager.generate_shareable( - self.train_ctx, - fl_ctx, - ) - # update train context into FL context. - fl_ctx.set_prop(FLConstants.TRAIN_CONTEXT, self.train_ctx) - return shareable diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/train_configer.py b/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/train_configer.py deleted file mode 100644 index 1a50ec9af6..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/train_configer.py +++ /dev/null @@ -1,301 +0,0 @@ -# Copyright 2020 MONAI Consortium -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json -import logging -import os - -import torch -import torch.distributed as dist -from monai.data import ( - CacheDataset, - DataLoader, - load_decathlon_datalist, - partition_dataset, -) -from monai.engines import SupervisedEvaluator, SupervisedTrainer -from monai.handlers import ( - CheckpointSaver, - LrScheduleHandler, - MeanDice, - StatsHandler, - TensorBoardStatsHandler, - ValidationHandler, -) -from monai.inferers import SimpleInferer, SlidingWindowInferer -from monai.losses import DiceLoss -from monai.networks.layers import Norm -from monai.networks.nets import UNet -from monai.transforms import ( - Activationsd, - AsDiscreted, - Compose, - CropForegroundd, - EnsureChannelFirstd, - LoadImaged, - Orientationd, - RandCropByPosNegLabeld, - ScaleIntensityRanged, - Spacingd, - ToTensord, -) -from torch.nn.parallel import DistributedDataParallel -from monai.handlers import from_engine - - -class TrainConfiger: - """ - This class is used to config the necessary components of train and evaluate engines - for MONAI trainer. - Please check the implementation of `SupervisedEvaluator` and `SupervisedTrainer` - from `monai.engines` and determine which components can be used. - Args: - config_root: root folder path of config files. - wf_config_file_name: json file name of the workflow config file. - """ - - def __init__( - self, - config_root: str, - wf_config_file_name: str, - local_rank: int = 0, - ): - with open(os.path.join(config_root, wf_config_file_name)) as file: - wf_config = json.load(file) - - self.wf_config = wf_config - """ - config Args: - max_epochs: the total epoch number for trainer to run. - learning_rate: the learning rate for optimizer. - data_list_base_dir: the directory containing the data list json file. - data_list_json_file: the data list json file. - val_interval: the interval (number of epochs) to do validation. - ckpt_dir: the directory to save the checkpoint. - amp: whether to enable auto-mixed-precision training. - use_gpu: whether to use GPU in training. - multi_gpu: whether to use multiple GPUs for distributed training. - """ - self.max_epochs = wf_config["max_epochs"] - self.learning_rate = wf_config["learning_rate"] - self.data_list_base_dir = wf_config["data_list_base_dir"] - self.data_list_json_file = wf_config["data_list_json_file"] - self.val_interval = wf_config["val_interval"] - self.ckpt_dir = wf_config["ckpt_dir"] - self.amp = wf_config["amp"] - self.use_gpu = wf_config["use_gpu"] - self.multi_gpu = wf_config["multi_gpu"] - self.local_rank = local_rank - - def set_device(self): - if self.multi_gpu: - # initialize distributed training - dist.init_process_group(backend="nccl", init_method="env://") - device = torch.device(f"cuda:{self.local_rank}") - torch.cuda.set_device(device) - else: - device = torch.device("cuda" if self.use_gpu else "cpu") - self.device = device - - def configure(self): - self.set_device() - network = UNet( - dimensions=3, - in_channels=1, - out_channels=2, - channels=(16, 32, 64, 128, 256), - strides=(2, 2, 2, 2), - num_res_units=2, - norm=Norm.BATCH, - ).to(self.device) - if self.multi_gpu: - network = DistributedDataParallel( - module=network, - device_ids=[self.device], - find_unused_parameters=False, - ) - - train_transforms = Compose( - [ - LoadImaged(keys=("image", "label")), - EnsureChannelFirstd(keys=("image", "label")), - Spacingd( - keys=["image", "label"], - pixdim=(1.5, 1.5, 2.0), - mode=("bilinear", "nearest"), - ), - Orientationd(keys=["image", "label"], axcodes="RAS"), - ScaleIntensityRanged( - keys="image", - a_min=-57, - a_max=164, - b_min=0.0, - b_max=1.0, - clip=True, - ), - CropForegroundd(keys=("image", "label"), source_key="image"), - RandCropByPosNegLabeld( - keys=("image", "label"), - label_key="label", - spatial_size=(64, 64, 64), - pos=1, - neg=1, - num_samples=4, - image_key="image", - image_threshold=0, - ), - ToTensord(keys=("image", "label")), - ] - ) - # set datalist - train_datalist = load_decathlon_datalist( - os.path.join(self.data_list_base_dir, self.data_list_json_file), - is_segmentation=True, - data_list_key="training", - base_dir=self.data_list_base_dir, - ) - val_datalist = load_decathlon_datalist( - os.path.join(self.data_list_base_dir, self.data_list_json_file), - is_segmentation=True, - data_list_key="validation", - base_dir=self.data_list_base_dir, - ) - if self.multi_gpu: - train_datalist = partition_dataset( - data=train_datalist, - shuffle=True, - num_partitions=dist.get_world_size(), - even_divisible=True, - )[dist.get_rank()] - train_ds = CacheDataset( - data=train_datalist, - transform=train_transforms, - cache_rate=1.0, - num_workers=4, - ) - train_data_loader = DataLoader( - train_ds, - batch_size=2, - shuffle=True, - num_workers=4, - ) - val_transforms = Compose( - [ - LoadImaged(keys=("image", "label")), - EnsureChannelFirstd(keys=("image", "label")), - Spacingd( - keys=["image", "label"], - pixdim=(1.5, 1.5, 2.0), - mode=("bilinear", "nearest"), - ), - Orientationd(keys=["image", "label"], axcodes="RAS"), - ScaleIntensityRanged( - keys="image", - a_min=-57, - a_max=164, - b_min=0.0, - b_max=1.0, - clip=True, - ), - CropForegroundd(keys=("image", "label"), source_key="image"), - ToTensord(keys=("image", "label")), - ] - ) - - val_ds = CacheDataset( - data=val_datalist, transform=val_transforms, cache_rate=0.0, num_workers=4 - ) - val_data_loader = DataLoader( - val_ds, - batch_size=1, - shuffle=False, - num_workers=4, - ) - post_transform = Compose( - [ - Activationsd(keys="pred", softmax=True), - AsDiscreted( - keys=["pred", "label"], - argmax=[True, False], - to_onehot=True, - num_classes=2, - ), - ] - ) - # metric - key_val_metric = { - "val_mean_dice": MeanDice( - include_background=False, - output_transform=from_engine(["pred", "label"]), - #device=self.device, - ) - } - val_handlers = [ - StatsHandler(output_transform=lambda x: None), - CheckpointSaver( - save_dir=self.ckpt_dir, - save_dict={"model": network}, - save_key_metric=True, - ), - TensorBoardStatsHandler( - log_dir=self.ckpt_dir, output_transform=lambda x: None - ), - ] - self.eval_engine = SupervisedEvaluator( - device=self.device, - val_data_loader=val_data_loader, - network=network, - inferer=SlidingWindowInferer( - roi_size=[160, 160, 160], - sw_batch_size=4, - overlap=0.5, - ), - postprocessing=post_transform, - key_val_metric=key_val_metric, - val_handlers=val_handlers, - amp=self.amp, - ) - - optimizer = torch.optim.Adam(network.parameters(), self.learning_rate) - loss_function = DiceLoss(to_onehot_y=True, softmax=True) - lr_scheduler = torch.optim.lr_scheduler.StepLR( - optimizer, step_size=5000, gamma=0.1 - ) - train_handlers = [ - LrScheduleHandler(lr_scheduler=lr_scheduler, print_lr=True), - ValidationHandler( - validator=self.eval_engine, interval=self.val_interval, epoch_level=True - ), - StatsHandler(tag_name="train_loss", output_transform=from_engine("loss", first=True)), - TensorBoardStatsHandler( - log_dir=self.ckpt_dir, - tag_name="train_loss", - output_transform=from_engine("loss", first=True), - ), - ] - - self.train_engine = SupervisedTrainer( - device=self.device, - max_epochs=self.max_epochs, - train_data_loader=train_data_loader, - network=network, - optimizer=optimizer, - loss_function=loss_function, - inferer=SimpleInferer(), - postprocessing=post_transform, - key_train_metric=None, - train_handlers=train_handlers, - amp=self.amp, - ) - - if self.local_rank > 0: - self.train_engine.logger.setLevel(logging.WARNING) - self.eval_engine.logger.setLevel(logging.WARNING) diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/utils.py b/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/utils.py deleted file mode 100644 index d0c1252a19..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/custom/utils.py +++ /dev/null @@ -1,187 +0,0 @@ -# Copyright 2020 MONAI Consortium -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import math -from typing import Dict - -import numpy as np -import torch -from ignite.engine import Engine, Events -from nvflare.apis.fl_constant import FLConstants, ShareableKey, ShareableValue -from nvflare.apis.fl_context import FLContext -from nvflare.apis.shareable import Shareable -from torch.optim import Optimizer - - -class TrainContext: - """ - Train Context class contains training related parameters/variables, - such as learning rate, number of gpus and current training iterations. - """ - - def __init__(self): - self.initial_learning_rate = 0 - self.current_learning_rate = 0 - self.current_iters = 0 - self.current_executed_epochs = 0 - self.fl_init_validation_metric = 0 - self.epoch_of_start_time = 0 - self.iter_of_start_time = 0 - - def set_context(self, train_engine: Engine, eval_engine: Engine): - """ - This function is usually called after train engine has finished running. - The variables that updated here will add to the shareable object and then - submit to server. You can add other variables in this function if they are - needed to be shared. - """ - self.current_learning_rate = get_lr_values(train_engine.optimizer) - - -class MONAIModelManager: - def __init__(self): - self.logger = logging.getLogger("ModelShareableManager") - - def assign_current_model( - self, model_weights: Dict[str, np.ndarray], fl_ctx: FLContext - ): - """ - This function is used to load provided weights for the network saved - in FL context. - Before loading weights, tensors might need to be reshaped to support HE for secure aggregation. - More info of HE: - https://github.com/NVIDIA/clara-train-examples/blob/master/PyTorch/NoteBooks/FL/Homomorphic_Encryption.ipynb - - """ - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - if fl_ctx.get_prop(FLConstants.MULTI_GPU): - net = net.module - - local_var_dict = net.state_dict() - model_keys = model_weights.keys() - for var_name in local_var_dict: - if var_name in model_keys: - weights = model_weights[var_name] - try: - local_var_dict[var_name] = torch.as_tensor(np.reshape(weights, local_var_dict[var_name].shape)) - except Exception as e: - raise ValueError( - "Convert weight from {} failed with error: {}".format( - var_name, str(e) - ) - ) - - net.load_state_dict(local_var_dict) - - def extract_model(self, fl_ctx: FLContext) -> Dict[str, np.ndarray]: - """ - This function is used to extract weights of the network saved in FL - context. - The extracted weights will be converted into a numpy array based dict. - """ - net = fl_ctx.get_prop(FLConstants.MODEL_NETWORK) - if fl_ctx.get_prop(FLConstants.MULTI_GPU): - net = net.module - local_state_dict = net.state_dict() - local_model_dict = {} - for var_name in local_state_dict: - try: - local_model_dict[var_name] = local_state_dict[var_name].cpu().numpy() - except Exception as e: - raise ValueError( - "Convert weight from {} failed with error: {}".format( - var_name, str(e) - ) - ) - - return local_model_dict - - def generate_shareable(self, train_ctx: TrainContext, fl_ctx: FLContext): - """ - This function is used to generate a shareable instance according to - the train context and FL context. - A Shareable instance can not only contain model weights, but also - some additional information that clients want to share. These information - should be added into ShareableKey.META. - """ - - # input the initial metric into meta data. You can also add other parameters. - meta_data = {} - meta_data[FLConstants.INITIAL_METRICS] = train_ctx.fl_init_validation_metric - meta_data[FLConstants.CURRENT_LEARNING_RATE] = train_ctx.current_learning_rate - meta_data[FLConstants.NUM_STEPS_CURRENT_ROUND] = train_ctx.current_iters - - shareable = Shareable() - shareable[ShareableKey.TYPE] = ShareableValue.TYPE_WEIGHT_DIFF - shareable[ShareableKey.DATA_TYPE] = ShareableValue.DATA_TYPE_UNENCRYPTED - shareable[ShareableKey.MODEL_WEIGHTS] = self.extract_model(fl_ctx) - shareable[ShareableKey.META] = meta_data - - return shareable - - -class IterAggregateHandler: - """ - This class implements an event handler for iteration based aggregation. - """ - - def __init__(self, interval: int): - self.interval = interval - - def attach(self, engine: Engine): - engine.add_event_handler(Events.ITERATION_COMPLETED(every=self.interval), self) - - def __call__(self, engine: Engine): - engine.terminate() - # save current iteration for next round - engine.state.dataloader_iter = engine._dataloader_iter - if engine.state.iteration % engine.state.epoch_length == 0: - # if current iteration is end of 1 epoch, manually trigger epoch completed event - engine._fire_event(Events.EPOCH_COMPLETED) - - -def get_lr_values(optimizer: Optimizer): - """ - This function is used to get the learning rates of the optimizer. - """ - return [group["lr"] for group in optimizer.state_dict()["param_groups"]] - - -def set_engine_state(engine: Engine, aggregation_epochs: int, aggregation_iters: int): - """ - This function is used to set the engine's state parameters according to - the aggregation ways (iteration based or epoch based). - - Args: - engine: the engine that to be processed. - aggregation_epochs: the number of epochs before aggregation. - This parameter only works when `aggregation_iters` is 0. - aggregation_iters: the number of iterations before aggregation. - If the value is larger than 0, the engine will use iteration based aggregation - rather than epoch based aggregation. - - """ - if aggregation_iters > 0: - next_aggr_iter = engine.state.iteration + aggregation_iters - engine.state.max_epochs = math.ceil(next_aggr_iter / engine.state.epoch_length) - previous_iter = engine.state.iteration % engine.state.epoch_length - if engine.state.iteration > 0 and previous_iter != 0: - # init to continue from previous epoch - engine.state.epoch -= 1 - if hasattr(engine.state, "dataloader_iter"): - # initialize to continue from previous iteration - engine._init_iter.append(previous_iter) - engine._dataloader_iter = engine.state.dataloader_iter - else: - engine.state.max_epochs = engine.state.epoch + aggregation_epochs - - return engine diff --git a/federated_learning/nvflare/nvflare_example_docker/spleen_example/resources/log.config b/federated_learning/nvflare/nvflare_example_docker/spleen_example/resources/log.config deleted file mode 100644 index 6b9761569b..0000000000 --- a/federated_learning/nvflare/nvflare_example_docker/spleen_example/resources/log.config +++ /dev/null @@ -1,27 +0,0 @@ -[loggers] -keys=root,modelLogger - -[handlers] -keys=consoleHandler - -[formatters] -keys=fullFormatter - -[logger_root] -level=INFO -handlers=consoleHandler - -[logger_modelLogger] -level=DEBUG -handlers=consoleHandler -qualname=modelLogger -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -level=DEBUG -formatter=fullFormatter -args=(sys.stdout,) - -[formatter_fullFormatter] -format=%(asctime)s - %(name)s - %(levelname)s - %(message)s diff --git a/federated_learning/nvflare/requirements.txt b/federated_learning/nvflare/requirements.txt new file mode 100644 index 0000000000..8ea240baa7 --- /dev/null +++ b/federated_learning/nvflare/requirements.txt @@ -0,0 +1,10 @@ +pip +setuptools +nvflare==2.0.1 +monai==0.8.0rc3 +pytorch-ignite==0.4.6 +tqdm==4.61.2 +nibabel==3.2.1 +tensorboard==2.5.0 +wheel +jupyterlab \ No newline at end of file From 801931f0937c3a6279a0d1150bbc2f4efa8fe04d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Nov 2021 09:02:50 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- federated_learning/nvflare/README.md | 1 - .../nvflare/hello_monai/config/config_fed_server.json | 1 - federated_learning/nvflare/hello_monai/custom/monai_trainer.py | 2 +- federated_learning/nvflare/requirements.txt | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/federated_learning/nvflare/README.md b/federated_learning/nvflare/README.md index 0abd4ba53a..146f113bd8 100644 --- a/federated_learning/nvflare/README.md +++ b/federated_learning/nvflare/README.md @@ -52,4 +52,3 @@ and enter the following link: `http://localhost:8888/?token=MONAIFLExample` Then run `1-Server.ipynb`. You should follow the steps in the notebook, which will guide you through the process of building an FL experiment based on 2 clients and 1 server. - diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_server.json b/federated_learning/nvflare/hello_monai/config/config_fed_server.json index 94cf06090c..f46dc87505 100644 --- a/federated_learning/nvflare/hello_monai/config/config_fed_server.json +++ b/federated_learning/nvflare/hello_monai/config/config_fed_server.json @@ -61,4 +61,3 @@ } ] } - diff --git a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py index 39923cd695..f19080dbcb 100644 --- a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py +++ b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py @@ -77,7 +77,7 @@ def _initialize_trainer(self, fl_ctx: FLContext): # it will be completely terminated after the current iteration is finished. self.train_engine = conf.train_engine self.eval_engine = conf.eval_engine - + def assign_current_model(self, model_weights: Dict[str, np.ndarray]): """ diff --git a/federated_learning/nvflare/requirements.txt b/federated_learning/nvflare/requirements.txt index 8ea240baa7..37a094ebda 100644 --- a/federated_learning/nvflare/requirements.txt +++ b/federated_learning/nvflare/requirements.txt @@ -7,4 +7,4 @@ tqdm==4.61.2 nibabel==3.2.1 tensorboard==2.5.0 wheel -jupyterlab \ No newline at end of file +jupyterlab From 55a9f1275309afd48438f6707072b67972178dec Mon Sep 17 00:00:00 2001 From: Yiheng Wang Date: Fri, 26 Nov 2021 18:59:16 +0800 Subject: [PATCH 3/4] enhance code format Signed-off-by: Yiheng Wang --- federated_learning/nvflare/3-Admin.ipynb | 2 +- .../hello_monai/config/config_fed_server.json | 6 ++-- .../hello_monai/config/config_train.json | 1 - .../hello_monai/custom/monai_trainer.py | 36 ++++++++++--------- .../hello_monai/custom/train_configer.py | 33 ++--------------- federated_learning/nvflare/requirements.txt | 2 +- 6 files changed, 27 insertions(+), 53 deletions(-) diff --git a/federated_learning/nvflare/3-Admin.ipynb b/federated_learning/nvflare/3-Admin.ipynb index bd8d16244c..342a71b8f2 100644 --- a/federated_learning/nvflare/3-Admin.ipynb +++ b/federated_learning/nvflare/3-Admin.ipynb @@ -247,7 +247,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Tips for Multiple Runs\n", + "### (Optional) Copy Dataset\n", "\n", "After starting a client (for example `site-1`), the Spleen dataset will be downloaded into:\n", "`run_1/app_site-1/Task09_Spleen.tar`.\n", diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_server.json b/federated_learning/nvflare/hello_monai/config/config_fed_server.json index 94cf06090c..29d192a4aa 100644 --- a/federated_learning/nvflare/hello_monai/config/config_fed_server.json +++ b/federated_learning/nvflare/hello_monai/config/config_fed_server.json @@ -35,8 +35,8 @@ "name": "AccumulateWeightedAggregator", "args": { "aggregation_weights": { - "org1-a": 1.0, - "org1-b": 0.5 + "site-1": 1.0, + "site-2": 0.5 }, "expected_data_kind": "WEIGHTS" } @@ -45,7 +45,7 @@ "workflows": [ { "id": "scatter_and_gather", - "path": "nvflare.app_common.workflows.scatter_and_gather.ScatterAndGather", + "name": "ScatterAndGather", "args": { "min_clients" : 1, "num_rounds" : 100, diff --git a/federated_learning/nvflare/hello_monai/config/config_train.json b/federated_learning/nvflare/hello_monai/config/config_train.json index 73da66da19..9724632477 100644 --- a/federated_learning/nvflare/hello_monai/config/config_train.json +++ b/federated_learning/nvflare/hello_monai/config/config_train.json @@ -3,7 +3,6 @@ "learning_rate": 2e-4, "amp": true, "use_gpu": true, - "multi_gpu": false, "val_interval": 5, "data_list_json_file": "config/dataset_part1.json", "ckpt_dir": "models" diff --git a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py index 39923cd695..6593897f91 100644 --- a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py +++ b/federated_learning/nvflare/hello_monai/custom/monai_trainer.py @@ -14,7 +14,7 @@ import numpy as np import torch -from nvflare.apis.dxo import DXO, DataKind, from_shareable, MetaKey +from nvflare.apis.dxo import DXO, DataKind, MetaKey, from_shareable from nvflare.apis.event_type import EventType from nvflare.apis.executor import Executor from nvflare.apis.fl_constant import FLContextKey, ReturnCode @@ -35,9 +35,10 @@ class MONAITrainer(Executor): """ - def __init__(self, + def __init__( + self, aggregation_epochs: int = 1, - train_task_name = AppConstants.TASK_TRAIN, + train_task_name: str = AppConstants.TASK_TRAIN, ): super().__init__() """ @@ -56,8 +57,9 @@ def _initialize_trainer(self, fl_ctx: FLContext): # Initialize train and evaluation engines. app_root = fl_ctx.get_prop(FLContextKey.APP_ROOT) fl_args = fl_ctx.get_prop(FLContextKey.ARGS) - num_gpus = fl_ctx.get_prop(AppConstants.NUMBER_OF_GPUS, 1) - self.multi_gpu = num_gpus > 1 + # will update multi-gpu supports later + # num_gpus = fl_ctx.get_prop(AppConstants.NUMBER_OF_GPUS, 1) + # self.multi_gpu = num_gpus > 1 self.client_name = fl_ctx.get_identity_name() self.log_info( fl_ctx, @@ -77,7 +79,6 @@ def _initialize_trainer(self, fl_ctx: FLContext): # it will be completely terminated after the current iteration is finished. self.train_engine = conf.train_engine self.eval_engine = conf.eval_engine - def assign_current_model(self, model_weights: Dict[str, np.ndarray]): """ @@ -88,8 +89,6 @@ def assign_current_model(self, model_weights: Dict[str, np.ndarray]): """ net = self.train_engine.network - # if self.multi_gpu: - # net = net.module local_var_dict = net.state_dict() model_keys = model_weights.keys() @@ -115,8 +114,6 @@ def extract_model(self) -> Dict[str, np.ndarray]: The extracted weights will be converted into a numpy array based dict. """ net = self.train_engine.network - # if self.multi_gpu: - # net = net.module local_state_dict = net.state_dict() local_model_dict = {} for var_name in local_state_dict: @@ -139,9 +136,7 @@ def generate_shareable(self): """ # update meta, NUM_STEPS_CURRENT_ROUND is needed for aggregation. if self.achieved_meta is None: - meta = { - MetaKey.NUM_STEPS_CURRENT_ROUND: self.current_iters - } + meta = {MetaKey.NUM_STEPS_CURRENT_ROUND: self.current_iters} else: meta = self.achieved_meta meta[MetaKey.NUM_STEPS_CURRENT_ROUND] = self.current_iters @@ -188,7 +183,11 @@ def _abort_execution(self) -> Shareable: return shareable def execute( - self, task_name: str, shareable: Shareable, fl_ctx: FLContext, abort_signal: Signal + self, + task_name: str, + shareable: Shareable, + fl_ctx: FLContext, + abort_signal: Signal, ) -> Shareable: """ This function is an extended function from the super class. @@ -212,13 +211,18 @@ def execute( dxo = from_shareable(shareable) # check if dxo is valid. if not isinstance(dxo, DXO): - self.log_exception(fl_ctx, f"dxo excepted type DXO. Got {type(dxo)} instead.") + self.log_exception( + fl_ctx, f"dxo excepted type DXO. Got {type(dxo)} instead." + ) shareable.set_return_code(ReturnCode.EXECUTION_EXCEPTION) return shareable # ensure data kind is weights. if not dxo.data_kind == DataKind.WEIGHTS: - self.log_exception(fl_ctx, f"data_kind expected WEIGHTS but got {dxo.data_kind} instead.") + self.log_exception( + fl_ctx, + f"data_kind expected WEIGHTS but got {dxo.data_kind} instead.", + ) shareable.set_return_code(ReturnCode.EXECUTION_EXCEPTION) return shareable diff --git a/federated_learning/nvflare/hello_monai/custom/train_configer.py b/federated_learning/nvflare/hello_monai/custom/train_configer.py index 1ef5767b38..ca7f315b1f 100644 --- a/federated_learning/nvflare/hello_monai/custom/train_configer.py +++ b/federated_learning/nvflare/hello_monai/custom/train_configer.py @@ -10,11 +10,9 @@ # limitations under the License. import json -import logging import os import torch -import torch.distributed as dist from monai.apps.utils import download_and_extract from monai.data import CacheDataset, DataLoader, load_decathlon_datalist from monai.engines import SupervisedEvaluator, SupervisedTrainer @@ -79,7 +77,7 @@ def __init__( ckpt_dir: the directory to save the checkpoint. amp: whether to enable auto-mixed-precision training. use_gpu: whether to use GPU in training. - multi_gpu: whether to use multiple GPUs for distributed training. + """ self.max_epochs = wf_config["max_epochs"] self.learning_rate = wf_config["learning_rate"] @@ -88,7 +86,6 @@ def __init__( self.ckpt_dir = wf_config["ckpt_dir"] self.amp = wf_config["amp"] self.use_gpu = wf_config["use_gpu"] - self.multi_gpu = wf_config["multi_gpu"] self.local_rank = local_rank self.app_root = app_root self.dataset_folder_name = dataset_folder_name @@ -96,12 +93,6 @@ def __init__( self.download_spleen_dataset() def set_device(self): - # if self.multi_gpu: - # # initialize distributed training - # dist.init_process_group(backend="nccl", init_method="env://") - # device = torch.device(f"cuda:{self.local_rank}") - # torch.cuda.set_device(device) - # else: device = torch.device("cuda" if self.use_gpu else "cpu") self.device = device @@ -109,9 +100,7 @@ def download_spleen_dataset(self): url = "https://msd-for-monai.s3-us-west-2.amazonaws.com/Task09_Spleen.tar" name = os.path.join(self.app_root, self.dataset_folder_name) tarfile_name = f"{name}.tar" - download_and_extract( - url=url, filepath=tarfile_name, output_dir=self.app_root - ) + download_and_extract(url=url, filepath=tarfile_name, output_dir=self.app_root) def configure(self): self.set_device() @@ -124,13 +113,6 @@ def configure(self): num_res_units=2, norm=Norm.BATCH, ).to(self.device) - # if self.multi_gpu: - # network = DistributedDataParallel( - # module=network, - # device_ids=[self.device], - # find_unused_parameters=False, - # ) - train_transforms = Compose( [ LoadImaged(keys=("image", "label")), @@ -176,13 +158,6 @@ def configure(self): data_list_key="validation", base_dir=os.path.join(self.app_root, self.dataset_folder_name), ) - # if self.multi_gpu: - # train_datalist = partition_dataset( - # data=train_datalist, - # shuffle=True, - # num_partitions=dist.get_world_size(), - # even_divisible=True, - # )[dist.get_rank()] train_ds = CacheDataset( data=train_datalist, transform=train_transforms, @@ -303,7 +278,3 @@ def configure(self): train_handlers=train_handlers, amp=self.amp, ) - - # if self.local_rank > 0: - # self.train_engine.logger.setLevel(logging.WARNING) - # self.eval_engine.logger.setLevel(logging.WARNING) diff --git a/federated_learning/nvflare/requirements.txt b/federated_learning/nvflare/requirements.txt index 8ea240baa7..ba65b390af 100644 --- a/federated_learning/nvflare/requirements.txt +++ b/federated_learning/nvflare/requirements.txt @@ -1,7 +1,7 @@ pip setuptools nvflare==2.0.1 -monai==0.8.0rc3 +monai==0.8.0 pytorch-ignite==0.4.6 tqdm==4.61.2 nibabel==3.2.1 From a3ba1dbb18c7a13625381bddacd947867de35540 Mon Sep 17 00:00:00 2001 From: Yiheng Wang Date: Tue, 30 Nov 2021 12:13:11 +0800 Subject: [PATCH 4/4] update folder and readme Signed-off-by: Yiheng Wang --- .../nvflare/{ => nvflare_spleen_example}/1-Server.ipynb | 0 .../nvflare/{ => nvflare_spleen_example}/2-Client.ipynb | 0 .../nvflare/{ => nvflare_spleen_example}/3-Admin.ipynb | 0 .../nvflare/{ => nvflare_spleen_example}/README.md | 2 +- .../hello_monai/config/config_fed_client.json | 0 .../hello_monai/config/config_fed_server.json | 0 .../hello_monai/config/config_train.json | 0 .../hello_monai/config/dataset_part1.json | 0 .../hello_monai/config/dataset_part2.json | 0 .../hello_monai/custom/monai_trainer.py | 0 .../hello_monai/custom/train_configer.py | 0 .../nvflare/{ => nvflare_spleen_example}/requirements.txt | 0 12 files changed, 1 insertion(+), 1 deletion(-) rename federated_learning/nvflare/{ => nvflare_spleen_example}/1-Server.ipynb (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/2-Client.ipynb (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/3-Admin.ipynb (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/README.md (96%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/config/config_fed_client.json (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/config/config_fed_server.json (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/config/config_train.json (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/config/dataset_part1.json (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/config/dataset_part2.json (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/custom/monai_trainer.py (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/hello_monai/custom/train_configer.py (100%) rename federated_learning/nvflare/{ => nvflare_spleen_example}/requirements.txt (100%) diff --git a/federated_learning/nvflare/1-Server.ipynb b/federated_learning/nvflare/nvflare_spleen_example/1-Server.ipynb similarity index 100% rename from federated_learning/nvflare/1-Server.ipynb rename to federated_learning/nvflare/nvflare_spleen_example/1-Server.ipynb diff --git a/federated_learning/nvflare/2-Client.ipynb b/federated_learning/nvflare/nvflare_spleen_example/2-Client.ipynb similarity index 100% rename from federated_learning/nvflare/2-Client.ipynb rename to federated_learning/nvflare/nvflare_spleen_example/2-Client.ipynb diff --git a/federated_learning/nvflare/3-Admin.ipynb b/federated_learning/nvflare/nvflare_spleen_example/3-Admin.ipynb similarity index 100% rename from federated_learning/nvflare/3-Admin.ipynb rename to federated_learning/nvflare/nvflare_spleen_example/3-Admin.ipynb diff --git a/federated_learning/nvflare/README.md b/federated_learning/nvflare/nvflare_spleen_example/README.md similarity index 96% rename from federated_learning/nvflare/README.md rename to federated_learning/nvflare/nvflare_spleen_example/README.md index 146f113bd8..9f27a8fdaa 100644 --- a/federated_learning/nvflare/README.md +++ b/federated_learning/nvflare/nvflare_spleen_example/README.md @@ -1,4 +1,4 @@ -# Federated learning with [NVIDIA FLARE](./federated_learning/nvflare)** +# Federated learning with NVIDIA FLARE ## Brief Introduction diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_client.json b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_fed_client.json similarity index 100% rename from federated_learning/nvflare/hello_monai/config/config_fed_client.json rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_fed_client.json diff --git a/federated_learning/nvflare/hello_monai/config/config_fed_server.json b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_fed_server.json similarity index 100% rename from federated_learning/nvflare/hello_monai/config/config_fed_server.json rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_fed_server.json diff --git a/federated_learning/nvflare/hello_monai/config/config_train.json b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_train.json similarity index 100% rename from federated_learning/nvflare/hello_monai/config/config_train.json rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/config_train.json diff --git a/federated_learning/nvflare/hello_monai/config/dataset_part1.json b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/dataset_part1.json similarity index 100% rename from federated_learning/nvflare/hello_monai/config/dataset_part1.json rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/dataset_part1.json diff --git a/federated_learning/nvflare/hello_monai/config/dataset_part2.json b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/dataset_part2.json similarity index 100% rename from federated_learning/nvflare/hello_monai/config/dataset_part2.json rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/config/dataset_part2.json diff --git a/federated_learning/nvflare/hello_monai/custom/monai_trainer.py b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/custom/monai_trainer.py similarity index 100% rename from federated_learning/nvflare/hello_monai/custom/monai_trainer.py rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/custom/monai_trainer.py diff --git a/federated_learning/nvflare/hello_monai/custom/train_configer.py b/federated_learning/nvflare/nvflare_spleen_example/hello_monai/custom/train_configer.py similarity index 100% rename from federated_learning/nvflare/hello_monai/custom/train_configer.py rename to federated_learning/nvflare/nvflare_spleen_example/hello_monai/custom/train_configer.py diff --git a/federated_learning/nvflare/requirements.txt b/federated_learning/nvflare/nvflare_spleen_example/requirements.txt similarity index 100% rename from federated_learning/nvflare/requirements.txt rename to federated_learning/nvflare/nvflare_spleen_example/requirements.txt