From db75f434f0e847f3ddb9308686cc4669ea3cbd72 Mon Sep 17 00:00:00 2001 From: Chester Chen <512707+chesterxgchen@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:33:17 -0800 Subject: [PATCH] FedStats Quantile and Tutorials Update (#3241) ## FedStats Quantile metrics * Replace t-digest python package ( which require python3-dev dependency) with fastdigest ( which requires cargo rust dependency). Make the installation of fastdigest optional * move make the quantile optional, only available when fastquantile is installed. ## Tutorial 2nd Pass Update 1. Chapter 1 -- introduction to logging section 2. Chapter 2 -- Update * Chapter 2.1 -- Expand the fed statistics with background and explanation * Chapter 2.2 -- Expand the Client API section with additional figure and details tutorials * Chapter 2.3 -- re-organized the section make client API goes first. Add a lot details for logistics regression, removed the Job API code, As it doesn't work right now. * Chapter 2.5 --recap, re-write the summary to avoid it as the repeat of the introduction 3. Chapter 1-2-3 grammar check update ### Types of changes - [x] Non-breaking change (fix or new feature that would not break existing functionality). - [ ] Breaking change (fix or new feature that would cause existing functionality to change). - [ ] New tests added to cover the changes. - [ ] Quick tests passed locally by running `./runtest.sh`. - [ ] In-line docstrings updated. - [ ] Documentation updated. --- ...est.LICENSE.txt => fastdigest.LICENSE.txt} | 0 CONTRIBUTING.md | 3 - .../advanced/federated-statistics/README.md | 87 ++- .../federated-statistics/df_stats/README.md | 59 +- .../df_stats/demo/visualization.ipynb | 10 +- .../df_stats/install_cargo.sh | 15 + .../df_stats/job_api/df_statistics.py | 8 +- .../df_stats/job_api/df_stats_job.py | 14 +- .../app/config/config_fed_server.json | 2 +- .../df_stats/requirements.txt | 2 +- .../streaming/src/simple_controller.py | 1 - .../src/standalone_file_streaming.py | 2 - .../01.0_introduction/introduction.ipynb | 45 +- .../code/fl_job.py | 2 +- .../code/log_config.json | 93 --- .../runing_pytorch_fl_job.ipynb | 42 +- .../setup.ipynb | 57 +- .../convert_dl_to_fl.ipynb | 62 +- .../code/data/download.py | 0 .../code/fl_job.py | 0 .../code/requirements.txt | 0 .../code/src/client.py | 0 .../code/src/fedavg_v0.py | 0 .../code/src/fedavg_v1.py | 1 - .../code/src/fedavg_v2.py | 0 .../code/src/network.py | 0 .../customize_server_logics.ipynb | 62 +- .../code/data/download.py | 0 .../code/fl_job.py | 0 .../code/requirements.txt | 0 .../code/src/client.py | 0 .../code/src/fedavg.py | 0 .../code/src/fl_job.py | 0 .../code/src/network.py | 0 .../customize_client_training.ipynb | 21 +- .../experiment_tracking_tensorboard.ipynb | 12 +- .../experiment_tracking_mlflow.ipynb | 4 +- .../experiment_tracking.ipynb | 12 +- ...l_job.ipynb => understanding_fl_job.ipynb} | 35 +- .../01.7_logging/logging.ipynb | 148 ++++ .../01.7_recap/recap.ipynb | 82 --- .../01.8_recap/recap.ipynb | 70 ++ .../02.0_introduction/introduction.ipynb | 54 +- .../federated_statistics_introduction.ipynb | 219 +++++- .../code/data/download_and_unzip_data.sh | 25 - .../code/data/prepare_data.sh | 8 + .../utils/prepare_data.py | 0 .../code/demo/visualization.ipynb | 258 +++++++ .../image_stats/demo/image_statistics.json | 1 - .../code/image_stats/demo/visualization.ipynb | 440 ----------- .../code/image_stats/figs/image_histogram.png | Bin 114002 -> 0 bytes .../code/image_stats_job.py | 2 +- ...federated_statistics_with_image_data.ipynb | 196 ++++- .../{df_stats/utils => data}/prepare_data.py | 0 .../{df_stats => }/demo/visualization.ipynb | 45 +- .../code/df_stats/demo/df_stats.png | Bin 139796 -> 0 bytes .../code/df_stats/demo/hist_plot.png | Bin 239374 -> 0 bytes .../code/df_stats/demo/stats_df.png | Bin 217615 -> 0 bytes .../code/df_stats_job.py | 25 +- .../code/src/df_statistics.py | 8 +- ...derated_statistics_with_tabular_data.ipynb | 292 +++++++- .../02.2_client_api/client_api.ipynb | 248 +++++++ .../client_api_communication_pattern.png | Bin 0 -> 52686 bytes .../code/log_config.json | 87 --- .../code/log_config.json | 87 --- .../code/lr_fl_job.py | 50 -- .../app/custom/newton_raphson_train.py | 184 ----- .../app/custom/newton_raphson_workflow.py | 167 ----- .../code/src/newton_raphson_persistor.py | 64 -- .../convert_logistic_regression_to_fl.ipynb | 341 --------- .../convert_ml_to_fl.ipynb | 34 - .../code/lightning_fl_job.py | 2 +- .../code/requirements.txt | 0 .../code/src/cifar10_lightning_fl.py | 0 .../code/src/lit_net.py | 0 .../controller_worker_flow.png | Bin 0 -> 58043 bytes .../convert_torch_lightning_to_fl.ipynb | 91 ++- .../02.4_client_api/client_api.ipynb | 346 --------- .../02.4_client_api/code/np_client_api_job.py | 82 --- .../02.4_client_api/code/src/train_diff.py | 71 -- .../02.4_client_api/code/src/train_full.py | 68 -- .../02.4_client_api/code/src/train_metrics.py | 84 --- .../code/data/prepare_heart_disease_data.sh | 0 .../code/data/utils/convert_data_to_np.py | 0 .../code/figs/tb-metrics.png | Bin .../app/config/config_fed_client.json | 0 .../app/config/config_fed_server.json | 0 .../app/custom/newton_raphson_persistor.py | 0 .../app/custom}/newton_raphson_train.py | 3 +- .../app/custom}/newton_raphson_workflow.py | 4 +- .../code/newton_raphson/meta.json | 0 .../code/requirements.txt | 0 .../code/train_centralized.py | 0 .../convert_logistic_regression_to_fl.ipynb | 687 ++++++++++++++++++ .../code/figs/minibatch.png | Bin .../code/kmeans_job.py | 0 .../code/requirements.txt | 0 .../code/src/kmeans_assembler.py | 0 .../code/src/kmeans_fl.py | 0 .../code/utils/prepare_data.py | 0 .../code/utils/split_data.py | 0 .../convert_kmeans_to_fl.ipynb | 1 + .../code/figs/km_curve_baseline.png | Bin .../code/figs/km_curve_fl.png | Bin .../code/figs/km_curve_fl_he.png | Bin .../code/km_job.py | 0 .../code/requirements.txt | 0 .../code/src/kaplan_meier_train.py | 0 .../code/src/kaplan_meier_train_he.py | 0 .../code/src/kaplan_meier_wf.py | 0 .../code/src/kaplan_meier_wf_he.py | 0 .../code/utils/baseline_kaplan_meier.py | 0 .../code/utils/prepare_data.py | 0 .../code/utils/prepare_he_context.py | 0 .../convert_survival_analysis_to_fl.ipynb | 0 .../convert_ml_to_fl.ipynb | 36 + .../02.5_recap/recap.ipynb | 44 +- .../part_1_introduction.ipynb | 16 +- .../03.0_introduction/introduction.ipynb | 2 +- .../system_architecture.ipynb | 18 +- .../simulate_real_world_deployment.ipynb | 24 +- .../ ways_to_interact_with_fl_system.ipynb | 13 +- .../03.4_system_monitoring/job_example.ipynb | 39 +- .../system_monitorinig.ipynb | 12 +- .../03.5_recap/recap.ipynb | 22 +- .../identity_security.ipynb | 2 +- .../09.2_tasks_and_data_share/modules.py | 6 - .../09.3_p2p_communication/modules.py | 2 - .../app_common/abstract/statistics_spec.py | 2 +- nvflare/app_common/app_constant.py | 7 +- .../statistics/statistics_task_handler.py | 10 +- .../app_common/statistics/numeric_stats.py | 60 +- .../statistics/statistics_config_utils.py | 2 +- .../workflows/statistics_controller.py | 24 +- .../statistics/df/df_core_statistics.py | 37 +- nvflare/app_opt/statistics/quantile_stats.py | 98 +++ setup.cfg | 1 - .../app_common/statistics/quantile_test.py | 266 +++++++ .../unit_test/app_opt/statistics/__init__.py | 13 - .../app_opt/statistics/percentiles_test.py | 89 --- 140 files changed, 3094 insertions(+), 2976 deletions(-) rename 3rdParty/{tdigest.LICENSE.txt => fastdigest.LICENSE.txt} (100%) create mode 100755 examples/advanced/federated-statistics/df_stats/install_cargo.sh delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/log_config.json rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/data/download.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/fl_job.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/src/client.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/src/fedavg_v0.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/src/fedavg_v1.py (99%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/src/fedavg_v2.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/code/src/network.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.3_customize_server_logics => 01.3_server_side_customization}/customize_server_logics.ipynb (87%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/data/download.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/fl_job.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/src/client.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/src/fedavg.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/src/fl_job.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/code/src/network.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/{01.4_customize_client_training => 01.4_client_side_customization}/customize_client_training.ipynb (79%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/{01.1.6.1_understanding_fl_job.ipynb => understanding_fl_job.ipynb} (90%) create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_logging/logging.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_recap/recap.ipynb create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.8_recap/recap.ipynb delete mode 100755 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/download_and_unzip_data.sh create mode 100755 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/prepare_data.sh rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/{image_stats => data}/utils/prepare_data.py (100%) create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/demo/visualization.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/image_statistics.json delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/visualization.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/figs/image_histogram.png rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/{df_stats/utils => data}/prepare_data.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/{df_stats => }/demo/visualization.ipynb (82%) delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/df_stats.png delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/hist_plot.png delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/stats_df.png create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api.ipynb create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api_communication_pattern.png delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/log_config.json delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/log_config.json delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/lr_fl_job.py delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_train.py delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_workflow.py delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_persistor.py delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.2_convert_torch_lightning_to_federated_learning => 02.3_convert_torch_lightning_to_federated_learning}/code/lightning_fl_job.py (93%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.2_convert_torch_lightning_to_federated_learning => 02.3_convert_torch_lightning_to_federated_learning}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.2_convert_torch_lightning_to_federated_learning => 02.3_convert_torch_lightning_to_federated_learning}/code/src/cifar10_lightning_fl.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.2_convert_torch_lightning_to_federated_learning => 02.3_convert_torch_lightning_to_federated_learning}/code/src/lit_net.py (100%) create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/controller_worker_flow.png rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.2_convert_torch_lightning_to_federated_learning => 02.3_convert_torch_lightning_to_federated_learning}/convert_torch_lightning_to_fl.ipynb (88%) delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/client_api.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/np_client_api_job.py delete mode 100755 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_diff.py delete mode 100755 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_full.py delete mode 100755 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_metrics.py rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/data/prepare_heart_disease_data.sh (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/data/utils/convert_data_to_np.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/figs/tb-metrics.png (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/newton_raphson/app/config/config_fed_client.json (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/newton_raphson/app/config/config_fed_server.json (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/newton_raphson/app/custom/newton_raphson_persistor.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom}/newton_raphson_train.py (97%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom}/newton_raphson_workflow.py (98%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/newton_raphson/meta.json (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning}/code/train_centralized.py (100%) create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/figs/minibatch.png (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/kmeans_job.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/src/kmeans_assembler.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/src/kmeans_fl.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/utils/prepare_data.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/code/utils/split_data.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning}/convert_kmeans_to_fl.ipynb (99%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/figs/km_curve_baseline.png (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/figs/km_curve_fl.png (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/figs/km_curve_fl_he.png (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/km_job.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/requirements.txt (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/src/kaplan_meier_train.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/src/kaplan_meier_train_he.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/src/kaplan_meier_wf.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/src/kaplan_meier_wf_he.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/utils/baseline_kaplan_meier.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/utils/prepare_data.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/code/utils/prepare_he_context.py (100%) rename examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/{02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning => 02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning}/convert_survival_analysis_to_fl.ipynb (100%) create mode 100644 examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb create mode 100644 nvflare/app_opt/statistics/quantile_stats.py create mode 100644 tests/unit_test/app_common/statistics/quantile_test.py delete mode 100644 tests/unit_test/app_opt/statistics/__init__.py delete mode 100644 tests/unit_test/app_opt/statistics/percentiles_test.py diff --git a/3rdParty/tdigest.LICENSE.txt b/3rdParty/fastdigest.LICENSE.txt similarity index 100% rename from 3rdParty/tdigest.LICENSE.txt rename to 3rdParty/fastdigest.LICENSE.txt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 07e05e2264..dd31762704 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,9 +44,6 @@ To collaborate efficiently, please read through this section and follow them. * [Building documentation](#building-the-documentation) * [Signing your work](#signing-your-work) -> Note: - > some package dependencies requires python-dev in local development such as - > python3.12-dev. #### Checking the coding style We check code style using flake8 and isort. diff --git a/examples/advanced/federated-statistics/README.md b/examples/advanced/federated-statistics/README.md index 32b09124ce..0d16d705fe 100644 --- a/examples/advanced/federated-statistics/README.md +++ b/examples/advanced/federated-statistics/README.md @@ -2,7 +2,7 @@ ## Objective NVIDIA FLARE will provide built-in federated statistics operators (controllers and executors) that -can generate global statistics based on local client side statistics. +can generate global statistics based on local client-side statistics. At each client site, we could have one or more datasets (such as "train" and "test" datasets); each dataset may have many features. For each feature in the dataset, we will calculate the statistics and then combine them to produce @@ -19,14 +19,47 @@ The result should be visualized via the visualization utility in the notebook. ## Assumptions -Assume that clients will provide the following: - * user needs to provide target statistics such as count, histogram only - * user needs to provide the local statistics for the target statistics (by implementing the statistic_spec) - * user needs to provide the data sets and dataset features (feature name, data type) - * * Note: count is always required as we use count to enforce data privacy policy -We only support **numerical features**, not categorical features. But user can return all types of features +Assume that clients will provide the following: +* Users need to provide target statistics such as count, histogram only +* Users need to provide the local statistics for the target statistics (by implementing the statistics_spec) +* Users need to provide the datasets and dataset features (feature name, data type) +* Note: count is always required as we use count to enforce data privacy policy + +We only support **numerical features**, not categorical features. However, users can return all types of features; the non-numerical features will be removed. + +## Statistics + + Federated statistics includes numerics statistics measures for + * count + * mean + * sum + * std_dev + * histogram + * quantile + + We did not include min, max value to avoid data privacy concern. + +### Quantile + +Quantile statistics refers to statistical measures that divide a probability distribution or dataset into intervals with equal probabilities or proportions. Quantiles help summarize the distribution of data by providing key points that indicate how values are spread. + +#### Key Quantiles: +1. Median (50th percentile): The middle value of a dataset, dividing it into two equal halves. +2. Quartiles (25th, 50th, 75th percentiles): Divide the data into four equal parts: +* Q1 (25th percentile): Lower quartile, below which 25% of the data falls. +* Q2 (50th percentile): Median. +* Q3 (75th percentile): Upper quartile, below which 75% of the data falls. +3. Deciles (10th, 20th, ..., 90th percentiles): Divide the data into ten equal parts. +4. Percentiles (1st, 2nd, ..., 99th): Divide the data into 100 equal parts. + +#### Usage of Quantiles: +* Descriptive Statistics: Summarizes the spread of data. +* Outlier Detection: Helps identify extreme values. +* Machine Learning: Used in feature engineering, normalization, and decision tree algorithms. +* Risk Analysis: Used in finance (e.g., Value at Risk, VaR). + ## Examples We provide several examples to demonstrate how should the operators be used. @@ -57,20 +90,21 @@ The main steps are The detailed example instructions can be found [Data frame statistics](df_stats/README.md) + ### COVID 19 Radiology Image Examples -The second example provided is image histogram example. Different from **Tabular** data example, +The second example provided is an image histogram example. Unlike the **Tabular** data example: -The image examples show the followings +The image examples show the following: * The [image_statistics.py](image_stats/jobs/image_stats/app/custom/image_statistics.py) only needs -to calculate the count and histogram target statistics, then user only needs to provide the calculation count, failure_count and histogram functions. There is no need to implement other metrics functions - (sum, mean,std_dev etc.) ( get_failure_count by default return 0 ) -* For each site's dataset, there are several thousands of images, the local histogram is aggregate histogram of all the image histograms. -* The image files are large, we can't load everything in memory, then calculate the statistics. -We will need to iterate through files for each calculation. For single feature, such as example. This is ok. If there are multiple features, -such as multiple channels, reload image to memory for each channel to do histogram calculation is really wasteful. -* Unlike [Data frame statistics](df_stats/README.md), the histogram bin's global range is pre-defined by user [0, 256] -where in [Data frame statistics](df_stats/README.md), besides "Age", all other features histogram global bin range +to calculate the count and histogram target statistics. Users only need to provide the calculation count, failure_count and histogram functions. There is no need to implement other metrics functions +(sum, mean, std_dev etc.) (get_failure_count by default returns 0) +* For each site's dataset, there are several thousand images; the local histogram is an aggregate histogram of all the image histograms +* The image files are large, so we can't load everything into memory and then calculate the statistics. +We will need to iterate through files for each calculation. For a single feature, this is acceptable. If there are multiple features, +such as multiple channels, reloading images to memory for each channel to do histogram calculation is wasteful +* Unlike [Data frame statistics](df_stats/README.md), the histogram bin's global range is pre-defined by users [0, 256], +whereas in [Data frame statistics](df_stats/README.md), besides "Age", all other features' histogram global bin range is dynamically estimated based on local min/max values An example of image histogram (the underline image files have only 1 channel) @@ -155,6 +189,7 @@ The main steps are * provide client side configuration to specify data input location * provide hierarchy specification file providing details about all the clients and their hierarchy. + ## Privacy Policy and Privacy Filters NVFLARE provide data privacy protection through privacy filters [privacy-management](https://nvflare.readthedocs.io/en/main/user_guide/security/site_policy_management.html#privacy-management) @@ -178,22 +213,21 @@ defined and job doesn't specify the privacy scope, the job deployment will fail, ### Privacy Policy Instrumentation -There are different ways to set privacy filter depending the use cases +There are different ways to set privacy filters depending on the use cases: #### Set Privacy Policy as researcher You can specify the "task_result_filters" in config_fed_client.json to specify -the privacy control. This is useful when you develop these filters +the privacy control. This is useful when you develop these filters. #### Setup site privacy policy as org admin -Once the company decides to instrument certain privacy policy independent of individual -job, one can copy the local directory privacy.json content to clients' local privacy.json ( merge not overwrite). -in this example, since we only has one app, we can simply copy the private.json from local directory to +Once the company decides to implement certain privacy policies independent of individual +jobs, one can copy the local directory privacy.json content to clients' local privacy.json (merge, not overwrite). +In this example, since we only have one app, we can simply copy the privacy.json from the local directory to: * site-1/local/privacy.json * site-2/local/privacy.json - We need to remove the same filters from the job definition in config_fed_client.json by simply set the "task_result_filters" to empty list to avoid **double filtering** ``` @@ -304,10 +338,7 @@ sequenceDiagram ``` - - ## Summary -We provided federated statistics operators that can easily aggregate and visualize the local statistics for -different data site and features. We hope this feature will make it easier to perform federated data analysis. - +We provided federated statistics operators that can easily aggregate and visualize the local statistics for +different data site and features. We hope this feature will make it easier to perform federated data analysis. \ No newline at end of file diff --git a/examples/advanced/federated-statistics/df_stats/README.md b/examples/advanced/federated-statistics/df_stats/README.md index 65900aeb5f..6c50b8b8d8 100644 --- a/examples/advanced/federated-statistics/df_stats/README.md +++ b/examples/advanced/federated-statistics/df_stats/README.md @@ -17,6 +17,52 @@ cd NVFlare/examples/advanced/federated-statistics/df_stats pip install -r requirements.txt ``` + +## Install fastdigest + +If you intend to calculate quantiles, you need to install fastdigest. + +``` +pip install fastdigest==0.4.0 +``` + +on Ubuntu, you might get the following error: + + Cargo, the Rust package manager, is not installed or is not on PATH. + This package requires Rust and Cargo to compile extensions. Install it through + the system's package manager or via https://rustup.rs/ + + Checking for Rust toolchain.... + +This is because fastdigest (or its dependencies) requires Rust and Cargo to build. + +You need to install Rust and Cargo on your Ubuntu system. Follow these steps: +Install Rust and Cargo +Run the following command to install Rust using rustup: + +``` +cd NVFlare/examples/advanced/federated-statistics/df_stats +./install_cargo.sh +``` + +Then you can install fastdigest again +``` +pip install fastdigest==0.4.0 +``` + +### Quantile Calculation + +To calculate federated quantiles, we needed to select a package that satisfies the following constraints: + +* Works in distributed systems +* Does not copy the original data (avoiding privacy leaks) +* Avoids transmitting large amounts of data +* Ideally, no system-level dependency + +We chose the fastdigest python package, a rust-based package. tdigest only carries the cluster coordinates, initially each data point is in its own cluster. By default, we will compress with max_bin = sqrt(datasize) to compress the coordinates, so the data won't leak. You can always override max_bins if you prefer more or less compression. + + + ## 1. Prepare data In this example, we are using UCI (University of California, Irvine) [adult dataset](https://archive.ics.uci.edu/dataset/2/adult) @@ -165,8 +211,12 @@ statistics computing, we will only need to provide the followings "stddev": {}, "histogram": { "*": {"bins": 10 }, "Age": {"bins": 5, "range":[0,120]} - } + }, + "quantile": { + "*": [25, 50, 75] + } }, + "writer_id": "stats_writer" } } @@ -195,7 +245,8 @@ in FLARE job store. ### 5.2 client side configuration -First, we specify the built-in client side executor: `StatisticsExecutor`, which takes a local stats generator Id +First, we specify the built-in client side executor: `StatisticsExecutor`, which takes a local stats generator ID + ``` "executor": { @@ -248,7 +299,7 @@ In this example, task_result_filters is defined as task privacy filter : `Statis `StatisticsPrivacyFilter` is using three separate the `StatisticsPrivacyCleanser`, you can find more details in [local privacy policy](../local/privacy.json) and in later discussion on privacy. -The privacy cleansers specify policy can be find in +The privacy cleansers specify policies can be found in ``` "components": [ { @@ -311,6 +362,8 @@ to calculate the local statistics, we will need to implements few methods def histogram(self, dataset_name: str, feature_name: str, num_of_bins: int, global_min_value: float, global_max_value: float) -> Histogram: + def quantiles(self, dataset_name: str, feature_name: str, percentiles: List) -> Dict: + ``` since some of features do not provide histogram bin range, we will need to calculate based on local min/max to estimate the global min/max, and then use the global bin/max as the range for all clients' histogram bin range. diff --git a/examples/advanced/federated-statistics/df_stats/demo/visualization.ipynb b/examples/advanced/federated-statistics/df_stats/demo/visualization.ipynb index 283f5279b2..f03648716a 100644 --- a/examples/advanced/federated-statistics/df_stats/demo/visualization.ipynb +++ b/examples/advanced/federated-statistics/df_stats/demo/visualization.ipynb @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "c44a0217", "metadata": { "tags": [] @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "93c62d5e", "metadata": { "tags": [] @@ -271,9 +271,9 @@ ], "metadata": { "kernelspec": { - "display_name": "nvflare_example", + "display_name": "nvflare-env", "language": "python", - "name": "nvflare_example" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -285,7 +285,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.8.13" } }, "nbformat": 4, diff --git a/examples/advanced/federated-statistics/df_stats/install_cargo.sh b/examples/advanced/federated-statistics/df_stats/install_cargo.sh new file mode 100755 index 0000000000..6fcbc255c6 --- /dev/null +++ b/examples/advanced/federated-statistics/df_stats/install_cargo.sh @@ -0,0 +1,15 @@ + +# fastdigest (or its dependencies) requires Rust and Cargo to build. +# You need to install Rust and Cargo on your Ubuntu system. Follow these steps: +# Install Rust and Cargo +# Run the following command to install Rust using rustup: + + +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +# Then restart your terminal or run: + +source $HOME/.cargo/env +# Verify Installation +# Check if Rust and Cargo are installed correctly: +rustc --version +cargo --version \ No newline at end of file diff --git a/examples/advanced/federated-statistics/df_stats/job_api/df_statistics.py b/examples/advanced/federated-statistics/df_stats/job_api/df_statistics.py index 5078c2f0a9..942bbf692d 100644 --- a/examples/advanced/federated-statistics/df_stats/job_api/df_statistics.py +++ b/examples/advanced/federated-statistics/df_stats/job_api/df_statistics.py @@ -21,10 +21,10 @@ class DFStatistics(DFStatisticsCore): - def __init__(self, data_path): + def __init__(self, filename, data_root_dir="/tmp/nvflare/df_stats/data"): super().__init__() - self.data_root_dir = "/tmp/nvflare/df_stats/data" - self.data_path = data_path + self.data_root_dir = data_root_dir + self.filename = filename self.data: Optional[Dict[str, pd.DataFrame]] = None self.data_features = [ "Age", @@ -57,7 +57,7 @@ def load_data(self, fl_ctx: FLContext) -> Dict[str, pd.DataFrame]: self.log_info(fl_ctx, f"load data for client {client_name}") try: skip_rows = self.skip_rows[client_name] - data_path = f"{self.data_root_dir}/{fl_ctx.get_identity_name()}/{self.data_path}" + data_path = f"{self.data_root_dir}/{fl_ctx.get_identity_name()}/{self.filename}" # example of load data from CSV df: pd.DataFrame = pd.read_csv( data_path, names=self.data_features, sep=r"\s*,\s*", skiprows=skip_rows, engine="python", na_values="?" diff --git a/examples/advanced/federated-statistics/df_stats/job_api/df_stats_job.py b/examples/advanced/federated-statistics/df_stats/job_api/df_stats_job.py index 696d57170c..39aafe312b 100644 --- a/examples/advanced/federated-statistics/df_stats/job_api/df_stats_job.py +++ b/examples/advanced/federated-statistics/df_stats/job_api/df_stats_job.py @@ -20,9 +20,9 @@ def define_parser(): parser = argparse.ArgumentParser() - parser.add_argument("-n", "--n_clients", type=int, default=3) - parser.add_argument("-d", "--data_root_dir", type=str, nargs="?", default="/tmp/nvflare/dataset/output") - parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/stats.json") + parser.add_argument("-n", "--n_clients", type=int, default=2) + parser.add_argument("-d", "--data_root_dir", type=str, nargs="?", default="/tmp/nvflare/df_stats/data") + parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/adults_stats.json") parser.add_argument("-j", "--job_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/stats_df") parser.add_argument("-w", "--work_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/stats_df/work_dir") parser.add_argument("-co", "--export_config", action="store_true", help="config only mode, export config") @@ -45,12 +45,11 @@ def main(): "mean": {}, "sum": {}, "stddev": {}, - "histogram": {"*": {"bins": 20}}, - "Age": {"bins": 20, "range": [0, 10]}, - "percentile": {"*": [25, 50, 75], "Age": [50, 95]}, + "histogram": {"*": {"bins": 20}, "Age": {"bins": 20, "range": [0, 100]}}, + "quantile": {"*": [0.1, 0.5, 0.9], "Age": [0.1, 0.5, 0.9]}, } # define local stats generator - df_stats_generator = DFStatistics(data_root_dir=data_root_dir) + df_stats_generator = DFStatistics(filename="data.csv", data_root_dir=data_root_dir) job = StatsJob( job_name="stats_df", @@ -63,6 +62,7 @@ def main(): job.setup_clients(sites) if export_config: + print("Exporting job config...", job_dir) job.export_job(job_dir) else: job.simulator_run(work_dir) diff --git a/examples/advanced/federated-statistics/df_stats/jobs/df_stats/app/config/config_fed_server.json b/examples/advanced/federated-statistics/df_stats/jobs/df_stats/app/config/config_fed_server.json index 58e4b861fb..62c4d3c8c5 100644 --- a/examples/advanced/federated-statistics/df_stats/jobs/df_stats/app/config/config_fed_server.json +++ b/examples/advanced/federated-statistics/df_stats/jobs/df_stats/app/config/config_fed_server.json @@ -19,7 +19,7 @@ "range": [0,120] } }, - "percentile": { + "quantile": { "*": [25, 50, 75] } }, diff --git a/examples/advanced/federated-statistics/df_stats/requirements.txt b/examples/advanced/federated-statistics/df_stats/requirements.txt index c766bd7827..5ae34037be 100644 --- a/examples/advanced/federated-statistics/df_stats/requirements.txt +++ b/examples/advanced/federated-statistics/df_stats/requirements.txt @@ -2,4 +2,4 @@ numpy pandas matplotlib jupyterlab -tdigest + diff --git a/examples/advanced/streaming/src/simple_controller.py b/examples/advanced/streaming/src/simple_controller.py index 206346e8f2..3c2d5a56d9 100644 --- a/examples/advanced/streaming/src/simple_controller.py +++ b/examples/advanced/streaming/src/simple_controller.py @@ -25,7 +25,6 @@ class SimpleController(Controller): - def control_flow(self, abort_signal: Signal, fl_ctx: FLContext): logger.info(f"Entering control loop of {self.__class__.__name__}") engine = fl_ctx.get_engine() diff --git a/examples/advanced/streaming/src/standalone_file_streaming.py b/examples/advanced/streaming/src/standalone_file_streaming.py index 1c4c44b87b..e714cb237c 100644 --- a/examples/advanced/streaming/src/standalone_file_streaming.py +++ b/examples/advanced/streaming/src/standalone_file_streaming.py @@ -27,7 +27,6 @@ class FileSender(FLComponent): - def __init__(self): super().__init__() self.seq = 0 @@ -73,7 +72,6 @@ def _sending_file(self, fl_ctx): class FileReceiver(FLComponent): - def __init__(self): super().__init__() self.done = False diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.0_introduction/introduction.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.0_introduction/introduction.ipynb index 260449d93b..5f9b12cee4 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.0_introduction/introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.0_introduction/introduction.ipynb @@ -4,43 +4,32 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Recap: Runing Federated Learning Applications\n", - "\n", - "\n", - "In this chapter, we will explore the process of running federated learning applications. We will start by setting up the environment and preparing the data, followed by training a classifier using PyTorch. We will then convert deep learning models to federated learning, customize server and client logic, and setup track experiments. Finally, we will delve into the job structure and configurations, including running a simulator, and conclude with a recap of the covered topics.\n", + "# Running Federated Learning Applications\n", "\n", + "In this chapter, we will explore the process of running federated learning applications. We will start by setting up the environment and preparing the data, followed by training a classifier using PyTorch. We will then convert deep learning models to federated learning, customize server and client logic, and set up experiment tracking. Finally, we will delve into the job structure and configurations, including running a simulator, and conclude with a recap of the covered topics.\n", "\n", "1. **Running federated learning job**\n", " * [Installation, prepare data](../01.1_running_federated_learning_job/setup.ipynb)\n", - " * [traing classifier with pytorch](../01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb)\n", - "\n", - "2. **From stand-alone-deep learning to Federated Learning**\n", - "\n", - " * [Convert deep learning with pytorch to federated leraning](../01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb)\n", - "\n", - "\n", - "2. **How to Customize the Federated Algorithms**\n", + " * [Training classifier with PyTorch](../01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb)\n", "\n", - " * [customize server logics](../01.3_customize_server_logics/customize_server_logics.ipynb)\n", + "2. **From stand-alone deep learning to Federated Learning**\n", + " * [Convert deep learning with PyTorch to federated learning](../01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb)\n", "\n", - "4. **How to make adjustments to different traing parameters** \n", + "3. **Sever Side Customization*\n", + " * [customize server logics](../01.3_server_side_customization/customize_server_logics.ipynb)\n", "\n", - " * [customize client logics](../01.4_customize_client_training/customize_client_training.ipynb)\n", + "4. **Client Side Customization** \n", + " * [customize client training](../01.4_client_side_customization/customize_client_training.ipynb)\n", "\n", "5. **Tracking the training metrics** \n", - "\n", - " * [experiment tracking](../01.5_experiment_tracking/experiment_tracking.ipynb )\n", + " * [Experiment tracking](../01.5_experiment_tracking/experiment_tracking.ipynb)\n", "\n", "6. **Job structure and configurations**\n", + " * [Job structure & configuration](../01.6_job_structure_and_configuration/understanding_fl_job.ipynb)\n", "\n", - " * [job structure & configuration ](../01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb)\n", - "\n", - " \n", - "7. [Recap of the covered topics](../01.7_recap/recap.ipynb)\n", - "\n", + "7. [Logging](../01.7_logging/logging.ipynb)\n", "\n", - "\n", - "Let's get started with [Installation & data preparation](.././01.1_running_federated_learning_job/setup.ipynb)\n" + "Let's get started with [Installation & data preparation](../01.1_running_federated_learning_job/setup.ipynb)" ] }, { @@ -50,8 +39,14 @@ } ], "metadata": { + "kernelspec": { + "display_name": "nvflare-env", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.8.13" } }, "nbformat": 4, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/fl_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/fl_job.py index 5cd4c6de70..15ed34823e 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/fl_job.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/fl_job.py @@ -32,4 +32,4 @@ ) job.to(executor, f"site-{i + 1}") - job.simulator_run(workspace="/tmp/nvflare/jobs/workdir", log_config="./log_config.json") + job.simulator_run(workspace="/tmp/nvflare/jobs/workdir") diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/log_config.json b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/log_config.json deleted file mode 100644 index 240e9616eb..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/code/log_config.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "version": 1, - "disable_existing_loggers": false, - "formatters": { - "baseFormatter": { - "()": "nvflare.fuel.utils.log_utils.BaseFormatter", - "fmt": "%(asctime)s - %(name)s - %(levelname)s - %(fl_ctx)s - %(message)s" - }, - "colorFormatter": { - "()": "nvflare.fuel.utils.log_utils.ColorFormatter", - "fmt": "%(asctime)s - %(levelname)s - %(message)s", - "datefmt": "%Y-%m-%d %H:%M:%S" - }, - "jsonFormatter": { - "()": "nvflare.fuel.utils.log_utils.JsonFormatter", - "fmt": "%(asctime)s - %(identity)s - %(name)s - %(fullName)s - %(levelname)s - %(fl_ctx)s - %(message)s" - } - }, - "filters": { - "FLFilter": { - "()": "nvflare.fuel.utils.log_utils.LoggerNameFilter", - "logger_names": ["custom", "nvflare.app_common", "nvflare.app_opt"] - } - }, - "handlers": { - "consoleHandler": { - "class": "logging.StreamHandler", - "level": "INFO", - "formatter": "colorFormatter", - "filters": ["FLFilter"], - "stream": "ext://sys.stdout" - }, - "logFileHandler": { - "class": "logging.handlers.RotatingFileHandler", - "level": "DEBUG", - "formatter": "baseFormatter", - "filename": "log.txt", - "mode": "a", - "maxBytes": 20971520, - "backupCount": 10 - }, - "errorFileHandler": { - "class": "logging.handlers.RotatingFileHandler", - "level": "ERROR", - "formatter": "baseFormatter", - "filename": "log_error.txt", - "mode": "a", - "maxBytes": 20971520, - "backupCount": 10 - }, - "jsonFileHandler": { - "class": "logging.handlers.RotatingFileHandler", - "level": "DEBUG", - "formatter": "jsonFormatter", - "filename": "log.json", - "mode": "a", - "maxBytes": 20971520, - "backupCount": 10 - }, - "FLFileHandler": { - "class": "logging.handlers.RotatingFileHandler", - "level": "DEBUG", - "formatter": "baseFormatter", - "filters": ["FLFilter"], - "filename": "log_fl.txt", - "mode": "a", - "maxBytes": 20971520, - "backupCount": 10, - "delay": true - } - }, - "loggers": { - "root": { - "level": "INFO", - "handlers": ["consoleHandler", "logFileHandler", "errorFileHandler", "jsonFileHandler", "FLFileHandler"] - }, - "nvflare.app_opt.pt.client_api_launcher_executor.PTClientAPILauncherExecutor": { - "level": "ERROR" - }, - "nvflare.app_opt.pt.in_process_client_api_executor.PTInProcessClientAPIExecutor": { - "level": "ERROR" - } - } -} - - - - - - - - - diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb index 87e84f39c9..990a62f9db 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb @@ -5,9 +5,9 @@ "id": "7a5c3d67-a6ea-4f59-84d2-effc3ef016e1", "metadata": {}, "source": [ - "# Runing Federated Learning Job with PyTorch\n", + " # Running Federated Learning Job with PyTorch\n", "\n", - "We have installed the NVIDIA FLARE, dependencies, download the data, look at the data split in [previous step](01.1.1_setup.ipynb), now we are going to look at the training. " + "We have installed NVIDIA FLARE and its dependencies, downloaded the data, and looked at the data split in the [previous step](01.1.1_setup.ipynb). Now we are going to look at the training.\n" ] }, { @@ -15,18 +15,22 @@ "id": "eb3f04b0", "metadata": {}, "source": [ - "## Run Federated Learning Training code\n", + " ## Run Federated Learning Training Code\n", "\n", + "The training code essentially consists of three files:\n", + "- `fl_job.py`: the main job flow\n", + "- `client.py`: the client-side training code\n", + "- `network.py`: the network model definition\n", + "\n", + "We use the `FedAvg` algorithm and workflow.\n", "\n", - "The training code essentially consists of `fl_job.py` code, `client.py` the client-side training code, and `nn.py` network model. We use the `FedAvg` algorithm and workflow.\n", "\n", - "```markdown\n", "## Run Federated Learning Training\n", "\n", - "The training code consists of three main scripts: `fl_job.py` for the overall job flow, `client.py` for the client-side training, and `network.py` for the network model. We use the built-in `FedAvg` algorithm for the server side worklow.\n", - "```\n", + "The training code consists of three main scripts: `fl_job.py` for the overall job flow, `client.py` for the client-side training, and `network.py` for the network model. We use the built-in `FedAvg` algorithm for the server-side workflow.\n", + "\n", "\n", - "to run the training in simulator we can simply execute the fl_job.py" + "To run the training in the simulator, we can simply execute `fl_job.py`.\n" ] }, { @@ -62,18 +66,18 @@ "id": "e823b5d4", "metadata": {}, "source": [ - "## 3. Access the logs and results\n", + " ## 3. Access the Logs and Results\n", "\n", - "You can find the running logs and results inside the simulator's workspace:\n", + "You can find the running logs and results inside the simulator's workspace.\n", "\n", - "noticed the \"fl_job.py\", we used the code \n", + "Notice that in `fl_job.py`, we used the code:\n", "\n", - "```\n", + "```python\n", "job.simulator_run(\"/tmp/nvflare/jobs/workdir\")\n", - "\n", "```\n", "\n", - "The \"/tmp/nvflare/jobs/workdir\" is the workspace directory of simulator\n" + "The \"/tmp/nvflare/jobs/workdir\" is the workspace directory of the simulator.\n", + "\n" ] }, { @@ -92,15 +96,21 @@ "id": "d4b62108", "metadata": {}, "source": [ - "We have successfully train a federated image classification model with pytorch. Next we need to take closer look the training codes and job structure. Let's go to [converting deep learning to federated learning](../01.1.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb)\n" + "We have successfully trained a federated image classification model with PyTorch. Next, we need to take a closer look at the training code and job structure. Let's go to [converting deep learning to federated learning](../01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb)." ] + }, + { + "cell_type": "markdown", + "id": "4406a33e", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { "display_name": "nvflare_env", "language": "python", - "name": "python3" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/setup.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/setup.ipynb index bbf9a7e923..c62e389bf6 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/setup.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.1_running_federated_learning_job/setup.ipynb @@ -5,11 +5,12 @@ "id": "7a5c3d67-a6ea-4f59-84d2-effc3ef016e1", "metadata": {}, "source": [ - "# Setup and Prepare Data\n", + "# Setup and Preparation\n", "\n", - "This example of using [NVIDIA FLARE](https://nvflare.readthedocs.io/en/main/index.html) to train an image classifier using federated averaging ([FedAvg](https://arxiv.org/abs/1602.05629))\n", + "This is an example of using [NVIDIA FLARE](https://nvflare.readthedocs.io/en/main/index.html) to train an image classifier using federated averaging ([FedAvg](https://arxiv.org/abs/1602.05629))\n", "and [PyTorch](https://pytorch.org/) as the deep learning training framework.\n", "\n", + "\n", "We will use the train script [cifar10_fl.py](src/cifar10_fl.py) and network [net.py](src/net.py) from the src directory.\n", "\n", "The dataset will be [CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html) dataset and will load its data within the client train code." @@ -72,7 +73,7 @@ "\n", "The CIFAR10 data will be downloaded to the common location. To make this process easiler, we wrote an simple download program like the followings\n", "\n", - "```\n", + "```python\n", "\n", "import argparse\n", "import torchvision.datasets as datasets\n", @@ -99,15 +100,26 @@ "id": "bcba6293", "metadata": {}, "source": [ - "The program just take a root dataset_path and download the training and test dataset to the given root directory from torchvision dataset. Let run the code. " + " The program just takes a root dataset_path and downloads the training and test datasets to the given root directory from the torchvision dataset. Let's run the code." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "87a13909", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to /tmp/nvflare/data/cifar10/cifar-10-python.tar.gz\n", + "100%|████████████████████████████████████████| 170M/170M [00:05<00:00, 28.6MB/s]\n", + "Extracting /tmp/nvflare/data/cifar10/cifar-10-python.tar.gz to /tmp/nvflare/data/cifar10\n", + "Files already downloaded and verified\n" + ] + } + ], "source": [ "!python3 code/data/download.py" ] @@ -122,10 +134,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "08bbe572", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;34m/tmp/nvflare/data/cifar10/cifar-10-batches-py/\u001b[0m\n", + "├── \u001b[00mbatches.meta\u001b[0m\n", + "├── \u001b[00mdata_batch_1\u001b[0m\n", + "├── \u001b[00mdata_batch_2\u001b[0m\n", + "├── \u001b[00mdata_batch_3\u001b[0m\n", + "├── \u001b[00mdata_batch_4\u001b[0m\n", + "├── \u001b[00mdata_batch_5\u001b[0m\n", + "├── \u001b[00mreadme.html\u001b[0m\n", + "└── \u001b[00mtest_batch\u001b[0m\n", + "\n", + "0 directories, 8 files\n" + ] + } + ], "source": [ "!tree /tmp/nvflare/data/cifar10/cifar-10-batches-py/" ] @@ -137,8 +167,8 @@ "source": [ "### Split the data\n", "\n", - "In real-world scenarios, the data will be distributed among different clients/sides. Since we are simulating the real-world data, we need to split the data into different clients/sites. How to split the data, \n", - "depending on the type of problem or type of data. For simplicity, in this example we assume all clients will have the same data for horizontal federated learning cases.\n", + "In real-world scenarios, the data will be distributed among different clients/sites. Since we are simulating real-world data, we need to split the data into different clients/sites. How to split the data\n", + "depends on the type of problem or type of data. For simplicity, in this example we assume all clients will have the same data for horizontal federated learning cases.\n", "Thus we do not do a data split, but rather point all clients to the same data location.\n", "\n", "\n", @@ -148,6 +178,7 @@ "\n", "\n", "\n", + "\n", "\n" ] }, @@ -156,7 +187,7 @@ "id": "316bae55", "metadata": {}, "source": [ - "Next Step, we will start to run training using simulation: [run pytorch federated learning job](../01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb)\n" + "Next step, we will start to run training using simulation: [run pytorch federated learning job](../01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb)\n" ] }, { @@ -168,9 +199,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "nvflare_env", "language": "python", - "name": "python3" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb index 208177e0be..8f980292c6 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb @@ -7,9 +7,10 @@ "source": [ "# PyTorch Deep Learning to Federated Learning Conversion\n", "\n", - "One common question frequently heard from data scientists is how do I wrote a federated learning ? If I already have training code already for deep learning? how do I write an federated learning training code for the same problem?\n", "\n", - "In this section, we will look at the classification training code we ran earlier and see how to convert the existing the pytorch training script to federated Learning client training code\n", + "One common question frequently heard from data scientists is \"how do I write federated learning code? If I already have training code for deep learning, how do I write federated learning training code for the same problem?\"\n", + "\n", + "In this section, we will look at the classification training code we ran earlier and see how to convert the existing PyTorch training script to federated learning client training code.\n", "\n", "\n", "## Orginal Deep learning Training Script" @@ -61,21 +62,24 @@ "\n", "we call \n", "\n", - "```\n", + "```python\n", "flare.init()\n", "```\n", "\n", "Once the flare is initialized, we will recieve some system metadata for example\n", - "```\n", + "\n", + "```python\n", + "\n", " sys_info = flare.system_info()\n", " client_name = sys_info[\"site_name\"]\n", "\n", "```\n", "We can get current client's \"identity\". \n", "\n", - "Next we need to extends the trainig beyond local iterations. Image the Federated Learning is like the following for-loop: \n", + "Next we need to extend the training beyond local iterations. Imagine the Federated Learning is like the following for-loop:\n", + "\n", + "```python\n", "\n", - "```\n", "rounds = 5\n", "for current_round in ranage (rounds):\n", " \n", @@ -94,9 +98,10 @@ "For each round: we need to receive and evaluate the global model. \n", "\n", "\n", - "**Step-4** Recive global model \n", + "**Step-4** Receive global model\n", + "\n", + "```python\n", "\n", - "```\n", " input_model = flare.receive()\n", " round=input_model.current_round\n", "\n", @@ -104,23 +109,23 @@ " model.load_state_dict(input_model.params)\n", "```\n", "\n", - "**Step-5** Eveluate Global Model\n", + "**Step-5** Evaluate Global Model\n", + "\n", + "Since the local model is being updated with global model, the training procedure calculates the loss which evaluates the model\n", "\n", - " Since the local model is being updated with global model, the training procedue caclate the loss which evaluate the model \n", "\n", "**Step-6** Send the local trained model back to aggregator\n", "\n", - " we take the newly trained local model parameters as well as metadata, sned it back to aggregator. \n", + "We take the newly trained local model parameters as well as metadata, send it back to aggregator.\n", "\n", - "```\n", + "```python\n", "\n", " output_model = flare.FLModel( params=model.cpu().state_dict(), meta={\"NUM_STEPS_CURRENT_ROUND\": steps},)\n", "\n", " flare.send(output_model)\n", "```\n", "\n", - "\n", - "With above steps, just a few lines of code changes, no code structural changes, we converted the pytorch deep learning code to federated learning with NVIDIA FLARE\n", + "With above steps, just a few lines of code changes, no code structural changes, we converted the PyTorch deep learning code to federated learning with NVIDIA FLARE.\n", "\n", "The complete code can be found at client.py" ] @@ -140,19 +145,19 @@ "id": "7f1824bf", "metadata": {}, "source": [ - "Now, we converted the client pytorch training script to federated learning code. Lets look further to handle multi-task client code\n", + "Now, we converted the client PyTorch training script to federated learning code. Let's look further to handle multi-task client code.\n", "\n", "\n", "## Multi-Task Client Scripts\n", "\n", - "So far, the client only handles traing, regardless what tasks the server issues to the clients. What if there are many tasks ? Client should take different actions based on the different tasks. Also, in previous version, we did not evaluate the global model. We are also to handle all these in this section. \n", + "So far, the client only handles training, regardless of what tasks the server issues to the clients. What if there are many tasks? Client should take different actions based on the different tasks. Also, in the previous version, we did not evaluate the global model. We are going to handle all these in this section.\n", "\n", "\n", - "In Flare's Client API, by detault, we will issue three different tasks: \"train\", \"evaluate\" and \"submit_model\"\n", + "In Flare's Client API, by default, we will issue three different tasks: \"train\", \"evaluate\" and \"submit_model\"\n", "\n", "These three tasks can be checked by \n", "\n", - "```\n", + "```python\n", "\n", "flare.is_train()\n", "\n", @@ -162,7 +167,7 @@ "\n", "```\n", "\n", - "So we need to motify our existing training code to have both training and evaluation logics\n", + "So we need to modify our existing training code to have both training and evaluation logics.\n", "\n", "### Training logics changes\n", "\n", @@ -171,23 +176,25 @@ "\n", "evaluate the local model: \n", "\n", - "```\n", + "```python\n", " # (5.2) evaluation on local trained model to save best model\n", " local_accuracy = evaluate(net.state_dict())\n", "\n", "\n", "```\n", "\n", - "evalute the global model received \n", + "evaluate the global model received:\n", + "\n", + "```python\n", "\n", - "```\n", " # (5.3) evaluate on received model for model selection\n", " accuracy = evaluate(input_model.params)\n", "```\n", "\n", "Then add the global model accuracy into the metrics parameter of the FLModel before send it back to server. \n", "\n", - "```\n", + "```python\n", + "\n", " output_model = flare.FLModel(\n", " params=net.cpu().state_dict(),\n", " metrics={\"accuracy\": accuracy},\n", @@ -201,7 +208,7 @@ ">Note: the evaluate() function will discussed next\n", "\n", "\n", - "```\n", + "```python\n", " \n", "\n", " # (5.2) evaluation on local trained model to save best model\n", @@ -235,7 +242,7 @@ "The return value is accuracy percentage. \n", "\n", "\n", - "```\n", + "```python\n", "\n", " # wraps evaluation logic into a method to re-use for\n", " # evaluation on both trained and received model\n", @@ -270,7 +277,8 @@ "\n", "The overall logics becomes\n", "\n", - "```\n", + "```python\n", + "\n", "if flare.is_training(): \n", " traing and evaluate metrics\n", " send model and merics back\n", @@ -313,7 +321,7 @@ "source": [ "Now, we know how to convert an existing Deep Learning code to Federated Learning training script. We can now explore how to customize the training logics. \n", "\n", - "Please checkout [customize server logics](../01.1.3_customize_server_logics/customize_server_logics.ipynb)\n", + "Please checkout [server side customization](../01.3_server_side_customization/customize_server_logics.ipynb)\n", "\n" ] }, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/data/download.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/data/download.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/data/download.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/data/download.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/fl_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/fl_job.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/fl_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/fl_job.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/client.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/client.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/client.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/client.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v0.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v0.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v0.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v0.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v1.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v1.py similarity index 99% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v1.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v1.py index b0508d33eb..e8d555bea5 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v1.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v1.py @@ -23,7 +23,6 @@ class FedAvgV1(BaseFedAvg): - def __init__( self, *args, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v2.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v2.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/fedavg_v2.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/fedavg_v2.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/network.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/network.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/code/src/network.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/code/src/network.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/customize_server_logics.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/customize_server_logics.ipynb similarity index 87% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/customize_server_logics.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/customize_server_logics.ipynb index ed22affd71..b61a0e396d 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_customize_server_logics/customize_server_logics.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.3_server_side_customization/customize_server_logics.ipynb @@ -8,16 +8,14 @@ "\n", "# Customizing Federated Learning Server logics\n", "\n", + "In previous sections, we were able to run federated PyTorch image classification code with NVIDIA FLARE's built-in FedAvg algorithm.\n", + "What if we want to build our own algorithms or modify the existing algorithm?\n", "\n", - "In previous sections, we are able to run federated pytorch image classification code with NVIDIA FLARE builtin FedAvg algorithm. \n", - "What if we want to build my own algorithms or modify the existing algorithm ? \n", - "\n", - "In the following, using FedAvg as starting point, we like to make a few changes to FedAvg to fit our needs: \n", - "\n", - "* Add early stopping mechanism so that the training could stop instead of waiting to the total numbers of rounds if the criteria is statisfied\n", - "* Instead of rely on the internal best model selection approach, we want to provide our own best model selection\n", - "* Instead of using building persiste component PTFileModelPersistor, we like to have our own save and loading functions\n", + "In the following, using FedAvg as a starting point, we would like to make a few changes to FedAvg to fit our needs:\n", "\n", + "* Add early stopping mechanism so that the training could stop instead of waiting for the total number of rounds if the criteria is satisfied\n", + "* Instead of relying on the internal best model selection approach, we want to provide our own best model selection\n", + "* Instead of using built-in persist component PTFileModelPersistor, we would like to have our own save and loading functions\n", "\n", "In this section, we will go over these changes step-by-step. \n", "\n", @@ -39,9 +37,10 @@ "FedAvg can be written as very simple for-loop. There are several other factors to consider \n", "\n", "* How to send the model to clients?\n", - "* How to receive the response \n", - "* for the model and response, what's the format ? \n", - "* The model and responses and corresponding objects must be serialized, how to series them ? \n", + "* How to receive the responses\n", + "* For the model and responses, what's the format?\n", + "* The model and responses and corresponding objects must be serialized, how to serialize them?\n", + "\n", "\n", "Let's dive into these questions.\n", "\n", @@ -50,7 +49,7 @@ "\n", "FLARE defined a high-level data structure \"FLModel\" that holds the model parameters, metrics and metadata\n", "\n", - "```\n", + "```python\n", "\n", "class ParamsType(str, Enum):\n", " FULL = \"FULL\"\n", @@ -76,12 +75,13 @@ "\n", "#### Serialization \n", "\n", - "Many of the deep learning machine frameworks using python pickle as default serrialization mechanism. There are enough security concerns that FLARE is not using Pickle. NVIDIA FLARE Object Serializer (FOBS) used a [messagePack](https://msgpack.org/index.html)-based serialization approach. \n", + "Many of the deep learning machine frameworks using python pickle as default serialization mechanism. There are enough security concerns that FLARE is not using Pickle. NVIDIA FLARE Object Serializer (FOBS) used a [messagePack](https://msgpack.org/index.html)-based serialization approach. \n", "User needs to register a component ( \"Decomposer\") to serialize/de-serialize certain project to fobs. \n", "\n", "To PyTorch Tensor, we need to register [TensorDecompressor](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_opt/pt/decomposers.py) component at FOBS. \n", "\n", - "```\n", + "```python\n", + "\n", " # Use FOBS for serializing/deserializing PyTorch tensors\n", " fobs.register(TensorDecomposer)\n", "```\n", @@ -90,10 +90,11 @@ "\n", "For high-level API, we can use the followings\n", "\n", - "```\n", + "```python\n", + "\n", " results = self.send_model_and_wait(targets=clients, data=model)\n", "```\n", - "the function send the FLModel to targeted clients and recieve result. This is synchornized methood like scatter and gather. We broadcast the model to all targeted clients and receive results when required clients send back the results. \n", + "the function send the FLModel to targeted clients and recieve result. This is synchronized method like scatter and gather. We broadcast the model to all targeted clients and receive results when required clients send back the results. \n", "\n", "The BasedFedAvg is derived from ModelController which has the communication component, which allows the component to send the model and wait for result. \n", "\n", @@ -129,11 +130,13 @@ "```stop_cond``` is a string to represent the stop condition, its string literal in the format of \" \" (e.g. \"accuracy >= 80\")\n", "\n", "we need to parse this condition so we can compare. To parse this, we leverage FLARE's math_utils\n", - "```\n", + "\n", + "```python\n", "\n", "math_utils.parse_compare_criteria(compare_expr: Optional[str] = None) -> Tuple[str, float, Callable]\n", "\n", "```\n", + "\n", "the return will be\n", "* key,\n", "* target_value,\n", @@ -163,16 +166,17 @@ "source": [ "#### Integrate the early stop condition\n", "\n", - "This should simple, if the condition is satified and simply break out the for-loop\n", + "This should simple, if the condition is satisfied and simply break out the for-loop\n", "\n", - "```\n", + "```python\n", " if self.should_stop(model.metrics, self.stop_condition):\n", " break\n", "```\n", "\n", "and the ```should_stop``` function is defined as followings\n", "\n", - "```\n", + "```python\n", + "\n", "def should_stop(self, metrics: Optional[Dict] = None, stop_condition: Optional[str] = None):\n", " key, target, op_fn = stop_condition\n", " value = metrics.get(key, None)\n", @@ -205,9 +209,10 @@ "source": [ "### Select best model \n", "\n", - "we simply write the following two functions and put into previus code\n", + "we simply write the following two functions and put into previous code\n", + "\n", + "```python\n", "\n", - "```\n", " def select_best_model(self, curr_model: FLModel):\n", " if self.best_model is None:\n", " self.best_model = curr_model\n", @@ -246,7 +251,7 @@ "source": [ "### Customized save and load model functions\n", " \n", - "The ```BaseFedAvg``` class defined ```save_model()``` and ```load_model()``` functions for user to overwrite. \n", + "The ```BaseFedAvg``` class defined ```save_model()``` and ```load_model()``` functions for user to override. \n", "We use torch save and load functions, and save the FLModel metadata separately with the fobs.dumpf and fobs.loadf serialization utilities.\n", "\n", "\n", @@ -313,7 +318,8 @@ "\n", "### Create Fed Job\n", "\n", - "```\n", + "```python\n", + "\n", " n_clients = 5\n", " num_rounds = 2\n", "\n", @@ -397,14 +403,6 @@ "source": [ "! python3 fl_job.py" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e096501e", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/data/download.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/data/download.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/data/download.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/data/download.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/fl_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/fl_job.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/fl_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/fl_job.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/client.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/client.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/client.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/client.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/fedavg.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/fedavg.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/fedavg.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/fedavg.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/fl_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/fl_job.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/fl_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/fl_job.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/network.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/network.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/code/src/network.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/code/src/network.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/customize_client_training.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/customize_client_training.ipynb similarity index 79% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/customize_client_training.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/customize_client_training.ipynb index 56f1a33a89..c4b2ce6c29 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_customize_client_training/customize_client_training.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.4_client_side_customization/customize_client_training.ipynb @@ -1,24 +1,19 @@ { "cells": [ - { - "cell_type": "markdown", - "id": "38561a0b-a072-41ea-b027-290402cf4582", - "metadata": {}, - "source": [ - "# Customize client training scripts for different sites\n" - ] - }, { "cell_type": "markdown", "id": "3f020f8b", "metadata": {}, "source": [ - "The client training script, so far, assume all sides have the same training parameters. In the real-world applications, each site's data will be different, therefore the training parameters such batch size and learning rate will be different.\n", + "# Customize client training scripts for different sites\n", "\n", + "The client training script, so far, assumes all sites have the same training parameters. In real-world applications, each site's data will be different, therefore the training parameters such as batch size and learning rate will be different.\n", "\n", - "In this section, we will show to set different parameters \n", + "In this section, we will show how to set different parameters.\n", + "\n", + "\n", + "```python\n", "\n", - "```\n", " # Add clients\n", "\n", " executor_1 = ScriptRunner(script=train_script, script_args=\"--learning_rate 0.01 --batch_size 12\")\n", @@ -31,10 +26,10 @@ " job.to(executor_3, \"site-3\")\n", "\n", " executor_4 = ScriptRunner(script=train_script, script_args=\"--learning_rate 0.001 --batch_size 6\")\n", - " job.to(executor_3, \"site-4\")\n", + " job.to(executor_4, \"site-4\")\n", " \n", " executor_5 = ScriptRunner(script=train_script, script_args=\"--learning_rate 0.0001 --batch_size 4\")\n", - " job.to(executor_3, \"site-5\")\n", + " job.to(executor_5, \"site-5\")\n", "\n", "```\n", "\n", diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.1_experiment_tracking_with_tensorboard/experiment_tracking_tensorboard.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.1_experiment_tracking_with_tensorboard/experiment_tracking_tensorboard.ipynb index b22d5e90f2..2ea3c3d23b 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.1_experiment_tracking_with_tensorboard/experiment_tracking_tensorboard.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.1_experiment_tracking_with_tensorboard/experiment_tracking_tensorboard.ipynb @@ -7,11 +7,12 @@ "source": [ "# Experiment tracking with TensorBoard\n", "\n", - "NVFlare uses `TBAnalyticsReceiver` for experiment tracking on the FL server by default, allowing for .\n", + "NVFlare uses `TBAnalyticsReceiver` for experiment tracking on the FL server by default, enabling experiment tracking.\n", "\n", "## Default in FedAvgJob\n", "\n", - "The FedJob API makes it easy to create job congifurations, and by default the `TBAnalyticsReceiver` for TensorBoard streaming is included. You can specify your own analytics_receiver of type `AnalyticsReceiver` as a parameter if you want, but if left unspecified, `TBAnalyticsReceiver` is configured to be set up in `BaseFedJob` (nvflare/app_opt/pt/job_config/base_fed_job.py). \n", + "The FedJob API makes it easy to create job configurations, and by default the `TBAnalyticsReceiver` for TensorBoard streaming is included. You can specify your own analytics_receiver of type `AnalyticsReceiver` as a parameter if you want, but if left unspecified, `TBAnalyticsReceiver` is configured to be set up in `BaseFedJob` (nvflare/app_opt/pt/job_config/base_fed_job.py).\n", + "\n", "\n", "The `TBAnalyticsReceiver` for TensorBoard streaming receives and records the logs during the experiment by saving them to Tensoboard event files on the FL server. See [this link](https://nvflare.readthedocs.io/en/main/programming_guide/experiment_tracking/experiment_tracking_log_writer.html#tools-sender-logwriter-and-receivers) for more details on the other available AnalyticsReceivers in NVFlare: MLflowReceiver and WandBReceiver." ] @@ -152,7 +153,9 @@ "source": [ "## View tensorboard results\n", "\n", - "In order to see the results, you can use the following command directed to the location of the tensorboard event files (by default the location for the server should be as follows using the default simulator path provided):\n", + "\n", + "In order to see the results, you can use the following command directed to the location of the TensorBoard event files (by default, the location for the server should be as follows using the default simulator path provided):\n", + "\n", "\n", "```commandline\n", "tensorboard --logdir=/tmp/nvflare/jobs/workdir/server/simulate_job/tb_events\n", @@ -164,7 +167,8 @@ "id": "bdd0eb76", "metadata": {}, "source": [ - "Now, we know how experiment tracking can be achieved through metric logging and can be configured to work in a job with an `AnalyticsReceiver`. With this mechanism, we can stream various types of metric data.\n", + "Now we know how experiment tracking can be achieved through metric logging and can be configured to work in a job with an `AnalyticsReceiver`. With this mechanism, we can stream various types of metric data.\n", + "\n", "\n", "For how to use `MLflowReceiver` to set up experiment tracking for MLflow, see [Experiment Tracking with MLflow](../01.5.2_experiment_tracking_with_mlflow/experiment_tracking_mlflow.ipynb)." ] diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.2_experiment_tracking_with_mlflow/experiment_tracking_mlflow.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.2_experiment_tracking_with_mlflow/experiment_tracking_mlflow.ipynb index 9e26e8b38f..b98d0b6a73 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.2_experiment_tracking_with_mlflow/experiment_tracking_mlflow.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/01.5.2_experiment_tracking_with_mlflow/experiment_tracking_mlflow.ipynb @@ -171,7 +171,7 @@ "id": "aec950ee", "metadata": {}, "source": [ - "The num_rounds for this job also 20 for more data for a better looking graph. Note that even though [this job](code/src/client_mlflow.py) uses `MLflowWriter`, if we used the [client code](code/src/client.py) with `SummaryWriter`, the resulting data logged to MLflow would be the same since behind the scenes, there is conversion that occurs to translate the event with the log with SummaryWriter to be the equivalent for MLflow." + "The num_rounds for this job is also 20 for more data for a better looking graph. Note that even though [this job](code/src/client_mlflow.py) uses `MLflowWriter`, if we used the [client code](code/src/client.py) with `SummaryWriter`, the resulting data logged to MLflow would be the same since, behind the scenes, there is conversion that occurs to translate the event with the log with SummaryWriter to be the equivalent for MLflow." ] }, { @@ -195,7 +195,7 @@ "id": "bdd0eb76", "metadata": {}, "source": [ - "Now, we know how experiment tracking can be achieved through metric logging and can different types of `AnalyticsReceiver` can be configured to work in a job. With this mechanism, we can stream various types of metric data.\n", + "Now we know how experiment tracking can be achieved through metric logging and how different types of `AnalyticsReceiver` can be configured to work in a job. With this mechanism, we can stream various types of metric data.\n", "\n", "To continue, please see [Understanding FLARE federated learning Job structure](../../01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb)." ] diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/experiment_tracking.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/experiment_tracking.ipynb index e4a865a3b0..bf54d7a70d 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/experiment_tracking.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.5_experiment_tracking/experiment_tracking.ipynb @@ -15,14 +15,14 @@ "\n", "In a federated computing setting, data is distributed across multiple devices or systems, and training is run on each device independently while preserving each client’s data privacy.\n", "\n", - "Assuming a federated system consisting of one server and many clients and the server coordinating the ML training of clients, we can interact with ML experiment tracking tools in two different ways:\n", + "There are two ways to interact with ML experiment tracking tools:\n", "\n", - "![experiment_tracking](img/metrics-streaming-fl-server-clients.png)\n", + "\"experiment_tracking\"\n", "\n", - "- Decentralized tracking (client-side experiment tracking): Each client will directly send the log metrics/parameters to the ML experiment tracking server (like MLflow or Weights and Biases) or local file system (like tensorboard)\n", - "- Centralized tracking (aggregated experiment trackin): Clients will send the log metrics/parameters to the FL server, and the FL server will send the metrics to ML experiment tracking server or local file system\n", + "- Decentralized tracking (client-side experiment tracking): Each client directly sends the log metrics/parameters to the ML experiment tracking server (like MLflow or Weights and Biases) or local file system (like TensorBoard).\n", + "- Centralized tracking (aggregated experiment tracking): Clients send the log metrics/parameters to the FL server, and the FL server sends the metrics to the ML experiment tracking server or local file system.\n", "\n", - "The NVIDIA FLARE job configuration enables you to choose the tracking scenario or system that best fits your needs. When users need to migrate from one experiment tracking system to another, using NVIDIA FLARE, you can modify the job configuration without re-writing the experiment tracking code." + "The NVIDIA FLARE job configuration enables you to choose the tracking scenario or system that best fits your needs. When users need to migrate from one experiment tracking system to another using NVIDIA FLARE, you can modify the job configuration without rewriting the experiment tracking code.\n" ] }, { @@ -30,7 +30,7 @@ "id": "47399ea6", "metadata": {}, "source": [ - "The `nvflare.client.tracking` API enables you to flexibly redirect your logging metrics to any destination. The use of MLflow, Weights & Biases, or TensorBoard syntax does not matter here as you can stream the collected metrics to any supported experiment tracking system. Choosing to use MLflowWriter, WandBWriter, or TBWriter is based on your existing code and requirements.\n", + "The `nvflare.client.tracking` API enables you to flexibly redirect your logging metrics to any destination. The syntax you use (MLflow, Weights & Biases, or TensorBoard) doesn't matter, as you can stream the collected metrics to any supported experiment tracking system. The choice between MLflowWriter, WandBWriter, or TBWriter depends on your existing code and requirements.\n", "\n", "- MLflowWriter uses the MLflow API operation log_metric.\n", "- TBWriter uses the TensorBoard SummaryWriter operation add_scalar.\n", diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/understanding_fl_job.ipynb similarity index 90% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/understanding_fl_job.ipynb index ae93a347f5..e013a4bc10 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/understanding_fl_job.ipynb @@ -13,17 +13,16 @@ "id": "ab47f2c5", "metadata": {}, "source": [ - "## What is NVFlare Job ? \n", + " ## What is an NVFlare Job?\n", "\n", - "\n", - "NVFlare Job refers to a job configuration used within the NVIDIA FLARE framework. \n", + "NVFlare Job refers to a job configuration used within the NVIDIA FLARE framework.\n", "\n", "In NVFlare, a job is a unit of work that defines the specific tasks to be executed during a federated learning process. It encapsulates all necessary configurations, scripts, and resources needed to run an FL task, such as training, validation, or evaluation, across multiple participants in a federated system.\n", "\n", - "A job may have many apps. Each app consists code specific for the site (client site or server site) as well as configurations. \n", + "A job may have many apps. Each app consists of code specific for the site (client site or server site) as well as configurations.\n", "\n", + "In this section, we will take a look at the Job structure as well as the Job API (aka job construction API).\n", "\n", - "In this section, we will take a look at the Job structure as well as Job API ( akak job construction API). \n", "\n", "## Job creation API\n", "\n", @@ -183,7 +182,8 @@ "id": "f475fa49", "metadata": {}, "source": [ - "The job name \"FedAvg\" is folder structure, with each folder representing one app at one site. \n", + "The job name \"FedAvg\" is a folder structure, with each folder representing one app at one site.\n", + "\n", "\n", "* **\"app_server\"**: is the name for the server app\n", "\n", @@ -199,7 +199,7 @@ "\n", "* meta.json gives additional information related to the each app's deployment. \n", "\n", - "```\n", + "```json\n", "{\n", " \"name\": \"fedavg\",\n", " \"resource_spec\": {},\n", @@ -235,7 +235,8 @@ "source": [ "A simplifed format of job structure can also be used when the client code and configuration is the same for all sites\n", "\n", - "```\n", + "```shell\n", + "\n", "/tmp/nvflare/jobs/job_config/fedavg\n", "├── app_server\n", "│ ├── config\n", @@ -258,7 +259,7 @@ "meta.json needs to be \n", "\n", "\n", - "```\n", + "```json\n", "{\n", " \"name\": \"fedavg\",\n", " \"resource_spec\": {},\n", @@ -277,7 +278,7 @@ "\n", "If we don't mind deploy all code to all sites, we can change the job config into the followings\n", "\n", - "A simplifed format of job structure can also be used when the client code and configuration is the same for all sites\n", + " A simplified format of job structure can also be used when the client code and configuration are the same for all sites\n", "\n", "```\n", "/tmp/nvflare/jobs/job_config/fedavg\n", @@ -297,7 +298,7 @@ "meta.json needs to be \n", "\n", "\n", - "```\n", + "```json\n", "{\n", " \"name\": \"fedavg\",\n", " \"resource_spec\": {},\n", @@ -317,9 +318,10 @@ "source": [ "## Job Configuration\n", "\n", - "We have convered a lot of ground so far. You could stop here, and move to the next chapter of the training materials. \n", "\n", - "But if you like to futher understand how NVIDIA FLARE works, you might want to go through this section: Job Configuration. \n" + "We have covered a lot of ground so far. You could stop here and move to the next chapter of the training materials.\n", + "\n", + "But if you would like to further understand how NVIDIA FLARE works, you might want to go through this section: Job Configuration.\n" ] }, { @@ -379,7 +381,7 @@ "id": "a75c80c4", "metadata": {}, "source": [ - "The server configuration is a json file descripe the workflows. In our case, we defined one workflow, whci has a controller using our defined FedAvg class. \n", + "The server configuration is a JSON file describing the workflows. In our case, we defined one workflow, which has a controller using our defined FedAvg class.\n", "\n", "\n", ">Note: The configuration pattern is like the followings\n", @@ -417,8 +419,7 @@ "id": "d9753aeb", "metadata": {}, "source": [ - "the configuration is simular, it defines an array of \"executors\", a builtin ```PTInProcessClientAPIExecutor``` is used, \n", - "which takes the training script client.py and its corresponding arguments as input. \n", + "The configuration is similar; it defines an array of \"executors\". A built-in `PTInProcessClientAPIExecutor` is used, which takes the training script client.py and its corresponding arguments as input. \n", "\n", "\n", "```\n", @@ -472,7 +473,7 @@ "id": "e8914e76", "metadata": {}, "source": [ - "Hope you have a good standing of working with NVIDIA FLARE job so far. Let's move on to other chapters. " + "Hope you now have a good understanding of working with NVIDIA FLARE jobs. Let's move on to other chapters." ] } ], diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_logging/logging.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_logging/logging.ipynb new file mode 100644 index 0000000000..d32425bda3 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_logging/logging.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NVIDIA FLARE Logging\n", + "\n", + "Before we finish chapter one, we would like to discuss logging. This will help us with debugging in the following chapters.\n", + "\n", + "The detailed logging configuration can be found in the [NVFlare Documentation](https://nvflare.readthedocs.io/en/main/user_guide/configurations/logging_configuration.html)\n", + "\n", + "as well as in the [NVFlare Logging Tutorial](https://github.com/NVIDIA/NVFlare/blob/main/examples/tutorials/logging.ipynb)\n", + "\n", + "Here are few key features of the logging in NVFlare:\n", + "\n", + "## Structured logging:\n", + "\n", + "When defining new loggers, we provide several functions to help adhere to the FLARE package logger hierarchy. For example, say we have the following module at my_package.my_module:\n", + "\n", + "get_obj_logger for classes. Ex:\n", + "\n", + "```python\n", + "\n", + " class MyClass:\n", + " def __init__(self):\n", + " self.logger = get_obj_logger(self) # my_package.my_module.MyClass\n", + "```\n", + "\n", + "get_script_logger for scripts (if not in a package, default to custom.). Ex:\n", + "\n", + "```python\n", + " if __name__ == \"__main__\":\n", + " logger = get_script_logger() # my_package.my_module\n", + "``` \n", + "get_module_logger for modules. Ex:\n", + "\n", + "```python\n", + " def my_function():\n", + " logger = get_module_logger(name=\"my_function\") # my_package.my_module.my_function\n", + "```\n", + "\n", + "If you use these functions to create your loggers, you will have a better hierarchy and the logging configuration can be configured in a structured way.\n", + "\n", + "For example, you can enable a module logging level, which can define all the sub-modules' logging levels if not defined.\n", + "\n", + "## Multiple logging formats:\n", + "\n", + "NVFlare supports and creates multiple logging formats, including JSON and txt formats. The JSON format is more useful for integrating with monitoring systems.\n", + "\n", + "log.txt:\n", + "The logFileHandler uses the baseFormatter to write all logs to log.txt. This is the default log that we see in the console.\n", + "\n", + "log.json:\n", + "The jsonFileHandler uses the jsonFormatter to write JSON formatted logs to log.json. This is useful for leveraging structured logs (i.e., with a 3rd party observability package).\n", + "\n", + "log_error.txt:\n", + "The errorFileHandler uses the baseFormatter and level \"ERROR\" to write error level logs to log_error.txt. This allows users to easily see when errors are logged.\n", + "\n", + "log_fl.txt:\n", + "The FLFileHandler uses the baseFormatter and FLFilter (uses LoggerNameFilter allowing certain logger names) to write FL training and custom logs to log_fl.txt. This removes the system and communication related logs and clearly shows logs related to FL training.\n", + "\n", + "## Logging mode for simulation\n", + "\n", + "We define a few special log configurations for simulation. This will reduce the amount of log information seen by data scientists, so they can focus on the training logs.\n", + "\n", + "The three logging modes are:\n", + "\n", + "* **concise**: filters out server and client process logs, only contains the application logs\n", + "* **full**: is the full log\n", + "* **verbose**: is the debug level of full log\n", + "\n", + "The simulator defaults to ```concise``` mode, which is the most useful for data scientists to see the training logs.\n", + "\n", + "\n", + "## Dynamic Logging Configuration Commands\n", + "\n", + "\n", + "When running the FLARE system (POC mode or production mode), in many cases, we need to change the logging level or configuration dynamically without stopping the system. Dynamic logging configuration provides these capabilities.\n", + "\n", + "There are two sets of logs: the site logs and job logs. The current site log configuration will be used for the site logs as well as the log configuration of any new job started on that site. \n", + " \n", + "We provide two admin commands to enable users to dynamically configure the site or job level logging when running the FLARE system. Note these command effects will last until reconfiguration or as long as the corresponding site or job is running. However these commands do not overwrite the log configuration file in the workspace. The previous the log configuration file can be reloaded using “reload”.\n", + "\n", + " \n", + "\n", + "here are more examples: \n", + "\n", + "```python\n", + "\n", + "configure_site_log server debug\n", + "configure_site_log client site-1 debug\n", + "configure_site_log all info\n", + "\n", + "configure_job_log server debug\n", + "configure_job_log client site-1 debug\n", + "configure_job_log all info\n", + "configure_job_log all //custom_log_config.json\n", + "```\n", + "\n", + "The ```configure_site_log``` is the FLARE Console command used to configure the site log configuration. \n", + "The ```configure_job_log``` is the FLARE Console command used to configure job log configuration. \n", + "\n", + "\n", + "\n", + "## Customizing logging\n", + "You can always customize logging by adding or removing filters, formats and profile your own logging configuration for simulation, job and system. We are not going to cover this in this tutorial.\n", + "\n", + "## FLARE Job Simulator Run Logging\n", + "\n", + "Since the Flare Job API uses the simulator to run, it defaults to concise mode. If you want to use different log configure, you can use the following command:\n", + "\n", + "\n", + "```python\n", + "\n", + "job.simulator_run(job_config_dir, log_config=\"full\")\n", + "job.simulator_run(job_config_dir, log_config=\"verbose\")\n", + "job.simulator_run(job_config_dir, log_config=\"concise\")\n", + "job.simulator_run(job_config_dir, log_config=\"/path/to/log_config.json)\n", + "\n", + "```\n", + "\n", + "Now that we have briefly introduced the logging configuration, let's wrap up this chapter: [wrap up](../01.8_wrap_up/wrap_up.ipynb) \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_recap/recap.ipynb deleted file mode 100644 index 640b47c170..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.7_recap/recap.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "7b152728-3366-4432-adb1-29aa3051dc22", - "metadata": {}, - "source": [ - "# Summary of Chapter 1\n", - "\n", - "We cover a lot of materials in Chapter 1. We guide you through the process of running federated learning applications. Here is an overview of the key contents:\n", - "\n", - "1. **Running Federated Learning Job**\n", - " - **Installation and Data Preparation**: Instructions for setting up the environment and preparing the data.\n", - " - [setup.ipynb](../01.1_running_federated_learning_job/setup.ipynb)\n", - " - **Training Classifier with PyTorch**: Steps to train a classifier using PyTorch in a federated learning setup.\n", - " - [runing_pytorch_fl_job.ipynb](../01.1_running_federated_learning_job/runing_pytorch_fl_job.ipynb)\n", - "\n", - "2. **From Stand-Alone Deep Learning to Federated Learning**\n", - " - **Conversion to Federated Learning**: Guide on converting deep learning models with PyTorch to federated learning.\n", - " - [convert_dl_to_fl.ipynb](../01.2_convert_deep_learning_to_federated_learning/convert_dl_to_fl.ipynb)\n", - "\n", - "3. **Customizing the Federated Algorithms**\n", - " - **Server Logic Customization**: Techniques to customize server logic for specific federated learning needs, we built an our own fed avg algorithms with best model seleciton, model saving and loading, as well as early stopping. \n", - " - [customize_server_logics.ipynb](../01.3_customize_server_logics/customize_server_logics.ipynb)\n", - "\n", - "4. **Adjusting Training Parameters**\n", - " - **Client Logic Customization**: Methods to customize client logic to optimize training parameters. Here we show how to customize the training for each site. \n", - " - [customize_client_training.ipynb](../01.4_customize_client_training/customize_client_training.ipynb)\n", - "\n", - "5. **Tracking Training Metrics**\n", - " - **Experiment Tracking**: Tools and methods to track experiments and monitor training metrics effectively.\n", - " - [experiment_tracking.ipynb](../01.5_experiment_tracking/experiment_tracking.ipynb)\n", - "\n", - "6. **Job Structure and Configurations**\n", - " - **Understanding Job Structure and Configuration**: Detailed explanation of the job structure and configurations necessary for running federated learning jobs.\n", - " - [01.1.6.1_understanding_fl_job.ipynb](../01.6_job_structure_and_configuration/01.1.6.1_understanding_fl_job.ipynb)\n", - "\n", - "7. **Recap of Covered Topics**\n", - " - **Summary and Recap**: A recap of the topics covered in the previous sections.\n", - " - [recap.ipynb](../01.7_recap/recap.ipynb)\n", - "\n", - "Each section is designed to provide comprehensive guidance and practical examples to help you implement and customize federated learning in your applications. For detailed instructions and examples, refer to the respective notebooks linked in each section.\n", - "\n", - "\n", - "Now let's move on to the [Chapter 2](../../chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "4f2e3cb3-e61f-45e9-8dad-ad55ebb3641a", - "metadata": {}, - "source": [ - " \n", - "\n", - "\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "nvflare_example", - "language": "python", - "name": "nvflare_example" - }, - "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.10.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.8_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.8_recap/recap.ipynb new file mode 100644 index 0000000000..0eb75a8a34 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-1_running_federated_learning_applications/01.8_recap/recap.ipynb @@ -0,0 +1,70 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7b152728-3366-4432-adb1-29aa3051dc22", + "metadata": {}, + "source": [ + "# Recap: Chapter 1 Summary\n", + "\n", + "Throughout this chapter, we've learned several crucial concepts and practical skills in federated learning. Here are the essential takeaways:\n", + "\n", + "1. **Federated Learning Fundamentals**\n", + " - FL enables collaborative model training while keeping data at source\n", + " - Basic FL workflow: client training → model aggregation → model broadcast → repeat\n", + " - NVIDIA FLARE provides a robust framework for implementing FL systems\n", + "\n", + "2. **Converting Traditional to Federated Learning**\n", + " - Most PyTorch models can be adapted for federated learning\n", + " - Key modifications needed:\n", + " - Separating training logic from model loading. The model can be received and sent back to the server, while keeping the training logic mostly the same.\n", + "\n", + "3. **Customization Capabilities**\n", + " - Server-side customization:\n", + " - Implementing custom aggregation strategies\n", + " - Model selection and persistence\n", + " - Early stopping mechanisms\n", + " - Client-side customization:\n", + " - Local training optimization\n", + " - Site-specific parameters\n", + " - Custom data handling\n", + "\n", + "These fundamentals prepare you for more advanced FL concepts and implementations in the following chapters.\n", + "\n", + "Now let's move on to [Chapter 2](../../chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "4f2e3cb3-e61f-45e9-8dad-ad55ebb3641a", + "metadata": {}, + "source": [ + " \n", + "\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nvflare_example", + "language": "python", + "name": "nvflare_example" + }, + "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.10.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb index 85352f1462..bcd503a12b 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.0_introduction/introduction.ipynb @@ -5,36 +5,64 @@ "id": "ed32af6f", "metadata": {}, "source": [ - "# Introduction: Develop Federated Learning Applications\n", + "# Develop Federated Learning Applications\n", "\n", - "In this chapter, we will explore the process of developing federated learning applications. We will start by exploring federated statistics and getting different visualizations from the data. We will then convert PyTorch Lightning code for use with NVFlare. We will then examine machine learning algorithms and look at how to convert logistics regression, kmeans, and survival analysis for use with federated learning. Finally, we will look into the Client API and conclude with a recap of the covered topics.\n", + "In this chapter, we will explore the process of developing federated learning applications. \n", + "We will cover the following topics:\n", "\n", + "* Federated Analytics\n", + " * Discover the federated statistics of local and global data\n", + " * Visualize the federated statistics\n", + "\n", + "* Convert deep learning code to Federated Learning code\n", + "\n", + " We already covered converting PyTorch code to Federated Learning code in the previous chapter. Now we will cover: \n", + " * Converting PyTorch Lightning code to Federated Learning code\n", + " * Converting TensorFlow code to Federated Learning code\n", + " \n", + "\n", + "* Convert machine learning code to Federated Learning code\n", + " * Convert logistic regression to Federated Learning code\n", + " * Convert k-means to Federated Learning code\n", + " * Convert survival analysis to Federated Learning code\n", + "\n", + "* Client API\n", + " Converting ML/DL to federated learning leverages the client API to interact with the federated learning system. We will explore the client API in detail in this chapter.\n", + " \n", "\n", "2.1. **Federated Statistics**\n", - " * [Federated Statistics with image data](../02.1_federated_statistics/0federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb)\n", + "\n", " * [Federated Statistics with tabular data](../02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb)\n", "\n", - "2.2. **Convert PyTorch Lightning to Federated Learning**\n", + " * [Federated Statistics with image data](../02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb)\n", "\n", - " * [Convert Torch Lightning to FL](../02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb)\n", + "2.2. **Introduction to Client API** \n", "\n", + " * [Client API](../02.2_client_api/client_api.ipynb)\n", "\n", - "2.3. **How to Convert Machine Learning Algorithms to Federated Algorithms**\n", + "2.3. **Convert PyTorch Lightning to Federated Learning**\n", "\n", - " * [Convert Logistics Regression to federated learning](../02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_Logistics_regression_to_federated_learning/convert_lr_to_fl.ipynb)\n", - " * [Convert KMeans to federated learning](../02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", - " * [Convert Survival Analysis to federated learning](../02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)\n", + " * [Convert PyTorch Lightning to Federated Learning](../02.3_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb)\n", "\n", - "2.4. **Client API** \n", + "2.4. **Convert Machine Learning to Federated Learning**\n", "\n", - " * [NVFlare Client API](../02.4_client_api/Client_api.ipynb)\n", + " * [Convert Logistic Regression to Federated Learning](../02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb)\n", "\n", - "2.5. [Recap of the covered topics](../02.5_recap/recap.ipynb)\n", + " * [Convert K-means to Federated Learning](../02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", "\n", + " * [Convert Survival Analysis to Federated Learning](../02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)\n", + "\n", + "2.5. [Recap of the covered topics](../02.5_recap/recap.ipynb)\n", "\n", "\n", - "Let's get started with [Federated Statistics](../02.1_federated_statistics/0federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb)\n" + "Let's get started with [Federated Statistics](../02.1_federated_statistics/federated_statistics_introduction.ipynb)" ] + }, + { + "cell_type": "markdown", + "id": "abde95b6", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_introduction.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_introduction.ipynb index 5fcc41dfed..ad2066eb2f 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_introduction.ipynb @@ -4,18 +4,227 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Federated Statistics Introduction\n", + "# Federated Statistics\n", "\n", - "In a federated learning setting, because data is private at each site and we need to ensure data privacy, there are many considerations to take into account when trying to gather statistics on the data. We provide two examples, one for image data and one for tabular data:\n", + "Before training the model, data scientists need to understand the data distribution and data quality of the data at different sites. As we can't access the raw data, we need to perform federated Analytics to get the statistics of the data at global level. That's where Federated Statistics comes in.\n", "\n", - " * [Federated Statistics with image data](./federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb) shows how to compute local and global image statistics with the consideration that data is private at each of the client sites.\n", - " * [Federated Statistics with tabular data](./federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb) demonstrates how to create federated statistics for data that can be represented as Pandas DataFrames." + "\n", + "## Objective\n", + "NVIDIA FLARE will provide built-in federated statistics operators (controllers and executors) that \n", + "can generate global statistics based on local client side statistics.\n", + "\n", + "At each client site, we could have one or more datasets (such as \"train\" and \"test\" datasets); each dataset may have many \n", + "features. For each feature in the dataset, we will calculate the statistics and then combine them to produce \n", + "global statistics for all the numeric features. The output would be complete statistics for all datasets in clients and global. \n", + "\n", + "The statistics here are commonly used statistics: count, sum, mean, std_dev and histogram for the numerical features.\n", + "The max, min are not included as it might violate the client's data privacy. The mean will be calculated with count and sum. \n", + "\n", + "The quantile can also be included, but requires additional dependency to be installed. We are not going to include it in the default installation.\n", + "\n", + "\n", + "A client will only need to implement the selected methods of \"Statistics\" class from statistics_spec.\n", + "\n", + "The result will be statistics for all features of all datasets at all sites as well as global aggregates. \n", + "The result could be visualized via the visualization utility in the notebook. \n", + "\n", + "\n", + "## Assumptions\n", + " \n", + "Assume that clients will provide the following: \n", + " * users need to provide target statistics such as count, histogram etc. of targeted statistics features\n", + " * users need to provide the local statistics for the **target statistics** (by implementing the statistic_spec), not all statistics. For example, if the target statistics does not include histogram, then users will not need to provide the histogram calculation function.\n", + " * users need to provide the datasets and dataset features (feature name, data type)\n", + " * Note: count is always required as we use count to enforce data privacy policy\n", + " \n", + "We only support **numerical features**, not categorical features. But users can return all types of features;\n", + "the non-numerical features will be removed.\n", + "\n", + "\n", + "\n", + "## Statistics\n", + "\n", + " Federated statistics includes numerics statistics measures for \n", + " * count\n", + " * mean \n", + " * sum\n", + " * std_dev\n", + " * histogram \n", + " * quantile\n", + " \n", + " We did not include min, max value to avoid data privacy concern. \n", + "\n", + "\n", + "#### Quantile\n", + "\n", + "Quantile statistics refers to statistical measures that divide a probability distribution or dataset into intervals with equal probabilities or proportions. Quantiles help summarize the distribution of data by providing key points that indicate how values are spread.\n", + "\n", + "##### Key Quantiles:\n", + "1. Median (50th percentile): The middle value of a dataset, dividing it into two equal halves.\n", + "2. Quartiles (25th, 50th, 75th percentiles): Divide the data into four equal parts:\n", + "* Q1 (25th percentile): Lower quartile, below which 25% of the data falls.\n", + "* Q2 (50th percentile): Median.\n", + "* Q3 (75th percentile): Upper quartile, below which 75% of the data falls.\n", + "3. Deciles (10th, 20th, ..., 90th percentiles): Divide the data into ten equal parts.\n", + "4. Percentiles (1st, 2nd, ..., 99th): Divide the data into 100 equal parts.\n", + "\n", + "##### Usage of Quantiles:\n", + "* Descriptive Statistics: Summarizes the spread of data.\n", + "* Outlier Detection: Helps identify extreme values.\n", + "* Machine Learning: Used in feature engineering, normalization, and decision tree algorithms.\n", + "* Risk Analysis: Used in finance (e.g., Value at Risk, VaR).\n", + "\n", + " \n", + "## Privacy Policy and Privacy Filters\n", + "\n", + "NVFLARE provide data privacy protection through privacy filters [privacy-management](https://nvflare.readthedocs.io/en/main/user_guide/security/site_policy_management.html#privacy-management)\n", + "Each site can have its own privacy policy. \n", + "\n", + "### Local privacy policy\n", + "\n", + "privacy.json provides local site specific privacy policy.\n", + "The policy is likely setup by the company and implemented by organization admin\n", + "for the project. For different type of scope or categories, there are might be different types of policies. \n", + "\n", + "### Privacy configuration\n", + "\n", + "The NVFLARE privacy configuration consists of set of task data filters and task result filters\n", + "* The task data filter applies before client executor executes;\n", + "* The task result filter is applied after the client executor executes and before the data is sent to the server;\n", + "* Both the data filter and result filter are grouped by scope.\n", + "\n", + "Each job will need to have a privacy scope. If not specified, the default scope will be used. If default scope is not\n", + "defined and job doesn't specify the privacy scope, the job deployment will fail, and job will not executed\n", + "\n", + "### Privacy Policy Instrumentation \n", + "\n", + "There are different ways to set privacy filters depending on the use cases\n", + "\n", + "\n", + "#### Set Privacy Policy as researcher\n", + "\n", + "You can specify the \"task_result_filters\" in config_fed_client.json to specify\n", + "the privacy control. This is useful when you develop these filters\n", + "\n", + "#### Setup site privacy policy as org admin\n", + "\n", + "Once the company decides to instrument certain privacy policy independent of individual\n", + "job, one can copy the local directory privacy.json content to clients' local privacy.json ( merge not overwrite).\n", + "in this example, since we only has one app, we can simply copy the private.json from local directory to\n", + "\n", + "* site-1/local/privacy.json\n", + "* site-2/local/privacy.json\n", + "\n", + "We need to remove the same filters from the job definition in config_fed_client.json\n", + "by simply set the \"task_result_filters\" to empty list to avoid **double filtering**\n", + "```\n", + "\"task_result_filters\": []\n", + "```\n", + "#### Job filter vs filters in private.json\n", + "\n", + "Privacy filters are defined within a privacy scope.\n", + "If a job's privacy scope is defined or has default scope, then the scope's filters (if any) are applied\n", + "before the job-specified filters (if any). This rule is enforced during task execution time.\n", + "\n", + "With such rules, if we have both task result filters and privacy scoped filters, we need to understand\n", + "that the privacy filters will be applied first, then the job filters. The filters will be applied by their specified orders\n", + "\n", + "### Statistics Privacy Filters\n", + "Statistics privacy filters are task result filters. We already built one for Statistics. \n", + "\n", + "```\n", + "StatisticsPrivacyFilter\n", + "```\n", + "The StatisticsPrivacyFilter consists of several `StatisticsPrivacyCleanser`s focused on the statistics sent\n", + "from client to server.\n", + "\n", + "`StatisticsPrivacyCleanser` can be considered as an interceptor before the results delivered to server.\n", + "Currently, we use three `StatisticsPrivacyCleanser`s to guard the data privacy. The reason we built \n", + "`StatisticsPrivacyCleanser` instead of separate filters is to avoid repeated data de-serialization.\n", + "\n", + "#### MinCountCleanser:\n", + "Check against the number of count returned from client for each dataset and each feature.\n", + "\n", + "If the min_count is not satisfied, there is potential risk of reveal client's real data. Then remove that feature's statistics\n", + "from the result for this client.\n", + "\n", + "#### HistogramBinsCleanser:\n", + "For histogram calculations, number of bins can't be too large compare to count. if the bins = count, then\n", + "we also reveal the real data. This check to make sure that the number of bins be less than X percent of the count.\n", + "X = max_bins_percent in percentage, for 10 is for 10%\n", + "if the number of bins for the histogram is not satisfy this specified condition, the resulting histogram will be removed\n", + "from statistics before sending to server.\n", + "\n", + "#### AddNoiseToMinMax\n", + "For histogram calculations, if the feature's histogram bin's range is not specified, we will need to use local data's min\n", + "and max values to calculate the global min/max values, then use the global min, max values as the bin range for histogram\n", + "calculation. But send the server the local min, max values will reveal client's real data.\n", + "To protect data privacy, we add noise to the local min/max values.\n", + "\n", + "Min/max random is used to generate random noise between (min_noise_level and max_noise_level).\n", + "for example, the random noise is to be within (0.1 and 0.3),i.e. 10% to 30% level. These noise\n", + "will make local min values smaller than the true local min values, and max values larger than\n", + "the true local max values. As result, the estimate global max and min values (i.e. with noise)\n", + "are still bounded the true global min/max values, in such that\n", + "```\n", + "est. global min value <\n", + " true global min value <\n", + " client's min value <\n", + " client's max value <\n", + " true global max <\n", + " est. global max value\n", + "```" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Summary\n", + "\n", + "We provided federated statistics operators that can easily aggregate and visualize the local statistics for\n", + "different data site and features. We hope this feature will make it easier to perform federated data analysis. \n", + "\n", + "We provide several examples to demonstrate how should the operators be used. \n", + "\n", + "The main steps are \n", + "* provide server side configuration to specify target statistics and their configurations and output location\n", + "* implement the local statistics generator (statistics_spec)\n", + "* provide client side configuration to specify data input location\n", + " \n", + "\n", + "Now lets dive into the examples\n", + "\n", + "\n", + "* [Federated Statistics with tabular data](./federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb) demonstrates how to create federated statistics for data that can be represented as Pandas DataFrames.\n", + "* [Federated Statistics with image data](./federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb) shows how to compute local and global image statistics with the consideration that data is private at each of the client sites.\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { + "kernelspec": { + "display_name": "nvflare-env", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" } }, "nbformat": 4, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/download_and_unzip_data.sh b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/download_and_unzip_data.sh deleted file mode 100755 index a50bb1c504..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/download_and_unzip_data.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -DATASET_PATH="/tmp/nvflare/image_stats/data" - -if [ ! -d $DATASET_PATH ]; then - mkdir -p $DATASET_PATH -fi - -source_url="$1" -echo "download url = ${source_url}" -if [ -n "${source_url}" ]; then - if [ ! -f "${DATASET_PATH}/COVID-19_Radiography_Dataset.zip" ]; then - wget -O "${DATASET_PATH}/COVID-19_Radiography_Dataset.zip" "${source_url}" - else - echo "zip file exists." - fi - if [ ! -d "${DATASET_PATH}/COVID-19_Radiography_Dataset" ]; then - unzip -d $DATASET_PATH "${DATASET_PATH}/COVID-19_Radiography_Dataset.zip" - else - echo "image files exist." - fi -else - echo "empty URL, nothing downloaded, you need to provide real URL to download" -fi \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/prepare_data.sh b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/prepare_data.sh new file mode 100755 index 0000000000..c7f677ad3e --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/prepare_data.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +INPUT_DATASET_PATH="/tmp/nvflare/image_stats/data" +OUTPUT_DATASET_PATH="/tmp/nvflare/image_stats/data" + +python3 "${SCRIPT_DIR}"/utils/prepare_data.py --input_dir "${INPUT_DATASET_PATH}" --output_dir "${OUTPUT_DATASET_PATH}" \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/utils/prepare_data.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/utils/prepare_data.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/utils/prepare_data.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/data/utils/prepare_data.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/demo/visualization.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/demo/visualization.ipynb new file mode 100644 index 0000000000..965bda266e --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/demo/visualization.ipynb @@ -0,0 +1,258 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3f851980", + "metadata": {}, + "source": [ + "# NVFLARE Federated Statistics Visualization" + ] + }, + { + "cell_type": "markdown", + "id": "0b71dd55", + "metadata": {}, + "source": [ + "## Image Statistics Visualization\n", + "In this example, we demonstate how to visualize the results from the statistics of image data. The visualization requires json, pandas, matplotlib modules as well as nvflare visualization utlities. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "85f23acf", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "import json\n", + "import pandas as pd\n", + "from nvflare.app_opt.statistics.visualization.statistics_visualization import Visualization" + ] + }, + { + "cell_type": "markdown", + "id": "151e23a8", + "metadata": {}, + "source": [ + "First, copy the resulting json file to demo directory. In this example, resulting file is called image_statistics.json. Then load json file\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "44f6bed2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "with open('image_stats.json', 'r') as f:\n", + " data = json.load(f)" + ] + }, + { + "cell_type": "markdown", + "id": "c4b83ddb", + "metadata": {}, + "source": [ + "Initialize the Visualization utilities\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ab771712", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "vis = Visualization()\n" + ] + }, + { + "cell_type": "markdown", + "id": "49f976aa", + "metadata": {}, + "source": [ + "### Overall Statistics\n", + "vis.show_stats() will show the statistics for each features, at each site for each dataset\n", + "\n", + "vis.show_stats(data = data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20ea4dff", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "vis.show_stats(data = data)" + ] + }, + { + "cell_type": "markdown", + "id": "521cbf6f", + "metadata": {}, + "source": [ + "### select features statistics using white_list_features \n", + "user can optionally select only show specified features via white_list_features arguments. In these image files, we only have one feature" + ] + }, + { + "cell_type": "markdown", + "id": "9ab23bcc", + "metadata": {}, + "source": [ + "### Histogram Visualization\n", + "We can use vis.show_histograms() to visualize the histogram. Before we do that, we need set some iPython display setting to make sure the graph displayed in full cell. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bada64b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from IPython.display import display, HTML\n", + "display(HTML(\"\"))" + ] + }, + { + "cell_type": "markdown", + "id": "e415b49e", + "metadata": {}, + "source": [ + "The following command display histograms for numberic features. The result shows both main plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53542cf9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "vis.show_histograms(data = data, plot_type=\"main\")" + ] + }, + { + "cell_type": "markdown", + "id": "d8d537cc", + "metadata": {}, + "source": [ + "## Display Options\n", + "Similar to other statistics, we can use white_list_features to select only few features to display histograms. We can also use display_format=\"percent\" to allow all dataset and sites to be displayed in the same scale. User can set \n", + "\n", + "* display_format: \"percent\" or \"sample_count\"\n", + "* white_list_features: feature names\n", + "* plot_type : \"both\" or \"main\" or \"subplot\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "353db4d9", + "metadata": {}, + "source": [ + "#### show default display format with subplot\n", + "In the following, we display only feature \"Intensity\" in default display_format, with \"subplot\" plot_type" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f619729", + "metadata": {}, + "outputs": [], + "source": [ + "vis.show_histograms(data = data, plot_type=\"subplot\")" + ] + }, + { + "cell_type": "markdown", + "id": "fbf7fc73", + "metadata": {}, + "source": [ + "\n", + "#### show percent display format with default plot_type (main)\n", + "In the following, we display only feature \"Intensity\" in \"percent\" display_format, with default plot_type" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8655ad63", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "vis.show_histograms(data = data, display_format=\"percent\")" + ] + }, + { + "cell_type": "markdown", + "id": "48501d37", + "metadata": {}, + "source": [ + "back to [federated_statistics_with_image_data](../../federated_statistics_with_image_data.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd6f59f2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "918341b9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d86bd3e8", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nvflare_example", + "language": "python", + "name": "nvflare_example" + }, + "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.10.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/image_statistics.json b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/image_statistics.json deleted file mode 100644 index 45ba336e50..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/image_statistics.json +++ /dev/null @@ -1 +0,0 @@ -{"intensity": {"count": {"site-4": {"train": 1345}, "site-1": {"train": 3616}, "site-2": {"train": 6012}, "site-3": {"train": 10192}, "Global": {"train": 21165}}, "histogram": {"site-4": {"train": [[0.0, 1.0039, 7529944], [1.0039, 2.0078, 425108], [2.0078, 3.0118, 380736], [3.0118, 4.0157, 334702], [4.0157, 5.0196, 327862], [5.0196, 6.0235, 310277], [6.0235, 7.0275, 313290], [7.0275, 8.0314, 313654], [8.0314, 9.0353, 307805], [9.0353, 10.0392, 305356], [10.0392, 11.0431, 295868], [11.0431, 12.0471, 279067], [12.0471, 13.051, 270320], [13.051, 14.0549, 260414], [14.0549, 15.0588, 262861], [15.0588, 16.0627, 264740], [16.0627, 17.0667, 263759], [17.0667, 18.0706, 266840], [18.0706, 19.0745, 269593], [19.0745, 20.0784, 265030], [20.0784, 21.0824, 260416], [21.0824, 22.0863, 259147], [22.0863, 23.0902, 257797], [23.0902, 24.0941, 259564], [24.0941, 25.098, 259845], [25.098, 26.102, 256981], [26.102, 27.1059, 252589], [27.1059, 28.1098, 244041], [28.1098, 29.1137, 236778], [29.1137, 30.1176, 235530], [30.1176, 31.1216, 233887], [31.1216, 32.1255, 232690], [32.1255, 33.1294, 230496], [33.1294, 34.1333, 227944], [34.1333, 35.1373, 225518], [35.1373, 36.1412, 226460], [36.1412, 37.1451, 228242], [37.1451, 38.149, 230445], [38.149, 39.1529, 234045], [39.1529, 40.1569, 238784], [40.1569, 41.1608, 243710], [41.1608, 42.1647, 251529], [42.1647, 43.1686, 258775], [43.1686, 44.1726, 264193], [44.1726, 45.1765, 271677], [45.1765, 46.1804, 277858], [46.1804, 47.1843, 287293], [47.1843, 48.1882, 295818], [48.1882, 49.1922, 304070], [49.1922, 50.1961, 312974], [50.1961, 51.2, 323260], [51.2, 52.2039, 328831], [52.2039, 53.2078, 335326], [53.2078, 54.2118, 343748], [54.2118, 55.2157, 351160], [55.2157, 56.2196, 356396], [56.2196, 57.2235, 363184], [57.2235, 58.2275, 369794], [58.2275, 59.2314, 373595], [59.2314, 60.2353, 378877], [60.2353, 61.2392, 384616], [61.2392, 62.2431, 391297], [62.2431, 63.2471, 396375], [63.2471, 64.251, 398059], [64.251, 65.2549, 401636], [65.2549, 66.2588, 404846], [66.2588, 67.2627, 409274], [67.2627, 68.2667, 413504], [68.2667, 69.2706, 416709], [69.2706, 70.2745, 422904], [70.2745, 71.2784, 425087], [71.2784, 72.2824, 430026], [72.2824, 73.2863, 434464], [73.2863, 74.2902, 438169], [74.2902, 75.2941, 441835], [75.2941, 76.298, 447908], [76.298, 77.302, 454231], [77.302, 78.3059, 458792], [78.3059, 79.3098, 466910], [79.3098, 80.3137, 473704], [80.3137, 81.3176, 480384], [81.3176, 82.3216, 488587], [82.3216, 83.3255, 493441], [83.3255, 84.3294, 499632], [84.3294, 85.3333, 506173], [85.3333, 86.3373, 508150], [86.3373, 87.3412, 514601], [87.3412, 88.3451, 520894], [88.3451, 89.349, 523951], [89.349, 90.3529, 532177], [90.3529, 91.3569, 539180], [91.3569, 92.3608, 544994], [92.3608, 93.3647, 550783], [93.3647, 94.3686, 556833], [94.3686, 95.3726, 563344], [95.3726, 96.3765, 570413], [96.3765, 97.3804, 578149], [97.3804, 98.3843, 585887], [98.3843, 99.3882, 592452], [99.3882, 100.3922, 599573], [100.3922, 101.3961, 606518], [101.3961, 102.4, 612282], [102.4, 103.4039, 620579], [103.4039, 104.4078, 627741], [104.4078, 105.4118, 635267], [105.4118, 106.4157, 643762], [106.4157, 107.4196, 651374], [107.4196, 108.4235, 658375], [108.4235, 109.4275, 664897], [109.4275, 110.4314, 672678], [110.4314, 111.4353, 680048], [111.4353, 112.4392, 688321], [112.4392, 113.4431, 694140], [113.4431, 114.4471, 702296], [114.4471, 115.451, 710582], [115.451, 116.4549, 715170], [116.4549, 117.4588, 724991], [117.4588, 118.4627, 733420], [118.4627, 119.4667, 741582], [119.4667, 120.4706, 747743], [120.4706, 121.4745, 752486], [121.4745, 122.4784, 759045], [122.4784, 123.4824, 767290], [123.4824, 124.4863, 773984], [124.4863, 125.4902, 779475], [125.4902, 126.4941, 786162], [126.4941, 127.498, 791886], [127.498, 128.502, 798187], [128.502, 129.5059, 807763], [129.5059, 130.5098, 812860], [130.5098, 131.5137, 820695], [131.5137, 132.5177, 830039], [132.5177, 133.5216, 837940], [133.5216, 134.5255, 844831], [134.5255, 135.5294, 853935], [135.5294, 136.5333, 862363], [136.5333, 137.5373, 872252], [137.5373, 138.5412, 875083], [138.5412, 139.5451, 879200], [139.5451, 140.549, 886720], [140.549, 141.5529, 894372], [141.5529, 142.5569, 898412], [142.5569, 143.5608, 907203], [143.5608, 144.5647, 914686], [144.5647, 145.5686, 921733], [145.5686, 146.5726, 930211], [146.5726, 147.5765, 942743], [147.5765, 148.5804, 950464], [148.5804, 149.5843, 964346], [149.5843, 150.5882, 975391], [150.5882, 151.5922, 985204], [151.5922, 152.5961, 993241], [152.5961, 153.6, 1003272], [153.6, 154.6039, 1007841], [154.6039, 155.6078, 1014981], [155.6078, 156.6118, 1025516], [156.6118, 157.6157, 1038689], [157.6157, 158.6196, 1046387], [158.6196, 159.6235, 1055958], [159.6235, 160.6275, 1061917], [160.6275, 161.6314, 1069902], [161.6314, 162.6353, 1074383], [162.6353, 163.6392, 1077711], [163.6392, 164.6431, 1084480], [164.6431, 165.6471, 1092246], [165.6471, 166.651, 1098250], [166.651, 167.6549, 1105551], [167.6549, 168.6588, 1112735], [168.6588, 169.6628, 1118098], [169.6628, 170.6667, 1125523], [170.6667, 171.6706, 1133121], [171.6706, 172.6745, 1142512], [172.6745, 173.6784, 1148704], [173.6784, 174.6824, 1154061], [174.6824, 175.6863, 1163823], [175.6863, 176.6902, 1168052], [176.6902, 177.6941, 1171740], [177.6941, 178.698, 1176882], [178.698, 179.702, 1179433], [179.702, 180.7059, 1176290], [180.7059, 181.7098, 1170622], [181.7098, 182.7137, 1165328], [182.7137, 183.7177, 1156930], [183.7177, 184.7216, 1147879], [184.7216, 185.7255, 1137300], [185.7255, 186.7294, 1120497], [186.7294, 187.7333, 1106738], [187.7333, 188.7373, 1091219], [188.7373, 189.7412, 1070762], [189.7412, 190.7451, 1047710], [190.7451, 191.749, 1024671], [191.749, 192.7529, 999503], [192.7529, 193.7569, 969456], [193.7569, 194.7608, 933606], [194.7608, 195.7647, 898096], [195.7647, 196.7686, 857537], [196.7686, 197.7726, 821693], [197.7726, 198.7765, 775987], [198.7765, 199.7804, 729475], [199.7804, 200.7843, 682130], [200.7843, 201.7882, 640395], [201.7882, 202.7922, 601811], [202.7922, 203.7961, 568228], [203.7961, 204.8, 542387], [204.8, 205.8039, 506923], [205.8039, 206.8078, 477752], [206.8078, 207.8118, 453628], [207.8118, 208.8157, 431648], [208.8157, 209.8196, 412465], [209.8196, 210.8235, 392404], [210.8235, 211.8275, 373984], [211.8275, 212.8314, 352797], [212.8314, 213.8353, 331776], [213.8353, 214.8392, 314056], [214.8392, 215.8431, 299929], [215.8431, 216.8471, 282146], [216.8471, 217.851, 263520], [217.851, 218.8549, 243529], [218.8549, 219.8588, 225895], [219.8588, 220.8627, 211073], [220.8627, 221.8667, 195363], [221.8667, 222.8706, 179534], [222.8706, 223.8745, 163521], [223.8745, 224.8784, 150222], [224.8784, 225.8824, 137280], [225.8824, 226.8863, 124883], [226.8863, 227.8902, 114227], [227.8902, 228.8941, 101407], [228.8941, 229.898, 89917], [229.898, 230.902, 79965], [230.902, 231.9059, 69839], [231.9059, 232.9098, 60326], [232.9098, 233.9137, 51425], [233.9137, 234.9176, 43914], [234.9176, 235.9216, 38433], [235.9216, 236.9255, 32395], [236.9255, 237.9294, 27010], [237.9294, 238.9333, 22764], [238.9333, 239.9373, 18860], [239.9373, 240.9412, 14844], [240.9412, 241.9451, 12068], [241.9451, 242.949, 9001], [242.949, 243.9529, 7004], [243.9529, 244.9569, 5834], [244.9569, 245.9608, 4248], [245.9608, 246.9647, 2930], [246.9647, 247.9686, 2306], [247.9686, 248.9725, 2106], [248.9725, 249.9765, 1872], [249.9765, 250.9804, 1876], [250.9804, 251.9843, 1856], [251.9843, 252.9882, 1814], [252.9882, 253.9922, 1858], [253.9922, 254.9961, 1955], [254.9961, 256.0, 9820]]}, "site-1": {"train": [[0.0, 1.0039, 10894028], [1.0039, 2.0078, 919649], [2.0078, 3.0118, 769280], [3.0118, 4.0157, 693827], [4.0157, 5.0196, 647480], [5.0196, 6.0235, 650549], [6.0235, 7.0275, 534844], [7.0275, 8.0314, 473089], [8.0314, 9.0353, 423891], [9.0353, 10.0392, 407681], [10.0392, 11.0431, 377949], [11.0431, 12.0471, 371994], [12.0471, 13.051, 337606], [13.051, 14.0549, 321416], [14.0549, 15.0588, 314833], [15.0588, 16.0627, 305874], [16.0627, 17.0667, 299324], [17.0667, 18.0706, 299362], [18.0706, 19.0745, 302235], [19.0745, 20.0784, 303270], [20.0784, 21.0824, 304850], [21.0824, 22.0863, 311243], [22.0863, 23.0902, 313018], [23.0902, 24.0941, 322185], [24.0941, 25.098, 323243], [25.098, 26.102, 333137], [26.102, 27.1059, 367039], [27.1059, 28.1098, 330758], [28.1098, 29.1137, 332182], [29.1137, 30.1176, 350388], [30.1176, 31.1216, 343288], [31.1216, 32.1255, 353006], [32.1255, 33.1294, 359859], [33.1294, 34.1333, 397470], [34.1333, 35.1373, 373270], [35.1373, 36.1412, 379933], [36.1412, 37.1451, 396555], [37.1451, 38.149, 398242], [38.149, 39.1529, 405559], [39.1529, 40.1569, 417184], [40.1569, 41.1608, 430439], [41.1608, 42.1647, 441752], [42.1647, 43.1686, 452952], [43.1686, 44.1726, 466667], [44.1726, 45.1765, 484097], [45.1765, 46.1804, 505844], [46.1804, 47.1843, 515014], [47.1843, 48.1882, 527903], [48.1882, 49.1922, 555451], [49.1922, 50.1961, 569528], [50.1961, 51.2, 586813], [51.2, 52.2039, 599347], [52.2039, 53.2078, 618684], [53.2078, 54.2118, 630950], [54.2118, 55.2157, 647808], [55.2157, 56.2196, 673090], [56.2196, 57.2235, 688245], [57.2235, 58.2275, 710112], [58.2275, 59.2314, 718399], [59.2314, 60.2353, 729100], [60.2353, 61.2392, 743367], [61.2392, 62.2431, 758390], [62.2431, 63.2471, 774620], [63.2471, 64.251, 790928], [64.251, 65.2549, 810389], [65.2549, 66.2588, 828657], [66.2588, 67.2627, 847662], [67.2627, 68.2667, 865040], [68.2667, 69.2706, 879144], [69.2706, 70.2745, 895969], [70.2745, 71.2784, 916437], [71.2784, 72.2824, 935822], [72.2824, 73.2863, 953892], [73.2863, 74.2902, 973171], [74.2902, 75.2941, 989698], [75.2941, 76.298, 1006427], [76.298, 77.302, 1024038], [77.302, 78.3059, 1039927], [78.3059, 79.3098, 1055270], [79.3098, 80.3137, 1069199], [80.3137, 81.3176, 1083336], [81.3176, 82.3216, 1097692], [82.3216, 83.3255, 1116214], [83.3255, 84.3294, 1129098], [84.3294, 85.3333, 1141204], [85.3333, 86.3373, 1155065], [86.3373, 87.3412, 1168550], [87.3412, 88.3451, 1185271], [88.3451, 89.349, 1199064], [89.349, 90.3529, 1214772], [90.3529, 91.3569, 1225242], [91.3569, 92.3608, 1239084], [92.3608, 93.3647, 1253750], [93.3647, 94.3686, 1269047], [94.3686, 95.3726, 1284168], [95.3726, 96.3765, 1299647], [96.3765, 97.3804, 1317955], [97.3804, 98.3843, 1335169], [98.3843, 99.3882, 1354612], [99.3882, 100.3922, 1379464], [100.3922, 101.3961, 1400813], [101.3961, 102.4, 1459381], [102.4, 103.4039, 1437747], [103.4039, 104.4078, 1452027], [104.4078, 105.4118, 1472904], [105.4118, 106.4157, 1495774], [106.4157, 107.4196, 1517943], [107.4196, 108.4235, 1540170], [108.4235, 109.4275, 1567816], [109.4275, 110.4314, 1596016], [110.4314, 111.4353, 1623599], [111.4353, 112.4392, 1638923], [112.4392, 113.4431, 1648676], [113.4431, 114.4471, 1660864], [114.4471, 115.451, 1670206], [115.451, 116.4549, 1678346], [116.4549, 117.4588, 1689001], [117.4588, 118.4627, 1697572], [118.4627, 119.4667, 1709890], [119.4667, 120.4706, 1723120], [120.4706, 121.4745, 1733628], [121.4745, 122.4784, 1744632], [122.4784, 123.4824, 1758708], [123.4824, 124.4863, 1769412], [124.4863, 125.4902, 1780412], [125.4902, 126.4941, 1793815], [126.4941, 127.498, 1804310], [127.498, 128.502, 1816440], [128.502, 129.5059, 1826211], [129.5059, 130.5098, 1838735], [130.5098, 131.5137, 1851383], [131.5137, 132.5177, 1864726], [132.5177, 133.5216, 1876103], [133.5216, 134.5255, 1886905], [134.5255, 135.5294, 1901283], [135.5294, 136.5333, 1911711], [136.5333, 137.5373, 1918392], [137.5373, 138.5412, 1927938], [138.5412, 139.5451, 1936607], [139.5451, 140.549, 1944733], [140.549, 141.5529, 1949944], [141.5529, 142.5569, 1956728], [142.5569, 143.5608, 1964468], [143.5608, 144.5647, 1971692], [144.5647, 145.5686, 1978261], [145.5686, 146.5726, 1989150], [146.5726, 147.5765, 1994601], [147.5765, 148.5804, 1998874], [148.5804, 149.5843, 2002253], [149.5843, 150.5882, 2010981], [150.5882, 151.5922, 2019781], [151.5922, 152.5961, 2029319], [152.5961, 153.6, 2041442], [153.6, 154.6039, 2049317], [154.6039, 155.6078, 2052385], [155.6078, 156.6118, 2057924], [156.6118, 157.6157, 2063970], [157.6157, 158.6196, 2070129], [158.6196, 159.6235, 2073822], [159.6235, 160.6275, 2071202], [160.6275, 161.6314, 2074443], [161.6314, 162.6353, 2085518], [162.6353, 163.6392, 2084152], [163.6392, 164.6431, 2088635], [164.6431, 165.6471, 2087421], [165.6471, 166.651, 2089825], [166.651, 167.6549, 2091350], [167.6549, 168.6588, 2098728], [168.6588, 169.6628, 2098083], [169.6628, 170.6667, 2103421], [170.6667, 171.6706, 2106742], [171.6706, 172.6745, 2108895], [172.6745, 173.6784, 2104367], [173.6784, 174.6824, 2097960], [174.6824, 175.6863, 2091572], [175.6863, 176.6902, 2083093], [176.6902, 177.6941, 2073152], [177.6941, 178.698, 2069031], [178.698, 179.702, 2049718], [179.702, 180.7059, 2040335], [180.7059, 181.7098, 2023287], [181.7098, 182.7137, 2022978], [182.7137, 183.7177, 2010025], [183.7177, 184.7216, 1994103], [184.7216, 185.7255, 1965720], [185.7255, 186.7294, 1961279], [186.7294, 187.7333, 1943250], [187.7333, 188.7373, 1936609], [188.7373, 189.7412, 1916980], [189.7412, 190.7451, 1913374], [190.7451, 191.749, 1893539], [191.749, 192.7529, 1882353], [192.7529, 193.7569, 1864142], [193.7569, 194.7608, 1855682], [194.7608, 195.7647, 1847667], [195.7647, 196.7686, 1853185], [196.7686, 197.7726, 1846513], [197.7726, 198.7765, 1826374], [198.7765, 199.7804, 1805915], [199.7804, 200.7843, 1777044], [200.7843, 201.7882, 1775611], [201.7882, 202.7922, 1738088], [202.7922, 203.7961, 1716504], [203.7961, 204.8, 1694891], [204.8, 205.8039, 1667268], [205.8039, 206.8078, 1643096], [206.8078, 207.8118, 1613994], [207.8118, 208.8157, 1578087], [208.8157, 209.8196, 1534606], [209.8196, 210.8235, 1495973], [210.8235, 211.8275, 1449118], [211.8275, 212.8314, 1399671], [212.8314, 213.8353, 1339223], [213.8353, 214.8392, 1287605], [214.8392, 215.8431, 1223187], [215.8431, 216.8471, 1174973], [216.8471, 217.851, 1131599], [217.851, 218.8549, 1090599], [218.8549, 219.8588, 1044891], [219.8588, 220.8627, 1008683], [220.8627, 221.8667, 974052], [221.8667, 222.8706, 944405], [222.8706, 223.8745, 918074], [223.8745, 224.8784, 899155], [224.8784, 225.8824, 878302], [225.8824, 226.8863, 844524], [226.8863, 227.8902, 813378], [227.8902, 228.8941, 787275], [228.8941, 229.898, 764613], [229.898, 230.902, 739253], [230.902, 231.9059, 712397], [231.9059, 232.9098, 696324], [232.9098, 233.9137, 676432], [233.9137, 234.9176, 668208], [234.9176, 235.9216, 651782], [235.9216, 236.9255, 633075], [236.9255, 237.9294, 624123], [237.9294, 238.9333, 618392], [238.9333, 239.9373, 612616], [239.9373, 240.9412, 602796], [240.9412, 241.9451, 603908], [241.9451, 242.949, 612502], [242.949, 243.9529, 616100], [243.9529, 244.9569, 616756], [244.9569, 245.9608, 608695], [245.9608, 246.9647, 612086], [246.9647, 247.9686, 615833], [247.9686, 248.9725, 612640], [248.9725, 249.9765, 611049], [249.9765, 250.9804, 643359], [250.9804, 251.9843, 705574], [251.9843, 252.9882, 716770], [252.9882, 253.9922, 679330], [253.9922, 254.9961, 601071], [254.9961, 256.0, 1052689]]}, "site-2": {"train": [[0.0, 1.0039, 15941521], [1.0039, 2.0078, 3409289], [2.0078, 3.0118, 3292634], [3.0118, 4.0157, 2963028], [4.0157, 5.0196, 2697815], [5.0196, 6.0235, 2472349], [6.0235, 7.0275, 2279512], [7.0275, 8.0314, 2005163], [8.0314, 9.0353, 1802259], [9.0353, 10.0392, 1628386], [10.0392, 11.0431, 1567570], [11.0431, 12.0471, 1431692], [12.0471, 13.051, 1392798], [13.051, 14.0549, 1269837], [14.0549, 15.0588, 1193088], [15.0588, 16.0627, 1130059], [16.0627, 17.0667, 1092008], [17.0667, 18.0706, 1015100], [18.0706, 19.0745, 983700], [19.0745, 20.0784, 960282], [20.0784, 21.0824, 909431], [21.0824, 22.0863, 866762], [22.0863, 23.0902, 836220], [23.0902, 24.0941, 823204], [24.0941, 25.098, 815079], [25.098, 26.102, 816740], [26.102, 27.1059, 816584], [27.1059, 28.1098, 810720], [28.1098, 29.1137, 815188], [29.1137, 30.1176, 817414], [30.1176, 31.1216, 825910], [31.1216, 32.1255, 834258], [32.1255, 33.1294, 842404], [33.1294, 34.1333, 847901], [34.1333, 35.1373, 855877], [35.1373, 36.1412, 865681], [36.1412, 37.1451, 877634], [37.1451, 38.149, 891457], [38.149, 39.1529, 906151], [39.1529, 40.1569, 920792], [40.1569, 41.1608, 937021], [41.1608, 42.1647, 951070], [42.1647, 43.1686, 969154], [43.1686, 44.1726, 986948], [44.1726, 45.1765, 1005515], [45.1765, 46.1804, 1027579], [46.1804, 47.1843, 1048011], [47.1843, 48.1882, 1065838], [48.1882, 49.1922, 1089849], [49.1922, 50.1961, 1112060], [50.1961, 51.2, 1132509], [51.2, 52.2039, 1154043], [52.2039, 53.2078, 1177892], [53.2078, 54.2118, 1200277], [54.2118, 55.2157, 1224671], [55.2157, 56.2196, 1246311], [56.2196, 57.2235, 1273277], [57.2235, 58.2275, 1298370], [58.2275, 59.2314, 1320641], [59.2314, 60.2353, 1343924], [60.2353, 61.2392, 1368803], [61.2392, 62.2431, 1398404], [62.2431, 63.2471, 1418798], [63.2471, 64.251, 1447717], [64.251, 65.2549, 1478809], [65.2549, 66.2588, 1509546], [66.2588, 67.2627, 1544021], [67.2627, 68.2667, 1576975], [68.2667, 69.2706, 1614871], [69.2706, 70.2745, 1647199], [70.2745, 71.2784, 1684707], [71.2784, 72.2824, 1721295], [72.2824, 73.2863, 1754361], [73.2863, 74.2902, 1791169], [74.2902, 75.2941, 1827869], [75.2941, 76.298, 1867136], [76.298, 77.302, 1909117], [77.302, 78.3059, 1948501], [78.3059, 79.3098, 1990679], [79.3098, 80.3137, 2026898], [80.3137, 81.3176, 2064295], [81.3176, 82.3216, 2100536], [82.3216, 83.3255, 2134824], [83.3255, 84.3294, 2173686], [84.3294, 85.3333, 2215018], [85.3333, 86.3373, 2250716], [86.3373, 87.3412, 2289487], [87.3412, 88.3451, 2331344], [88.3451, 89.349, 2370562], [89.349, 90.3529, 2404724], [90.3529, 91.3569, 2446641], [91.3569, 92.3608, 2481625], [92.3608, 93.3647, 2516636], [93.3647, 94.3686, 2557334], [94.3686, 95.3726, 2598710], [95.3726, 96.3765, 2638704], [96.3765, 97.3804, 2670602], [97.3804, 98.3843, 2696413], [98.3843, 99.3882, 2721216], [99.3882, 100.3922, 2749841], [100.3922, 101.3961, 2779287], [101.3961, 102.4, 2806616], [102.4, 103.4039, 2835561], [103.4039, 104.4078, 2863948], [104.4078, 105.4118, 2883549], [105.4118, 106.4157, 2905702], [106.4157, 107.4196, 2932802], [107.4196, 108.4235, 2954641], [108.4235, 109.4275, 2982323], [109.4275, 110.4314, 3004721], [110.4314, 111.4353, 3028188], [111.4353, 112.4392, 3048302], [112.4392, 113.4431, 3060261], [113.4431, 114.4471, 3075460], [114.4471, 115.451, 3091074], [115.451, 116.4549, 3101385], [116.4549, 117.4588, 3108729], [117.4588, 118.4627, 3123015], [118.4627, 119.4667, 3126990], [119.4667, 120.4706, 3134952], [120.4706, 121.4745, 3147843], [121.4745, 122.4784, 3156261], [122.4784, 123.4824, 3163852], [123.4824, 124.4863, 3167825], [124.4863, 125.4902, 3168960], [125.4902, 126.4941, 3161481], [126.4941, 127.498, 3164858], [127.498, 128.502, 3173046], [128.502, 129.5059, 3182439], [129.5059, 130.5098, 3198768], [130.5098, 131.5137, 3196157], [131.5137, 132.5177, 3196652], [132.5177, 133.5216, 3197763], [133.5216, 134.5255, 3199729], [134.5255, 135.5294, 3205524], [135.5294, 136.5333, 3211286], [136.5333, 137.5373, 3213368], [137.5373, 138.5412, 3211412], [138.5412, 139.5451, 3206645], [139.5451, 140.549, 3209193], [140.549, 141.5529, 3214692], [141.5529, 142.5569, 3211823], [142.5569, 143.5608, 3212346], [143.5608, 144.5647, 3208845], [144.5647, 145.5686, 3204488], [145.5686, 146.5726, 3199919], [146.5726, 147.5765, 3189501], [147.5765, 148.5804, 3179552], [148.5804, 149.5843, 3166138], [149.5843, 150.5882, 3153095], [150.5882, 151.5922, 3142765], [151.5922, 152.5961, 3139218], [152.5961, 153.6, 3130360], [153.6, 154.6039, 3134121], [154.6039, 155.6078, 3134447], [155.6078, 156.6118, 3139450], [156.6118, 157.6157, 3145100], [157.6157, 158.6196, 3147758], [158.6196, 159.6235, 3146090], [159.6235, 160.6275, 3138656], [160.6275, 161.6314, 3131494], [161.6314, 162.6353, 3119024], [162.6353, 163.6392, 3111654], [163.6392, 164.6431, 3106116], [164.6431, 165.6471, 3098675], [165.6471, 166.651, 3093899], [166.651, 167.6549, 3085426], [167.6549, 168.6588, 3070005], [168.6588, 169.6628, 3067126], [169.6628, 170.6667, 3070429], [170.6667, 171.6706, 3076652], [171.6706, 172.6745, 3076603], [172.6745, 173.6784, 3063677], [173.6784, 174.6824, 3054089], [174.6824, 175.6863, 3046927], [175.6863, 176.6902, 3030450], [176.6902, 177.6941, 3007018], [177.6941, 178.698, 2980311], [178.698, 179.702, 2962652], [179.702, 180.7059, 2946745], [180.7059, 181.7098, 2924491], [181.7098, 182.7137, 2896582], [182.7137, 183.7177, 2869170], [183.7177, 184.7216, 2843862], [184.7216, 185.7255, 2819849], [185.7255, 186.7294, 2795058], [186.7294, 187.7333, 2777121], [187.7333, 188.7373, 2751346], [188.7373, 189.7412, 2737059], [189.7412, 190.7451, 2708849], [190.7451, 191.749, 2669175], [191.749, 192.7529, 2631722], [192.7529, 193.7569, 2609137], [193.7569, 194.7608, 2588888], [194.7608, 195.7647, 2556796], [195.7647, 196.7686, 2524864], [196.7686, 197.7726, 2489195], [197.7726, 198.7765, 2446870], [198.7765, 199.7804, 2408229], [199.7804, 200.7843, 2377414], [200.7843, 201.7882, 2343879], [201.7882, 202.7922, 2302332], [202.7922, 203.7961, 2265841], [203.7961, 204.8, 2239418], [204.8, 205.8039, 2220973], [205.8039, 206.8078, 2184959], [206.8078, 207.8118, 2150144], [207.8118, 208.8157, 2114186], [208.8157, 209.8196, 2078547], [209.8196, 210.8235, 2049835], [210.8235, 211.8275, 1997943], [211.8275, 212.8314, 1943236], [212.8314, 213.8353, 1899057], [213.8353, 214.8392, 1854857], [214.8392, 215.8431, 1814772], [215.8431, 216.8471, 1769082], [216.8471, 217.851, 1731006], [217.851, 218.8549, 1697932], [218.8549, 219.8588, 1659068], [219.8588, 220.8627, 1627294], [220.8627, 221.8667, 1598942], [221.8667, 222.8706, 1552328], [222.8706, 223.8745, 1493287], [223.8745, 224.8784, 1443311], [224.8784, 225.8824, 1398265], [225.8824, 226.8863, 1350080], [226.8863, 227.8902, 1291945], [227.8902, 228.8941, 1235278], [228.8941, 229.898, 1182931], [229.898, 230.902, 1135305], [230.902, 231.9059, 1083947], [231.9059, 232.9098, 1043830], [232.9098, 233.9137, 989887], [233.9137, 234.9176, 921426], [234.9176, 235.9216, 856490], [235.9216, 236.9255, 794486], [236.9255, 237.9294, 732566], [237.9294, 238.9333, 667414], [238.9333, 239.9373, 583868], [239.9373, 240.9412, 492933], [240.9412, 241.9451, 411886], [241.9451, 242.949, 340969], [242.949, 243.9529, 281630], [243.9529, 244.9569, 232361], [244.9569, 245.9608, 190872], [245.9608, 246.9647, 152602], [246.9647, 247.9686, 126933], [247.9686, 248.9725, 100975], [248.9725, 249.9765, 75090], [249.9765, 250.9804, 54275], [250.9804, 251.9843, 35979], [251.9843, 252.9882, 29189], [252.9882, 253.9922, 38216], [253.9922, 254.9961, 18398], [254.9961, 256.0, 24730]]}, "site-3": {"train": [[0.0, 1.0039, 35420536], [1.0039, 2.0078, 3434579], [2.0078, 3.0118, 3341431], [3.0118, 4.0157, 3092450], [4.0157, 5.0196, 3042051], [5.0196, 6.0235, 2757745], [6.0235, 7.0275, 2490254], [7.0275, 8.0314, 2411643], [8.0314, 9.0353, 2285068], [9.0353, 10.0392, 2156599], [10.0392, 11.0431, 2074827], [11.0431, 12.0471, 2118880], [12.0471, 13.051, 2024748], [13.051, 14.0549, 1964664], [14.0549, 15.0588, 1877950], [15.0588, 16.0627, 1895079], [16.0627, 17.0667, 1777361], [17.0667, 18.0706, 1680089], [18.0706, 19.0745, 1668241], [19.0745, 20.0784, 1609927], [20.0784, 21.0824, 1539886], [21.0824, 22.0863, 1526719], [22.0863, 23.0902, 1444669], [23.0902, 24.0941, 1446578], [24.0941, 25.098, 1415474], [25.098, 26.102, 1430897], [26.102, 27.1059, 1446241], [27.1059, 28.1098, 1467478], [28.1098, 29.1137, 1493183], [29.1137, 30.1176, 1537432], [30.1176, 31.1216, 1586366], [31.1216, 32.1255, 1630488], [32.1255, 33.1294, 1677620], [33.1294, 34.1333, 1716854], [34.1333, 35.1373, 1766773], [35.1373, 36.1412, 1817857], [36.1412, 37.1451, 1867103], [37.1451, 38.149, 1918587], [38.149, 39.1529, 1969687], [39.1529, 40.1569, 2017640], [40.1569, 41.1608, 2067479], [41.1608, 42.1647, 2120295], [42.1647, 43.1686, 2173831], [43.1686, 44.1726, 2225973], [44.1726, 45.1765, 2277126], [45.1765, 46.1804, 2324888], [46.1804, 47.1843, 2375966], [47.1843, 48.1882, 2422688], [48.1882, 49.1922, 2470304], [49.1922, 50.1961, 2515550], [50.1961, 51.2, 2562232], [51.2, 52.2039, 2604402], [52.2039, 53.2078, 2646158], [53.2078, 54.2118, 2685611], [54.2118, 55.2157, 2725405], [55.2157, 56.2196, 2769219], [56.2196, 57.2235, 2801003], [57.2235, 58.2275, 2836516], [58.2275, 59.2314, 2868959], [59.2314, 60.2353, 2899569], [60.2353, 61.2392, 2928114], [61.2392, 62.2431, 2956648], [62.2431, 63.2471, 2985628], [63.2471, 64.251, 3014738], [64.251, 65.2549, 3050418], [65.2549, 66.2588, 3082767], [66.2588, 67.2627, 3113070], [67.2627, 68.2667, 3144182], [68.2667, 69.2706, 3171032], [69.2706, 70.2745, 3197708], [70.2745, 71.2784, 3224877], [71.2784, 72.2824, 3254809], [72.2824, 73.2863, 3282706], [73.2863, 74.2902, 3313171], [74.2902, 75.2941, 3340328], [75.2941, 76.298, 3369138], [76.298, 77.302, 3393056], [77.302, 78.3059, 3420210], [78.3059, 79.3098, 3446986], [79.3098, 80.3137, 3469169], [80.3137, 81.3176, 3490349], [81.3176, 82.3216, 3511811], [82.3216, 83.3255, 3529029], [83.3255, 84.3294, 3551042], [84.3294, 85.3333, 3575271], [85.3333, 86.3373, 3600291], [86.3373, 87.3412, 3623519], [87.3412, 88.3451, 3648167], [88.3451, 89.349, 3666903], [89.349, 90.3529, 3684651], [90.3529, 91.3569, 3703091], [91.3569, 92.3608, 3718889], [92.3608, 93.3647, 3736978], [93.3647, 94.3686, 3759958], [94.3686, 95.3726, 3779436], [95.3726, 96.3765, 3797707], [96.3765, 97.3804, 3819111], [97.3804, 98.3843, 3828612], [98.3843, 99.3882, 3847381], [99.3882, 100.3922, 3866771], [100.3922, 101.3961, 3879339], [101.3961, 102.4, 3902031], [102.4, 103.4039, 3929528], [103.4039, 104.4078, 3948769], [104.4078, 105.4118, 3968417], [105.4118, 106.4157, 3992482], [106.4157, 107.4196, 4016228], [107.4196, 108.4235, 4042653], [108.4235, 109.4275, 4063340], [109.4275, 110.4314, 4087918], [110.4314, 111.4353, 4109329], [111.4353, 112.4392, 4138338], [112.4392, 113.4431, 4162863], [113.4431, 114.4471, 4189909], [114.4471, 115.451, 4215519], [115.451, 116.4549, 4247141], [116.4549, 117.4588, 4273944], [117.4588, 118.4627, 4311672], [118.4627, 119.4667, 4338825], [119.4667, 120.4706, 4370836], [120.4706, 121.4745, 4402997], [121.4745, 122.4784, 4431116], [122.4784, 123.4824, 4460083], [123.4824, 124.4863, 4482474], [124.4863, 125.4902, 4504318], [125.4902, 126.4941, 4519438], [126.4941, 127.498, 4550325], [127.498, 128.502, 4580158], [128.502, 129.5059, 4618214], [129.5059, 130.5098, 4659317], [130.5098, 131.5137, 4686527], [131.5137, 132.5177, 4721523], [132.5177, 133.5216, 4744639], [133.5216, 134.5255, 4762751], [134.5255, 135.5294, 4779756], [135.5294, 136.5333, 4801818], [136.5333, 137.5373, 4821757], [137.5373, 138.5412, 4834936], [138.5412, 139.5451, 4845614], [139.5451, 140.549, 4873763], [140.549, 141.5529, 4898921], [141.5529, 142.5569, 4937001], [142.5569, 143.5608, 4973016], [143.5608, 144.5647, 4993681], [144.5647, 145.5686, 5002594], [145.5686, 146.5726, 4999512], [146.5726, 147.5765, 4994651], [147.5765, 148.5804, 4987965], [148.5804, 149.5843, 4967454], [149.5843, 150.5882, 4942949], [150.5882, 151.5922, 4920523], [151.5922, 152.5961, 4896259], [152.5961, 153.6, 4882397], [153.6, 154.6039, 4869893], [154.6039, 155.6078, 4869395], [155.6078, 156.6118, 4868932], [156.6118, 157.6157, 4866115], [157.6157, 158.6196, 4861393], [158.6196, 159.6235, 4858587], [159.6235, 160.6275, 4849058], [160.6275, 161.6314, 4848421], [161.6314, 162.6353, 4847538], [162.6353, 163.6392, 4853239], [163.6392, 164.6431, 4852638], [164.6431, 165.6471, 4858857], [165.6471, 166.651, 4851576], [166.651, 167.6549, 4844393], [167.6549, 168.6588, 4825204], [168.6588, 169.6628, 4824452], [169.6628, 170.6667, 4832095], [170.6667, 171.6706, 4845295], [171.6706, 172.6745, 4852993], [172.6745, 173.6784, 4852364], [173.6784, 174.6824, 4847783], [174.6824, 175.6863, 4843062], [175.6863, 176.6902, 4833583], [176.6902, 177.6941, 4825035], [177.6941, 178.698, 4813977], [178.698, 179.702, 4809204], [179.702, 180.7059, 4803096], [180.7059, 181.7098, 4794134], [181.7098, 182.7137, 4774045], [182.7137, 183.7177, 4758050], [183.7177, 184.7216, 4748434], [184.7216, 185.7255, 4742331], [185.7255, 186.7294, 4734879], [186.7294, 187.7333, 4727653], [187.7333, 188.7373, 4723189], [188.7373, 189.7412, 4716853], [189.7412, 190.7451, 4695524], [190.7451, 191.749, 4673050], [191.749, 192.7529, 4652493], [192.7529, 193.7569, 4640657], [193.7569, 194.7608, 4630755], [194.7608, 195.7647, 4621774], [195.7647, 196.7686, 4592518], [196.7686, 197.7726, 4554421], [197.7726, 198.7765, 4528396], [198.7765, 199.7804, 4495683], [199.7804, 200.7843, 4456919], [200.7843, 201.7882, 4421014], [201.7882, 202.7922, 4385719], [202.7922, 203.7961, 4354884], [203.7961, 204.8, 4337416], [204.8, 205.8039, 4320880], [205.8039, 206.8078, 4297270], [206.8078, 207.8118, 4265592], [207.8118, 208.8157, 4221109], [208.8157, 209.8196, 4184597], [209.8196, 210.8235, 4145936], [210.8235, 211.8275, 4102365], [211.8275, 212.8314, 4054169], [212.8314, 213.8353, 4014081], [213.8353, 214.8392, 3980732], [214.8392, 215.8431, 3950586], [215.8431, 216.8471, 3909584], [216.8471, 217.851, 3864430], [217.851, 218.8549, 3813607], [218.8549, 219.8588, 3776123], [219.8588, 220.8627, 3735486], [220.8627, 221.8667, 3706293], [221.8667, 222.8706, 3661984], [222.8706, 223.8745, 3606364], [223.8745, 224.8784, 3544293], [224.8784, 225.8824, 3477928], [225.8824, 226.8863, 3406908], [226.8863, 227.8902, 3332751], [227.8902, 228.8941, 3252660], [228.8941, 229.898, 3161730], [229.898, 230.902, 3062149], [230.902, 231.9059, 2953007], [231.9059, 232.9098, 2862108], [232.9098, 233.9137, 2760883], [233.9137, 234.9176, 2633718], [234.9176, 235.9216, 2503331], [235.9216, 236.9255, 2347287], [236.9255, 237.9294, 2194271], [237.9294, 238.9333, 2016997], [238.9333, 239.9373, 1808115], [239.9373, 240.9412, 1593507], [240.9412, 241.9451, 1395255], [241.9451, 242.949, 1210900], [242.949, 243.9529, 1038748], [243.9529, 244.9569, 875010], [244.9569, 245.9608, 714476], [245.9608, 246.9647, 562953], [246.9647, 247.9686, 431427], [247.9686, 248.9725, 326175], [248.9725, 249.9765, 231626], [249.9765, 250.9804, 155845], [250.9804, 251.9843, 104933], [251.9843, 252.9882, 72649], [252.9882, 253.9922, 47831], [253.9922, 254.9961, 34488], [254.9961, 256.0, 100798]]}, "Global": {"train": [[0.0, 1.0039, 69786029], [1.0039, 2.0078, 8188625], [2.0078, 3.0118, 7784081], [3.0118, 4.0157, 7084007], [4.0157, 5.0196, 6715208], [5.0196, 6.0235, 6190920], [6.0235, 7.0275, 5617900], [7.0275, 8.0314, 5203549], [8.0314, 9.0353, 4819023], [9.0353, 10.0392, 4498022], [10.0392, 11.0431, 4316214], [11.0431, 12.0471, 4201633], [12.0471, 13.051, 4025472], [13.051, 14.0549, 3816331], [14.0549, 15.0588, 3648732], [15.0588, 16.0627, 3595752], [16.0627, 17.0667, 3432452], [17.0667, 18.0706, 3261391], [18.0706, 19.0745, 3223769], [19.0745, 20.0784, 3138509], [20.0784, 21.0824, 3014583], [21.0824, 22.0863, 2963871], [22.0863, 23.0902, 2851704], [23.0902, 24.0941, 2851531], [24.0941, 25.098, 2813641], [25.098, 26.102, 2837755], [26.102, 27.1059, 2882453], [27.1059, 28.1098, 2852997], [28.1098, 29.1137, 2877331], [29.1137, 30.1176, 2940764], [30.1176, 31.1216, 2989451], [31.1216, 32.1255, 3050442], [32.1255, 33.1294, 3110379], [33.1294, 34.1333, 3190169], [34.1333, 35.1373, 3221438], [35.1373, 36.1412, 3289931], [36.1412, 37.1451, 3369534], [37.1451, 38.149, 3438731], [38.149, 39.1529, 3515442], [39.1529, 40.1569, 3594400], [40.1569, 41.1608, 3678649], [41.1608, 42.1647, 3764646], [42.1647, 43.1686, 3854712], [43.1686, 44.1726, 3943781], [44.1726, 45.1765, 4038415], [45.1765, 46.1804, 4136169], [46.1804, 47.1843, 4226284], [47.1843, 48.1882, 4312247], [48.1882, 49.1922, 4419674], [49.1922, 50.1961, 4510112], [50.1961, 51.2, 4604814], [51.2, 52.2039, 4686623], [52.2039, 53.2078, 4778060], [53.2078, 54.2118, 4860586], [54.2118, 55.2157, 4949044], [55.2157, 56.2196, 5045016], [56.2196, 57.2235, 5125709], [57.2235, 58.2275, 5214792], [58.2275, 59.2314, 5281594], [59.2314, 60.2353, 5351470], [60.2353, 61.2392, 5424900], [61.2392, 62.2431, 5504739], [62.2431, 63.2471, 5575421], [63.2471, 64.251, 5651442], [64.251, 65.2549, 5741252], [65.2549, 66.2588, 5825816], [66.2588, 67.2627, 5914027], [67.2627, 68.2667, 5999701], [68.2667, 69.2706, 6081756], [69.2706, 70.2745, 6163780], [70.2745, 71.2784, 6251108], [71.2784, 72.2824, 6341952], [72.2824, 73.2863, 6425423], [73.2863, 74.2902, 6515680], [74.2902, 75.2941, 6599730], [75.2941, 76.298, 6690609], [76.298, 77.302, 6780442], [77.302, 78.3059, 6867430], [78.3059, 79.3098, 6959845], [79.3098, 80.3137, 7038970], [80.3137, 81.3176, 7118364], [81.3176, 82.3216, 7198626], [82.3216, 83.3255, 7273508], [83.3255, 84.3294, 7353458], [84.3294, 85.3333, 7437666], [85.3333, 86.3373, 7514222], [86.3373, 87.3412, 7596157], [87.3412, 88.3451, 7685676], [88.3451, 89.349, 7760480], [89.349, 90.3529, 7836324], [90.3529, 91.3569, 7914154], [91.3569, 92.3608, 7984592], [92.3608, 93.3647, 8058147], [93.3647, 94.3686, 8143172], [94.3686, 95.3726, 8225658], [95.3726, 96.3765, 8306471], [96.3765, 97.3804, 8385817], [97.3804, 98.3843, 8446081], [98.3843, 99.3882, 8515661], [99.3882, 100.3922, 8595649], [100.3922, 101.3961, 8665957], [101.3961, 102.4, 8780310], [102.4, 103.4039, 8823415], [103.4039, 104.4078, 8892485], [104.4078, 105.4118, 8960137], [105.4118, 106.4157, 9037720], [106.4157, 107.4196, 9118347], [107.4196, 108.4235, 9195839], [108.4235, 109.4275, 9278376], [109.4275, 110.4314, 9361333], [110.4314, 111.4353, 9441164], [111.4353, 112.4392, 9513884], [112.4392, 113.4431, 9565940], [113.4431, 114.4471, 9628529], [114.4471, 115.451, 9687381], [115.451, 116.4549, 9742042], [116.4549, 117.4588, 9796665], [117.4588, 118.4627, 9865679], [118.4627, 119.4667, 9917287], [119.4667, 120.4706, 9976651], [120.4706, 121.4745, 10036954], [121.4745, 122.4784, 10091054], [122.4784, 123.4824, 10149933], [123.4824, 124.4863, 10193695], [124.4863, 125.4902, 10233165], [125.4902, 126.4941, 10260896], [126.4941, 127.498, 10311379], [127.498, 128.502, 10367831], [128.502, 129.5059, 10434627], [129.5059, 130.5098, 10509680], [130.5098, 131.5137, 10554762], [131.5137, 132.5177, 10612940], [132.5177, 133.5216, 10656445], [133.5216, 134.5255, 10694216], [134.5255, 135.5294, 10740498], [135.5294, 136.5333, 10787178], [136.5333, 137.5373, 10825769], [137.5373, 138.5412, 10849369], [138.5412, 139.5451, 10868066], [139.5451, 140.549, 10914409], [140.549, 141.5529, 10957929], [141.5529, 142.5569, 11003964], [142.5569, 143.5608, 11057033], [143.5608, 144.5647, 11088904], [144.5647, 145.5686, 11107076], [145.5686, 146.5726, 11118792], [146.5726, 147.5765, 11121496], [147.5765, 148.5804, 11116855], [148.5804, 149.5843, 11100191], [149.5843, 150.5882, 11082416], [150.5882, 151.5922, 11068273], [151.5922, 152.5961, 11058037], [152.5961, 153.6, 11057471], [153.6, 154.6039, 11061172], [154.6039, 155.6078, 11071208], [155.6078, 156.6118, 11091822], [156.6118, 157.6157, 11113874], [157.6157, 158.6196, 11125667], [158.6196, 159.6235, 11134457], [159.6235, 160.6275, 11120833], [160.6275, 161.6314, 11124260], [161.6314, 162.6353, 11126463], [162.6353, 163.6392, 11126756], [163.6392, 164.6431, 11131869], [164.6431, 165.6471, 11137199], [165.6471, 166.651, 11133550], [166.651, 167.6549, 11126720], [167.6549, 168.6588, 11106672], [168.6588, 169.6628, 11107759], [169.6628, 170.6667, 11131468], [170.6667, 171.6706, 11161810], [171.6706, 172.6745, 11181003], [172.6745, 173.6784, 11169112], [173.6784, 174.6824, 11153893], [174.6824, 175.6863, 11145384], [175.6863, 176.6902, 11115178], [176.6902, 177.6941, 11076945], [177.6941, 178.698, 11040201], [178.698, 179.702, 11001007], [179.702, 180.7059, 10966466], [180.7059, 181.7098, 10912534], [181.7098, 182.7137, 10858933], [182.7137, 183.7177, 10794175], [183.7177, 184.7216, 10734278], [184.7216, 185.7255, 10665200], [185.7255, 186.7294, 10611713], [186.7294, 187.7333, 10554762], [187.7333, 188.7373, 10502363], [188.7373, 189.7412, 10441654], [189.7412, 190.7451, 10365457], [190.7451, 191.749, 10260435], [191.749, 192.7529, 10166071], [192.7529, 193.7569, 10083392], [193.7569, 194.7608, 10008931], [194.7608, 195.7647, 9924333], [195.7647, 196.7686, 9828104], [196.7686, 197.7726, 9711822], [197.7726, 198.7765, 9577627], [198.7765, 199.7804, 9439302], [199.7804, 200.7843, 9293507], [200.7843, 201.7882, 9180899], [201.7882, 202.7922, 9027950], [202.7922, 203.7961, 8905457], [203.7961, 204.8, 8814112], [204.8, 205.8039, 8716044], [205.8039, 206.8078, 8603077], [206.8078, 207.8118, 8483358], [207.8118, 208.8157, 8345030], [208.8157, 209.8196, 8210215], [209.8196, 210.8235, 8084148], [210.8235, 211.8275, 7923410], [211.8275, 212.8314, 7749873], [212.8314, 213.8353, 7584137], [213.8353, 214.8392, 7437250], [214.8392, 215.8431, 7288474], [215.8431, 216.8471, 7135785], [216.8471, 217.851, 6990555], [217.851, 218.8549, 6845667], [218.8549, 219.8588, 6705977], [219.8588, 220.8627, 6582536], [220.8627, 221.8667, 6474650], [221.8667, 222.8706, 6338251], [222.8706, 223.8745, 6181246], [223.8745, 224.8784, 6036981], [224.8784, 225.8824, 5891775], [225.8824, 226.8863, 5726395], [226.8863, 227.8902, 5552301], [227.8902, 228.8941, 5376620], [228.8941, 229.898, 5199191], [229.898, 230.902, 5016672], [230.902, 231.9059, 4819190], [231.9059, 232.9098, 4662588], [232.9098, 233.9137, 4478627], [233.9137, 234.9176, 4267266], [234.9176, 235.9216, 4050036], [235.9216, 236.9255, 3807243], [236.9255, 237.9294, 3577970], [237.9294, 238.9333, 3325567], [238.9333, 239.9373, 3023459], [239.9373, 240.9412, 2704080], [240.9412, 241.9451, 2423117], [241.9451, 242.949, 2173372], [242.949, 243.9529, 1943482], [243.9529, 244.9569, 1729961], [244.9569, 245.9608, 1518291], [245.9608, 246.9647, 1330571], [246.9647, 247.9686, 1176499], [247.9686, 248.9725, 1041896], [248.9725, 249.9765, 919637], [249.9765, 250.9804, 855355], [250.9804, 251.9843, 848342], [251.9843, 252.9882, 820422], [252.9882, 253.9922, 767235], [253.9922, 254.9961, 655912], [254.9961, 256.0, 1188037]]}}}} \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/visualization.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/visualization.ipynb deleted file mode 100644 index 71f933fb78..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/demo/visualization.ipynb +++ /dev/null @@ -1,440 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f851980", - "metadata": {}, - "source": [ - "# NVFLARE Federated Statistics Visualization" - ] - }, - { - "cell_type": "markdown", - "id": "1aea2083", - "metadata": {}, - "source": [ - "#### Dependencies\n", - "\n", - "To run this example, you need to install the following dependencies:\n", - "* monai[itk]\n", - "* numpy\n", - "* pandas\n", - "* kaleido\n", - "* matplotlib\n", - "* jupyter\n", - "* notebook\n", - "\n", - "These are captured in the requirements.txt\n" - ] - }, - { - "cell_type": "markdown", - "id": "0b71dd55", - "metadata": {}, - "source": [ - "## Image Statistics Visualization\n", - "In this example, we demonstate how to visualize the results from the statistics of image data. The visualization requires json, pandas, matplotlib modules as well as nvflare visualization utlities. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "85f23acf", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "\n", - "import json\n", - "import pandas as pd\n", - "from nvflare.app_opt.statistics.visualization.statistics_visualization import Visualization" - ] - }, - { - "cell_type": "markdown", - "id": "151e23a8", - "metadata": {}, - "source": [ - "First, copy the resulting json file to demo directory. In this example, resulting file is called image_statistics.json. Then load json file\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "44f6bed2", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "with open('image_statistics.json', 'r') as f:\n", - " data = json.load(f)" - ] - }, - { - "cell_type": "markdown", - "id": "c4b83ddb", - "metadata": {}, - "source": [ - "Initialize the Visualization utilities\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ab771712", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "vis = Visualization()\n" - ] - }, - { - "cell_type": "markdown", - "id": "49f976aa", - "metadata": {}, - "source": [ - "### Overall Statistics\n", - "vis.show_stats() will show the statistics for each features, at each site for each dataset\n", - "\n", - "vis.show_stats(data = data)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "20ea4dff", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "intensity\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
counthistogram
site-4-train1345[[0.0, 1.0039, 7529944], [1.0039, 2.0078, 4251...
site-1-train3616[[0.0, 1.0039, 10894028], [1.0039, 2.0078, 919...
site-2-train6012[[0.0, 1.0039, 15941521], [1.0039, 2.0078, 340...
site-3-train10192[[0.0, 1.0039, 35420536], [1.0039, 2.0078, 343...
Global-train21165[[0.0, 1.0039, 69786029], [1.0039, 2.0078, 818...
\n", - "
" - ], - "text/plain": [ - " count histogram\n", - "site-4-train 1345 [[0.0, 1.0039, 7529944], [1.0039, 2.0078, 4251...\n", - "site-1-train 3616 [[0.0, 1.0039, 10894028], [1.0039, 2.0078, 919...\n", - "site-2-train 6012 [[0.0, 1.0039, 15941521], [1.0039, 2.0078, 340...\n", - "site-3-train 10192 [[0.0, 1.0039, 35420536], [1.0039, 2.0078, 343...\n", - "Global-train 21165 [[0.0, 1.0039, 69786029], [1.0039, 2.0078, 818..." - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vis.show_stats(data = data)" - ] - }, - { - "cell_type": "markdown", - "id": "521cbf6f", - "metadata": {}, - "source": [ - "### select features statistics using white_list_features \n", - "user can optionally select only show specified features via white_list_features arguments. In these image files, we only have one feature" - ] - }, - { - "cell_type": "markdown", - "id": "9ab23bcc", - "metadata": {}, - "source": [ - "### Histogram Visualization\n", - "We can use vis.show_histograms() to visualize the histogram. Before we do that, we need set some iPython display setting to make sure the graph displayed in full cell. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "4bada64b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from IPython.display import display, HTML\n", - "display(HTML(\"\"))" - ] - }, - { - "cell_type": "markdown", - "id": "e415b49e", - "metadata": {}, - "source": [ - "The following command display histograms for numberic features. The result shows both main plot" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "53542cf9", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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RESaa/FdIcdavXp1KxTj5IV1sWCVBRERkSYipsaCTSFERETai5hgwc6bRERE2ouYYAEc87wQIiIiOuUiKlgEk4XgQ8iIiIg0EVHBorbGgk0hREREWoioYBHswMkuFkRERNqIqGAR7MDJzptERETaiKxgEZxhriAiItJERAULyMEaC43LQURE1EFFVLCQQn0smCyIiIi0EFnBIjjDXEFERKSJyAoWMjtvEhERaSmiggURERFpK6KChcSRN4mIiDQVMcEid/LdUCorAACCnSyIiIg0ETHBombbNgifV11griAiItJExAQL6HShu0LYeZOIiEgbERMsJFkOda5griAiItJGxAQL6HS18wwWREREmoiYYCHJMqRAVQWbQoiIiLQRMcECsoxgVQVzBRERkTYiJ1joZEjBNhAGCyIiIk1ETLCQZF2oqoJNIURERNqImGChdt5koCAiItJSxASLsM6bCgMGERGRFiImWNStsWCsICIi0kbEBAtJrtt5k9GCiIhICxETLKDTgbmCiIhIWxETLOrWWDBYEBERaSNigkXYXSFMFkRERJqImGChPoSMNRZERERaiphgoT42nSNvEhERaSligkV4jQWTBRERkRYiJliEjWPBXEFERKSJiAkWkq7uXSFMFkRERFqImGABuXYcC/axICIi0kbEBIuwGguNy0JERNRRtShYvP766xgwYACio6MRHR2N8847D8uXL2+rsrWMXKePBR9CRkREpIkWBYtOnTrhxRdfxKZNm7Bx40ZceumluPrqq7Ft27a2Kl+zSTqZvTaJiIg0pm/JxmPHjg1bfuGFF/D6669j3bp16Nu3b6sWrMUkdt4kIiLSWouCRV1+vx8ffvghnE4nzjvvvEa3c7vdcLvdoeWKiooTPWTT6tZYMFcQERFposWdN7du3QqbzQaTyYTJkydjyZIlOOOMMxrdfsaMGXA4HKEpIyPjpArcGEnW8SFkREREGmtxsOjVqxc2b96M9evX4+6778att96K7du3N7r9Y489hvLy8tCUm5t7UgVulE4G2BRCRESkqRY3hRiNRnTv3h0AMGTIEGzYsAGzZ8/GP//5zwa3N5lMMJlMJ1fKZpBkHZtCiIiINHbS41goihLWh0IzOh2kwKxgsiAiItJEi2osHnvsMYwZMwadO3dGZWUl3n33XaxevRorVqxoq/I1m/oQMgVA6IWIiIhOsRYFi4KCAtxyyy3Iy8uDw+HAgAEDsGLFClx22WVtVb7m0+m0LgEREVGH16Jg8a9//autynHS+BAyIiIi7UXMs0JQp/Mmm0KIiIi0ETHBom6NBW8LISIi0kbEBIuwh5AxVxAREWkiYoKFpJMhcRwLIiIiTUVMsFBrLFTsvElERKSNiAkW6mPTA+NYMFcQERFpImKCBeTakTeZLIiIiLQRMcFCCnsImbZlISIi6qgiJlhA1oU6bzJYEBERaSNygkWdGgveFkJERKSNiAkW6kPIOPImERGRliImWECuO/ImERERaSFigoWkqzvyJgMGERGRFiImWKgPIVNnmSuIiIi0ETHBQn0IWXCALCYLIiIiLURMsKg7pDe7WhAREWkjYoJF3YeQscaCiIhIGxETLPjYdCIiIu1FTLBQH0LGx6YTERFpKWKChfoQMjaFEBERaSligoUUNqQ3ERERaSFigoX6EDJ1VigMGERERFqImGCh1lgExrHQtihEREQdVsQEi7qPTWeyICIi0kbEBAu1xkLFzptERETaiJhgAZ0OoaYQ5goiIiJNREywkGQ51HmTTSFERETaiJhgAT42nYiISHOREyzkOuNYMFcQERFpImKChdoUwhoLIiIiLUVMsAh7CJm2JSEiIuqwIiZY1H1seuDmECIiIjrFIiZYqDUWKjaFEBERaSNiggWH9CYiItJexAQL6GofQgY+hIyIiEgTERMspDq3mzJWEBERaSNigkX4AFnaFoWIiKijalGwmDFjBs4++2zY7XYkJSVh3Lhx2LVrV1uVrUXqjmPBZEFERKSNFgWLb7/9FlOmTMG6deuwcuVKeL1ejBo1Ck6ns63K13wc0puIiEhz+pZs/MUXX4Qtz58/H0lJSdi0aRMuuuiiVi1YS4WNvMnOm0RERJo4qT4W5eXlAIC4uLhWKcxJqVtjwWBBRESkiRbVWNSlKAqmTZuGYcOGoV+/fo1u53a74Xa7Q8sVFRUnesgm1b0rBAqH3iQiItLCCddYTJkyBb/++ivee++9JrebMWMGHA5HaMrIyDjRQzZNpws1hSissSAiItLECQWLqVOnYtmyZVi1ahU6derU5LaPPfYYysvLQ1Nubu4JFfR41BqLAHbeJCIi0kSLmkKEELj33nuxZMkSrF69Gl26dDnuPiaTCSaT6YQL2Gx1aiyEn00hREREWmhRsJgyZQreffddfPLJJ7Db7cjPzwcAOBwOWCyWNilgs9UdeZM1FkRERJpoUVPI66+/jvLycgwfPhypqamh6f3332+r8jWbJEmQJHWed4UQERFpo8VNIae1ULI4zctJREQUoSLnWSEAArGCNRZEREQaiahgAVmNFgwWRERE2oioYBGssWBTCBERkTYiK1gEaiw4QBYREZE2IitYhDpZMFgQERFpIaKCRTBZsI8FERGRNiIqWEi83ZSIiEhTkRUsAj8NayyIiIi0EVnBItgUwhoLIiIiTURUsAiNY8FgQUREpImICha1fSy0LQcREVFHFZHBgn0siIiItBExwWLEByNwtLoAAJtCiIiItBIxwQISICQFAIMFERGRViImWJh0JiihkTc1LQoREVGHFTHBwigbIQKJgn0siIiItBE5wUJnhJAYKIiIiLQUkcGCNRZERETaiJhgYdKZaoMFO28SERFpImKChUFnCPWxYOdNIiIibURMsDDJJojQw02ZLIiIiLQQMcHCqKtzVwhzBRERkSYiK1iwjwUREZGmIiZYqANksY8FERGRliImWITXWGhcGCIiog4qooJFaEhvVlkQERFpInKChcwaCyIiIq1FTLAIHyBL48IQERF1UBETLIw6I5TQAFlMFkRERFqIqGAhZNZYEBERaSlygoVcW2PBXEFERKSNyAkWdWosmCyIiIi0EVHBQuGQ3kRERJqKmGCh3hWidSmIiIg6Nr3WBWgtRtkYGtKbzwohovZCKAJetx+yToLOIEOS+A2J2rfICRa6usFC48IQUasTioCrwoPKkprQVFXihtvlhd+rwO9T4Au8Kn4BnV6GziBDp5ehN8jQG2XojTp1MsjQ6SUoivq5QhEQQkDxC/g8CrweP3xuP7weP7xuP3weBT6PH5AkyDIgyVKDAaCxLzWyLEHWydAZ1P081T7UuHxwO73wVPtCf7MkCdAbdTCYdNCbdDAE5i12A2yxZthiTYiKMcEWa1KXY0zQGSKm4pkiROQEix9m13beJKJ2w+9T4Cxzo6q0BlWlblRXelFd6UG104uaSi+qqzyB991Q/JH937gQgNethpnmstgNiIoxISbJitgUK2JToxCXGoWYJCtDB2mixcHiu+++w0svvYRNmzYhLy8PS5Yswbhx49qgaC1jyt0ABVkAWGNBdDpR/ArKC6tRmu9CZXENKktrUFWihojK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CC0HayyIiIhOJUmSYDaoY3rEal2YCNaiYJGQkACdToejR4+GrT969ChSUlIa3MdkMsFkOj2HJyUiIqLW1aJeeEajEUOGDMHXX38dWqcoCr7++mucd955rV44IiIial9a3BTywAMP4NZbb8VZZ52Fc845B6+88gqcTiduu+22tigfERERtSMtDhY33ngjCgsL8eSTTyI/Px+DBg3CF198Ua9DJxEREXU8ETWkNxEREbWN5l6/2/DpMURERNTRMFgQERFRq2GwICIiolbDYEFERESthsGCiIiIWg2DBREREbUaBgsiIiJqNQwWRERE1GoYLIiIiKjVtPlj048VHOizoqLiVB+aiIiITlDwun28AbtPebCorKwEAGRkZJzqQxMREdFJqqyshMPhaPT9U/6sEEVRcOTIEdjtdkiS1GqfW1FRgYyMDOTm5vIZJG2E57ht8fy2LZ7ftsdz3La0Pr9CCFRWViItLQ2y3HhPilNeYyHLMjp16tRmnx8dHc1f6DbGc9y2eH7bFs9v2+M5bltant+maiqC2HmTiIiIWg2DBREREbWaiAkWJpMJTz31FEwmk9ZFiVg8x22L57dt8fy2PZ7jttVezu8p77xJREREkStiaiyIiIhIewwWRERE1GoYLIiIiKjVMFgQERFRq2GwICIiolbT7oNFUVERH2hGEY03brUtnl+i1nXKh/RuTdOnT8d7772HmpoaDBgwAA888ADOP/98rYsVkb744guYzWaYzWace+65WhenQ8jJyUF8fDyEELDZbBBCtOrzdTo6nt+2tXjxYqxduxYJCQkYPHgwRo8erXWRIs5pe45FO/X888+LxMRE8fbbb4t33nlHnHfeeeKcc84Rn332mdZFizjXXHONSE9PF927dxdGo1Hcf//9YufOnVoXK6I9+OCDok+fPqJ3795i2LBhYtOmTcLv92tdrIjB89u2HnvsMWG328V1110nBg4cKCwWi5g+fbpwuVxaFy1inM7nuF0Gi+rqanH55ZeLv//976F1hw8fFg8++KA444wzxJYtW7QrXIR57rnnxMCBA0Vubq7Izc0Vn3zyiUhLSxMTJ04UP//8s9bFi0iPPPKIyMzMFJ9//rmYO3euGDdunIiOjhYLFy4UTqdT6+K1ezy/bWvnzp2iW7duYsWKFUIIIcrKysTcuXOFLMvi+eefF1VVVRqXsP073c9xuwwWNTU14pxzzhGPPPJI2Pq9e/eKO++8U5x77rmitLRUm8JFAEVRQvOTJk0SN9xwQ9j7S5cuFQMGDBBTp04VR44cOdXFi3gjRowQM2fODFt3yy23iO7du4vFixfzm/VJ4vltW998841ITU0Vhw4dClv/6quvCp1OJz7++GMhRPjfGWqZ0/0ct8vOmzqdDllZWdi9ezeKiopC67t164YJEybA5/NhwYIFGpawfTt69CgAwOPxoKqqCnq92hXH6/UCAK6++mrceeedWL58OdasWQOAHeBagxACRUVFOHjwIGJjYwEANTU1AIAFCxagc+fOePHFF0P/PtQyPp+P57cNBf8GZGZmoqCgAFu2bAGgnncAuPfeezFp0iTcf//9UBSF/VlaSFGU0Pxpf441iTOtYN26dUKSJPH3v/+9Xir73e9+J8477zyNSta+Pf7446J3796iuLhYCCHExx9/LCRJEhs3bhRCqLVFQWPHjhUXXHCBJuWMZDfffLPo169faDl4zouLi4XVahV//etftSpau7R79+6w5d/97nc8v63o6NGjwu12h5arq6vFLbfcIi644AJx8OBBIYQQHo9HCKE2WWdmZoo333xTk7K2V++//37o91JRFOFyucSkSZNO23PcLmssAGDo0KGYMWMG/vSnP+Hjjz+G2+0Ovde9e3ckJSWFJTw6vhtvvBH/+Mc/8OabbyIuLg4AcPnll+Pqq6/Gtddei6qqKphMJng8HgDA7bffjn379uHQoUOssThBixcvxpIlS/D555+H1t1///1wuVy47777AKhPNHS73YiLi8Ndd92Fzz77DNXV1TznzfDwww/j+uuvx9GjR0Pna8qUKXC73Ty/reCpp57CZZddhnPOOQe/+c1vsH37dpjNZkyYMAF+vx9PPfUUXC4XDAYDAPVc6/V6+P1+jUvefjz88MO46aab0L9/fwCAJEmwWCy4+uqrAeC0PMftNlgAwKOPPoo77rgDd9xxB1599VWsW7cOO3bswLvvvotevXpBltv1j3fKeDwenHPOOdi1axe2bduGCy+8EOXl5VAUBVarFc8++yySk5MxfPhwVFdXw2g0AgDy8vLQtWtXJCYmslrzBFx77bW455578Oyzz+LKK6/ETTfdhB9++AFnnXUWJk+ejP/+97+YNWsWAIQek+zxeJCcnAyLxcJzfhxXX3013n77bbz11ltITk4Ona8zzjgDv//97/HZZ5/x/J6Exx57DP/617/w8MMP45577kFBQQFuvPFGvP/++xg1ahR+97vfYevWrZg8eXLYfhaLJfTFhZp2zTXX4N1338XatWtx+eWXh703btw4jBs3Dtu2bTv9zrFmdSWt6JFHHhHnnnuucDgcomvXrmL8+PFaF6ldmTt3rjAYDOKNN94QQgjx73//W1x22WWib9++YuTIkeKTTz4RX331lRgwYIDo27evePDBB8WcOXNEXFyceOKJJzQuffs0Z84cMWDAAJGTkyNcLpdYt26dOPfcc8Vll10m1q5dK1wul/jzn/8srFareP7558X3338vNmzYILp06SKeeeYZrYt/WnM6nWLIkCFi4MCBorKyUgghREFBgaiurg4tHzlyhOf3JLjdbnH++eeLOXPmhNZ5vV5x1VVXifPOO098/vnnwu/3i7feektkZmaKrl27it/+9rciKytLjB49WsOStw9+v19MmDBBGI1GsXnzZiGEEGvXrhUzZ84UTz31lPjPf/4jhFCb8ebOnXvanWNJiMio7zt69Chyc3MhSRKGDBmidXHaFZfLhSeffBJffvklunTpgl9//RW33HILYmJi8Omnn6Kqqgr33nsvrrrqKjz44IPYv38/fD4frrnmGkybNk3r4rdL999/P37++WesXr06tO67777DCy+8AJPJhDlz5iA1NRULFizAU089BZPJBJ/PhyuuuAKvv/66dgVvB/7v//4PTzzxBP785z/j4Ycfxrx587BgwYJQc8iMGTMwduxYeL1eLFq0iOe3hYQQKCwsxIgRIzB16lTcdddd8Hg8MBqNyMvLw8033wybzYZ//vOfSE1NRV5eHubMmQOdToe4uDjcf//9Wv8I7cLf/vY3vP/++5g4cSJqamowZ84c9O7dG4WFhfjll18wbdo0zJw5E7IsIz8///Q6x5rGGjptFBQUiOuvv1706dNHrFy5MrTe7XaLUaNGiZEjRwoh1G8lQqj3TVPL+f1+4ff7xcMPPyxGjx4tnE5n2O2NH374oTj77LPFzJkzQ+c6JydHHDhwgOOzNFNJSYm47777xIUXXiguuugikZWVJV555RUxd+5cMWnSJJGUlCQWLlwYOu88vydm+PDh4vLLLw8tBzsP/vjjj8Jut4t58+ZpVLL2re7NCA8//LBIT08XXbt2FR9++GGoxu2jjz4SkiSJ9957T6tiNonBgkL27NkjPv7449AgQT6fTwghxKJFi4TRaBS5ubm8x/8EFRYWhi1/++23QpZlsXjxYiFE7bkWQojJkyeLvn37hpZ5v//xHXt+9+7dK6677jpx9tlni1WrVoW9d/3114uBAweGlnl+j2/dunXif//7n9i1a1do3Y8//igsFouYNWuWEEL9HQ7+Hk+aNElcdNFFmpS1vWroHHu9XjFt2jTx+uuvh/2NEEKIcePGhb7wnW4YLChM8FtHXc8++6y44oorNChNZPj9738vxo4dK/bv3x+2furUqSI2Nlbs2bNHCCFCoW3jxo0iKipKbN++/ZSXtT1q7Pxu3rxZfPDBB6EhjoN/mJctWybMZrPYu3cvQ0Uz3H777aJ79+4iMzNTWCwW8e9//1sIIURFRYV49tlnhdFoFJ988knYPnfddZeYOHGiFsVtlxo6x8G/B5WVlaKoqChs+5qaGnH55ZeLKVOmaFHc42KwoCatXr1adOvWTbz00ktaF6Xd8fl84s477xSdOnUSer1eTJkyJewPRF5enrjkkktEjx49wkLEu+++K4YMGcLRY4/jeOdXiNqmOyFqayZefPFFMWrUKNa+HYfX6xXjxo0TgwYNEr/88os4cOCAePzxx0VsbKwoKSkRQghx6NAhMWXKFKHT6cS8efPEunXrxI4dO0S3bt3E008/rfFPcPprzjluyNatW8XgwYPFggULTmFpm4/Bghr06aefimnTpgmHw8E/ECdoy5Yt4oYbbhArVqwQ//3vf4UkSWL69OmhdlIh1MFszj33XNGrVy9x4403ihdffFHExsaKhx56SMOStw+Nnd+mnpOwYsUKkZGREaq+p8b95z//EcOHDw8LvVVVVSIzM1N8+OGHoXXV1dXiySefFBkZGSItLU107txZ3HLLLVoUud1p6hx/9NFH9bbftGmTeOedd0RiYqK46667TmVRW4TBghpUXl4urr32WrFs2TKti9JueTwe8fXXX4uKigohhBAvv/yy0Ol04p133gkbwVQI9WFvV199tbjqqqvEa6+9pkVx252mzm/dkSCFUJs/br75ZhETEyNefPFFLYrb7hQXF4s//OEPYb+rNTU1onPnzmL58uX1tt++fbv4+eefxbp1605lMdu1lpzjyspK8dJLL4msrKywB3CejiLmdlNqfT6fL/ScEDo5QghIkoTJkyfjgw8+wAcffIARI0bUG4TJ6XQiKipKo1K2X02dXyEEjh49iscffxzjx4/HyJEjtS5uu+T3+1FdXY2hQ4finXfeweDBg7UuUsQ53jmuqKjA0aNH0aNHD41K2DwcmpIaxVDReoL5/Y033sDgwYMxdepU/Prrr8jJycHUqVPx1VdfAQCsVquWxWy3mjq/U6ZMwcGDBzF37lyGihMQPLc6nQ7V1dUoKSkJDRft8Xjw1ltvIScnR8sitnvHO8dz585FTk4OoqOjT/tQAQCssSA6RerWAPXu3Rt2ux2HDh1CRkYGfvjhh9BQ6XRiGjq/ubm56Ny5M89vK9m7dy+GDh2K/fv3w+l0Yvjw4YiNjcWaNWv4RaSVRMI5Zo0F0Smi1+tDjzd+4IEHsGnTJowdOxb/+9//eNFrBQ2d36uuuorntxUVFBSgZ8+e2Lx5MwYOHIjBgwdj/fr17eaC1x5EwjlmsCA6hfR6Pd5++21MnjwZzz//PN58802tixRReH7bltPpxPr163HppZfizjvvxPvvv691kSJOJJxjNoUQnUJCCHz22Wfw+XwYN26c1sWJODy/bausrAwJCQlYunQprrzySq2LE5Ei4RwzWBARUbPV1NTAbDZrXYyI1t7PMYMFERERtRr2sSAiIqJWw2BBRERErYbBgoiIiFoNgwURERG1GgYLIiIiajUMFkRERNRqGCyIiIio1TBYEBERUathsCAiIqJWw2BBREREreb/Aa9Ba5+o9U42AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vis.show_histograms(data = data, plot_type=\"main\")" - ] - }, - { - "cell_type": "markdown", - "id": "d8d537cc", - "metadata": {}, - "source": [ - "## Display Options\n", - "Similar to other statistics, we can use white_list_features to select only few features to display histograms. We can also use display_format=\"percent\" to allow all dataset and sites to be displayed in the same scale. User can set \n", - "\n", - "* display_format: \"percent\" or \"sample_count\"\n", - "* white_list_features: feature names\n", - "* plot_type : \"both\" or \"main\" or \"subplot\"\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "353db4d9", - "metadata": {}, - "source": [ - "#### show default display format with subplot\n", - "In the following, we display only feature \"Intensity\" in default display_format, with \"subplot\" plot_type" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "8f619729", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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KS8vD7t27cJrr70GvV6Pe++9N9xZIqImYIkFEbVLn376KSZPnoy8vDysWbOm3vE2iKj9YRsLIiIiChqWWBAREVHQMLAgIiKioGFgQUREREHDwIKIiIiChoEFERERBQ0DCyIiIgoaBhZEREQUNAwsiIiIKGgYWBAREVHQMLAgIiKioGFgQUREREHDwIKIiIiChoEFERERBQ0DCyIiIgoaBhZEREQUNGELLD777DOMHz8e6enpkCQJ7777brOPIYTAc889hz59+sBoNKJLly5YuHBh8DNLRERETaIL14mrqqowcOBA3HnnnbjhhhtadIwHHngAH3/8MZ577jlkZ2fj9OnTOH36dJBzSkRERE0lCSFE2DMhSdi8eTMmTJigpjkcDjz++OP4xz/+gbKyMgwYMABLly7FyJEjAQA//fQTLrjgAvzwww/o27dveDJOREREAdptG4sZM2bgq6++wvr16/Hdd9/hpptuwpVXXomff/4ZAPB///d/6NGjB7Zs2YLu3bsjKysL//M//8MSCyIiojBql4FFfn4+3njjDWzcuBEjRoxAz549MWfOHFx66aV44403AAC//PILjh07ho0bN+LNN99Ebm4u9u7dixtvvDHMuSciIjp3ha2NRWO+//57eDwe9OnTJyDd4XAgKSkJACDLMhwOB9588011u7/+9a8YPHgwDh48yOoRIiKiMGiXgYXVaoVWq8XevXuh1WoDPouJiQEApKWlQafTBQQf/fv3B6CUeDCwICIianvtMrDIycmBx+NBcXExRowYUe82w4cPh9vtxpEjR9CzZ08AwKFDhwAAmZmZbZZXIiIiqhG2XiFWqxWHDx8GoAQSzz//PEaNGoXExER069YNt99+O3bt2oVly5YhJycHJSUl2L59Oy644AJcffXVkGUZQ4YMQUxMDJYvXw5ZljF9+nTExcXh448/DsdXIiIiOueFLbDYuXMnRo0aVSd96tSpyM3NhcvlwoIFC/Dmm2/i+PHj6NSpEy6++GLMnz8f2dnZAIATJ05g5syZ+PjjjxEdHY1x48Zh2bJlSExMbOuvQ0RERGgn41gQERFRZGiX3U2JiIioY2JgQUREREHT5r1CZFnGiRMnEBsbC0mS2vr0RERE1AJCCFRWViI9PR0aTcPlEm0eWJw4cQIZGRltfVoiIiIKgoKCAnTt2rXBz9s8sIiNjQWgZCwu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8OHDER8fj0WLFiE7OxtGoxHff/89Xn31VXTp0gXXXnttuLPZak6nEwaD4azbxcTEICYm/O/KalaJxbx58yBJUsDUr1+/UOWtWXQGtrEgIjqX3H///dDpdNizZw9uvvlm9O/fHz169MB1112HDz74AOPHj693v++//x6XXXYZoqKikJSUhHvuuQdWq7XOdvPnz0dycjLi4uJw3333wel0qp9t3boVl156KeLj45GUlIRrrrkGR44caXLed+7ciTvuuAPl5eXq/XTevHkAgKysLDzzzDOYMmUK4uLicM899wAA/vjHP6JPnz4wm83o0aMHnnzyyYBGlrWrQnxVOs899xzS0tKQlJSE6dOnh3wQtGZXhZx//vkoLCxUpy+++CIU+Wo2LUssiIjOGadOncLHH3+M6dOnIzo6ut5t6muIWFVVhbFjxyIhIQHffPMNNm7ciE8++QQzZswI2G779u346aefsHPnTvzjH//AO++8g/nz5wccZ/bs2dizZw+2b98OjUaD66+/HrLctHvQb37zGyxfvhxxcXHq/XTOnDnq58899xwGDhyI//73v3jyyScBALGxscjNzcX+/fuxYsUKrF69Gv/7v//b6Hl27NiBI0eOYMeOHVizZg1yc3ORm5vbpDy2VLOrQnQ6HTp37hyKvLQKB8giImo9IUTYfkd1Bk2TeyUcPnwYQgj07ds3IL1Tp06w2+0AgOnTp2Pp0qUBn//973+H3W7Hm2++qQYkq1atwvjx47F06VKkpqYCAAwGA15//XWYzWacf/75ePrpp/Hwww/jmWeegUajwe9///uA477++utITk7G/v37MWDAgLPm32AwwGKxQJKkeu+pl112GR566KGAtCeeeEJdzsrKwpw5c7B+/Xo88sgjDZ4nISEBq1atglarRb9+/XD11Vdj+/btuPvuu8+ax5ZqdmDx888/Iz09HSaTCZdccgkWL16Mbt26Nbi9w+GAw+FQ1ysqKlqW07OoGSCLVSFERC3ldsp49YFPw3Lue1b8Dnpj695V8e9//xuyLOO2224LuPf4/PTTTxg4cGBAKcfw4cMhyzIOHjyoBhYDBw4MGNvjkksugdVqRUFBATIzM/Hzzz9j7ty52L17N0pLS9WSivz8/HoDi/PPPx/Hjh0DAIwYMQIffvhho9/joosuqpO2YcMGvPDCCzhy5AisVivcbjfi4uIa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vxy+jHcAL774Ip544gn86U9/wsMPP4w33ngDa9asUatDFi9ejPHjx8PlcmHdunW8vs0khEBJSQkuv/xyzJgxA/feey+cTicMBgMKCwtx6623IiYmBn/5y1+QlpaGwsJCrFq1ClqtFomJiXjwwQfD/RU6hOeeew4bNmzA5MmTYbfbsWrVKvTr1w8lJSX47rvvMGvWLCxduhQajQZFRUXt6xqHNayhdqO4uFjcdNNNon///mLbtm1qusPhEGPGjBGjR48WQihPJUIoVSXUfB6PR3g8HvHwww+LsWPHiqqqqoBGxhs3bhRDhgwRS5cuVa91fn6+yMvL48BvTXT69GnxwAMPiBEjRojf/va3IisrSyxfvlysXr1aTJs2TaSkpIi1a9eq153Xt2VGjhwprrzySnXd13jwq6++ErGxseKNN94IU846Nv8uog8//LDo0qWL6NGjh9i4caNa4vb2228LSZLUaqf2hoEFqX7++WexadMmdZAgt9sthBBi3bp1wmAwiIKCAva0aaHa4618+umnQqPRiHfeeUcIUXOthRDivvvuE+eff766zv7+Z1f7+h4+fFjceOONYsiQIWLHjh0Bn910001i4MCB6jqv79l9/fXX4t///rc4ePCgmvbVV1+JqKgosWzZMiGE8jfs+zueNm2a+O1vfxuWvHZU9V1jl8slZs2aJV5++eWA3wghlPYXvge+9oaBBQXwPXX4e/rpp8XVV18dhtxEhv/5n/8R48ePF7/88ktA+owZM0RCQoL4+eefhRBCDdr27NkjoqOjxf79+9s8rx1RQ9d337594q233lIbHPt+mLds2SJMJpM4fPgwg4omuPPOO0WvXr1EZmamiIqKEm+++aYQQoiKigrx9NNPC4PBIN57772Afe69996ABoXUuPquse/3oLKyUpSWlgZsb7fbxZVXXimmT58ejuyeFQMLatTOnTtFz549xbPPPhvurHQ4brdb3H333aJr165Cp9OJ6dOnB/xAFBYWilGjRonevXsHBBF///vfxeDBgzks/Vmc7foKUVN1J0RNycSSJUvEmDFjWPp2Fi6XS0yYMEEMGjRIfPfddyIvL088/vjjIiEhQZw+fVoIIcSvv/4qpk+fLrRarXjjjTfE119/LX766SfRs2dPMW/evDB/g/avKde4Pt9//73IyckRa9asacPcNh0DC6rX+++/L2bNmiUsFgt/IFro22+/FTfffLP46KOPxP/93/8JSZLEokWL1HpSIZTBbC6++GLRt29fMXHiRLFkyRKRkJAg5syZE8acdwwNXd/G3pPw0UcfiYyMDLX4nhr2j3/8Q4wcOTIg6LVarSIzM1Ns3LhRTauurhZz584VGRkZIj09XXTr1k1MmTIlHFnucBq7xm+//Xad7ffu3Sv+9re/ieTkZHHvvfe2ZVabhYEF1au8vFzccMMNYsuWLeHOSofldDrF9u3bRUVFhRBCiOeff15otVrxt7/9rc7YH88884y47rrrxLXXXitWrlwZjux2OI1dX/+RIIVQqj9uvfVWER8fL5YsWRKO7HY4p06dEvfcc0/A36rdbhfdunUTH374YZ3t9+/fL/773/+Kr7/+ui2z2aE15xpXVlaKZ599VmRlZQW82bs9YndTapDb7VbfE0KtI4SAJEm477778NZbb+Gtt97C5ZdfXmcs/6qqKkRHR4cplx1XY9dXCIGTJ0/i8ccfx6RJkzB69OhwZ7dD8ng8qK6uxrBhw/C3v/0NOTk54c5SxDnbNa6oqMDJkyfRu3fvMOWwaTjmNTWIQUXw+OL3V155BTk5OZgxYwZ++OEH5OfnY8aMGfjkk08AAGazOZzZ7LAau77Tp0/HsWPHsHr1agYVLeC7tlqtFtXV1Th9+rQ6XLTT6cRrr72G/Pz8cGaxwzvbNV69ejXy8/MRFxfX7oMKAGCJBVEb8S8B6tevH2JjY/Hrr78iIyMDX3zxBQwGQ5hz2LHVd30LCgrQrVs3Xt8gOXz4MIYNG4ZffvkFVVVVGDlyJBISErBr1y4+iARJJFxjllgQtRGdTqe+3nj27NnYu3cvxo8fj3//+9+86QVBfdf32muv5fUNouLiYvTp0wf79u3DwIEDkZOTg927d3eYG15HEAnXmIEFURvS6XR4/fXXcd9992HBggV49dVXw52liMLrG1pVVVXYvXs3LrvsMtx9993YsGFDuLMUcSLhGrMqhKgNCSHwwQcfwO12Y8KECeHOTsTh9Q2tsrIydOrUCe+++y6uueaacGcnIkXCNWZgQURETWa322EymcKdjYjW0a8xAwsiIiIKGraxICIioqBhYEFERERBw8CCiIiIgoaBBREREQUNAwsiIiIKGgYWREREFDQMLIiIiChoGFgQERFR0DCwICIioqBhYEFERERB8/8BtAPbg90AZHEAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vis.show_histograms(data = data, plot_type=\"subplot\")" - ] - }, - { - "cell_type": "markdown", - "id": "fbf7fc73", - "metadata": {}, - "source": [ - "\n", - "#### show percent display format with default plot_type (main)\n", - "In the following, we display only feature \"Intensity\" in \"percent\" display_format, with default plot_type" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "8655ad63", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAHBCAYAAABKReAoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACFIUlEQVR4nOzdd3wUdf7H8ddsT930SkjoNRCkg10koqLYQFQQ9Lyz4KnYG3YQTzxQVE49D+Tg5FTk/KGiiGADkd47hFDSe3azfX5/LFmISdgEEjfA5/l4jLs7+52Z744h+873+53vKKqqqgghhBBCtGCaQFdACCGEEMIfCSxCCCGEaPEksAghhBCixZPAIoQQQogWTwKLEEIIIVo8CSxCCCGEaPEksAghhBCixZPAIoQQQogWTwKLEEIIIVo8CSxCiHrNnj0bRVHIysoKdFVOy4oVK1AUhRUrVgS6KkKIUySBRQjR5LZv387zzz/fooPO/PnzmT59eqCrIYRoIEXuJSSEqI/b7cbpdGI0GlEUpcHbffrpp9x0000sX76ciy++uPkq2EAejweHw4HBYECj8f6ddvXVV7N169YWHaqEEMfpAl0BIUTLpdVq0Wq1ga7GadNoNJhMpkBXQwhxGqRLSAhRr9+PYUlLS+Pqq6/m559/pl+/fphMJtq2bctHH31UY5ubbroJgEsuuQRFUWqNH/n666+54IILCAkJISwsjKuuuopt27bVOPa4ceMIDQ3lyJEjjBgxgtDQUGJjY3nkkUdwu901yn788cf07t2bsLAwwsPDSU9PZ8aMGb73fz+G5eKLL+bLL7/k4MGDvvqlpaVRWVlJSEgIDzzwQK1zcfjwYbRaLVOmTDmdUyqEOEUSWIQQjbJ3715uvPFGLr/8cqZNm0ZkZCTjxo3zBY4LL7yQv/71rwA89dRTzJ07l7lz59KlSxcA5s6dy1VXXUVoaChTp07l2WefZfv27Zx//vm1umfcbjeZmZlER0fz+uuvc9FFFzFt2jTee+89X5mlS5cyevRoIiMjmTp1Kq+++ioXX3wxv/zyS72f4emnnyYjI4OYmBhf/aZPn05oaCjXXXcdCxYsqBWK/vOf/6CqKrfeemtTnEYhRGOpQghRj3/9618qoB44cEBVVVVNTU1VAfXHH3/0lcnPz1eNRqP68MMP+9Z98sknKqAuX768xv4qKirUiIgI9a677qqxPjc3VzWbzTXW33777SqgvvjiizXK9urVS+3du7fv9QMPPKCGh4erLper3s+xfPnyWvW56qqr1NTU1Fplv/nmGxVQv/766xrre/TooV500UX1HkMI0bykhUUI0Shdu3blggsu8L2OjY2lU6dO7N+/3++2S5cupbS0lNGjR1NYWOhbtFot/fv3Z/ny5bW2ufvuu2u8vuCCC2ocKyIiAovFwtKlS0/jUx03ZMgQkpKSmDdvnm/d1q1b2bx5M7fddluTHEMI0Xgy6FYI0SitW7eutS4yMpKSkhK/2+7ZsweASy+9tM73w8PDa7w2mUzExsae9Fj33nsv//3vfxk2bBjJyckMHTqUkSNHcsUVV/itT100Gg233nor7777LlarleDgYObNm4fJZPKNzRFC/PEksAghGqW+q4bUBsyQ4PF4AO84loSEhFrv63Q1fyU15AqluLg4Nm7cyDfffMPXX3/N119/zb/+9S/Gjh3LnDlz/G5fl7Fjx/K3v/2NRYsWMXr0aObPn8/VV1+N2Ww+pf0JIU6fBBYhRJOrb86Wdu3aAd6QMWTIkCY7nsFgYPjw4QwfPhyPx8O9997LP/7xD5599lnat2/fqDoCdO/enV69ejFv3jxatWpFdnY2b731VpPVVwjReDKGRQjR5EJCQgAoLS2tsT4zM5Pw8HAmT56M0+mstV1BQUGjj1VUVFTjtUajoUePHgDY7faT1rGsrKze98eMGcO3337L9OnTiY6OZtiwYY2umxCi6UgLixCiyWVkZKDVapk6dSplZWUYjUYuvfRS4uLiePfddxkzZgznnXceN998M7GxsWRnZ/Pll18yePBgZs6c2ahj/elPf6K4uJhLL72UVq1acfDgQd566y0yMjJ8l1LXpXfv3ixYsICJEyfSt29fQkNDGT58uO/9W265hccee4zPP/+ce+65B71ef8rnQwhx+qSFRQjR5BISEpg1axb5+fnceeedjB49mu3btwPeILBs2TKSk5P529/+xgMPPMDHH39MRkYG48ePb/SxbrvtNkwmE++88w733nsvc+bMYdSoUXz99de+afjrcu+993LLLbfwr3/9i1tuuYX777+/xvvx8fEMHToU8La2CCECS+4lJIQQ9bjuuuvYsmULe/fuDXRVhDjnSQuLEELUIScnhy+//FJaV4RoIWQMixBCnODAgQP88ssv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ipOSksK9995LZWWlb5+/7xJ6/vnnycjIYO7cuaSlpWE2m7n55pupqKg4xTN7eiSw+CH3EhJCiNOnqipWpzUgS2O69HNychg9ejR33HEHO3bsYMWKFVx//fW19jFjxgwGDhzIXXfdRU5ODjk5OaSkpFBaWsqll15Kr169WLt2LUuWLCEvL4+RI0c26nyVlZWhKEq9LTopKSl89tlnAOzatYucnBxmzJjhe3/OnDkYDAZ++eUXZs2aBYBGo+HNN99k27ZtzJkzh++//57HHnvspPXYt28fixYtYvHixSxevJgffviBV199tVGfpanoAnLUM4kMuhVCiNNW5aqi//z+ATn26ltWE6wPblDZnJwcXC4X119/PampqQCkp6fXKmc2mzEYDAQHB5OQkOBbP3PmTHr16sXkyZN96z788ENSUlLYvXs3HTt29FsHm83G448/zujRowkPD6+zjFarJSoqCoC4uLhawaZDhw689tprNdadON4mLS2Nl19+mbvvvpt33nmn3rp4PB5mz55NWFgYAGPGjGHZsmW88sorfj9HU5MWFj9k0K0QQpw7evbsyWWXXUZ6ejo33XQT77//PiUlJQ3eftOmTSxfvpzQ0FDf0rlzZ8DbWjFv3rwa7/300081tnc6nYwcORJVVXn33Xd966u7mEJDQ+nWrZvfevTu3bvWuu+++47LLruM5ORkwsLCGDNmDEVFRVit1nr3k5aW5gsrAImJieTn5/s9fnOQFhY/5F5CQghx+oJ0Qay+ZXXAjt1QWq2WpUuXsnLlSr799lveeustnn76aVavbljdKysrGT58OFOnTq31XmJiIh6Ph/79j7c0JScn+55Xh5WDBw/y/fff12hd+eCDD6iqqgJAr9f7rUdISEiN11lZWVx99dXcc889vPLKK0RFRfHzzz9z55134nA4CA6uuwXq98dSFAWPx+P3+M1BAosfGkXm5hdCiNOlKEqDu2UCTVEUBg8ezODBg5k0aRKpqal8/vnntcoZDAbcbneNdeeddx6fffYZaWlp6HR1f8We2GJRrTqs7Nmzh+XLlxMdHV3j/RODzYnHB2rVoS7r1q3D4/Ewbdo0NBpv58p///tfv9u1JNIl5Ed1XpEWFiGEOPutXr2ayZMns3btWrKzs1m4cCEFBQV06dKlVtm0tDRWr15NVlYWhYWFeDwe7rvvPoqLixk9ejRr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UVWV0NBQVFVt8ntwncvk/DavhQsXsnLlSmJiYujVqxeZmZmBrtJZp8WeY1XU8PLLL6uxsbHqhx9+qP773/9WBw4cqPbr10/98ssvA121s851112nJicnq+3bt1cNBoP60EMPqTt37gx0tc5qDz/8sNqlSxe1c+fO6uDBg9V169apbrc70NU6a8j5bV5PPvmkGhYWpt54441qz5491aCgIHXy5Mmq1WoNdNXOGi35HEtgOUFVVZV6xRVXqH//+999644cOaI+/PDDateuXdVNmzYFrnJnmZdeeknt2bOneujQIfXQoUPq//73PzUpKUkdM2aMumHDhkBX76z02GOPqampqepXX32lvv/+++qIESPU8PBwde7cuarFYgl09c54cn6b186dO9V27dqp33zzjaqqqlpaWqq+//77qkajUV9++WW1srIywDU887X0cyyB5QQ2m03t16+f+thjj9VYv3fvXvWuu+5SBwwYoJaUlASmcmcBj8fjez5u3Dh15MiRNd5ftGiR2qNHD3XChAnq0aNH/+jqnfUuu+wyderUqTXWjR07Vm3fvr26cOFCaQk4TXJ+m9f333+vJiYmqocPH66x/s0331S1Wq362Wefqapa8/eMaJyWfo5l0O0JtFotaWlp7N69m8LCQt/6du3aceutt+JyuZgzZ04Aa3hmy8vLA8DhcFBZWYlO5x1C5XQ6Abj22mu56667+Prrr/nll18AGbjYFFRVpbCwkIMHDxIZGQmAzWYDYM6cObRu3ZpXX33V9/9HNI7L5ZLz24yqfwekpqaSn5/Ppk2bAO95B7j//vsZN24cDz30EB6PR8YLNZLH4/E9b/HnOCAxqQX79ddfVUVR1L///e+1UuRtt92mDhw4MEA1O7M9/fTTaufOndWioiJVVVX1s88+UxVFUdeuXauqqrd1q9rw4cPV888/PyD1PJvdcsstavfu3X2vq895UVGRGhwcrL722muBqtoZaffu3TVe33bbbXJ+m1BeXp5qt9t9r6uqqtSxY8eq559/vnrw4EFVVVXV4XCoqurtuk9NTVXfe++9gNT1TLVgwQLfz6XH41GtVqs6bty4FnuOpYXld/r378+UKVN44okn+Oyzz7Db7b732rdvT1xcXI1EKvwbNWoU77zzDu+99x5RUVEAXHHFFVx77bVcf/31VFZWYjQacTgcANxxxx3s27ePw4cPSwvLKVq4cCGff/45X331lW/dQw89hNVq5YEHHgC8d2i12+1ERUXxl7/8hS+//JKqqio55w3w6KOPctNNN5GXl+c7X/fddx92u13ObxN47rnnuPzyy+nXrx9XXnkl27dvx2Qyceutt+J2u3nuueewWq3o9XrAe651Oh1utzvANT9zPProo9x8882kp6cDoCgKQUFBXHvttQAt8hxLYKnD448/zp133smdd97Jm2++ya+//sqOHTuYP38+nTp1QqOR09YQDoeDfv36sWvXLrZt28YFF1xAWVkZHo+H4OBgXnzxReLj47n44oupqqrCYDAAkJOTQ9u2bYmNjZXm3VNw/fXXc++99/Liiy9y9dVXc/PNN/Pzzz/Tp08f7r77bv7v//6PadOmAfhuJ+9wOIiPjycoKEjOuR/XXnstH374IR988AHx8fG+89W1a1f+9Kc/8eWXX8r5PQ1PPvkk//znP3n00Ue59957yc/PZ9SoUSxYsIChQ4dy2223sWXLFu6+++4a2wUFBfn+IBInd9111zF//nxWrlzJFVdcUeO9ESNGMGLECLZt29byznHA2nbOAI899pg6YMAA1Ww2q23btlVHjx4d6CqdUd5//31Vr9ers2bNUlVVVT/66CP18ssvV7t166YOGTJE/d///qd+9913ao8ePdRu3bqpDz/8sDpz5kw1KipKfeaZZwJc+zPTzJkz1R49eqjZ2dmq1WpVf/31V3XAgAHq5Zdfrq5cuVK1Wq3qU089pQYHB6svv/yy+tNPP6lr1qxR27Rpo77wwguBrn6LZrFY1N69e6s9e/ZUKyoqVFVV1fz8fLWqqsr3+ujRo3J+T4PdblcHDRqkzpw507fO6XSq11xzjTpw4ED1q6++Ut1ut/rBBx+oqampatu2bdUbbrhBTUtLUzMzMwNY8zOD2+1Wb731VtVgMKgbN25UVVVVV65cqU6dOlV97rnn1P/85z+qqnq7M99///0Wd44VVZX2yZPJy8vj0KFDKIpC7969A12dM4rVamXSpEl8++23tGnThq1btzJ27FgiIiL44osvqKys5P777+eaa67h4YcfZv/+/bhcLq677joefPDBQFf/jPTQQw+xYcMGVqxY4Vv3448/8sorr2A0Gpk5cyaJiYnMmTOH5557DqPRiMvl4qqrruLdd98NXMXPAG+//TbPPPMMTz31FI8+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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHbCAYAAAAzs2v3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACKhUlEQVR4nO3dd2AUZd4H8O9sTw9JSMOQoAZQyRGOEgELao4oRdFTih6I+mKFF0REQIo95hRfEDxz4CmcyoFY0EPFwwjeKREFzkpRkJAIqUDaJtn6vH/M7mQ3jYTMsinfz904M888M/vsJGR/+7SRhBACRERERJ2cxt8FICIiIlIDgxoiIiLqEhjUEBERUZfAoIaIiIi6BAY1RERE1CUwqCEiIqIugUENERERdQkMaoiIiKhLYFBDREREXQKDGiJq0bp16yBJEvLy8vxdlHbZuXMnJEnCzp07/V0UIvIRBjVE5BP79+/HY4891qGDoQ0bNmDFihX+LgYRqUTis5+IqCUOhwM2mw1GoxGSJLX6vLfffhu33HILduzYgVGjRvmugK3kdDphtVphMBig0cjf58aNG4cff/yxQwdeRNR6On8XgIg6Nq1WC61W6+9itJtGo4HJZPJ3MYjIh9j8REQtatinJikpCePGjcMXX3yBYcOGwWQy4fzzz8ff//53r3NuueUWAMBVV10FSZIa9Wf5+OOPcfnllyMoKAghISEYO3YsfvrpJ6/Xnj59OoKDg3H8+HFMmDABwcHB6NmzJ+bNmweHw+GVd+PGjRg8eDBCQkIQGhqKlJQUrFy5UjnesE/NqFGj8OGHH+LYsWNK+ZKSklBdXY2goCDMnj270b347bffoNVqkZmZ2Z5bSkQ+wqCGiNrs8OHDuPnmm/GHP/wBy5cvR48ePTB9+nQlKLniiivwv//7vwCARYsW4fXXX8frr7+Oiy66CADw+uuvY+zYsQgODkZWVhaWLFmC/fv347LLLmvUFORwOJCRkYHIyEg8//zzuPLKK7F8+XKsWbNGybN9+3ZMmTIFPXr0QFZWFp599lmMGjUKX375ZbPv4dFHH0VqaiqioqKU8q1YsQLBwcG48cYbsWnTpkaB0z/+8Q8IIXDbbbepcRuJSG2CiKgFr732mgAgjh49KoQQIjExUQAQ//73v5U8JSUlwmg0ioceekhJ27x5swAgduzY4XW9qqoqER4eLmbMmOGVXlRUJMLCwrzSb7/9dgFAPPHEE155Bw0aJAYPHqzsz549W4SGhgq73d7s+9ixY0ej8owdO1YkJiY2yvvJJ58IAOLjjz/2Sv/d734nrrzyymZfg4j8izU1RNRmF198MS6//HJlv2fPnujXrx9+/fXXM567fft2lJeXY8qUKSgrK1MWrVaLtLQ07Nixo9E59957r9f+5Zdf7vVa4eHhMJvN2L59ezveVb309HTEx8fjzTffVNJ+/PFHfP/99/jTn/6kymsQkfrYUZiI2qx3796N0nr06IHTp0+f8dxffvkFAHD11Vc3eTw0NNRr32QyoWfPni2+1v3334+33noL1113HXr16oXRo0dj4sSJuPbaa89YnqZoNBrcdtttePnll1FTU4PAwEC8+eabMJlMSl8hIup4GNQQUZs1NxpKtGKGCKfTCUDuVxMbG9vouE7n/WepNSOvoqOj8e233+KTTz7Bxx9/jI8//hivvfYapk2bhvXr15/x/KZMmzYNzz33HLZs2YIpU6Zgw4YNGDduHMLCws7qekTkewxqiMgnmpvT5oILLgAgByLp6emqvZ7BYMD48eMxfvx4OJ1O3H///fjrX/+KJUuW4MILL2xTGQFgwIABGDRoEN58802cd955yM/Px6pVq1QrLxGpj31qiMgngoKCAADl5eVe6RkZGQgNDcUzzzwDm83W6LzS0tI2v9bJkye99jUaDX73u98BACwWS4tlrKioaPb41KlT8a9//QsrVqxAZGQkrrvuujaXjYjOHdbUEJFPpKamQqvVIisrCxUVFTAajbj66qsRHR2Nl19+GVOnTsXvf/97TJ48GT179kR+fj4+/PBDjBw5EqtXr27Ta/3P//wPTp06hauvvhrnnXcejh07hlWrViE1NVUZRt6UwYMHY9OmTZg7dy6GDh2K4OBgjB8/Xjl+6623Yv78+Xjvvfdw3333Qa/Xn/X9ICLfY00NEflEbGwssrOzUVJSgrvuugtTpkzB/v37AcjBQk5ODnr16oXnnnsOs2fPxsaNG5Gamoo77rijza/1pz/9CSaTCX/5y19w//33Y/369Zg0aRI+/vhj5ZEITbn//vtx66234rXXXsOtt96KWbNmeR2PiYnB6NGjAci1NkTUsfHZT0RELbjxxhvxww8/4PDhw/4uChGdAWtqiIiaUVhYiA8//JC1NESdBPvU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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vis.show_histograms(data = data, display_format=\"percent\")" - ] - }, - { - "cell_type": "markdown", - "id": "fe527f64", - "metadata": {}, - "source": [ - "### Tip: Avoid repeated calculation\n" - ] - }, - { - "cell_type": "markdown", - "id": "4640b9aa", - "metadata": {}, - "source": [ - "If you intend to plot histogram main plot and subplot separately, repeated calling show_histogram with different plot_types is not efficicent, as it repeatewd calculate the same set of Dataframes. To do it efficiently, you can use the following functions instead show_histogram methods. This avoid the duplicated calculation in show_histograms. But if you intend to show both plots, the show_histogram() should be used" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "a8e6722f", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAHBCAYAAABKReAoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACFIUlEQVR4nOzdd3wUdf7H8ddsT930SkjoNRCkg10koqLYQFQQ9Lyz4KnYG3YQTzxQVE49D+Tg5FTk/KGiiGADkd47hFDSe3azfX5/LFmISdgEEjfA5/l4jLs7+52Z744h+873+53vKKqqqgghhBBCtGCaQFdACCGEEMIfCSxCCCGEaPEksAghhBCixZPAIoQQQogWTwKLEEIIIVo8CSxCCCGEaPEksAghhBCixZPAIoQQQogWTwKLEEIIIVo8CSxCiHrNnj0bRVHIysoKdFVOy4oVK1AUhRUrVgS6KkKIUySBRQjR5LZv387zzz/fooPO/PnzmT59eqCrIYRoIEXuJSSEqI/b7cbpdGI0GlEUpcHbffrpp9x0000sX76ciy++uPkq2EAejweHw4HBYECj8f6ddvXVV7N169YWHaqEEMfpAl0BIUTLpdVq0Wq1ga7GadNoNJhMpkBXQwhxGqRLSAhRr9+PYUlLS+Pqq6/m559/pl+/fphMJtq2bctHH31UY5ubbroJgEsuuQRFUWqNH/n666+54IILCAkJISwsjKuuuopt27bVOPa4ceMIDQ3lyJEjjBgxgtDQUGJjY3nkkUdwu901yn788cf07t2bsLAwwsPDSU9PZ8aMGb73fz+G5eKLL+bLL7/k4MGDvvqlpaVRWVlJSEgIDzzwQK1zcfjwYbRaLVOmTDmdUyqEOEUSWIQQjbJ3715uvPFGLr/8cqZNm0ZkZCTjxo3zBY4LL7yQv/71rwA89dRTzJ07l7lz59KlSxcA5s6dy1VXXUVoaChTp07l2WefZfv27Zx//vm1umfcbjeZmZlER0fz+uuvc9FFFzFt2jTee+89X5mlS5cyevRoIiMjmTp1Kq+++ioXX3wxv/zyS72f4emnnyYjI4OYmBhf/aZPn05oaCjXXXcdCxYsqBWK/vOf/6CqKrfeemtTnEYhRGOpQghRj3/9618qoB44cEBVVVVNTU1VAfXHH3/0lcnPz1eNRqP68MMP+9Z98sknKqAuX768xv4qKirUiIgI9a677qqxPjc3VzWbzTXW33777SqgvvjiizXK9urVS+3du7fv9QMPPKCGh4erLper3s+xfPnyWvW56qqr1NTU1Fplv/nmGxVQv/766xrre/TooV500UX1HkMI0bykhUUI0Shdu3blggsu8L2OjY2lU6dO7N+/3++2S5cupbS0lNGjR1NYWOhbtFot/fv3Z/ny5bW2ufvuu2u8vuCCC2ocKyIiAovFwtKlS0/jUx03ZMgQkpKSmDdvnm/d1q1b2bx5M7fddluTHEMI0Xgy6FYI0SitW7eutS4yMpKSkhK/2+7ZsweASy+9tM73w8PDa7w2mUzExsae9Fj33nsv//3vfxk2bBjJyckMHTqUkSNHcsUVV/itT100Gg233nor7777LlarleDgYObNm4fJZPKNzRFC/PEksAghGqW+q4bUBsyQ4PF4AO84loSEhFrv63Q1fyU15AqluLg4Nm7cyDfffMPXX3/N119/zb/+9S/Gjh3LnDlz/G5fl7Fjx/K3v/2NRYsWMXr0aObPn8/VV1+N2Ww+pf0JIU6fBBYhRJOrb86Wdu3aAd6QMWTIkCY7nsFgYPjw4QwfPhyPx8O9997LP/7xD5599lnat2/fqDoCdO/enV69ejFv3jxatWpFdnY2b731VpPVVwjReDKGRQjR5EJCQgAoLS2tsT4zM5Pw8HAmT56M0+mstV1BQUGjj1VUVFTjtUajoUePHgDY7faT1rGsrKze98eMGcO3337L9OnTiY6OZtiwYY2umxCi6UgLixCiyWVkZKDVapk6dSplZWUYjUYuvfRS4uLiePfddxkzZgznnXceN998M7GxsWRnZ/Pll18yePBgZs6c2ahj/elPf6K4uJhLL72UVq1acfDgQd566y0yMjJ8l1LXpXfv3ixYsICJEyfSt29fQkNDGT58uO/9W265hccee4zPP/+ce+65B71ef8rnQwhx+qSFRQjR5BISEpg1axb5+fnceeedjB49mu3btwPeILBs2TKSk5P529/+xgMPPMDHH39MRkYG48ePb/SxbrvtNkwmE++88w733nsvc+bMYdSoUXz99de+afjrcu+993LLLbfwr3/9i1tuuYX777+/xvvx8fEMHToU8La2CCECS+4lJIQQ9bjuuuvYsmULe/fuDXRVhDjnSQuLEELUIScnhy+//FJaV4RoIWQMixBCnODAgQP88ssv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ipOSksK9995LZWWlb5+/7xJ6/vnnycjIYO7cuaSlpWE2m7n55pupqKg4xTN7eiSw+CH3EhJCiNOnqipWpzUgS2O69HNychg9ejR33HEHO3bsYMWKFVx//fW19jFjxgwGDhzIXXfdRU5ODjk5OaSkpFBaWsqll15Kr169WLt2LUuWLCEvL4+RI0c26nyVlZWhKEq9LTopKSl89tlnAOzatYucnBxmzJjhe3/OnDkYDAZ++eUXZs2aBYBGo+HNN99k27ZtzJkzh++//57HHnvspPXYt28fixYtYvHixSxevJgffviBV199tVGfpanoAnLUM4kMuhVCiNNW5aqi//z+ATn26ltWE6wPblDZnJwcXC4X119/PampqQCkp6fXKmc2mzEYDAQHB5OQkOBbP3PmTHr16sXkyZN96z788ENSUlLYvXs3HTt29FsHm83G448/zujRowkPD6+zjFarJSoqCoC4uLhawaZDhw689tprNdadON4mLS2Nl19+mbvvvpt33nmn3rp4PB5mz55NWFgYAGPGjGHZsmW88sorfj9HU5MWFj9k0K0QQpw7evbsyWWXXUZ6ejo33XQT77//PiUlJQ3eftOmTSxfvpzQ0FDf0rlzZ8DbWjFv3rwa7/300081tnc6nYwcORJVVXn33Xd966u7mEJDQ+nWrZvfevTu3bvWuu+++47LLruM5ORkwsLCGDNmDEVFRVit1nr3k5aW5gsrAImJieTn5/s9fnOQFhY/5F5CQghx+oJ0Qay+ZXXAjt1QWq2WpUuXsnLlSr799lveeustnn76aVavbljdKysrGT58OFOnTq31XmJiIh6Ph/79j7c0JScn+55Xh5WDBw/y/fff12hd+eCDD6iqqgJAr9f7rUdISEiN11lZWVx99dXcc889vPLKK0RFRfHzzz9z55134nA4CA6uuwXq98dSFAWPx+P3+M1BAosfGkXm5hdCiNOlKEqDu2UCTVEUBg8ezODBg5k0aRKpqal8/vnntcoZDAbcbneNdeeddx6fffYZaWlp6HR1f8We2GJRrTqs7Nmzh+XLlxMdHV3j/RODzYnHB2rVoS7r1q3D4/Ewbdo0NBpv58p///tfv9u1JNIl5Ed1XpEWFiGEOPutXr2ayZMns3btWrKzs1m4cCEFBQV06dKlVtm0tDRWr15NVlYWhYWFeDwe7rvvPoqLixk9ejRr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UVWV0NBQVFVt8ntwncvk/DavhQsXsnLlSmJiYujVqxeZmZmBrtJZp8WeY1XU8PLLL6uxsbHqhx9+qP773/9WBw4cqPbr10/98ssvA121s851112nJicnq+3bt1cNBoP60EMPqTt37gx0tc5qDz/8sNqlSxe1c+fO6uDBg9V169apbrc70NU6a8j5bV5PPvmkGhYWpt54441qz5491aCgIHXy5Mmq1WoNdNXOGi35HEtgOUFVVZV6xRVXqH//+999644cOaI+/PDDateuXdVNmzYFrnJnmZdeeknt2bOneujQIfXQoUPq//73PzUpKUkdM2aMumHDhkBX76z02GOPqampqepXX32lvv/+++qIESPU8PBwde7cuarFYgl09c54cn6b186dO9V27dqp33zzjaqqqlpaWqq+//77qkajUV9++WW1srIywDU887X0cyyB5QQ2m03t16+f+thjj9VYv3fvXvWuu+5SBwwYoJaUlASmcmcBj8fjez5u3Dh15MiRNd5ftGiR2qNHD3XChAnq0aNH/+jqnfUuu+wyderUqTXWjR07Vm3fvr26cOFCaQk4TXJ+m9f333+vJiYmqocPH66x/s0331S1Wq362Wefqapa8/eMaJyWfo5l0O0JtFotaWlp7N69m8LCQt/6du3aceutt+JyuZgzZ04Aa3hmy8vLA8DhcFBZWYlO5x1C5XQ6Abj22mu56667+Prrr/nll18AGbjYFFRVpbCwkIMHDxIZGQmAzWYDYM6cObRu3ZpXX33V9/9HNI7L5ZLz24yqfwekpqaSn5/Ppk2bAO95B7j//vsZN24cDz30EB6PR8YLNZLH4/E9b/HnOCAxqQX79ddfVUVR1L///e+1UuRtt92mDhw4MEA1O7M9/fTTaufOndWioiJVVVX1s88+UxVFUdeuXauqqrd1q9rw4cPV888/PyD1PJvdcsstavfu3X2vq895UVGRGhwcrL722muBqtoZaffu3TVe33bbbXJ+m1BeXp5qt9t9r6uqqtSxY8eq559/vnrw4EFVVVXV4XCoqurtuk9NTVXfe++9gNT1TLVgwQLfz6XH41GtVqs6bty4FnuOpYXld/r378+UKVN44okn+Oyzz7Db7b732rdvT1xcXI1EKvwbNWoU77zzDu+99x5RUVEAXHHFFVx77bVcf/31VFZWYjQacTgcANxxxx3s27ePw4cPSwvLKVq4cCGff/45X331lW/dQw89hNVq5YEHHgC8d2i12+1ERUXxl7/8hS+//JKqqio55w3w6KOPctNNN5GXl+c7X/fddx92u13ObxN47rnnuPzyy+nXrx9XXnkl27dvx2Qyceutt+J2u3nuueewWq3o9XrAe651Oh1utzvANT9zPProo9x8882kp6cDoCgKQUFBXHvttQAt8hxLYKnD448/zp133smdd97Jm2++ya+//sqOHTuYP38+nTp1QqOR09YQDoeDfv36sWvXLrZt28YFF1xAWVkZHo+H4OBgXnzxReLj47n44oupqqrCYDAAkJOTQ9u2bYmNjZXm3VNw/fXXc++99/Liiy9y9dVXc/PNN/Pzzz/Tp08f7r77bv7v//6PadOmAfhuJ+9wOIiPjycoKEjOuR/XXnstH374IR988AHx8fG+89W1a1f+9Kc/8eWXX8r5PQ1PPvkk//znP3n00Ue59957yc/PZ9SoUSxYsIChQ4dy2223sWXLFu6+++4a2wUFBfn+IBInd9111zF//nxWrlzJFVdcUeO9ESNGMGLECLZt29byznHA2nbOAI899pg6YMAA1Ww2q23btlVHjx4d6CqdUd5//31Vr9ers2bNUlVVVT/66CP18ssvV7t166YOGTJE/d///qd+9913ao8ePdRu3bqpDz/8sDpz5kw1KipKfeaZZwJc+zPTzJkz1R49eqjZ2dmq1WpVf/31V3XAgAHq5Zdfrq5cuVK1Wq3qU089pQYHB6svv/yy+tNPP6lr1qxR27Rpo77wwguBrn6LZrFY1N69e6s9e/ZUKyoqVFVV1fz8fLWqqsr3+ujRo3J+T4PdblcHDRqkzpw507fO6XSq11xzjTpw4ED1q6++Ut1ut/rBBx+oqampatu2bdUbbrhBTUtLUzMzMwNY8zOD2+1Wb731VtVgMKgbN25UVVVVV65cqU6dOlV97rnn1P/85z+qqnq7M99///0Wd44VVZX2yZPJy8vj0KFDKIpC7969A12dM4rVamXSpEl8++23tGnThq1btzJ27FgiIiL44osvqKys5P777+eaa67h4YcfZv/+/bhcLq677joefPDBQFf/jPTQQw+xYcMGVqxY4Vv3448/8sorr2A0Gpk5cyaJiYnMmTOH5557DqPRiMvl4qqrruLdd98NXMXPAG+//TbPPPMMTz31FI8+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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "feature_dfs = vis.get_histogram_dataframes(data, display_format=\"percent\" )\n", - " \n", - "vis.show_dataframe_plots(feature_dfs, plot_type=\"main\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "17fbd7fd", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHbCAYAAAAzs2v3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACKhUlEQVR4nO3dd2AUZd4H8O9sTw9JSMOQoAZQyRGOEgELao4oRdFTih6I+mKFF0REQIo95hRfEDxz4CmcyoFY0EPFwwjeKREFzkpRkJAIqUDaJtn6vH/M7mQ3jYTMsinfz904M888M/vsJGR/+7SRhBACRERERJ2cxt8FICIiIlIDgxoiIiLqEhjUEBERUZfAoIaIiIi6BAY1RERE1CUwqCEiIqIugUENERERdQkMaoiIiKhLYFBDREREXQKDGiJq0bp16yBJEvLy8vxdlHbZuXMnJEnCzp07/V0UIvIRBjVE5BP79+/HY4891qGDoQ0bNmDFihX+LgYRqUTis5+IqCUOhwM2mw1GoxGSJLX6vLfffhu33HILduzYgVGjRvmugK3kdDphtVphMBig0cjf58aNG4cff/yxQwdeRNR6On8XgIg6Nq1WC61W6+9itJtGo4HJZPJ3MYjIh9j8REQtatinJikpCePGjcMXX3yBYcOGwWQy4fzzz8ff//53r3NuueUWAMBVV10FSZIa9Wf5+OOPcfnllyMoKAghISEYO3YsfvrpJ6/Xnj59OoKDg3H8+HFMmDABwcHB6NmzJ+bNmweHw+GVd+PGjRg8eDBCQkIQGhqKlJQUrFy5UjnesE/NqFGj8OGHH+LYsWNK+ZKSklBdXY2goCDMnj270b347bffoNVqkZmZ2Z5bSkQ+wqCGiNrs8OHDuPnmm/GHP/wBy5cvR48ePTB9+nQlKLniiivwv//7vwCARYsW4fXXX8frr7+Oiy66CADw+uuvY+zYsQgODkZWVhaWLFmC/fv347LLLmvUFORwOJCRkYHIyEg8//zzuPLKK7F8+XKsWbNGybN9+3ZMmTIFPXr0QFZWFp599lmMGjUKX375ZbPv4dFHH0VqaiqioqKU8q1YsQLBwcG48cYbsWnTpkaB0z/+8Q8IIXDbbbepcRuJSG2CiKgFr732mgAgjh49KoQQIjExUQAQ//73v5U8JSUlwmg0ioceekhJ27x5swAgduzY4XW9qqoqER4eLmbMmOGVXlRUJMLCwrzSb7/9dgFAPPHEE155Bw0aJAYPHqzsz549W4SGhgq73d7s+9ixY0ej8owdO1YkJiY2yvvJJ58IAOLjjz/2Sv/d734nrrzyymZfg4j8izU1RNRmF198MS6//HJlv2fPnujXrx9+/fXXM567fft2lJeXY8qUKSgrK1MWrVaLtLQ07Nixo9E59957r9f+5Zdf7vVa4eHhMJvN2L59ezveVb309HTEx8fjzTffVNJ+/PFHfP/99/jTn/6kymsQkfrYUZiI2qx3796N0nr06IHTp0+f8dxffvkFAHD11Vc3eTw0NNRr32QyoWfPni2+1v3334+33noL1113HXr16oXRo0dj4sSJuPbaa89YnqZoNBrcdtttePnll1FTU4PAwEC8+eabMJlMSl8hIup4GNQQUZs1NxpKtGKGCKfTCUDuVxMbG9vouE7n/WepNSOvoqOj8e233+KTTz7Bxx9/jI8//hivvfYapk2bhvXr15/x/KZMmzYNzz33HLZs2YIpU6Zgw4YNGDduHMLCws7qekTkewxqiMgnmpvT5oILLgAgByLp6emqvZ7BYMD48eMxfvx4OJ1O3H///fjrX/+KJUuW4MILL2xTGQFgwIABGDRoEN58802cd955yM/Px6pVq1QrLxGpj31qiMgngoKCAADl5eVe6RkZGQgNDcUzzzwDm83W6LzS0tI2v9bJkye99jUaDX73u98BACwWS4tlrKioaPb41KlT8a9//QsrVqxAZGQkrrvuujaXjYjOHdbUEJFPpKamQqvVIisrCxUVFTAajbj66qsRHR2Nl19+GVOnTsXvf/97TJ48GT179kR+fj4+/PBDjBw5EqtXr27Ta/3P//wPTp06hauvvhrnnXcejh07hlWrViE1NVUZRt6UwYMHY9OmTZg7dy6GDh2K4OBgjB8/Xjl+6623Yv78+Xjvvfdw3333Qa/Xn/X9ICLfY00NEflEbGwssrOzUVJSgrvuugtTpkzB/v37AcjBQk5ODnr16oXnnnsOs2fPxsaNG5Gamoo77rijza/1pz/9CSaTCX/5y19w//33Y/369Zg0aRI+/vhj5ZEITbn//vtx66234rXXXsOtt96KWbNmeR2PiYnB6NGjAci1NkTUsfHZT0RELbjxxhvxww8/4PDhw/4uChGdAWtqiIiaUVhYiA8//JC1NESdBPvU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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vis.show_dataframe_plots(feature_dfs, plot_type=\"subplot\") " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venvpt", - "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.10.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/figs/image_histogram.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats/figs/image_histogram.png deleted file mode 100644 index 94503bd053ab1fdd0595318b3b410a0360405d2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114002 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 LS()B6W`zGAB@4Ji diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats_job.py index 0579a82a9b..f8573fe4ba 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats_job.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/code/image_stats_job.py @@ -22,7 +22,7 @@ def define_parser(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--n_clients", type=int, default=3) parser.add_argument("-d", "--data_root_dir", type=str, nargs="?", default="/tmp/nvflare/image_stats/data") - parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/stats.json") + parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/image_stats.json") parser.add_argument("-j", "--job_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/image_stats") parser.add_argument("-w", "--work_dir", type=str, nargs="?", default="/tmp/nvflare/workspace/image_stats") diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb index 41852256cb..a2ac9fedd4 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb @@ -7,9 +7,126 @@ "source": [ "# Federated Statistics with image data\n", "\n", - "## Calculate Image Histogram\n", + "In this example, we will compute local and global image statistics with the consideration that data is private at each of the client sites.\n", "\n", - "In this example, we will compute local and global image statistics with the consideration that data is private at each of the client sites." + "## Define target statistics configuration\n", + "\n", + "For Image statistics, we are only interested in histogram of the image intensity, so we ignore all other statistic measures. \n", + "\n", + "```python\n", + "\n", + "statistic_configs = {\"count\": {}, \"histogram\": {\"*\": {\"bins\": 20, \"range\": [0, 256]}}}\n", + "```\n", + "\n", + "## Define the local statistics generator\n", + "\n", + "Based on the above target statistics configuration, we can define the local statistics generator. To do this, we need to write a class that implement \n", + "\n", + "```python\n", + "\n", + "class Statistics(InitFinalComponent, ABC):\n", + "\n", + " def initialize(self, fl_ctx: FLContext):\n", + " def pre_run(self, statistics: List[str], num_of_bins: Optional[Dict[str, Optional[int]]],bin_ranges: Optional[Dict[str, Optional[List[float]]]]):\n", + " def features(self) -> Dict[str, List[Feature]]:\n", + " def count(self, dataset_name: str, feature_name: str) -> int:\n", + " def sum(self, dataset_name: str, feature_name: str) -> float:\n", + " def mean(self, dataset_name: str, feature_name: str) -> float:\n", + " def stddev(self, dataset_name: str, feature_name: str) -> float:\n", + " def variance_with_mean(self, dataset_name: str, feature_name: str, global_mean: float, global_count: float) -> float:\n", + " def histogram(self, dataset_name: str, feature_name: str, num_of_bins: int, global_min_value: float, global_max_value: float) -> Histogram:\n", + " def max_value(self, dataset_name: str, feature_name: str) -> float:\n", + " def min_value(self, dataset_name: str, feature_name: str) -> float:\n", + " def failure_count(self, dataset_name: str, feature_name: str) -> int:\n", + " def quantiles(self, dataset_name: str, feature_name: str, percentiles: List) -> Dict:\n", + " def finalize(self, fl_ctx: FLContext):\n", + "\n", + "```\n", + "\n", + "But since we are only interested in two metrics : Count and Histogram, we can ignore other metrics implementation and only implements count and histogram. Here is the skeleton code for this generator\n", + "\n", + "```python\n", + "\n", + "class ImageStatistics(Statistics):\n", + "\n", + " def __init__(self):\n", + " pass\n", + " \n", + " def initialize(self, fl_ctx: FLContext):\n", + " self.fl_ctx = fl_ctx\n", + " self.client_name = fl_ctx.get_identity_name()\n", + " \n", + " # call load data function \n", + "\n", + " def _load_data_list(self, client_name, fl_ctx: FLContext) -> bool:\n", + " pass\n", + "\n", + "\n", + " def pre_run(\n", + " self,\n", + " statistics: List[str],\n", + " num_of_bins: Optional[Dict[str, Optional[int]]],\n", + " bin_ranges: Optional[Dict[str, Optional[List[float]]]],\n", + " ):\n", + " return {}\n", + "\n", + " def features(self) -> Dict[str, List[Feature]]:\n", + " return {\"train\": [Feature(\"intensity\", DataType.FLOAT)]}\n", + "\n", + " def count(self, dataset_name: str, feature_name: str) -> int:\n", + "\n", + " # return number of images loaded\n", + " pass\n", + " \n", + "\n", + " def failure_count(self, dataset_name: str, feature_name: str) -> int:\n", + "\n", + " return self.failure_images\n", + "\n", + " def histogram(\n", + " self, dataset_name: str, feature_name: str, num_of_bins: int, global_min_value: float, global_max_value: float\n", + " ) -> Histogram:\n", + " # do histogram calculation: \n", + " return Histogram(HistogramType.STANDARD, histogram_bins)\n", + "```\n", + "\n", + "Here ```FLContext``` is the context of the current Job workflow, \"identity\" referring to the site identity, therefore ```get_identity_name()``` will return the site name.\n", + "\n", + "You can take a look of the implementation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31517cdb", + "metadata": {}, + "outputs": [], + "source": [ + "! cat code/src/image_statistics.py" + ] + }, + { + "cell_type": "markdown", + "id": "2bdda4a9", + "metadata": {}, + "source": [ + "# Define Job Configuration\n", + " \n", + "\n", + "```python\n", + "\n", + " statistic_configs = {\"count\": {}, \"histogram\": {\"*\": {\"bins\": 20, \"range\": [0, 256]}}}\n", + " \n", + " # define local stats generator\n", + " stats_generator = ImageStatistics(data_root_dir)\n", + "\n", + " job = StatsJob(\n", + " job_name=\"stats_image\",\n", + " statistic_configs=statistic_configs,\n", + " stats_generator=stats_generator,\n", + " output_path=output_path,\n", + " )\n", + "```" ] }, { @@ -45,12 +162,24 @@ "\n", "As an example, we use the dataset from the [\"COVID-19 Radiography Database\"](https://www.kaggle.com/tawsifurrahman/covid19-radiography-database).\n", "it contains png image files in four different classes: `COVID`, `Lung_Opacity`, `Normal`, and `Viral Pneumonia`.\n", - "First create a temp directory, then we download and extract to `/tmp/nvflare/image_stats/data/.`." + "First create a temp directory, then we download and extract to `/tmp/nvflare/image_stats/data/.`.\n", + "\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, + "id": "ae0f0f1b", + "metadata": {}, + "outputs": [], + "source": [ + "! pip install kagglehub" + ] + }, + { + "cell_type": "code", + "execution_count": 1, "id": "b4e64769-17f1-4805-9399-1c141e050065", "metadata": { "tags": [] @@ -66,12 +195,28 @@ "fi\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "519789a2", + "metadata": {}, + "outputs": [], + "source": [ + "import kagglehub\n", + "\n", + "# Download latest version\n", + "path = kagglehub.dataset_download(\"tawsifurrahman/covid19-radiography-database\")\n", + "\n", + "print(\"Path to dataset files:\", path)\n", + "\n" + ] + }, { "cell_type": "markdown", "id": "0562f713-5892-43c7-a3d6-d277c337b5ea", "metadata": {}, "source": [ - "Download and unzip the data (you may need to log in to Kaggle or use an API key). Once you have extracted the data from the zip file, you can check the directory to make sure you have the COVID-19_Radiography_Dataset directory at the following location." + "Download and unzip the data (you may need to log in to Kaggle or use an API key). Once you have extracted the data from the zip file, check the directory to make sure you have the COVID-19_Radiography_Dataset directory at the following location." ] }, { @@ -83,7 +228,9 @@ }, "outputs": [], "source": [ - "ls -l /tmp/nvflare/image_stats/data/." + "! mv {path} /tmp/nvflare/image_stats/data/\n", + "\n", + "! tree /tmp/nvflare/image_stats/data" ] }, { @@ -104,17 +251,11 @@ { "cell_type": "code", "execution_count": null, - "id": "e1ea959f-7282-4e55-bb26-11524ec47e99", - "metadata": { - "tags": [] - }, + "id": "79ba087e", + "metadata": {}, "outputs": [], "source": [ - "from code.image_stats.utils.prepare_data import prepare_data\n", - "\n", - "prepare_data(input_dir = \"/tmp/nvflare/image_stats/data\", \n", - " input_ext = \".png\",\n", - " output_dir =\"/tmp/nvflare/image_stats/data\")\n" + "! code/data/prepare_data.sh" ] }, { @@ -140,7 +281,11 @@ "metadata": {}, "outputs": [], "source": [ - "! python3 code/image_stats_job.py" + "%cd code\n", + "\n", + "! python3 image_stats_job.py\n", + "\n", + "%cd -\n" ] }, { @@ -171,7 +316,8 @@ }, "outputs": [], "source": [ - "! ls -al /tmp/nvflare/workspace/image_stats/server/simulate_job/statistics/image_statistics.json" + "! ls -al /tmp/nvflare/workspace/image_stats/server/simulate_job/statistics/image_stats.json\n", + " " ] }, { @@ -182,19 +328,19 @@ }, "source": [ "## Visualization\n", - "We can visualize the results easly via the visualization notebook. Before we do that, we need to copy the data to the notebook directory \n" + "We can visualize the results easily via the visualization notebook. Before we do that, we need to copy the data to the notebook directory\n" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "a3c89693-37b9-450c-85dd-8a2d78fee3fa", "metadata": { "tags": [] }, "outputs": [], "source": [ - "! cp /tmp/nvflare/workspace/image_stats/server/simulate_job/statistics/image_statistics.json image_stats/demo/." + "! cp /tmp/nvflare/workspace/image_stats/server/simulate_job/statistics/image_stats.json code/image_stats/demo/." ] }, { @@ -202,7 +348,7 @@ "id": "d5c6f632-3326-4236-902e-8c0965688d85", "metadata": {}, "source": [ - "now we can visualize via the [visualization notebook](image_stats/demo/visualization.ipynb)" + "now we can visualize via the [visualization notebook](code/image_stats/demo/visualization.ipynb)" ] }, { @@ -213,15 +359,15 @@ }, "source": [ "## We are done !\n", - "Congratulations, you just completed the federated stats image histogram calulation\n" + "Congratulations, you have just completed the federated stats image histogram calculation.\n" ] } ], "metadata": { "kernelspec": { - "display_name": ".venvpt", + "display_name": "nvflare_env", "language": "python", - "name": "python3" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { @@ -233,7 +379,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/utils/prepare_data.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/data/prepare_data.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/utils/prepare_data.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/data/prepare_data.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/visualization.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/demo/visualization.ipynb similarity index 82% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/visualization.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/demo/visualization.ipynb index c04b07220b..ea51dfe209 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/visualization.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/demo/visualization.ipynb @@ -8,24 +8,6 @@ "# NVFlare Federated Statistics Visualization" ] }, - { - "cell_type": "markdown", - "id": "987e6028", - "metadata": {}, - "source": [ - "#### Dependencies\n", - "\n", - "To run the examples, you will need to install the following dependencies:\n", - "* numpy\n", - "* pandas\n", - "* wget\n", - "* matplotlib\n", - "* jupyter\n", - "* notebook\n", - "\n", - "These are captured in [requirements.txt](../../requirements.txt)." - ] - }, { "cell_type": "markdown", "id": "665dc17e", @@ -37,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "c44a0217", "metadata": { "tags": [] @@ -81,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "93c62d5e", "metadata": { "tags": [] @@ -249,31 +231,24 @@ }, { "cell_type": "markdown", - "id": "2f330eb6", + "id": "ffa1da20", "metadata": {}, "source": [ - "### Tip: Avoid repeated calculation\n", - "If you intend to plot the histogram main plot and subplot separately, repeatedly calling `show_histograms()` with different plot_types is not efficicent, as it repeatedly calculates the same set of Dataframes. To do it efficiently, you can use the following functions instead of `show_histograms()` to avoid the duplicated calculations. If you intend to show both plots, then `show_histograms()` should be used." + "Now, Let's back to [federated_statistics_with_tabular_data](../../../federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "395315a4", + "cell_type": "markdown", + "id": "d3f12a4a", "metadata": {}, - "outputs": [], - "source": [ - "feature_dfs = vis.get_histogram_dataframes(data, display_format=\"percent\")\n", - " \n", - "vis.show_dataframe_plots(feature_dfs, plot_type=\"main\")" - ] + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "nvflare_example", + "display_name": "nvflare_env", "language": "python", - "name": "nvflare_example" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { @@ -285,7 +260,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/df_stats.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/df_stats.png deleted file mode 100644 index da9835b735a00385657bcf17df36d77fb442ece9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139796 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%0A8*8ifpi!G)CsBYpBa-cez&yyZCOG>30%y$Uhqw^ zFCb>+9er#o$}&-&VPjnqV~veW*;vWSD-c_1(0HWL(=_9PX`k%!2Dfw-mHWsd~ha>p4^xwwPvvnBc0RxT&i7eukxa zs8|&jxTw90Ey^vS{Zh|cPdfFAxC~UXX4dmGC5=L*qr#b$Lp&f~rqHU6z2b~{{j?zW zXC#<_MV2=2Cg0A^YV^A%@&myFa_N?p4&%sR|5F6=y(s&U27Z_t(cs?^S`u%;Jn1}# zR>3jZ5=!vuxGTFS5|Z$qMqt2ufkHeCczsPR*y-%^jQ00n0;~}=AL?YGNj-S#+Q>X= zej9RZbh@s^#zKD%q6U$u@d%jLnInm4-ggJf=`uSr@aUm2XiKW5F2-^HB|PoPR9UIK zq`>LaF1<9-Uys<>3s;#sjIsX|3RcsBZcdU3-1NVZb6E3NPncG;yUcawx8~S%Vc%U9 zGOc+S@_C`A@^{$2vGc{&8B5g(W`d}WxmFmfCTn%9iSL?;)lF`BF)=Z4wBYF(!511$ z<8PJuh6ca;Y^J6Zvg$($T2qwEGWe%4Bi=&(^7Qg!7s2D1gmMf0pHg3=rx77Uj56awaseIE zgB~1O&m_*#SPlpz7Y(a6oLeZPN>_eudpU=Su7wy;4*>|?y^}X63XldqFAhC27QgwQ z*z&?Feu&v^BV+UT?$Zp^Nk{5m$>(j!8BGXB1Z6M8K9`~8fKj+xP`V^r`qCS6TZ~jD ztDN=JK4WdGaIFR#B?9}9kYV9j(wR&8A+YR(CcfTkB@JIkROVgU9|-5LBI1JZgrnd- zK_4aqMgr}I-q$D7p=%kBSl*=+ot1Dn%(@sF4+8ph}Nd%ysEHM>g7ks&q7_tTRZwtDb|syBhCi)5V1hnT`KV z(y9c^bkB(fNTnu}qv66;(soAO?MPdL-`$oTP7FK^^!z7=VAzn7`n3}gDU zAa7KO%AmEddc;fG@Wc|b31C*!5T3ZTG>~`op2T)BG78W^WnpSpoZWBlB!sq5xKyMHF5C91`RwSPbH(Lmxo=)#4cFhkvak2nam<8Bi*@9!> z#Abk@gLt@^mUZ1tP~%@6S(@`C=cjFQ z>!AF@!pcnQLCaBb1tQ>1mFEV`8;I`7TEBlS#(LnMiJp(nt>$%H6 z`?J)~eR|zdBly4|h+BM3+v_vbAYGZSD!eZ9iHeR{?@k@FA_l9bf8ORW<|mZ(*s3tc zJ32a5^qI3!MI+qg?$1v#SI|A=gl0?d@KW8h6z#%)J!0YqQmfS1*g@>)d?N^cs>r?c zsT^-&`ErpBm9kCJjT<)@@bPAId7Yhkxp6#rs5hnO(l2GyfRc(EpXcVxG^=}bEX$9S z+|6Ew;mSnv##K?@PfdUx)iIKSQ-x+9msbJ3$)-(1VzdIL{{)f<#H!$@gg!I>k8FQW zMxTj39_0DK#=nWLUM!6P0UN{yCp?w_i%#2bPS;;=xRJFdx0G2q65$Z9!yGx<-cOa9 zfpdaSY;JL*U6&?)6IYJ)W|-J2w`-T5Fh!$r?OYg;;*iT`${ws!pC{@oLqzXbC7 z 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
E{uGrt0=9ZO~>k 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 diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats_job.py index 6666b9a533..e2f3637757 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats_job.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats_job.py @@ -20,11 +20,13 @@ def define_parser(): parser = argparse.ArgumentParser() - parser.add_argument("-n", "--n_clients", type=int, default=3) + parser.add_argument("-n", "--n_clients", type=int, default=2) parser.add_argument("-d", "--data_root_dir", type=str, nargs="?", default="/tmp/nvflare/df_stats/data") - parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/adult_stats.json") + parser.add_argument("-o", "--stats_output_path", type=str, nargs="?", default="statistics/adults_stats.json") parser.add_argument("-j", "--job_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/stats_df") - parser.add_argument("-w", "--work_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/stats_df") + parser.add_argument("-w", "--work_dir", type=str, nargs="?", default="/tmp/nvflare/jobs/stats_df/work_dir") + parser.add_argument("-co", "--export_config", action="store_true", help="config only mode, export config") + parser.add_argument("-l", "--log_config", type=str, default="concise") return parser.parse_args() @@ -37,18 +39,19 @@ def main(): output_path = args.stats_output_path job_dir = args.job_dir work_dir = args.work_dir + export_config = args.export_config + log_config = args.log_config statistic_configs = { "count": {}, "mean": {}, "sum": {}, "stddev": {}, - "histogram": {"*": {"bins": 20}}, - "Age": {"bins": 20, "range": [0, 10]}, - "percentile": {"*": [25, 50, 75], "Age": [50, 95]}, + "histogram": {"*": {"bins": 20}, "Age": {"bins": 20, "range": [0, 100]}}, + "quantile": {"*": [0.1, 0.5, 0.9], "Age": [0.5, 0.9]}, } # define local stats generator - df_stats_generator = DFStatistics(data_root_dir=data_root_dir) + df_stats_generator = DFStatistics(filename="data.csv", data_root_dir=data_root_dir) job = StatsJob( job_name="stats_df", @@ -60,9 +63,11 @@ def main(): sites = [f"site-{i + 1}" for i in range(n_clients)] job.setup_clients(sites) - job.export_job(job_dir) - - job.simulator_run(work_dir) + if export_config: + print("Exporting job config...", job_dir) + job.export_job(job_dir) + else: + job.simulator_run(work_dir, log_config=log_config) if __name__ == "__main__": diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/src/df_statistics.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/src/df_statistics.py index 5078c2f0a9..942bbf692d 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/src/df_statistics.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/src/df_statistics.py @@ -21,10 +21,10 @@ class DFStatistics(DFStatisticsCore): - def __init__(self, data_path): + def __init__(self, filename, data_root_dir="/tmp/nvflare/df_stats/data"): super().__init__() - self.data_root_dir = "/tmp/nvflare/df_stats/data" - self.data_path = data_path + self.data_root_dir = data_root_dir + self.filename = filename self.data: Optional[Dict[str, pd.DataFrame]] = None self.data_features = [ "Age", @@ -57,7 +57,7 @@ def load_data(self, fl_ctx: FLContext) -> Dict[str, pd.DataFrame]: self.log_info(fl_ctx, f"load data for client {client_name}") try: skip_rows = self.skip_rows[client_name] - data_path = f"{self.data_root_dir}/{fl_ctx.get_identity_name()}/{self.data_path}" + data_path = f"{self.data_root_dir}/{fl_ctx.get_identity_name()}/{self.filename}" # example of load data from CSV df: pd.DataFrame = pd.read_csv( data_path, names=self.data_features, sep=r"\s*,\s*", skiprows=skip_rows, engine="python", na_values="?" diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb index a630c65dcc..4e6d4cee41 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb @@ -2,24 +2,28 @@ "cells": [ { "cell_type": "markdown", - "id": "26cb3afa", + "id": "64a17f22-5667-4f99-b4f6-d49116db74b0", "metadata": { "tags": [] }, "source": [ - "# Data Frame Federated Statistics \n", + "# Federated Statistics with Tabular Data\n", + "\n", + "Tabular data is the most common data type in the world; it is easy to understand and manipulate. In this chapter, we will explore federated statistics with tabular data. We will leverage pandas dataframe to calculate the statistics of the local data and the global data.\n", + "\n", + "\n", + "To illustrate with an example, we will prepare the dependencies and prepare the dataset. \n", "\n", - "In this example, we will show how to generate federated statistics for data that can be represented as Pandas Data Frame." + "## Prerequisites" ] }, { "cell_type": "markdown", - "id": "64a17f22-5667-4f99-b4f6-d49116db74b0", - "metadata": { - "tags": [] - }, + "id": "497d44fa", + "metadata": {}, "source": [ - "## Install requirements\n", + "\n", + "### Install dependencies\n", "First, install the required packages:" ] }, @@ -35,6 +39,47 @@ "%pip install -r code/requirements.txt" ] }, + { + "cell_type": "markdown", + "id": "05d9890a", + "metadata": {}, + "source": [ + "\n", + "> Sidebar: \n", + "> **Installing fastdigest**\n", + ">\n", + "> If you intend to calculate quantiles, you need to install fastdigest. the fastdigest not included in the requirements.txt file. If you are not calculating quantiles, you can skip this step.\n", + ">\n", + "> ```bash\n", + "> pip install fastdigest==0.4.0\n", + "> ```\n", + ">\n", + "> On Ubuntu, you might get the following error:\n", + ">\n", + "> ```\n", + "> Cargo, the Rust package manager, is not installed or is not on PATH.\n", + "> This package requires Rust and Cargo to compile extensions. Install it through\n", + "> the system's package manager or via https://rustup.rs/\n", + "> \n", + "> Checking for Rust toolchain....\n", + "> ```\n", + ">\n", + "> This is because fastdigest (or its dependencies) requires Rust and Cargo to build. \n", + ">\n", + "> You need to install Rust and Cargo on your Ubuntu system. Follow these steps:\n", + ">\n", + "> 1. Install Rust and Cargo by running:\n", + "> ```bash\n", + "> cd NVFlare/examples/advanced/federated-statistics/df_stats\n", + "> ./install_cargo.sh\n", + "> ```\n", + ">\n", + "> 2. Then install fastdigest again:\n", + "> ```bash\n", + "> pip install fastdigest==0.4.0\n", + "> ```" + ] + }, { "cell_type": "markdown", "id": "94faaa6b-08fd-485c-87d5-53b4520177fe", @@ -43,10 +88,14 @@ }, "source": [ "\n", - "## Prepare data\n", + "### Prepare data\n", "\n", "In this example, we are using the UCI (University of California, Irvine) [adult dataset](https://archive.ics.uci.edu/dataset/2/adult)\n", "The original dataset already contains \"training\" and \"test\" datasets. Here we simply assume that the \"training\" and \"test\" data set each belong to a client, so we assign the adult.train dataset to site-1 and the adult.test dataset to site-2.\n", + "```\n", + "site-1: adult.train\n", + "site-2: adult.test\n", + "```\n", "\n", "Now we use the data utility to download UCI datasets to separate client package directory to /tmp/nvflare/data/ directory.\n", "Please note that the UCI's website may experience occasional downtime." @@ -61,9 +110,13 @@ }, "outputs": [], "source": [ - "from code.df_stats.utils.prepare_data import prepare_data\n", + "%cd code/data\n", "\n", - "prepare_data(data_root_dir = \"/tmp/nvflare/df_stats/data\")" + "from prepare_data import prepare_data\n", + "\n", + "prepare_data(data_root_dir = \"/tmp/nvflare/df_stats/data\")\n", + "\n", + "%cd -" ] }, { @@ -71,7 +124,7 @@ "id": "c5444d8f-4938-4759-bd43-831013043c23", "metadata": {}, "source": [ - "#### Let's take a look at the data" + "Let's take a look at the data" ] }, { @@ -122,7 +175,175 @@ "jp-MarkdownHeadingCollapsed": true }, "source": [ - "> Note **We will only calculate the statistics of numerical features, categorical features will be skipped**" + "> Note \n", + "We will only calculate the statistics of numerical features; categorical features will be skipped." + ] + }, + { + "cell_type": "markdown", + "id": "ae3bb5a4", + "metadata": {}, + "source": [ + "## Define target statistics configuration\n", + "\n", + "\n", + "Let's see what statistics we want to calculate, we can capture the statistics configuration in a dictionary, the key is the statistic name, the value is the statistic configuration.\n", + "\n", + "```python\n", + "\n", + " statistic_configs = {\n", + " \"count\": {},\n", + " \"mean\": {},\n", + " \"sum\": {},\n", + " \"stddev\": {},\n", + " \"histogram\": {\"*\": {\"bins\": 20}, \"Age\": {\"bins\": 10, \"range\": [0, 100]}},\n", + " \"quantile\": {\"*\": [0.1, 0.5, 0.9], \"Age\": [0.5, 0.9]},\n", + " }\n", + "```\n", + "\n", + "For each statistic, we can configure to give additional instructions for each feature. While count, mean, sum and stddev are defined in such a way that the calculation will be the same for all features, for histogram, we can define different bins for each feature. \"*\" is a wildcard for all features.\n", + "```\n", + "\"histogram\": {\"*\": {\"bins\": 20}, \"Age\": {\"bins\": 20, \"range\": [0, 10]}},\n", + "```\n", + "here, we define a histogram with a histogram with 20 bins for all features, the range is not defined, which means the range will be calculated from the data.\n", + "We also defined 10 bins and range [0, 100] for the feature \"Age\".\n", + "\n", + "Similarly the quantile is defined for different features with different values. This can be specified with Job API\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d17a6a9", + "metadata": {}, + "outputs": [], + "source": [ + "!cat code/df_stats_job.py" + ] + }, + { + "cell_type": "markdown", + "id": "b1857b89", + "metadata": {}, + "source": [ + "If a user only wants to calculate statistics except for quantile and histogram, then the configuration can be simplified as:\n", + "\n", + "```python\n", + "\n", + " statistic_configs = {\n", + " \"count\": {},\n", + " \"mean\": {},\n", + " \"sum\": {},\n", + " \"stddev\": {},\n", + " }\n", + "\n", + "```\n", + "\n", + "Similarly, the code can be changed to \n", + "\n", + "\n", + "```python\n", + "\n", + " skip previous code\n", + "\n", + "\n", + " statistic_configs = {\n", + " \"count\": {},\n", + " \"mean\": {},\n", + " \"sum\": {},\n", + " \"stddev\": {},\n", + "\n", + " }\n", + " # define local stats generator\n", + " df_stats_generator = DFStatistics(data_root_dir=data_root_dir)\n", + "\n", + " job = StatsJob(\n", + " job_name=\"stats_df\",\n", + " statistic_configs=statistic_configs,\n", + " stats_generator=df_stats_generator,\n", + " output_path=output_path,\n", + " )\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "f102f6b9", + "metadata": {}, + "source": [ + "## Define the local statistics generator\n", + "\n", + "Based on the above target statistics configuration, we can define the local statistics generator. To do this, we need to write a class that implement \n", + "\n", + "\n", + "```python\n", + "\n", + "class Statistics(InitFinalComponent, ABC):\n", + "\n", + " def initialize(self, fl_ctx: FLContext):\n", + " def pre_run(self, statistics: List[str], num_of_bins: Optional[Dict[str, Optional[int]]],bin_ranges: Optional[Dict[str, Optional[List[float]]]]):\n", + " def features(self) -> Dict[str, List[Feature]]:\n", + " def count(self, dataset_name: str, feature_name: str) -> int:\n", + " def sum(self, dataset_name: str, feature_name: str) -> float:\n", + " def mean(self, dataset_name: str, feature_name: str) -> float:\n", + " def stddev(self, dataset_name: str, feature_name: str) -> float:\n", + " def variance_with_mean(self, dataset_name: str, feature_name: str, global_mean: float, global_count: float) -> float:\n", + " def histogram(self, dataset_name: str, feature_name: str, num_of_bins: int, global_min_value: float, global_max_value: float) -> Histogram:\n", + " def max_value(self, dataset_name: str, feature_name: str) -> float:\n", + " def min_value(self, dataset_name: str, feature_name: str) -> float:\n", + " def failure_count(self, dataset_name: str, feature_name: str) -> int:\n", + " def quantiles(self, dataset_name: str, feature_name: str, percentiles: List) -> Dict:\n", + " def finalize(self, fl_ctx: FLContext):\n", + "\n", + "```\n", + "\n", + "\n", + "NVIDIA FLARE has implemented ```DFStatisticsCore```, which is a core class for calculating the statistics of the data frame. We can inherit this class and override the methods to calculate the statistics. Here are a few assumptions:\n", + "\n", + "* data can be loaded and cached in the memory.\n", + "* data has the proper column names and can be loaded into a pandas dataframe.\n", + "* The feature names can be obtained from the dataframe.\n", + "\n", + "```\n", + "def load_data(self, fl_ctx: FLContext) -> Dict[str, pd.DataFrame]:\n", + "```\n", + "which loads the data into a dictionary of pandas dataframe, the key is the dataset name, the value is the pandas dataframe.\n", + "\n", + "Let's take a look what the user needs to do to implement the local statistics generator. With ```DFStatisticsCore```, the user needs to implement the following methods:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ad902da", + "metadata": {}, + "outputs": [], + "source": [ + "!cat code/src/df_statistics.py\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c9eb7c51", + "metadata": {}, + "source": [ + "# Define Job Configuration\n", + "\n", + "Each FLARE job is defined by a job configuration, the configuration includes configurations for the clients and server. Optionally, the job configuration also contains the customized job code. You have seen this in [Job Structure and configuration](../../../chapter-1_running_federated_learning_applications/01.6_job_structure_and_configuration/understanding_fl_job.ipynb)\n", + "\n", + "For now, we can define a FebJob via FLARE's Job API, here is Statistrics Job we havea predefined for you\n", + "\n", + "```python\n", + "\n", + " job = StatsJob(\n", + " job_name=\"\",\n", + " statistic_configs=statistic_configs,\n", + " stats_generator=df_stats_generator,\n", + " output_path=output_path,\n", + " )\n", + "\n", + "```" ] }, { @@ -130,6 +351,9 @@ "id": "5c4da328", "metadata": {}, "source": [ + "For this example, we simply hardcoded the column names, but in practice, users can get the column names from files such as CSV files, parquet files, etc.\n", + "\n", + "\n", "## Run Job with FL Simulator" ] }, @@ -148,7 +372,10 @@ "metadata": {}, "outputs": [], "source": [ - "! python3 code/df_stats_job.py" + "%cd code\n", + "\n", + "! python3 df_stats_job.py \n", + "%cd -" ] }, { @@ -166,9 +393,10 @@ "id": "45bf6e9a-3265-4e45-8b06-c8e543605f21", "metadata": {}, "source": [ - "With the default parameters, the results are stored in workspace \"/tmp/nvflare/jobs/stats_df/\"\n", + "With the default parameters, the results are stored in workspace \"/tmp/nvflare/jobs/stats_df/work_dir\"\n", "```\n", - "/tmp/nvflare/jobs/stats_df/server/simulate_job/statistics/adults_stats.json\n", + "/tmp/nvflare/jobs/stats_df/work_dir/server/simulate_job/statistics/adults_stats.json \n", + "\n", "```" ] }, @@ -181,7 +409,7 @@ }, "outputs": [], "source": [ - "cat /tmp/nvflare/jobs/stats_df/server/simulate_job/statistics/adults_stats.json" + "ls -al /tmp/nvflare/jobs/stats_df/work_dir/server/simulate_job/statistics/adults_stats.json " ] }, { @@ -197,14 +425,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "a3c89693-37b9-450c-85dd-8a2d78fee3fa", "metadata": { "tags": [] }, "outputs": [], "source": [ - "! cp /tmp/nvflare/jobs/stats_df/server/simulate_job/statistics/adults_stats.json code/df_stats/demo/." + "! cp /tmp/nvflare/jobs/stats_df/work_dir/server/simulate_job/statistics/adults_stats.json code/demo/." ] }, { @@ -212,9 +440,17 @@ "id": "d5c6f632-3326-4236-902e-8c0965688d85", "metadata": {}, "source": [ - "now we can visualize the results with the [visualization notebook](code/df_stats/demo/visualization.ipynb)" + "Now we can visualize the results with the [visualization notebook](code/demo/visualization.ipynb)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef94e26f", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "fda06c0b-798d-480d-9b4c-a62fab95bcf0", @@ -223,15 +459,23 @@ }, "source": [ "## We are done !\n", - "Congratulations, you just completed the federated stats calulation with data represented by data frame\n" + "Congratulations, you just completed the federated stats calculation with data represented by a data frame.\n", + "\n", + "Let's move on to [federated stats with Image Data](../federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb)" ] + }, + { + "cell_type": "markdown", + "id": "70459712", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "nvflare_example", + "display_name": "nvflare_env", "language": "python", - "name": "nvflare_example" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { @@ -243,7 +487,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api.ipynb new file mode 100644 index 0000000000..69eb19ebf2 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api.ipynb @@ -0,0 +1,248 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "58149c32", + "metadata": {}, + "source": [ + "# Transform Existing Code to FL Easily with the FLARE Client API" + ] + }, + { + "cell_type": "markdown", + "id": "06203527", + "metadata": {}, + "source": [ + "The FLARE Client API offers a straightforward path to transform your existing machine learning or deep learning code into federated learning applications. With just a few lines of code changes, you can adapt your training logic without restructuring your codebase or moving code into different class methods. This flexibility applies to both traditional machine learning and deep learning frameworks. For PyTorch Lightning users, the process is even more streamlined with dedicated Lightning API support.\n", + "\n", + "You can see detailed examples with actual integration across different platforms including PyTorch and TensorFlow [here:](https://github.com/NVIDIA/NVFlare/tree/main/examples/hello-world/ml-to-fl)\n", + "\n", + "In Chapter 1, you have already seen the Client API in action with pytorch. In this section, we will focus on the core concepts of the Client API and explain some of the ways it can be configured to help you use the Client API more effectively.\n", + "\n", + "Then we will see how to use the Client API with PyTorch Lightning, and traditional machine learning algorithms such as Logistic Regression, KMeans and survival analysis." + ] + }, + { + "cell_type": "markdown", + "id": "be7efa36", + "metadata": {}, + "source": [ + "## Core Concept" + ] + }, + { + "cell_type": "markdown", + "id": "76102eac", + "metadata": {}, + "source": [ + "The general workflow of the popular federated learning (FL) follows the following steps:\n", + "\n", + "1. **FL server initializes an initial model**\n", + "2. **For each round (global iteration):**\n", + " * FL server broadcasts the global model to clients\n", + " * Each FL client starts with this global model and perform the local training on their own data\n", + " * Each FL client, then sends back their newly trained model to the FL server\n", + " * FL server aggregates all the local models and produces a new global model\n", + "\n", + "On the client side, the training workflow is as follows:\n", + "\n", + "1. Receive the model from the FL server\n", + "2. Perform local training on the received global model and/or evaluate the received global model for model selection\n", + "3. Send the new model back to the FL server" + ] + }, + { + "cell_type": "markdown", + "id": "50e2b7dd", + "metadata": {}, + "source": [ + "To convert a centralized training code to federated learning, we need to\n", + "adapt the code to do the following steps:\n", + "\n", + "\n", + "1. Obtain the required information from the received `FLModel`\n", + "2. Run local training\n", + "3. Put the results in a new `FLModel` to be sent back\n", + "\n", + "For a general use case, there are three essential methods for the Client API:\n", + "\n", + "* ``init()``: Initializes NVFlare Client API environment.\n", + "* ``receive()``: Receives model from NVFlare side.\n", + "* ``send()``: Sends the model to NVFlare side.\n", + "\n", + "Where `FLModel` is a data structure like this:\n", + "\n", + "```python\n", + "\n", + "class FLModel:\n", + " def __init__(\n", + " self,\n", + " params_type: Union[None, str, ParamsType] = None,\n", + " params: Any = None,\n", + " optimizer_params: Any = None,\n", + " metrics: Optional[Dict] = None,\n", + " start_round: Optional[int] = 0,\n", + " current_round: Optional[int] = None,\n", + " total_rounds: Optional[int] = None,\n", + " meta: Optional[Dict] = None,\n", + " ):\n", + " \"\"\"FLModel is a standardize data structure for NVFlare to communicate with external systems.\n", + "\n", + " Args:\n", + " params_type: type of the parameters. It only describes the \"params\".\n", + " If params_type is None, params need to be None.\n", + " If params is provided but params_type is not provided, then it will be treated as FULL.\n", + " params: model parameters, for example: model weights for deep learning.\n", + " optimizer_params: optimizer parameters.\n", + " For many cases, the optimizer parameters don't need to be transferred during FL training.\n", + " metrics: evaluation metrics such as loss and scores.\n", + " current_round: the current FL rounds. A round means round trip between client/server during training.\n", + " None for inference.\n", + " total_rounds: total number of FL rounds. A round means round trip between client/server during training.\n", + " None for inference.\n", + " meta: metadata dictionary used to contain any key-value pairs to facilitate the process.\n", + " \"\"\"\n", + "```\n", + "\n", + "You can use the Client API to change centralized training code to\n", + "federated learning, for example:\n", + "\n", + "```python\n", + "\n", + "import nvflare.client as flare\n", + "\n", + "flare.init() # 1. Initializes NVFlare Client API environment.\n", + "input_model = flare.receive() # 2. Receives model from NVFlare side.\n", + "params = input_model.params # 3. Obtain the required information from received FLModel\n", + "\n", + "# original local training code begins\n", + "\n", + "new_params = trainer.fit(params)\n", + "\n", + "# original local training code ends\n", + "\n", + "output_model = flare.FLModel(params=new_params) # 4. Put the results in a new FLModel\n", + "flare.send(output_model) # 5. Sends the model to NVFlare side.\n", + "\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "494e4079", + "metadata": {}, + "source": [ + "With 5 lines of code changes, we convert the centralized training code to work in a\n", + "federated learning setting.\n", + "\n", + "After this, we can use the job templates and the Job CLI\n", + "to generate a job and export it to run on a deployed NVFlare system or directly run the job using FL Simulator.\n", + "\n", + "To see a table of the key Client APIs, see the [Client API documentation in the programming guide](https://nvflare.readthedocs.io/en/main/programming_guide/execution_api_type/client_api.html#id2).\n", + "\n", + "Please consult the [Client API Module](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.client.api.html) for more in-depth information about all of the Client API functions.\n", + "\n", + "If you are using PyTorch Lightning in your training code, you can check the [Lightning API Module](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.app_opt.lightning.api.html). Also, be sure to look through the [Convert Torch Lightning to FL notebook](../02.2_client_api/convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb) and related code." + ] + }, + { + "cell_type": "markdown", + "id": "4a09d80e", + "metadata": {}, + "source": [ + "## Client API with Different Implementations\n", + "\n", + "Within the Client API, we offer multiple implementations tailored to diverse requirements:\n", + "\n", + "* In-process Client API: efficient for single GPU training\n", + "* Sub-process Client API: flexible for multi-GPU or distributed PyTorch training\n", + "\n", + "\n", + "\n", + "### In-process Client API\n", + "\n", + "In this setup, the client training script operates within the same process as the NVFlare Client job. This configuration, utilizing the ```InProcessClientAPIExecutor```, offers shared memory usage and is efficient with simple configuration. \n", + "This is the default for `ScriptRunner` since by default `launch_external_process=False`. Use this configuration for development or single GPU training.\n", + "\n", + "### Sub-process Client API: \n", + "\n", + "Here, the client training script runs in a separate subprocess.\n", + "\n", + "Utilizing the ```ClientAPILauncherExecutor```, this option offers flexibility in communication mechanisms:\n", + " * Communication via CellPipe (default)\n", + " * Communication via FilePipe (no capability to stream metrics for experiment tracking) \n", + "\n", + "This configuration is ideal for scenarios requiring multi-GPU or distributed PyTorch training.\n", + "\n", + "Choose the option best suited to your specific requirements and workflow preferences.\n", + "\n", + "\n", + "## Client API communication patterns\n", + "\n", + "We have two different implementations of the Client API tailored to different scenarios, each linked with distinct communication patterns.\n", + "\n", + "Broadly, we present in-process and sub-process executors. The in-process executor entails both training scripts and client executor operating within the same process.\n", + "\n", + "\n", + "On the other hand, the LauncherExecutor employs a sub-process to execute training scripts, leading to the client executor and training scripts residing in separate processes. Communication between them is facilitated by either CellPipe (default) or FilePipe.\n", + "\n", + "\"Client\n", + "\n", + "\n", + "\n", + "### Choice of different Pipes\n", + "We suggest using the default setting with CellPipe for most users.\n", + "\n", + "CellPipe facilitates TCP-based cell-to-cell connections between the Executor and training script processes on the local host. The term cell represents logical endpoints. This communication enables the exchange of models, metrics, and metadata between the two processes.\n", + "\n", + "In contrast, FilePipe offers file-based communication between the Executor and training script processes, utilizing a job-specific file directory for exchanging models and metadata via files. While FilePipe is easier to set up than CellPipe, it’s not suitable for high-frequency metrics exchange. On the other hand, FilePipe might be a better choice for scenarios where the training script is running on a remote machine and the client executor is running on the local machine.\n", + "\n", + "\n", + "## Client API Examples\n", + "\n", + "All implementations can be easily configured using the JobAPI's `ScriptRunner`. By default, the in-process is used, however setting `launch_external_process=True` uses the sub-process with pre-configured CellPipes for communication and metrics streaming.\n", + "\n", + "To find out more about the Client API, and its pipe configurations, please refer to the [Client API](https://nvflare.readthedocs.io/en/2.4/programming_guide/execution_api_type/client_api.html). In this tutorial, we will only use the in-process for simplicity. You can follow the examples in [ML-To-FL](https://github.com/NVIDIA/NVFlare/tree/main/examples/hello-world/ml-to-fl) for sub-processtraining. with different pipe training. \n", + "\n", + "In the following sections, we will see how to use the Client API with PyTorch Lightning and machine learning algorithms.\n", + "\n", + "\n", + "* [Convert PyTorch lightning to federated learning](../02.3_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb)\n", + "\n", + "* [Convert logistic regression to federated learning](../02.4_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb)\n", + "\n", + "* [Convert Kmeans to federated learning](../02.4_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", + "\n", + "* [Convert survival analysis to federated learning](../02.4_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)\n" + ] + }, + { + "cell_type": "markdown", + "id": "fffcd761", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nvflare_example", + "language": "python", + "name": "nvflare_example" + }, + "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.10.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api_communication_pattern.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_client_api/client_api_communication_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5038377888d5acec42d9040d7ee3e35f21b185 GIT binary patch literal 52686 zcmb?@WmJ`G+pU3wA_z)J35Xym(%r2{OQ&@A0tA$hPH7ONq`L$cAl)gYw1jjC(s(X( zzwfut7~lDK*4TRt2V<>gJO=U3zs%T1;3Op|d{aYI*0!nc()3v~*UUozlZ7Vio1Q9A8RF%7=yY_q|^X zQp%i(Gg03X6aEnBeea5|@GI$emjXq(a09rSa6VJWi8kRG+{$g$cZlhJZ%c(4fAWZP zT+adFX|r@&(BpKyh+k)`z{Pl`Sg>G+wZDhYVSOFx!qokM^6#r(&G<6T-&ZS^59i;1 zMfwvW0|WlN_*!P4iv4*lP@vlU^C4^&#O=TDbPZ@s`uoNXQOxPTZxkal*#778ySM&- zTvBIcIQQ+yK&{hSTR3^@yLV^XbE2p2>*FjAgzax`67QwC?Jbv@eR&YwU1DrSNhxFb z_fB+#x5?PehaWz5a$-Lx<9Ac`=H%(oCs`XSmYk7|W74j%zqYUIb+$h|tc*$7oLCtc zKwJ9v!CbF3x({VaOUyO--T3+Q=l*P+#aL0_J6rvos8o5*fD@^)EP3TI_RyvUF_^wcsOjPUv5p; z!54LX>7GK_vYT&9GuGFqsKqAbx#P^&HY;{#^z~IVCLLr>+~h|)!{6s;yK5tJ&HnWC z^!xSlN=oGpKl)Zz%`^B4(6GtYvC-b4N;skvt^ur((33{5V+T749-V8>&x@a9JL>?4_ir_~A(crH5#{sF?Mv z($8NLHfz+n9{YILpCxm>wtm?qaJ)=aSG>_8*X=s?N`Y)Nfz@Q8+)SvL!|Gd3xUDy@ z+aB#Vq{SGMV>l5j>eSiE!Ay+<4Ub$3pV_FK-j@$g-H^O5Fy}Bo3>nCWr}wJ9jW4Wb3w>6NmGkGh_OB#WCv^wPo1+1bg18YC8J)gC(4{1-(6#m`3mcJ|14$tzdqBe$qvoy8YPN zMAED2mGL(i-a-^h>qB(41&S~v!^$;=@pYTNViV|VaPh^SrlzLesyiUN8>%ki@N;*! zM6tAna6~@p`Lo`i{^Xuq11!$#<8MYZFOO0ii?Q2pe5*9R*$zphLP}c2_i_RLWis5} z6?=WF{-mfD)p8o?su-}*uPb;Yrl_F6Qkinjr?SPMUAyNcEBN>&S1$#W(x}dNyea<#2yYHv{Vm>n^tqlLG^KB#FVqC{Ur z+<6?A2P!R|he)nkPJY~h(lDfVe;mR_+1o-zMJ2P1>dc@vhr{dqlye%$h8fvxcZj14n4W4IrB&o(Q*2halD{qy2?7bTXA+k0i zveJNYxe9Yc_Uu7)N=ngn$k#NwlQ_N%aXqu7I{sJKuM!QYws$!EpXdeSGe+HX8p%^J z7QARzGMAR-jQRNyadB}OFLoC?A4}=zq%5M?xZe5hGUGwB7{vfpD@(#!@?$%3?#QS& zC#8|Kbj|1)KeE(94W9QXj=~}!RO5<-8X1mN1VHs}HY5eZL zqD9zxwDjHvwDD_TI;;ZpuCO68{imRf)~r6o=!k%+>I%- zJzekdDVoZwllh9hoaXfr3xd*H->Pkx{Q?fubk*b|jlatI%JxEuW1&&a*mFP@5+nEH zR1(itLkU?#MsU)yi>(M6C+v$Pm%6z}UdpjL zEIrBB-*?+#s;lQo86e1jR;v< zQ2IoLl!asR+P2%aM9$`1ME)H|b2U_(@a0D0?s5l|;}NvLaA-6gV=^)_j~_oC9#e|? z%#d`$n|7c;VrwUMw$5~rGFt1StuWpCM0LNtHz#UEGJVC&P%@8`40%$LI}$SLcDHnQ zO-)UJUo1XS<#9XCW5p~1icYP7xLq4h&-#tYDt@o?m-p`;iRH`o0-&Iq7xtC5E7A@h zMo8}}s+;j4{7Jo43}XYo@6Bm;c6Jr4d7`B6lQj+j4i=*Y-0r^$zV@q= zRAR*#mxiW4=2#nezQ9g|94pk!rlZZ<;o(QjvwrAe8H8q1BcNdEKCuIo#rhMM&+k0PlgMF`kshM!1dRNW5Ia@Kd-w%+x4W9}*Zdl9o+ zEQZ)d-wbJ03m>(bMiQ|GzgvMS7*cPJpQy#`tkg)%7>C^o!B#@8$LL$njT+oRXa$f1 zAl=LGY#^eq1us$}xzNybV&ISx7@Lv z3g{Ctr@0=8(W($A$gM zWzei*P@JD}-{OzXuZ}xd8?%AB6NtrEj%i$o>tr!4|13axc>aGCr4+i;dlLA{8UO60mQc6!(q|gSVqm` zUmN-7*9x?#JPq?n*Z5dO{KJhD6e9C7!f$^fbiMT6J3OdVRQT0!Tsh(67Xc|EIBqJ% z^X=jJPQKeVoHPhS?X_z0+1vDsev;dkHLr{CUDZD9YX%S=e;C>pco zh4O2dE|xx?dEH!vR5N&!kb=YWNGs<=Eg+!dMpUh6I8gv?1Oq|i319;*xwYZk+lp)= zAH|4C`m{gVUM5AaM#CaeYw+a98nTry4DWKrK@L(p6KiIn3DX<2@|#4l=9MO1guLUb z`u#nad7y;Fux;6}e9dR#aAzLJPT{7H;plz8bb&C|LE|UrQ;>K;!wBy0t&QAWkxc`k zo$O@DW~_8h2Fq(NJRL*svabSi&v`YN&fO4W7}(so_R7DjIpmROhEMuXpx(TjnHMPGeXuc6t->7fq3RLB za2`F>ImlAcx%pMLch=OS*<9B_(K4K0D2dsLL7y4Omr91qXZG#hWC?cbLuuB}z5%nt zbDGdNM$Hdh`y6bXhzW}4Y#r=(>~(|W8%k>|iS=wuM|1oWV$fu3b(wc7Bz!bXk8N(H z37qXIu^Zzd_fyj^U^>!gxcByym~^YX_2*I9SSD?AZr34aZ%*8ZjTUkzWp2yyNBQSE zo9XG4Dq&Qd+|s$tk$HHyY$)mT!?{X>rEdG??6}cVIzogBc)lpIkx=-PF>a%;=E*_0 zMif!|eHT)`&LX!jR4El2*Pf!@XGTHtoT^D`8v>wu17!8l8(d^M zYIY>NtNE;Ta%PG&2$7*Ch4ant@e?C%Jeow~UvW6H5;B>GHhE}N48&->wjVpoo&O_*KNs_Q9B4NG(K zM~PF7o(u-~>YVJji>DMZO$y328*Pu0GYS}W-KqKboa~%wxV74iQshGv9&;RdK=g5N z-NuK_9f=SHk42Pv&!pqkk^KEGXtkb6EAeb*QOB>vFbN+CtyVumgp+V9jzsG^t{)TN zqSttgd3-Jx6)EG3Bu|PXdrH8d_DaMu_;>#E-?3L1DEUvjuibCs!Y1RRoo}I3^!xdv zUve%_C0|+k0*G)+&H>mP38zxC!}STB4fT8D*YNUaw>yq`Vl&0ONGDW}mzVVHfPlZN z>zQ4z`9(QU=@sxep3MjluS4t@sL&FdmyZUM&XH}w;2^2e#uJ5o%~^<>n;SB+fCcsS zhDm1>brPqIsv#A$m!=f_uNT{}%NirnOV$`;T7GKyB1ZBW`hHRQgBr|fy2w0Vsy#LO z8rl9L+z4OKHpQvv390ST{?h#0KG1{}{8sI)=a!rdY!A2fb7z`n>j2amg@qDxe(UQu zcK@|LSWFrFrJ?sa!cA(F-0*!|x74k1<<8~743(#B59(61-lSpEA7})`&_B^fVop~%ST#S_^%yBPc{cypX0U0tkW*!|<3IE;Uty$@?%s%n;YL+^E@*>KzbZAZxwBAq!KK#(H}P-7{l?hu;<_YrDF-cHM9- zCsDREtF3c+LL=I_^4HCMfgU)?Pqg-~PI(>qVK`7r1zk3lL1BM?Hq_X~UQgmNE35xa z;x{GP*^ZxD8;K3S^xOEG>u-eK2r|Vu+SI3Yht>+ zIhf&3$MW2YpU6ibDXmm6Xf|}whL5**h)mY_leMO{_Pe|{G3iemhYR)%{BKMvr0!Us z5?rRFG{?|+0gTM_k?xBTUHZ`b88abPoXEGT@0=ZOBds=~snT}}bc`6LpxFN3F5?6=s$v_VocDONB{j>p7Si2xhXZ)^FX$R`$ z-+OhgI6$xh+vwVUz2;R|Kme`k`2nfJ&Uf(`6b736P&J4XP;!O5vSJtc60}h5h>-he z7Wvg}h84%%Zx<*u70_(52;NR?zoqrrpaF!S9cY{EN^uX#%s(Ue+e0BpPNpE>l zjgBQF$67HzIj41U9?44X($}wF+Xyc@G+)z~DKW8yTvWkLxkNT;(mhFUsRB9qPngqg zzsi%_L)Mr%t18AE+36ACciCm|oHxEXZO=9?R|3DJLio#Dpa0M)$BWse$H(QqY35Ey zb>~|eps5BCy3w^qUlC@`%kSnCP;8bbs*C9=lJno~d#Th0v-J(kdTdSed*I)a1U@K3 z@H1wlS|7zH?CH=5u^{SV=AS@6u5RU&uQGGFK=EmHiY-4QyrIQDe&$w6oFdhpDF_r8 z@1#3&C+*SnytaY@h2aG&xtrMf=V7u?by=l`kDY4LZejPO@aM0>(>OP`hY;VA9oFni z!b6JAQ29N{Pkl5@{xWM4>8eEBB*IiVPmJ7n!@2V&YdYQtxzD5Q*mwekzRj=>ufU+@ zbwi}x8&n%wdU_>4)F-k!nAYuVh_!~>`k@^`16#|g1j(N)i809qCJPjvd5I^S>>F?* zN2iAR+&Kks&scUZh~bp)E7p*U8u2qOoL1jnB)i_WX*l}@J$gU!_)F%V@mI78uyy`p9ub=nJSKvGSa0G>@{7)c`6A}{KTvb(L&rO+R-7SXG#e??} zM36HLUJV+;Q47L?Uq9(Lqdu%47BH7<$T$IrblkdeWv!^JOmQTTP429x1Q{Tk%w^Z~ zF}BfusJJ$cOtnBQ&CTj-nRra_1FxuCFxxQzQk7i@U3Tus*dOkvwf^=1pFvGex%{rc zRo#zT%(kn;56^yF@|bA5*Vc*^`*XsdZ$VeVNhGyJLQIU&WXBOS09S_ZoHv^&><3{u zyME&a4F83KF?8m@=?J*)F2G~p`2X6R%D3*Z4g_kO(uWji<-L_JtF9XL&MAY zR8>?G&P49T0_R9-M$|p9K6WMGT|hxc#9@9BuW1@oc_75~%7xuRMz{=HjV3myKKV-_ zEx(q*(iyPl&Zvsi=rSJ)>C^KA)4tdp7phZ+kI$r~rll2vb8Nv1QO29H`G7K=E8s5= zeTA8d%IAVvM*ihHrSmc~ea8}R<0z19cfSFRBI-^tD-C7(;UC^S{r;a2y+eLlPXVLm zi+Buod3J1MY@Ar99S?MJ7%6Yh5W2w0dU=UpcKuEp zF|Y$1vYMjtZ5K?>HR7;-AUUAj%g7Kg>$C{WP1rQByWfB1dwu!_J_9m69s$ITMLGQ zQj!I{WW0et7HKTA?nMk>+pv?Mm4v?lG>d20q+*_f{B-PdHVF`w{q8?#uHyBo+NYOG^ayC z-c%aP@wd8!YbGq*2pL!FxI#(Ybui-b#iYqe6(kl^B*7kP$NM zH8k$tb)Ij#sd-~sE%SoZ9mbppDe0!5r@!$Y6A*AmR~DhB(H6iD1|3|^jy0I8&X+|&@ll#uTRpO&+yvt3&;}jF(iOeTIcTZ z2prD(07S{SiuT@Ih{R)QaS<5Vxl07UC0vea5e0|muS8xuf)phE_JO{p$Y%*c_xVuH z1<|o$UBQ==+xlXhL(Es`3~0) zU||=F=A)zU5ZxMNYke&hXixM5%2$NA(L!1y@gUAsnd)_X)j|zF>m%SWqNve76Q-@N zQLkqH^#rF;kDSBv>zz*#t!rsBcmq?W4S5(UOmf|v+qz1NiFkiz( zQa$Cj{#Xq(ZTdn~WF$`NTeIiII;}Vhnl^P#Yomq!*yO<3kpBK|I$rQ&yv*pvar#xs z&s=hq?`HX}CqL3d_SL^s$6_O3(mDk2=ydm9c};W&Ll0@3B6fIOHc#gfYjfq3^&ajk5PD<+EB2^_ zq#%pD-38Likk2&m$sHW!F3<}KmQZZOo@Q!cY{Lyiw@I1{5lb$gqwvy)oWjm7x7FX+ zrxx+A8`iqZ=l;v`$mM%Wps5cj6GGBlVtn!5qCPWwe`lvKGsf?LuNjiz5>zVNvAXn+ zJRN81Jtp$7rz1a*aV~jN!J=HR8n`MMj)a}%+8cgmHy^J^_7svT3ud0o4<9Zt0DJ^! zrb5B?oH)^3smbg5ih%tI0{N9voZ*)lH%9o#K!d+tWk4 z7Gs8+n6wU7lIYVgHVwu_8K7)QB;q)8OVyy*7*4}9Xv$5qigxqv9>}B8ZK{pLKc`_~ zj#bCU^$qAkpYU7vT$2QC`HtQWvX5lYZT9nPW3w}=Xq+0zif|u85-gBlSS`0Dl!H{<{Zc7%E-EO9_OdWH-)3&gM6o&Q>~Y5Za9rSrx&@6+qwnT|joHHKBZ1*^WFbG{bVY3ezzc05NP2j5RKi>+ zb2e1_)-PH62Si?l68(s7Ma7#b+zubKEXmz+T{De+wXqb*ekuNh>Qt!Ppi^t~EI=j0 zoAXyPh)hEV5ORcpJjGH0{_(HsOZAv3E z%0#na--Z5?VGI1K)VE_(Bj3x$t#($5uf(rUca%zn2SmaieFPRuRTW=A=@65H6LF!* z?nAeH37u+K%!TUpZDE2m0`lLiCVlsOyQQZFW*M>V>1k<&mZI|;7eid&%7F3%@uxr9 zT_s&vS#e%K1qJyceJ4QCRR`!>{RCuieL*Uk>Vx&KK0^6)RO3)IM5U!Mb|0a>Jlh}J zux;eMD3E9q+%BOCegf3z?_8!E>#<&wuU&a763@eV$|4ibU$Nk0FaY)eWh zoOrVkzzeN<%TFGMPv^=b0EJXAu=F8Yl(n=N7Dup1T2)n5-@tUmKP`ei%~cd55_p+Q zrj6xbywuRBq62r8WAJ^{MM;d3t*o}0vF2_39z!B>?Q=J zKk63n(o|QwrG)BGpI|5NGHe2%eD4nW;=?|_@2~C`cR5LgM|D!r(6r|X{s@^0HZSqj z=e55&VDBoHoQ6bdodso+71di$@vOhd)VFU8^VSYcG))!oSor>u-5w7~#ZEP3FLW*c zoM?sTiFO_1l`k>$Z7SQIU}|u7uG$kPUQl%4-5s8P<4%7e-Qi#4J4o8LGa`ZfW%2qk%t1)L7wzFpvh^b=@MFyC}@-;uz;>b2WD+Ma7hBKb&|Qn~EDcg4_i zO#;(a%!2r=hB>{!|57gUDo&N=VMP-J(#CY%$?^W0ak%Z~OhdRHxm($Dc=@B#5%{h} z@VTsyzn%(Hm@Yv549yRuLh31qrHHTX3r%5jFv15cj!jqH!f;wo4&0a$g&J`o#eunkOwhBSYwh`Yy6q|Ck&PRybk-Go6v>wFt#}737=l}aZ^A3*TZ)-p>CD< zE&Tg?BK(Y5#Wn{-cBzUa|GP*f3o7~&6gC@JnE(24i3syUY(|RT7lx;X**}YOg`SE^ z)GLyZ`7t(O(Nh`Y3*ZJ^l6sz5nRj-PPMwCTs&VWCmcJ`s5~A1kW$JSC>{DUycpkH% z`{it9{Q@TiJK;ia@%U8K)Z(L}3}PRYs%qZ8@K&WfHsE;Xf`B<1Usc_n zf9w_PF#6@@=0Yh4jNS({s5}C40fb+DWm>2!TQK%y z*~8HDz?Vq)VniwQK7hD%+h6rNj(-PbEkBY5@9(n2?1iQ-xU)gvI+Fn&wOF!YOOxSfC-TFb5)y)$kiLsGGj zbr^O+y`BRazg6@s3y>Qw@{jF6x5i$)%Nq#TxN-~>{jvD}8Vk5ra;3?3qvw|I}_psnD`%=IR5iuzP%+Ql4+gD$9Z zINNyjl-G6l1uVb`)PKdWXr@2iVVO|#*|psl&3|+C78c4#a0?;QC#W&Wy9Iq(>BE!A zO=uL^TsmN%1Iqrw5@fkuL>@W?`U9Yk9NVQHqC1`^8`X*c%jXAX&sqs|-*2yfEl=}< zNqW}?LhM}J0u7UJpvp>9#cHW10k`DKmoG3u&J1Ca@+hmwlKp+sfqVA(8BgkxuDr2` z^}esT9lPs;hTYXrdVSjd1GxSM6%oq=X#=y`8XD$ib0q4uP|p=V8u#9P$Uslu+yKf! zT+(Nid+o~i5f@V`Df%zPdcZYK8*Ykoe@oe$u>=|nRGaI#+;5Rku)&$I(x_Q<&^802 zb#FY&)v0$pP7v7o^EDdG;mT>xQUwB9pd!N4KYR8J`{pzxgsC))y|OYgqs6++CR0Eb zg^S$Zz5!jL&W#;L$VHeRLGb)c2-m*KJBL2l0udw=FN&)+TGHXI>0*mZO%$;Eqm2NQZ@GvIbbt0PoUL8m|Bes-i034 zXbLbnVq;O=0v?~0p1ayBmCsd?th5M_AQ_kKEa)7oX69Gs8>K?J6zgH?deTSx?4NCY zzpOv;U9;s%Xk$_i^|aesVMRp+6bwp{ZlfQtQJnM&A%E}aHB5yR`ovyDJ>H>faXHjr zFB%5w_Qe^eWYT?@7iXo49=ei5bj(H7~hSA~S_^dk?ew8{nQm5lN8^7wZeM?!axg7|+$!zXsvae}Kp~AI|YQohJt$ z(b?IS*YAm$a}IX){REQ~SD-(B>+(Bhpe!y2^W+2`6JBpNz$C7l)d=bK=RAw7Blr@j*S`=rl7H8QiYqc;99i*{`;^Dm;~q<4X2CD z&|BAUFeA6ay-u&19SQzEx=>4d^BCXQ8T1eee(*Na4~l2{5XKR&5=hHLh`bv1Q&vn& z*ob>;b7^Js{@%i2B^l)bv*%8*FaM>FAWZ^)tK+dhlKT7f$HmG)_0U#UcHH>JUY^qa zNc;(bk|gl}ZUtJQ$V88u*g^sgFGD%Q09Qj}tR-AHx?+|2k;$r@#O>s_)3ss~n714O z#Z7>3FLM&;KRkSV0QQM78W*BbRu|p4_kD0g2&%LM2cr?9M~19`PBO`xH45LKt!>gCjvSy*bjmx7bq_ ze=+}5`f+>7a`*%&M%|Y?t*{LMih9-wxZpAmmk1oJeo>__nOaukN?qK0&ymv?I!>pk zgrvp!4`E{qwUU8oPtZLTz9Z4U*)yr#9M^ceA)lqX8+Y%FEE@gf$I|tQB_IZjO-vg0 zhGaW`U9#Eu9iMYwPqWggvi$n9U+{Oa*I74|*mxI)%M57cXgD=`ew(V^ zp+AW&1GyWlH5Na}J$5L6IXS!&=1Wu_efpur)j4iPR8IP=7fatntc-;7IXT8>I*X|@ z2geW&$XMjz_h5ZNCFyIjm%1;@Hm?hdJ^i!lHk7vidThysmS}aE^ZTHs?_)T7{?ohTt9W1G;s?v|S@3;6W>$QJTg|pCJ zi6)^&UBG%3(b(YMbSKd3ncJslQ%wzmEcY2xiyjMlz8_cuxgFdwUjQ3$o#I+I$p3Z?Pd@Yy500!WCE{u~j%i90vZ6nqe(ch)_&teh z`V(4guj2LBS$o~O=ev+7)o_)&1{b0Ie=jnDhDGf{ZjOVcMQNgIWKCc8b7mUWnZn0{ zn>1(ROQU6gR=}KFm6Ou}k8<~aS&y{J53(t{&$q4hEzaDZxex75(fxdG;YU6(83efH z_m|Z3ih_b3`0)P!vLk+@iA=6}ehM6Y8ud8Go0xP*7BQ7CZ-)vBR@FFpoFDxF%nxXn z!~IsI&)+or{4{@ZSlZY+Hav+($Fy)ID*NRfq~VbA%sXLfufoUV>?%8kNt)W$)|(c^ zb;hx{|L@NkL>bRhsXpDG`nk{{ncowBA}v_OjdQy4%nNAc59%^vnA5M@kDj9ZJHACM zp2qRv<+Bl^m43T&c37}}|3`)jetsca%IWx$m@Pm?s4J_0OpUSAGutmJ*o@fh2Nmnp z`>dSZ?N3RWD@GkVl{_(~ORZ=)jc0bc>3+)cI(b?;c*j3B>dG&!H;=`o=Kp`Ka*);g zeK|{Jj#_EY|p5CRQ>3kdxO zz}y7#;4_2FgPob}Q(UBG{n5%x$CWa7u+~q*41d%AYyWS!xWT8iHh=PoWUhJ`cb@CG zwlYx5SYu9K{_m2!m4nj?JK$>VTF2o9abuI%2B{zG*8exa851@Em46u;N?8wJ1h?@T zpf)hO!=NZX2VAysxEtW#s7N7@rNC+gR7{VIT`BZaI5SgT(fYk%?uZi6&ga)ZWVEoUui)Ck% z_C5f?x|gi<_U}`wNd|IGC*-Yt$4CX1b(pKj1zvsx6|twMXK&B3JgWKWw#4U;aKHmb zMoydQkS>7QZ1kZt7iy5`1hM1!Lu9UR2kDLw+Db1Vc`W=2iUY*Vr$Gt=uX|w zj-AR=`i~4^j?yDhA)3;l(i3={t?BkErr$TFp0M`&SIK+}JSk`~aD@x4ordNIu#}+K zpd$d_3l#$smHw%$%pQg=kK?@rE;|EQDRAGH7`9{WiQgj;^n7VfH7dd7R7vNfWbCYy3@{0JmD0Gze9-&jH>mFnCRH z-#iBohAajCg_uW;Fq|`_Fyse^g<`1KJ%k}+zLz_9Nl~diu$mzwE~ke(FxkI&@!}p{ zhAj|yiVjD+i-Z&syx{f2_%)6Tf=5Wy<*TS2$Kp2tGczTnZcmpWM0yWjP0L3p-$g*`NWPLSXhN zroU+YS4y!xwA>c3oxK#s4$4j);7!K@jmp*0LQT~(ycO6#G0w69px*{xH!C^bYo&1e z+NV!1G7Jdj#*G_Bw-(49k!Qaq&@H88I{bm=l9HDaAbiBhN#MaEM>3y&HE^xGU*HSz zZT7!;E5@(wtFI1k<+4_-b`2-xRed)legI+;HMqiw*6ctzST4%Rk)JPpHye6MRa^TX zxuBr(+70}B_3004SUmK3-g8=5Tui$~4dR`cAMnnezt0X#QAdF$k5llz6;^mn z_&JA<*_RI&G8M=Qf`a58gM9BU!=VOly!js3a7C^{bKmh5d#X$sugeJG0gi2f**Sv7%RB5&-XBr9oX z9QzBNHbU`IeO4dZQzkTjimGYQSDd6;llvvJr11o*)Kyf>l4LD3iSrt_{XCUaFU7Ug zKtJUD4dJtk!z6~H=be3hv76WehwovK&)I$q|DagcBSP<3|9<$(b!oi5rF7eyH?8s#=Iv{FUIG{ECJ*=arI;WKlU;*)MBUhK51l z@KEu4<+ZPZAvG3Xi*izBHPPialSUn+vF|yvjVp+7zf;Y3*UAD;-qABL_4W6svY8FR z0`^Y7o()!cKyKv)4e$1VLqER@2;|TM9`bXmv2^pzE*Wv};G`ZsCD}=yfm3WG-{%qE z)^Q|vl64RMAi)QIH>as2LYBu%=YeS%1Ukni#%rPAy_WmKqii7U9tU&@f~)?*5SD4X z*cEfZE~na2A4#U*!GN-8j<%|-s@nGGH~N1vWD4qf!};;r>P%43^^m-R0?bBt$P2~z zn3ybY&T|=xs60EPT)XhuNnv@i# zeB6mnSPgRvi^#gjqyA*>iz6r9(z|KY=IQ1mCmzkR-)60<_1?+}jnjMX4N8uu!$D3C z&r?KA6(s`KE5^@iZhvj8^gwDn2DhqrSj+2VVg{NS@x>acZ@SP!y>wUnlm?8;{H>Cb zl7Ry4{>5(l?``({4ZYr?pJBk^)WPipa?#K!laMaxh`mVN50a9CjBQtHj+oQBqm$?L zJh7`MZdf=Dqoql*eOU|+uV6(fHnDA^0foQX!C zQZKonr|74+A<;;Gkf-WFX^F^J zEsR?GnGtc=IPnQzqE4D75lkosI&KG>a8BhEj)Fjx7Xfc#oFyc6s$yKR4eb75i01wU zF?ANWUIsRk54z~{sLmm9hH7ZbRRInpg?o7O92k;xeaOycRx1&5)0gy(JhkbF;AqGH zC3o1xAuFo)p@48o;EP5{ds|$bx=eI*%DPKW8TvwV1DJV~?$(qu4F$7IH89XvPxjlC zzc4ZBf5%(B6D4IUHPsXV9UFILn?C5M73VZZA!DyHLbY)->gDO(yB>4eU`i=YsSeS0I& z3oIp_hzg_#l;XTte1|91UTcOad^z~8U&RN*_hzzO4I-pxN%;&vr| z(M$=LR(vE)o)NhLic-t61{DSnih2@TM$TC9uK% zW#DJ#aC0B{pj15AXELMpW|-oZtiM%AqoSyv{HYRwC3ADKCP2Ec&KL*Yv8dziCsCy$ z*2%=LN-prb^trl(Z$zu3{3>{?ic~PrIr9rz^kdtUsgm-in_y)8?hwR30WO%5q$V`M z)*~yqGgSmQR$Loj%kJKIfBL<60xV?f=rs?+hUQjji4t3jS5;*g4 z-D{q^<6KGG$b^7F4itmV&d$ct4|l#ZW7)~b%34@hK=}_o=DMp{>zGTr`;9PevcI?t zSbd=M0I#t<`PSg@Lk>l@hbv6oW*Ql&O;gXhUCdLN9tSD{+Q>jCONU$)5_v(s(h@<} z{B=Ty$RLsIAM{{8U*c?NEb#N36K84A51%E*m{#MBb+)zPb;-vf<|qK>@|sP-Bn0)h zxoKrKn`yq6Q@^%m1V>zD<&BIM!B)P2@Blu*JedhDz%m?FIr~9w7>M`Oph3c0Tz&V5lR-^H4C9$TT{-~DCWmfqZm?~GN}Z)NXrtKV6HtQNr8&SbG0YaZ;UnK~{A?x|kC=pceejA=B!!(ymW%?THYEm3~2m z?OQpL8L!`UWJo))*EX@BGn=YhN#9X<^YmabPS+YK_e4)5mddevIQx9seT!ldj`aw| z%nIE=BcnsWv0F5M>7i~etrkxVNhPTcu1BJ2$Oa(+s+>1xA$PMk_yS4+A%mIpke<3N zt$;6I(X%VWWV^4syF58n)h_xYxZ_E#&E2vXcrWbSp-EUu(5i6T`HlVzGRJbfWDXRO zh-y9qv)KqtcX0+aZBi9RQ(MDYa)ieJ3;L!!>XxT_J`)K1L0^)CTk&^C^zyX!`t9N}@TH_H*} zP9NU=T=8Ot@#Oddp&A<-=mzqP6JPX(RZTJGgvUnL>jiC1gE6rH{?VIMt=D*k#CSGBwEo-P3DuQ*Lv-|Ze+a=FhQ*7dPg?UD z_-KYaadmgn1n+ zo{4?`GD2b=kOzYboASJ5#QA(Uv5su-2YwYMUdRdo6VgP5nbNW*VOAqovJUxXZ*Ui! zAsamC<(!$Ub+QO2<6oE~y^!w&J&_xH9bfE=1mXN6G07#tgGmSDhYE^ilUu3_&EcfN zpWFfzoiiFI!nVsu*6$39`#`C0%CV$DY_*u8FzZURV)Vuuz_|L-sv|3A{LJHYr(MnT zP~;oH0#M)5jcZLS)cGC9f9F5D=t`DwvRL1ZCQxOnlK1)-=m4EX9kX(6+uzn+St zPp_UB!XT+Q6CRfsoHOSAA1)@_FI@+=2-hOCBQ)$Vlfb98Td2duD6?S1ema!9ugYd7 zg-m$)>~1}NZC6QJUI*h|eaaBW2#v_WTdsnpxi7y_a|rGtMX?DM)$S1CQG-z`@)(R* z?NW-#pFS;)ACo>%`a`AK& zIOD<4%O<^v)Xe3Fz!WMa|8QIOX}S5~WLW80LYA2HN~dQ#L-4&I*WImCmsbNpIi$Lpffy=tGth(c~G84@ee^$Gcey_dHskS%Qf_4l4(RP zUr>A6!>|jAaZmQXBhgbh$dmX23%|+UGyU-gYqOJ1*fnBK3^IY2glNiXjl6rd3Sr_S z(gfYE2(j^5Mibs|JOdP*q#d(d){$|{t8t&I4Yp&csCg$f3HN6iyIV%d{L}QphACs- zssId&XqIK5Cov+j2@7F;7I!}~obPKSbRjVuBrIJvfED}j8X8LX-1_#`DL3KP zE^)bR@6GAMzVc*Qq%zbq*#(!|R0w|$rO5N1%y{rk(AKBx-1rZB^bX(rqgzs`XQzvD z524!cQ|>{!z+qF-H*d=piq+Zik;D#@Pu}tD&xZ?6gOX(&U@j<_O&2ww!qHf>py_(F z7$=*UUUk%#;Nv%tZQ(cZtjmWC>S%#Xi68b|Hd;1>KN*uMZ+kjG$f(PO=#83kZ~7D2 zEi$f>J{Bk9+mj!agG@TcmoO_q*&6sEPlrC8$Bh48<+p(Xi3f}eH_;O8$G_4c+LEMP z%bu}yQwCI2H}&BJD%90WdGU&5#x34^1sxTOy;!RzDkg^ds|xn?t4qe*2Uoir#&3hz z`vV-mz!$Xj83Dl9!I-Z4c^3N6fCDEA)LcE@Fdizt=J>pSRG>+#tpq znZqI(Zy|QU*<_#?it?Ooe%cydYl+xUxco_v9rvKbMfG`fXIyfCfhX0qEx=JZmB@y< zq@nHoSFT?xEeMQ-M}tq7^-#8;re7yU?uZAE6h3V%q+Q~Cqfv(cU#gLDFls-Ei;TNx z=oZGg=M+~&NLsDR-dV4W=a&)#zK+bo;|@l@Gb^M29 zr0Q4Sg_!&8=`69nC-Xr-(3n zU{h1mogcY8yTyFPKR|&Gb)>auhtt>hYyo3AH_yH!+Qn~c^WmhdwH&hFpx|&HZjUS{ z(M`Kz{MEiF$EAGY0DWucfnv%!Q7>TT2MGgpcmn;;+7zEn;aKrXBJ_1*eY7+AWP0s& z(rLp9#RKcRLCGaLHuypLn{uTy^n2`2ON{j=8PHxA-8@@id117(;8rFDE}@nH{U(?5 zdc0?I4d#Wo1I^ibOky3|6yV3B*u;>_#ZRC?O3@mra6iIwzSdMyb~R zUHA=lQwPy!6fE`IV0IRWSHrT~3($~jaN&Q&TRIfYc?7Y7!Oe~WW!8ubq!}0g0e5_)5_JZj& zgUOI8f$JFaxApEMn40!r0boK@NVk&@$%>2nsoxa~EiS{5I|X-mTrU|}#4sbx_`ZFH z-|pvcc7@ucVj3>Hso(u^;8Dhe{ zwX7m3Eg6TR z40Oyrclc3F4K8tKV4NQmf4||Oq@V^odD!>76GUHenjat#(l}eo*EWv(cby|Rt6Sw2 z6mYO^^e8g_5i!IH{nj|I4{8s8$!zm+$vjy5hOj5F$yL z5gCa}LfKKuNJc1BR8~o4WMxFirVypbUXi@bka0gw_4!<%>vvth`#8S$eILKSZvS-X z;B>yv^YwbZp5rl$gj&d=@9Q!9Yq|J1<;#87RWc4JQ)FudouP2t-z!hiBxvp|xpEtu zF_21h3JmNsB0)Id4{K|y^`qP$8azN6wa=a@7@6a+=jpF@2{&T4(WxU~CB@52zd)VQ zFXpTki;p%l`)eF#qC{Gn?F|i9^4yVNlGBamDZ<9OPC_9;Y26w zTZfyHXoeHavHkZ#c;U>x^=_NbT9y|uyJL-Rl;S(bjbUl<4|2hxUdKDW!EeXAU;0v& ztJy_%*)gF#%UGc0mTkCWzUvwt)R`=iO!L>O72JvL`d5pqH(Z|l$m<*I^r?MRYmmkR zM^u>=c=P7S@Gwasxau|LkibmmuY{C8hqw=>YgWo!$gO$+V&XB@NuiR1o z#c;dBgEZ^N3ZIq5`r+u$LtCU@k{|6!d->MhT#z$+OJ}*G@J1$^&a&gEDCoTs)8r3Mqr#szK4@9~yFJRGWk5dGAYCBE zSQwmJ7+-WqOfLQckv=vf>9;l&Wz^qzj4lA3_v|$^ zhMxZ~jcteRM^^*_`mam7X+A9cs?~9p8r@4M8iC;!pU=5|nt;P~z36Gj`w3p*pVr2L zgnVGPYCr%+3>$@B`4xTE^T|c&{%gi)8Xxs;E?S|HF26p%Tl6xloiA%q`W-h#XgXSN z2@k5>1wwQ~=w!k8c~s<3zzRW+rxy5x`tB&F~;nV6WW6uOaoMm{0ae5|ynJ17}9k=lsEIvyhq z1CBC)D}H~-Y@9pnkg+n?)4S8YnSHw}&^qiR3|m*}r}oRY<&1Z+e_PB)eoRQ2Wb4F& zAc#-bk`uRXEL3rcWh)&uvN@lbs!^&&^0A2t$L70=-g|pKfFkw0kG3Q10oPYX)1X~T z1dyHiYHg*;uK@Js)qWk+Cf?ux;5*uNKUXtkQ}6ifyyG9Z2a{o@363$-*X~;Pc2jLv z=P-|rjs1$C-Zx6L)>^{WF@U>g_&Sq)`#eHCrKaOm_rS?^N2-nhx2gjyRE#IVUP%(u zz}7f*cFaDMyS98~=+2?#g3^f5M7i^Opv@j|G>o(yH@PQviR?GfKLYWlui`ZpT2E=1 zZ>J+7#df`*UTy3PcFi+8E%|UHs2>^q8DB-?Wk4NC7`^Tp(JOUmtT134? zYJHPE8$AusLmTYu!inc1eJjWfUztPF-|wHWm#s_bj*)YDXLvc- zY0m4b`jnk=iA-&6?WyZFGdNFzs71|Xkwo&rsL1JihbM9ESc&W^} z_e{!|qZZjDmi+q^mF1et8wanASBVKpMBVS1X~XdkT89HZV|9&m7B8b00!(E;!=fok zlN2&KFnBX>TdbMB(K+enSrRdjmhSYNtl5zkoupD7{NKm++g_kWf#DY|=ib6ckKQDF z_?qKAap>IG*mSK)L{F67K;>d0F?=?4|CWSa>Hp1@!k;XJpSJMGmi?d4(=|%FMx%_j zmH%t{&xS(n>5~V00C@j=P4L@4r|EwoH(p4dn7AFvqxC#h>Sv>H1gTMIve&B#kC4oJ z{=-9SD0M_KGF)@%`Y(@=Uwcll>Fsc$bgotBIDSv(*e2i{TKWeDie|o?wcgGk`@e%o z)TouTIZKr?KbV^Nv=Ba;`{((z=kHx!m_$Dmou2y&0aYdc7?1uN;$TTb(&h|}w!71= z8Fru~ytDOZGwNU1;CNA7{H9%7Q&Y#GqWcHP^q&Ze1<-d+%LUCR=8joMdglJY9T?Xl z0ex_J<};w&zy#U;w|h5K_!7t%IOe0(?BZ@IWjvCp+&JDVGJr4Ym>zCC$p zTI8AcIh4(CCxN`d-BA1g=iPAFp8pa@HdruHx9Ob!k6hK|ch*f4V?t-k7oD0D2{7#3 zbegxqrD5Gnm!`6vCE+C#61X9$K1N<2fWd`|+Q*L{rJjc;rn9B*PCt}xRp+I`wB^5S)7}pwiq#FzcU4en zp7##O+Fv8DI;=@0xa!&SOF!Q?N_>flh?qnun!h~Q;AptUkk*iuc;?jqc_sN4^=57} zO4VWgzUJI>kzBTHe5H48aaIY{lDZR?*1st74pFkX5AmRxg~|8JBWBAxYa-SSumjFj z0;G@Ve?cpqWxS-DBH?jNscGY3(nr<-b)Ve83w^v-KS%JDF6HHw=FC9|1_`Rz>!~Kp z=hQ;e+hCwy>6MR&J)P+KLghhz(AgO zeF?CQfk52`*9THJk5WIhejWRD3~PY${!@8Y6~wQ>Om+y2|pG=d(Vy z<%)|%^VV%1pq;dt*%qI?@_D21!&P#?NYvHWFMfXSH3L-YWbyK1+UGWd1_IVd?!?r* zYYw&7%Bmu07p4SZ>VE=;eUB>q`i7*rfXC1!4Je(F?`(bGGR_-*Kp`{u*}y=mXKEpYA1o?#?d z#*u)qi5<@xYB4Z7P_x*}xhw;CKzw}s?79<&7(SFYH&SGgjqZQeAeG6%;O6)Dr@3(w zrz_~a*v@7|T-a>t+ReE6etpdx78QYf1Falki=VVi44cLI8R z{&kH3lpznjm)s5?en)^`%@&6Zpf_6l>+9Ik($C^h7Kt^sc^KBddiCo0^Y0)zpx2g% zhY0XKwC2RQmg2Ya3#yql@7HRsJi@|k`NmaTDrlo+#jM1pL$xvT4CP-Vx?<1OouaoH zs1sQ2#6YmB`EzjS@+hSlW>^ryYpTKXm5NJ^=v4tW_p^9$)E?}Chi(IRpFH%MUv5#B z);JPUlzi=8a%h~maK)AJljjD=0+O>Ol89?D%w36@+Qy^!|FKXp*2@1w?PGzPR2zVc z4M^5$zsZ=*rl{ssDXGpRNik++E@?FbnFCb^F^y)&1-3c%Ph2|9vsVu?x9c!6WRv}j zR}ravAJ*xxf$=~vXS7ubJ3oVt=7s-PKMW-Gd`LK5JRgrE-LFGGlx`dkQR6MDP~g_l z6n7Q486M7f+3e{|^pPI%bzD3e7B4NYuU8v-_krz7fJs+lK=B1_btZ^GSMz)~VAnYt zmUiJ*?~8`|O};51vf?^tcjXxJIBq|w#(Qw-gms-5gJj6VyL>z2y2+JPs1Af2?_(+d zu6A2pi7xF%)$5a-!F=ysw*0)VQeWN`YvQwLr>4>;$#E7>C{%SJ#6u}w5I4j=$NjPW z8Y6>F0(2fVT-OTe1d(jsK6xd;7sz_eWg>j6a8;)}FyfNg_H|u4+rpw;cZXLsyH|HT zxRqQE41V$^8M=d)Cz|i7pO){FGmTygZEOBjUQrBT9w47J&nwXx)v@B$-U#kIrP56K zgCRhWn{?7QAYdT`|G`A{lTzh2y=%IXii%g|*iN3n>mFo08kF*e5SA$Jb=ksjpj2TE z13wwZb9#ob&hdhv0G@7+s{xEYOU!p6qY#a^9>B;^TpJ)raPl-LAx`U<=##*_^7EW4 zKM%e^JXxu9EaRUGDE*(+-~JyjYdYlpuk!QfK`Fw?1)U*<*)tWJr!Whu;~>~)22dzQ z`gH(eXo52sN}MzL2nbm2xz9c!Xmez$CP1NX&)JW{nY%@WgoFSC&p7>_1IY`6j>XxJ zxu?Cn_7*)tn(SGqYG}m5P z%bvc{%|h|^0t?H9H{ah}pi@n!w0;#;`$!`9oap@zS2j>wvs<6qd4E3fp}c&HUDT*( z!LwhB^J_P0E1sBc?oJu}dMQq2+tsk$yLUfI$5bidGiOgj+Z|zp_mJ zC3Dt)#NgGhRnFIWxoA5P2?gJ(5p|vtParuK*bAQq8(BhEWG#AZy3j;Fv(#6;@f$st zhh{d`0zpm_4@uaW4!RRtO42skTz68WL;N<{Nfs6f3o_cWok1rsX=9pCrhyj>!uEsMyA!W>vV;DCNktGjY zCb)G0+iTv$$U5B$);krXBC*_$^Yi#AAWI0Jms zYt|gK8=7A?R2AKOYy{Ua)ynn&98A3ypaLJmcil}NMJ4Gxgg;_5T5`Ci--cYqFET1> zt1qY^VI2>E@6^a+9mPLEmNu=u=Xe*XU(?agP`ZNhGS`!CUMAjvnbzxrD$PX*tjCEF zk^az^?@;{)5EZvt!M@UMzX}X31X+G!UQ#YTTvfuM!{)Ee_De$kOtYX|X}RNK?& z+rZp5<+{#I@IRiOiT>V-F;L3o*=~Q9iav2}HV2VGb+NTWZdgBH3^D~5It_;OQ+Lc1 zMBURIQn)xo?-%AMa#}TUO~|5S#lEnvuetVS7+8C@I?nS5xk5jhAvPL=T+7)A?Y$YX zW{VjHeS?8BS3*%`>Rjn%VLIRZI^jX%gKi>g=jN{5`H8am<5RG>*-5+hxG5HCp@Y?sI z^B;_+cXjM^bRmHbqu&|s8e}4}Y1`qLWL17X*V$dr=-{P}uk!oib z(y%MNL&5F5S~Sf?t;Ae&*%KSwctYMfO4u|!Le4zY%gq!2)*M@dsHAyz{2gub&Y&XA_7{Ake*7e$R&T)O$Ei1X7w#E!Tx$X3Xp307P ziQV5Fq|OzWeqHzK@~@mcA)>H%8#YBTg=-tLIl2 z@vob{OuNI8WuZnGp7OfDToP{*JB}Wqf1RHDZ++D@*CR{DX??Tr& zZs%eRTJrC2XU)amKvG~Fw-;GBKi8!{VLU9M57T#Mk>ggf(7tG_=@L=oYKxPP&f>^~=aZ zt%5bKnL5cv_KAYsm)$|oe1GbgoD=gTs{2DtjmC5rvuAE{GNtc?y3{QiQlba+k1TEZ zj{ADuusXqQa82`x`MVg|6mumX>C$xFidLNbTqOlqgDLkglbYjR6-y;IwX3+Qx*8%V zTCI8eGFwa@y}ugy2ueBQ!v#Z8Bx@<2`0Giu650>sGqMusda~G#&|m9+(v4|cmB>lT z4)f4*2(fOfOqV}la##%v>`yEYr0qF;TwYGjY}j$}TO?13F?$Ylfc%v2JFMT}5tCgu zy`%l|D!F!s^!)te^J^m~cS)Q1t1=x!jE-MbJ%je>yjF8q)w4q2DcR&C4rexRuVk5e z66^0vjdkYk!OF^taVZQjd<>sa>u`U!@3t}5(h6Rmumv&U+(d^hRmV_R*UezX?(djD z8|tgix^q{ADp^*)8Z34GlF$*h4XR(x(C$DG{pJgAlq)>!3Je;613ooV`=|jKB7oHQ zU8#)I;PB6J?ALhhLuRk5?19{GDs=r{adKZPPUN>T?P?CzHw1-n>w?s}Bq>Fta)EM? z5W00gx!+`uU)ZH-Y9ZGVUzOXSmf=SLsoDb(ro7o;)Y(5y6nkApp8x_AhG-%co>s|) z{u&!I#CsiiG$0LvOqclD`>(o?0p!}1udq;D55+pZJpbj1gT+SZE#Qmu@0@(@U!FK> z|NkZb|7XcF@qc;|QH??`1G(h~O`#n-ZUzPtJr_?XVF9-@{7?zPaUffn6}p<=_D2ML z7Jq@%h;56Lqh9PSU)|0x&#mVG@&Os7()*?oO(1K@9}6g|`j^i!Pcjsnn;%KjA#%R; z0{r|0|8M?D&PF+%{iRM3fCRs|K+?g`9G5ul#l4NNS+d)U6WUMUQ1q2yXgyo#U-XZa=z@d<>G;rKL); zyCDVboep4Pj54iTK7ATVc&S|C0TDsfyv6e*)BKCJc!CiT5y%Bdi$6Ox z&EZV~4je(72_>2BehR?tEb~&qsaj@9j;|=gRD)T4#~&%M2xv4UBHX1K=h9C4IA$#) zkv%GVv=_>^Ey&BQngL8P=i9Jh12oiTdyqzeU=#$H=i|e%f#Z*kh&H=;^EbyAQyO=J zxfZR)WN{rJ{t6}4ZZrpv1e8CBjP#ob-8-*-qCQ0Ix7Q89C+aS`{0kx<7TpV^GCJoz zBh|Hu<8})km2xFpcilK8U5@$l@kQQHpd&=hq)%?LXoFN-%$)CA9NE3duzJMea5A^P zBBYVE1|e%%(J7Eqim_#NQyV1QnJkRAFgi~39enLoQ1$-3!LwPSgRe+?7Yxjl$0s$* zf`Cwd0+G_RAUEAhp!^H^MjMSjV*n!c5GNt`!w|Mv-6G)hy4^U#R;s3uJ%T9d=-qn> z*PF!|0L7d4FFQjLMNoxncZFEVR^GhFVaF z=kvxwwwN_pvp(!Q=?;dMal6t`^8DIF7~V8DH$M{R=O-^S+>5#|xe$_JcSk_uKwWC# z3Jif@rHh0-`VlB-E?xu}gJOin7f6`*_4Vb&ETW>KA-ih{dok{bIS{O-2IfX%yB3EU zd2QJ)j(pTwu1WwgQYn~Qc(L*h8R6$;arr(?`PE{gme<)~nArF+<}dq)Mi$!Ua|gxfMMJayYjXnMUc1J2WH*XolWc1M*L zq|c?8@qdwawTI}f7Nz&hKxGK}B+vF(0GVmc@2?{woJUb{II&9s#bk@)I#B-04-~ykIbphFHJ!kkM>Ia7d@ccTwj?Onx!oO>=N$1K&?)nzH49>BnL@cl#Y z>0!M#x99mum-6gRKgO_e%Ts*PP&M-2a$3nXQOU8DD&G92jNiD4Qkf^ z%@Suzz_YH{@bIQu?kB%4ZB)L0xaSRXn%L^+1a3+jTG2lwj-->kGLiT0u(`8;=3C{I5@j6s@CRH{W-Z*wik4UyF8$6f`)olj+Ejk&%d)v!8e+O~VUy^;zjU%!}h`j92>x1P>QOyYDYM z93LGa>Kso^p_2 zThxXF15g_3%cYwn;;RqpvBNiWoT5sxB;dOdb^rd&Z|L0}Tjc5SQ?_iQt)g zoc@nk!%2V*7cDP&^m14dtZSt0nV+vRSjz-1xUt}M>HOsSLc~LHoRtgw(p^X(U=y+818h0*P*ON&nZRBU%h`KENZmGIj0Y} zQbLy+eT5%4NfOpZaur+ICA_kGbj>4RoKs@<8A|-V^<&80FQw-4T8IWU_Rta9b784- z0$B0!>B4j+#^?D|Lv@7I*KI1<`dV^*@)J+)&1g+3k4=B(@R6P$rc4^~Ih4it4Lt!)8*R_a>^Bj3ROG8=)S?p}5s@L1 zvS-aR^Y}?hGWMKZede!Ob8PvH6Ii#I7glc=u|Pdkgcr<0p3P z+I6hwCmO)*PQi?x2ZE{l)+xqmAGiCwXZk5aA-9~I@#Xw;pLfc!mKck^U^ug@BECVI zFWZ0Ol>$LYY)SK@c3wSyNu^c3S#7>FiaijLOl6PH3-|G

k@jG>i8*u0IsU7`XIH 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 None: - """ - The run function executes the logic of federated - second order Newton Raphson optimization. - - """ - self.info("starting Federated Averaging Netwon Raphson ...") - - # First load the model and set up some training params. - # A `persisitor` (NewtonRaphsonModelPersistor) will load - # the model in `ModelLearnable` format, then will be - # converted `FLModel` by `ModelController`. - # - model = self.load_model() - - model.start_round = self.start_round - model.total_rounds = self.num_rounds - - self.info("Server side model loader: {}".format(model)) - - for self.current_round in range(self.start_round, self.start_round + self.num_rounds): - self.info(f"Round {self.current_round} started.") - - # Get the list of clients. - clients = self.sample_clients(self.num_clients) - - model.current_round = self.current_round - - # Send training task and current global model to clients. - # - # A `task` isntance will be created, and sent - # to clients, the model is first converted to a shareable - # and is attached to the task. - # - # After the task is finished, the result (shareable) recieved - # from the task is converted to FLModel, and is returned to the - # server. The `results` below is a list with result (FLModel) - # from all clients. - # - # The full logic of `task` is implemented in: - # https://github.com/NVIDIA/NVFlare/blob/d6827bca96d332adb3402ceceb4b67e876146067/nvflare/app_common/workflows/model_controller.py#L178 - # - self.info("sending server side global model to clients") - results = self.send_model_and_wait(targets=clients, data=model) - - # Aggregate results receieved from clients. - aggregate_results = self.aggregate(results, aggregate_fn=self.newton_raphson_aggregator_fn) - - # Update global model based on the following formula: - # weights = weights + updates, where - # updates = -damping_factor * Hessian^{-1} . Gradient - self.update_model(model, aggregate_results) - - # Save global model. - self.save_model(model) - - self.info("Finished FedAvg.") - - def newton_raphson_aggregator_fn(self, results: List[FLModel]): - """ - Custom aggregator function for second order Newton Raphson - optimization. - - This uses the default thread-safe WeightedAggregationHelper, - which implement a weighted average of all values received from - a `result` dictionary. - - Args: - results: a list of `FLModel`s. Each `FLModel` is received - from a client. The field `params` is a dictionary that - contains values to be aggregated: the gradient and hessian. - """ - self.info("receieved results from clients: {}".format(results)) - - # On client side the `NUM_STEPS_CURRENT_ROUND` key - # is used to track the number of samples for each client. - for curr_result in results: - self.aggregator.add( - data=curr_result.params, - weight=curr_result.meta.get(FLMetaKey.NUM_STEPS_CURRENT_ROUND, 1.0), - contributor_name=curr_result.meta.get("client_name", AppConstants.CLIENT_UNKNOWN), - contribution_round=curr_result.current_round, - ) - - aggregated_dict = self.aggregator.get_result() - self.info("aggregated result: {}".format(aggregated_dict)) - - # Compute global model update: - # update = - damping_factor * Hessian^{-1} . Gradient - # A regularization is added to avoid empty hessian. - # - reg = self.epsilon * np.eye(aggregated_dict["hessian"].shape[0]) - newton_raphson_updates = self.damping_factor * np.linalg.solve( - aggregated_dict["hessian"] + reg, aggregated_dict["gradient"] - ) - self.info("newton raphson updates: {}".format(newton_raphson_updates)) - - # Convert the aggregated result to `FLModel`, this `FLModel` - # will then be used by `update_model` method from the base class, - # to update the global model weights. - # - aggr_result = FLModel( - params={"newton_raphson_updates": newton_raphson_updates}, - params_type=results[0].params_type, - meta={ - "nr_aggregated": len(results), - AppConstants.CURRENT_ROUND: results[0].current_round, - AppConstants.NUM_ROUNDS: self.num_rounds, - }, - ) - return aggr_result - - def update_model(self, model, model_update, replace_meta=True) -> FLModel: - """ - Update logistic regression parameters based on - aggregated gradient and hessian. - - """ - if replace_meta: - model.meta = model_update.meta - else: - model.meta.update(model_update.meta) - - model.metrics = model_update.metrics - model.params[NPConstants.NUMPY_KEY] += model_update.params["newton_raphson_updates"] diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_persistor.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_persistor.py deleted file mode 100644 index 5b324dd50c..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_persistor.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. -# -# 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 numpy as np - -from nvflare.app_common.np.np_model_persistor import NPModelPersistor - - -class NewtonRaphsonModelPersistor(NPModelPersistor): - """ - This class defines the persistor for Newton Raphson model. - - A persistor controls the logic behind initializing, loading - and saving of the model / parameters for each round of a - federated learning process. - - In the 2nd order Newton Raphson case, a model is just a - 1-D numpy vector containing the parameters for logistic - regression. The length of the parameter vector is defined - by the number of features in the dataset. - - """ - - def __init__(self, model_dir="models", model_name="weights.npy", n_features=13): - """ - Init function for NewtonRaphsonModelPersistor. - - Args: - model_dir: sub-folder name to save and load the global model - between rounds. - model_name: name to save and load the global model. - n_features: number of features for the logistic regression. - For the UCI ML heart Disease dataset, this is 13. - - """ - - super().__init__() - - self.model_dir = model_dir - self.model_name = model_name - self.n_features = n_features - - # A default model is loaded when no local model is available. - # This happen when training starts. - # - # A `model` for a binary logistic regression is just a matrix, - # with shape (n_features + 1, 1). - # For the UCI ML Heart Disease dataset, the n_features = 13. - # - # A default matrix with value 0s is created. - # - self.default_data = np.zeros((self.n_features + 1, 1), dtype=np.float32) diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb deleted file mode 100644 index 5bf4d3f4f1..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb +++ /dev/null @@ -1,341 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e8c19632", - "metadata": {}, - "source": [ - "# Converting Logistic Regression to FL" - ] - }, - { - "cell_type": "markdown", - "id": "7f9d96ed", - "metadata": {}, - "source": [ - "## Federated Logistic Regression with Second-Order Newton-Raphson optimization\n", - "This example shows how to implement a federated binary classification via logistic regression with second-order Newton-Raphson optimization.\n", - "\n", - "The [UCI Heart Disease dataset](https://archive.ics.uci.edu/dataset/45/heart+disease) is\n", - "used in this example. Scripts are provided to download and process the\n", - "dataset as described\n", - "[here](https://github.com/owkin/FLamby/tree/main/flamby/datasets/fed_heart_disease).\n", - "\n", - "This dataset contains samples from 4 sites, splitted into training and\n", - "testing sets as described below:\n", - "|site | sample split |\n", - "|-------------|---------------------------------------|\n", - "|Cleveland | train: 199 samples, test: 104 samples |\n", - "|Hungary | train: 172 samples, test: 89 samples |\n", - "|Switzerland | train: 30 samples, test: 16 samples |\n", - "|Long Beach V | train: 85 samples, test: 45 samples |\n", - "\n", - "The number of features in each sample is 13." - ] - }, - { - "cell_type": "markdown", - "id": "e54f0dcc", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "The [Newton-Raphson\n", - "optimization](https://en.wikipedia.org/wiki/Newton%27s_method) problem\n", - "can be described as follows.\n", - "\n", - "In a binary classification task with logistic regression, the\n", - "probability of a data sample $x$ classified as positive is formulated\n", - "as:\n", - "$$p(x) = \\sigma(\\beta \\cdot x + \\beta_{0})$$\n", - "where $\\sigma(.)$ denotes the sigmoid function. We can incorporate\n", - "$\\beta_{0}$ and $\\beta$ into a single parameter vector $\\theta =\n", - "( \\beta_{0}, \\beta)$. Let $d$ be the number\n", - "of features for each data sample $x$ and let $N$ be the number of data\n", - "samples. We then have the matrix version of the above probability\n", - "equation:\n", - "$$p(X) = \\sigma( X \\theta )$$\n", - "Here $X$ is the matrix of all samples, with shape $N \\times (d+1)$,\n", - "having it's first column filled with value 1 to account for the\n", - "intercept $\\theta_{0}$.\n", - "\n", - "The goal is to compute parameter vector $\\theta$ that maximizes the\n", - "below likelihood function:\n", - "$$L_{\\theta} = \\prod_{i=1}^{N} p(x_i)^{y_i} (1 - p(x_i)^{1-y_i})$$\n", - "\n", - "The Newton-Raphson method optimizes the likelihood function via\n", - "quadratic approximation. Omitting the maths, the theoretical update\n", - "formula for parameter vector $\\theta$ is:\n", - "$$\\theta^{n+1} = \\theta^{n} - H_{\\theta^{n}}^{-1} \\nabla L_{\\theta^{n}}$$\n", - "where\n", - "$$\\nabla L_{\\theta^{n}} = X^{T}(y - p(X))$$\n", - "is the gradient of the likelihood function, with $y$ being the vector\n", - "of ground truth for sample data matrix $X$, and\n", - "$$H_{\\theta^{n}} = -X^{T} D X$$\n", - "is the Hessian of the likelihood function, with $D$ a diagonal matrix\n", - "where diagonal value at $(i,i)$ is $D(i,i) = p(x_i) (1 - p(x_i))$.\n", - "\n", - "In federated Newton-Raphson optimization, each client will compute its\n", - "own gradient $\\nabla L_{\\theta^{n}}$ and Hessian $H_{\\theta^{n}}$\n", - "based on local training samples. A server will aggregate the gradients\n", - "and Hessians computed from all clients, and perform the update of\n", - "parameter $\\theta$ based on the theoretical update formula described\n", - "above." - ] - }, - { - "cell_type": "markdown", - "id": "32003ba9", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "Using `nvflare`, The federated logistic regression with Newton-Raphson\n", - "optimization is implemented as follows.\n", - "\n", - "On the server side, all workflow logics are implemented in\n", - "class `FedAvgNewtonRaphson`, which can be found\n", - "[here](code/newton_raphson/app/custom/newton_raphson_workflow.py). The\n", - "`FedAvgNewtonRaphson` class inherits from the\n", - "[`BaseFedAvg`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/base_fedavg.py)\n", - "class, which itself inherits from the **ModelController**\n", - "([`ModelController`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py))\n", - "class. This is the preferrable approach to implement a custom\n", - "workflow, since `ModelController` decouples communication logic from\n", - "actual workflow (training & validation) logic. The mandatory\n", - "method to override in `ModelController` is the\n", - "[`run()`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L37)\n", - "method, where the orchestration of server-side workflow actually\n", - "happens. The implementation of `run()` method in\n", - "[`FedAvgNewtonRaphson`](code/newton_raphson/app/custom/newton_raphson_workflow.py)\n", - "is similar to the classic\n", - "[`FedAvg`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/fedavg.py#L44):\n", - "- Initialize the global model, this is acheived through method `load_model()`\n", - " from base class\n", - " [`ModelController`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L292),\n", - " which relies on the\n", - " [`ModelPersistor`](https://nvflare.readthedocs.io/en/main/glossary.html#persistor). A\n", - " custom\n", - " [`NewtonRaphsonModelPersistor`](code/newton_raphson/app/custom/newton_raphson_persistor.py)\n", - " is implemented in this example, which is based on the\n", - " [`NPModelPersistor`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/np/np_model_persistor.py)\n", - " for numpy data, since the _model_ in the case of logistic regression\n", - " is just the parameter vector $\\theta$ that can be represented by a\n", - " numpy array. Only the `__init__` method needs to be re-implemented\n", - " to provide a proper initialization for the global parameter vector\n", - " $\\theta$.\n", - "- During each training round, the global model will be sent to the\n", - " list of participating clients to perform a training task. This is\n", - " done using the\n", - " [`send_model_and_wait()`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L41)\n", - " method. Once\n", - " the clients finish their local training, results will be collected\n", - " and sent back to server as\n", - " [`FLModel`](https://nvflare.readthedocs.io/en/main/programming_guide/fl_model.html#flmodel)s.\n", - "- Results sent by clients contain their locally computed gradient and\n", - " Hessian. A [custom aggregation\n", - " function](code/newton_raphson/app/custom/newton_raphson_workflow.py)\n", - " is implemented to get the averaged gradient and Hessian, and compute\n", - " the Newton-Raphson update for the global parameter vector $\\theta$,\n", - " based on the theoretical formula shown above. The averaging of\n", - " gradient and Hessian is based on the\n", - " [`WeightedAggregationHelper`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/aggregators/weighted_aggregation_helper.py#L20),\n", - " which weighs the contribution from each client based on the number\n", - " of local training samples. The aggregated Newton-Raphson update is\n", - " returned as an `FLModel`.\n", - "- After getting the aggregated Newton-Raphson update, an\n", - " [`update_model()`](code/newton_raphson/app/custom/newton_raphson_workflow.py#L172)\n", - " method is implemented to actually apply the Newton-Raphson update to\n", - " the global model.\n", - "- The last step is to save the updated global model, again through\n", - " the `NewtonRaphsonModelPersistor` using `save_model()`.\n", - "\n", - "\n", - "On the client side, the local training logic is implemented\n", - "[here](code/newton_raphson/app/custom/newton_raphson_train.py). The\n", - "implementation is based on the [`Client\n", - "API`](https://nvflare.readthedocs.io/en/main/programming_guide/execution_api_type.html#client-api). This\n", - "allows user to add minimum `nvflare`-specific code to turn a typical\n", - "centralized training script into a federated client side local training\n", - "script.\n", - "- During local training, each client receives a copy of the global\n", - " model, sent by the server, using `flare.receive()` from the Client API.\n", - " The received global model is an instance of `FLModel`.\n", - "- A local validation is first performed, where validation metrics\n", - " (accuracy and precision) are streamed to server using the\n", - " [`SummaryWriter`](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.client.tracking.html#nvflare.client.tracking.SummaryWriter). The\n", - " streamed metrics can be loaded and visualized using tensorboard.\n", - "- Then each client computes it's gradient and Hessian based on local\n", - " training data, using their respective theoretical formula described\n", - " above. This is implemented in the\n", - " [`train_newton_raphson()`](code/newton_raphson/app/custom/newton_raphson_train.py#L82)\n", - " method. Each client then sends the computed results (always in\n", - " `FLModel` format) to server for aggregation, using the Client API call\n", - " `flare.send()`.\n", - "\n", - "Each client site corresponds to a site listed in the data table above.\n", - "\n", - "A [centralized training script](code/train_centralized.py) is also\n", - "provided, which allows for comparing the federated Newton-Raphson\n", - "optimization versus the centralized version. In the centralized\n", - "version, training data samples from all 4 sites were concatenated into\n", - "a single matrix, used to optimize the model parameters. The\n", - "optimized model was then tested separately on testing data samples of\n", - "the 4 sites, using accuracy and precision as metrics.\n", - "\n", - "Comparing the federated [client-side training\n", - "code](code/newton_raphson/app/custom/newton_raphson_train.py) with the\n", - "centralized [training code](code/train_centralized.py), we can see that\n", - "the training logic remains similar: load data, perform training\n", - "(Newton-Raphson updates), and valid trained model. The only added\n", - "differences in the federated code are related to interaction with the\n", - "FL system, such as receiving and send `FLModel`." - ] - }, - { - "cell_type": "markdown", - "id": "c3fc55e0", - "metadata": {}, - "source": [ - "## Install requirements\n", - "First, install the required packages:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "04911ca3", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -r code/requirements.txt" - ] - }, - { - "cell_type": "markdown", - "id": "33ea8504", - "metadata": {}, - "source": [ - "## Download and prepare data\n", - "\n", - "Execute the following script\n", - "```\n", - "bash ./code/data/prepare_heart_disease_data.sh\n", - "```\n", - "This will download the heart disease dataset under\n", - "`/tmp/flare/dataset/heart_disease_data/`\n", - "\n", - "Please note that you may need to accept the data terms in order to complete the download." - ] - }, - { - "cell_type": "markdown", - "id": "d548b466", - "metadata": {}, - "source": [ - "## Centralized Logistic Regression\n", - "\n", - "Launch the following script:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8c68fe1a", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 code/train_centralized.py --solver custom" - ] - }, - { - "cell_type": "markdown", - "id": "fa666b79", - "metadata": {}, - "source": [ - "Two implementations of logistic regression are provided in the\n", - "centralized training script, which can be specified by the `--solver`\n", - "argument:\n", - "- One is using `sklearn.LogisticRegression` with the `newton-cholesky`\n", - " solver\n", - "- The other one is manually implemented using the theoretical update\n", - " formulas described above.\n", - "\n", - "Both implementations were tested to converge in 4 iterations and to\n", - "give the same result.\n", - "\n", - "Example output:\n", - "```\n", - "using solver: custom\n", - "loading training data.\n", - "training data X loaded. shape: (486, 13)\n", - "training data y loaded. shape: (486, 1)\n", - "\n", - "site - 1\n", - "validation set n_samples: 104\n", - "accuracy: 0.75\n", - "precision: 0.7115384615384616\n", - "\n", - "site - 2\n", - "validation set n_samples: 89\n", - "accuracy: 0.7528089887640449\n", - "precision: 0.6122448979591837\n", - "\n", - "site - 3\n", - "validation set n_samples: 16\n", - "accuracy: 0.75\n", - "precision: 1.0\n", - "\n", - "site - 4\n", - "validation set n_samples: 45\n", - "accuracy: 0.6\n", - "precision: 0.9047619047619048\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "0b72ef2b", - "metadata": {}, - "source": [ - "## Federated Logistic Regression\n", - "\n", - "Execute the following command to launch federated logistic\n", - "regression. This will run in `nvflare`'s simulator mode.\n", - "```\n", - "nvflare simulator -w ./workspace -n 4 -t 4 job/newton_raphson/\n", - "```\n", - "\n", - "Accuracy and precision for each site can be viewed in Tensorboard:\n", - "```\n", - "tensorboard --logdir=./workspace/server/simulate_job/tb_events\n", - "```\n", - "As can be seen from the figure below, per-site evaluation metrics in\n", - "federated logistic regression are on-par with the centralized version.\n", - "\n", - "\"Tensorboard\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb deleted file mode 100644 index efef1032b9..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb +++ /dev/null @@ -1,34 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple ML/DL to FL transition with NVFlare\n", - "\n", - "Converting Deep Learning (DL) models to Federated Learning (FL) entails several key steps:\n", - "\n", - " - Formulating the algorithm: This involves determining how to adapt a DL model into an FL framework, including specifying the information exchange protocol between the server and clients.\n", - "\n", - " - Code conversion: Adapting existing standalone DL code into FL-compatible code. This typically involves minimal changes, often just a few lines of code, thanks to tools like NVFlare.\n", - "\n", - " - Workflow configuration: Once the code is modified, configuring the workflow to integrate the newly adapted FL code seamlessly.\n", - "\n", - "NVFlare simplifies the process of transitioning from traditional Machine Learning (ML) or DL algorithms to FL. With NVFlare, the conversion process requires only minor code adjustments.\n", - "\n", - "In this section, we have the following three examples for converting traditional ML to FL:\n", - "\n", - " * [Convert Logistics Regression to federated learning](02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb)\n", - " * [Convert KMeans to federated learning](02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", - " * [Convert Survival Analysis to federated learning](02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py similarity index 93% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py index b51724a962..aee42bb95b 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/lightning_fl_job.py @@ -41,4 +41,4 @@ job.to(runner, f"site-{i + 1}") job.export_job("/tmp/nvflare/jobs/job_config") - job.simulator_run("/tmp/nvflare/jobs/workdir", gpu="0", log_config="./log_config.json") + job.simulator_run("/tmp/nvflare/jobs/workdir", gpu="0") diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/src/cifar10_lightning_fl.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/src/cifar10_lightning_fl.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/src/cifar10_lightning_fl.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/src/cifar10_lightning_fl.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/src/lit_net.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/src/lit_net.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/code/src/lit_net.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/code/src/lit_net.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/controller_worker_flow.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/controller_worker_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5deac70f5aeea723f369535281a0e560fda1f1d6 GIT binary patch literal 58043 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¥Qpk@!m3_Mt<(XyK%|g;#a=i%2!?bpLJJu zzmi8MR6Cje)Ok2~wbrcZ zt=MRQyNYK``B*y9p!{};$86qMhc&#S7venhFT9rCju$_Fz&N2BK#p^_+PYm&zK z-i%fP8R?*+D6Bh%@W%2BBlSOxw5pTB-)0}aWG3vhL=rRecu z`v;7MP3?L^9=8(um_%7RU~e6fb;?Z)E_vF9SZGPY)jRdz=P(X(*P89V6jALx(!gCUpI+^UrjpI>iBc=dg_P};{Zd!j()mDm*(*8KS1?*V_WN-p?Y z2;_~BCcr+qy1X6mZm^Ry@K{v+X)bf=B9mx3&G%5BLZ6LlWKO==B_*JdH&7aO{x zDtz`vz5Y`Ci2kd%0J9{8KKY=>I${>YXY?(9o!iVY*VnP?fl*0MBzWj)hML32i;W*J znn>8{@6~WQJuFIgzoMXFdGPn8ffB583ul5CwT8w_tLI`m!`n1ZRgMns*GNXJcrJ8D zAPRQz&|9&(phdG74_;l@$+>}`#q5Q=#7}vpuMRa0iZ`8Yb=OM-=1vk3U16^EDM+`Z zZU2(b0e2}HL7kAOS1=(nu%zIm8^@Tk`+Ocw%P8o1#vQPGckvJ!hOm_wiMJzTu=%j2 z+Y&d+k+C;$$D+-#zj~SBCT~WlE4Wp!`WM%J+J9~Z zx0VSzH(u6vy-?YA>Z-sSemp_9 z7;I70W2rRj_9(if4&Oj?o0ftvnk)l@^_?1-_-8Ae?y-D^{visE8Jtf}kJhdU;v_RX z9Ck6AA)L+7JlpPR_V97PMY-bXMr2pPy_2PonHr>@Z7O%DW*?~JzOP}wDy^cfo^eS# zlQKaFk_W2I#j;(##r7UYQ-GE#vdRul!G-yf$w=p!YqL_`R;2DD*Hv^gv-7uJU4HI= zX;}J_HXpo}SABZ+tMxgU3ptq1>vepad`G*7fE#zx(c<4>e_~3wGDk|sp64(A zquPe-Ntp;TKc0wjzUa5^L?c|K@AEI|u%$U;xb+@QO7ly=2MnG?j7!?^B<`JV^1Gt< z(p19sNFH-kh1r`BU0>ZV9MV*T_kS-Z@KT4hN{ptsLQ;iR{MU`YhthK}dQXs_{3j3n zU=mqI!N1lUk!rG@zx_?qK@AHRAVMbbA^-iK^Xc)w{BQB*9WFO_M0}lM`A*%aVLb9s O9!fvHpLfsT@BagUMgT$p literal 0 HcmV?d00001 diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb similarity index 88% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb index 71f9a334c6..b09b44d940 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb @@ -7,7 +7,7 @@ "source": [ "# Converting PyTorch Lightning to FL\n", "\n", - "In this notebook, we use FedAvg and CIFAR10 PyTorch Lightning for client training code to create and run a federated learning job with NVFlare." + "In chapter 1, we have learned how to convert the PyTorch code to a federated learning job with NVFlare. In this section and next section, we will learn how to convert the PyTorch Lightning code to a federated learning job with NVFlare.\n" ] }, { @@ -16,12 +16,16 @@ "metadata": {}, "source": [ "## Basic Concepts\n", + "\n", "At the heart of NVFlare lies the concept of collaboration through\n", "\"tasks.\" An FL controller assigns tasks (e.g., training on local data) to one or more FL clients, processes returned\n", "results (e.g., model weight updates), and may assign additional\n", "tasks based on these results and other factors (e.g., a pre-configured\n", "number of training rounds). The clients run executors which can listen for tasks and perform the necessary computations locally, such as model training. This task-based interaction repeats\n", - "until the experiment’s objectives are met. " + "until the experiment's objectives are met.\n", + "\n", + "\n", + "\"Controller-Executor" ] }, { @@ -30,6 +34,7 @@ "metadata": {}, "source": [ "## Federated Averaging with NVFlare\n", + "\n", "Given the flexible controller and executor concepts, it is easy to implement different computing & communication patterns with NVFlare, such as [FedAvg](https://proceedings.mlr.press/v54/mcmahan17a?ref=https://githubhelp.com) and [cyclic weight transfer](https://academic.oup.com/jamia/article/25/8/945/4956468). \n", "\n", "The controller's `run()` routine is responsible for assigning tasks and processing task results from the Executors. " @@ -114,8 +119,9 @@ "metadata": {}, "source": [ "Using NVFlare's Client Lightning API, we can easily adapt machine learning code that was written for centralized training and apply it in a federated scenario.\n", + "\n", "For general use cases, we can use the Client Lightning API patch function:\n", - "- `flare.patch(trainer)`: Patch the lightning trainer. After flare.patch, functions such as `trainer.fit()` and `trainer.validate()` will get the global model internally and automatically send the result model to the FL server." + "- `flare.patch(trainer)`: Patch the lightning trainer with callbacks. After flare.patch, functions such as `trainer.fit()` and `trainer.validate()` will get the global model internally and automatically send the result model to the FL server." ] }, { @@ -163,7 +169,8 @@ "id": "5da34414-bac4-4352-8077-ab7ade998eec", "metadata": {}, "source": [ - "## Run an NVFlare Job\n", + "## Run an FedAvg PyTorch Lightning Training Job\n", + "\n", "Now that we have defined the FedAvg controller to run our federated compute workflow on the FL server, and our client training script to receive the global models, run local training, and send the results back to the FL server, we can put everything together using NVFlare's Job API." ] }, @@ -183,7 +190,7 @@ "metadata": {}, "outputs": [], "source": [ - "% pip install -r code/requirements.txt" + "! pip install -r code/requirements.txt" ] }, { @@ -196,11 +203,12 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "id": "93889e62-b725-427c-8839-2771ca81d24c", "metadata": {}, + "outputs": [], "source": [ - "```python\n", "from typing import Any\n", "\n", "import torch\n", @@ -278,8 +286,7 @@ "\n", " def configure_optimizers(self):\n", " optimizer = optim.SGD(self.parameters(), lr=0.001, momentum=0.9)\n", - " return {\"optimizer\": optimizer}\n", - "```" + " return {\"optimizer\": optimizer}\n" ] }, { @@ -296,13 +303,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "aaa2b6f4", "metadata": {}, "outputs": [], "source": [ - "from code.src.lit_net import LitNet\n", - "\n", "from nvflare.app_common.workflows.fedavg import FedAvg\n", "from nvflare.app_opt.pt.job_config.base_fed_job import BaseFedJob\n", "from nvflare.job_config.script_runner import ScriptRunner\n", @@ -324,11 +329,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "6962e6cc-995e-4356-8156-3ceba2c7a249", "metadata": {}, "outputs": [], "source": [ + "from nvflare.app_common.workflows.fedavg import FedAvg\n", + "from nvflare.app_opt.pt.job_config.base_fed_job import BaseFedJob\n", + "from nvflare.job_config.script_runner import ScriptRunner\n", + "\n", "n_clients = 2\n", "\n", "controller = FedAvg(\n", @@ -354,21 +363,27 @@ "#### 4. Add clients\n", "Next, we can use the `ScriptRunner` and send it to each of the clients to run our training script.\n", "\n", - "Note that our script could have additional input arguments, such as batch size or data path, but we don't use them here for simplicity." + "Note that our script could have additional input arguments, such as batch size or data path, but we don't use them here for simplicity.\n", + "```python\n", + "\n", + "for i in range(n_clients):\n", + " runner = ScriptRunner(\n", + " script=\"src/cifar10_lightning_fl.py\", script_args=\"\" # f\"--batch_size 32 --data_path /tmp/data/site-{i}\"\n", + " )\n", + " job.to(runner, f\"site-{i+1}\")\n", + "\n", + "\n", + "```" ] }, { "cell_type": "code", "execution_count": null, - "id": "ad5d36fe-9ae5-43c3-80bc-2cdc66bf7a7e", + "id": "9d391acd", "metadata": {}, "outputs": [], "source": [ - "for i in range(n_clients):\n", - " runner = ScriptRunner(\n", - " script=\"src/cifar10_lightning_fl.py\", script_args=\"\" # f\"--batch_size 32 --data_path /tmp/data/site-{i}\"\n", - " )\n", - " job.to(runner, f\"site-{i+1}\")" + "!cat code/src/cifar10_lightning_fl.py" ] }, { @@ -379,17 +394,12 @@ "That's it!\n", "\n", "#### 5. Optionally export the job\n", - "Now, we could export the job and submit it to a real NVFlare deployment using the [Admin client](https://nvflare.readthedocs.io/en/main/real_world_fl/operation.html) or [FLARE API](https://nvflare.readthedocs.io/en/main/real_world_fl/flare_api.html). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "99a270bf-c906-425b-b999-2306cb76eb62", - "metadata": {}, - "outputs": [], - "source": [ - "job.export_job(\"/tmp/nvflare/jobs/job_config\")" + "Now, we could export the job and submit it to a real NVFlare deployment using the [Admin client](https://nvflare.readthedocs.io/en/main/real_world_fl/operation.html) or [FLARE API](https://nvflare.readthedocs.io/en/main/real_world_fl/flare_api.html). \n", + "\n", + "```python\n", + "\n", + "job.export_job(\"/tmp/nvflare/jobs/job_config\")\n", + "```" ] }, { @@ -410,7 +420,10 @@ }, "outputs": [], "source": [ - "job.simulator_run(\"/tmp/nvflare/jobs/workdir\", gpu=\"0\")" + "%cd code/\n", + "! python3 lightning_fl_job.py\n", + "%cd -\n", + "\n" ] }, { @@ -418,15 +431,23 @@ "id": "fb2e1266", "metadata": {}, "source": [ - "You can see the full code for this job in [lightning_fl_job](code/lightning_fl_job.py)." + "You can see the full code for this job in [lightning_fl_job](code/lightning_fl_job.py).\n", + "\n", + "Now that you see how easy it is to convert a PyTorch Lightning training job to a federated learning job with NVFlare, we will show you how to [convert machine learning training jobs to federated learning](../02.4_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb) in the next section." ] + }, + { + "cell_type": "markdown", + "id": "9370e34a", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "nvflare_env", "language": "python", - "name": "python3" + "name": "nvflare_env" }, "language_info": { "codemirror_mode": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/client_api.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/client_api.ipynb deleted file mode 100644 index 3a0c46da26..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/client_api.ipynb +++ /dev/null @@ -1,346 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "58149c32", - "metadata": {}, - "source": [ - "# Transform Existing Code to FL Easily with the FLARE Client API" - ] - }, - { - "cell_type": "markdown", - "id": "06203527", - "metadata": {}, - "source": [ - "The FLARE Client API provides an easy way to convert centralized, local training code into federated learning code with just a few lines of code changes.\n", - "\n", - "Most of the previous examples up this point have already been using the Client API, but in this section we focus on the core concepts of the Client API and explain some of the ways it can be configured to help you use the Client API more effectively.\n", - "\n", - "You can see the detailed examples with actual integration with deep learing platforms including PyTorch and TensorFlow here: https://github.com/NVIDIA/NVFlare/tree/main/examples/hello-world/ml-to-fl" - ] - }, - { - "cell_type": "markdown", - "id": "be7efa36", - "metadata": {}, - "source": [ - "## Core Concept" - ] - }, - { - "cell_type": "markdown", - "id": "76102eac", - "metadata": {}, - "source": [ - "The general structure of the popular federated learning (FL) workflow, \"FedAvg\" is as follows:\n", - "\n", - "1. **FL server initializes an initial model**\n", - "2. **For each round (global iteration):**\n", - " 1. FL server sends the global model to clients\n", - " 2. Each FL client starts with this global model and trains on their own data\n", - " 3. Each FL client sends back their trained model\n", - " 4. FL server aggregates all the models and produces a new global model\n", - "\n", - "On the client side, the training workflow is as follows:\n", - "\n", - "1. Receive the model from the FL server\n", - "2. Perform local training on the received global model and/or evaluate the received global model for model selection\n", - "3. Send the new model back to the FL server" - ] - }, - { - "cell_type": "markdown", - "id": "50e2b7dd", - "metadata": {}, - "source": [ - "To convert a centralized training code to federated learning, we need to\n", - "adapt the code to do the following steps:\n", - "\n", - "1. Obtain the required information from the received `fl_model`\n", - "2. Run local training\n", - "3. Put the results in a new `fl_model` to be sent back\n", - "\n", - "For a general use case, there are three essential methods for the Client API:\n", - "\n", - "* ``init()``: Initializes NVFlare Client API environment.\n", - "* ``receive()``: Receives model from NVFlare side.\n", - "* ``send()``: Sends the model to NVFlare side.\n", - "\n", - "You can use the Client API to change centralized training code to\n", - "federated learning, for example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9f21ee16", - "metadata": {}, - "outputs": [], - "source": [ - "import nvflare.client as flare\n", - "\n", - "flare.init() # 1. Initializes NVFlare Client API environment.\n", - "input_model = flare.receive() # 2. Receives model from NVFlare side.\n", - "params = input_model.params # 3. Obtain the required information from received FLModel\n", - "\n", - "# original local training code begins\n", - "new_params = local_train(params)\n", - "# original local training code ends\n", - "\n", - "output_model = flare.FLModel(params=new_params) # 4. Put the results in a new FLModel\n", - "flare.send(output_model) # 5. Sends the model to NVFlare side." - ] - }, - { - "cell_type": "markdown", - "id": "494e4079", - "metadata": {}, - "source": [ - "With 5 lines of code changes, we convert the centralized training code to work in a\n", - "federated learning setting.\n", - "\n", - "After this, we can use the job templates and the Job CLI\n", - "to generate a job and export it to run on a deployed NVFlare system or directly run the job using FL Simulator.\n", - "\n", - "To see a table of the key Client APIs, see the [Client API documentation in the programming guide](https://nvflare.readthedocs.io/en/main/programming_guide/execution_api_type/client_api.html#id2).\n", - "\n", - "Please consult the [Client API Module](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.client.api.html) for more in-depth information about all of the Client API functions.\n", - "\n", - "If you are using PyTorch Lightning in your training code, you can check the [Lightning API Module](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.app_opt.lightning.api.html). Also, be sure to look through the [Convert Torch Lightning to FL notebook](../02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb) and related code." - ] - }, - { - "cell_type": "markdown", - "id": "4a09d80e", - "metadata": {}, - "source": [ - "## Advanced User Options: Client API with Different Implementations\n", - "\n", - "Within the Client API, we offer multiple implementations tailored to diverse requirements:\n", - "\n", - "* In-process Client API: In this setup, the client training script operates within the same process as the NVFlare Client job.\n", - "This configuration, utilizing the ```InProcessClientAPIExecutor```, offers shared memory usage and is efficient with simple configuration. \n", - "This is the default for `ScriptRunner` since by default `launch_external_process=False`. Use this configuration for development or single GPU training.\n", - "\n", - "* Sub-process Client API: Here, the client training script runs in a separate subprocess.\n", - "Utilizing the ```ClientAPILauncherExecutor```, this option offers flexibility in communication mechanisms:\n", - " * Communication via CellPipe (default)\n", - " * Communication via FilePipe (no capability to stream metrics for experiment tracking) \n", - "This configuration is ideal for scenarios requiring multi-GPU or distributed PyTorch training.\n", - "\n", - "Choose the option best suited to your specific requirements and workflow preferences.\n", - "\n", - "These implementations can be easily configured using the JobAPI's `ScriptRunner`.\n", - "By default, the ```InProcessClientAPIExecutor``` is used, however setting `launch_external_process=True` uses the ```ClientAPILauncherExecutor```\n", - "with pre-configured CellPipes for communication and metrics streaming." - ] - }, - { - "cell_type": "markdown", - "id": "b3ac92dd", - "metadata": {}, - "source": [ - "## NVFlare Client API Job with NumPy" - ] - }, - { - "cell_type": "markdown", - "id": "832a4b34", - "metadata": {}, - "source": [ - "In this example we use simple NumPy scripts to showcase the Client API with the `ScriptRunner` for both in-process and sub-process settings. With NumPy, only nvflare is needed so you do not have to install any additional dependencies.\n", - "\n", - "The default mode of the `ScriptRunner` uses `InProcessClientAPIExecutor` with the client training script operating within the same process as the NVFlare Client job. Below, we show a script that sends back full model parameters and then one that sends back model parameters differences before explaining metrics streaming and then showing how to launch those same scripts with the Sub-process Client API." - ] - }, - { - "cell_type": "markdown", - "id": "c1af7da6", - "metadata": {}, - "source": [ - "### Send model parameters back to the NVFlare server\n", - "\n", - "We use the mock training script in [train_full.py](code/src/train_full.py)\n", - "and send back the FLModel with `params_type=\"FULL\"`.\n", - "\n", - "After we modify our training script, we can create a job using the ScriptRunner: [np_client_api_job.py](code/np_client_api_job.py).\n", - "\n", - "The script will run the job using the simulator with the Job API by default:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7952cab8", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 code/np_client_api_job.py --script code/src/train_full.py" - ] - }, - { - "cell_type": "markdown", - "id": "5076b478", - "metadata": {}, - "source": [ - "To instead export the job configuration to use in other modes, run the script with the flag `--export_config`." - ] - }, - { - "cell_type": "markdown", - "id": "efdceecd", - "metadata": {}, - "source": [ - "### Send model parameters differences back to the NVFlare server\n", - "\n", - "We can send model parameter differences back to the NVFlare server by calculating the parameters differences and sending it back: [train_diff.py](code/src/train_diff.py)\n", - "\n", - "Note that we set the `params_type` to `DIFF` when creating `flare.FLModel`.\n", - "\n", - "Then we can run it using the NVFlare Simulator:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "737d8b7c", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 code/np_client_api_job.py --script code/src/train_diff.py" - ] - }, - { - "cell_type": "markdown", - "id": "550479f2", - "metadata": {}, - "source": [ - "### Metrics streaming\n", - "\n", - "We already showed an example with metrics streaming in section 01.5 of Chapter 1 in Part 1, but this is a simple example with the Client API for streaming the training progress to the server with `MLflowWriter`.\n", - "\n", - "NVFlare supports the following writers:\n", - "\n", - " - `SummaryWriter` mimics Tensorboard `SummaryWriter`'s `add_scalar`, `add_scalars` method\n", - " - `WandBWriter` mimics Weights And Biases's `log` method\n", - " - `MLflowWriter` mimics MLflow's tracking api\n", - "\n", - "In this example we use `MLflowWriter` in [train_metrics.py](code/src/train_metrics.py) and configure a corresponding `MLflowReceiver` in the job script [np_client_api_job.py](code/np_client_api_job.py)\n", - "\n", - "Then we can run it using the NVFlare Simulator:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d27f9b3a", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 code/np_client_api_job.py --script code/src/train_metrics.py" - ] - }, - { - "cell_type": "markdown", - "id": "3774d943", - "metadata": {}, - "source": [ - "After the experiment is finished, you can view the results by running the the mlflow command: `mlflow ui --port 5000` inside the directory `/tmp/nvflare/jobs/workdir/server/simulate_job/`." - ] - }, - { - "cell_type": "markdown", - "id": "eadee3dd", - "metadata": {}, - "source": [ - "## Sub-process Client API\n", - "\n", - "The `ScriptRunner` with `launch_external_process=True` uses the `ClientAPILauncherExecutor` for external process script execution.\n", - "This configuration is ideal for scenarios requiring third-party integrations, multi-GPU or distributed PyTorch training, or if additional processes are needed for training." - ] - }, - { - "cell_type": "markdown", - "id": "ade375cd", - "metadata": {}, - "source": [ - "### Launching the script\n", - "\n", - "When launching a script in an external process, it is launched once for the entire job.\n", - "We must ensure our training script [train_full.py](code/src/train_full.py) is in a loop to support this.\n", - "\n", - "Then we can run it using the NVFlare Simulator:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b3ee641", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 code/np_client_api_job.py --script code/src/train_full.py --launch_process" - ] - }, - { - "cell_type": "markdown", - "id": "5006b87a", - "metadata": {}, - "source": [ - "### Metrics streaming\n", - "\n", - "In this example we use `MLflowWriter` in [train_metrics.py](code/src/train_metrics.py) and configure a corresponding `MLflowReceiver` in the job script [np_client_api_job.py](code/np_client_api_job.py)\n", - "\n", - "Then we can run it using the NVFlare Simulator:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "071834d0", - "metadata": {}, - "outputs": [], - "source": [ - "! python3 np_client_api_job.py --script src/train_metrics.py --launch_process" - ] - }, - { - "cell_type": "markdown", - "id": "95504253", - "metadata": {}, - "source": [ - "If you want to see example code with actual integration with PyTorch and TensorFlow, you can find it in the [Hello World ML to FL](https://github.com/NVIDIA/NVFlare/tree/main/examples/hello-world/ml-to-fl) section of the examples." - ] - }, - { - "cell_type": "markdown", - "id": "c56e633e", - "metadata": {}, - "source": [ - "With this, we are at the end of Chapter 2. The [next notebook](../02.5_recap/recap.ipynb) is a reacap of this chapter." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/np_client_api_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/np_client_api_job.py deleted file mode 100644 index b2a09c5968..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/np_client_api_job.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. -# -# 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 argparse - -from nvflare import FedJob -from nvflare.app_common.np.np_model_persistor import NPModelPersistor -from nvflare.app_common.workflows.fedavg import FedAvg -from nvflare.app_opt.tracking.mlflow.mlflow_receiver import MLflowReceiver -from nvflare.job_config.script_runner import FrameworkType, ScriptRunner - - -def define_parser(): - parser = argparse.ArgumentParser() - parser.add_argument("--n_clients", type=int, default=2) - parser.add_argument("--num_rounds", type=int, default=5) - parser.add_argument("--script", type=str, default="src/train_full.py") - parser.add_argument("--launch_process", action=argparse.BooleanOptionalAction, default=False) - parser.add_argument("--export_config", action=argparse.BooleanOptionalAction, default=False) - - return parser.parse_args() - - -def main(): - # define local parameters - args = define_parser() - - n_clients = args.n_clients - num_rounds = args.num_rounds - script = args.script - launch_process = args.launch_process - export_config = args.export_config - - job = FedJob(name="np_client_api") - - persistor_id = job.to_server(NPModelPersistor(), "persistor") - - # Define the controller workflow and send to server - controller = FedAvg(num_clients=n_clients, num_rounds=num_rounds, persistor_id=persistor_id) - job.to_server(controller) - - # Add MLflow Receiver for metrics streaming - if script == "src/train_metrics.py": - receiver = MLflowReceiver( - tracking_uri="file:///tmp/nvflare/jobs/workdir/server/simulate_job/mlruns", - kw_args={ - "experiment_name": "nvflare-fedavg-np-experiment", - "run_name": "nvflare-fedavg-np-with-mlflow", - "experiment_tags": {"mlflow.note.content": "## **NVFlare FedAvg Numpy experiment with MLflow**"}, - "run_tags": {"mlflow.note.content": "## Federated Experiment tracking with MLflow.\n"}, - }, - artifact_location="artifacts", - events=["fed.analytix_log_stats"], - ) - job.to_server(receiver) - - executor = ScriptRunner( - script=script, - launch_external_process=launch_process, - framework=FrameworkType.NUMPY, - ) - job.to_clients(executor) - - if export_config: - job.export_job("/tmp/nvflare/jobs/job_config") - else: - job.simulator_run("/tmp/nvflare/jobs/workdir", n_clients=n_clients, gpu="0") - - -if __name__ == "__main__": - main() diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_diff.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_diff.py deleted file mode 100755 index d7dc02ee45..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_diff.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. -# -# 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 copy - -import nvflare.client as flare - - -def train(input_arr): - output_arr = copy.deepcopy(input_arr) - # mock training with plus 1 - return output_arr + 1 - - -def evaluate(input_arr): - # mock evaluation metrics - return 100 - - -def main(): - # initializes NVFlare interface - flare.init() - - # get system information - sys_info = flare.system_info() - print(f"system info is: {sys_info}") - - while flare.is_running(): - - # get model from NVFlare - input_model = flare.receive() - print(f"received weights is: {input_model.params}") - - input_numpy_array = input_model.params["numpy_key"] - - # training - output_numpy_array = train(input_numpy_array) - - # evaluation - metrics = evaluate(input_numpy_array) - - print(f"finish round: {input_model.current_round}") - - # calculate difference here - diff = output_numpy_array - input_numpy_array - - # send back the model difference - print(f"send back: {diff}") - flare.send( - flare.FLModel( - params={"numpy_key": diff}, - params_type="DIFF", - metrics={"accuracy": metrics}, - current_round=input_model.current_round, - ) - ) - - -if __name__ == "__main__": - main() diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_full.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_full.py deleted file mode 100755 index e1598275b5..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_full.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. -# -# 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 copy - -import nvflare.client as flare - - -def train(input_arr): - output_arr = copy.deepcopy(input_arr) - # mock training with plus 1 - return output_arr + 1 - - -def evaluate(input_arr): - # mock evaluation metrics - return 100 - - -def main(): - # initializes NVFlare interface - flare.init() - - # get system information - sys_info = flare.system_info() - print(f"system info is: {sys_info}") - - while flare.is_running(): - - # get model from NVFlare - input_model = flare.receive() - print(f"received weights is: {input_model.params}", flush=True) - - input_numpy_array = input_model.params["numpy_key"] - - # training - output_numpy_array = train(input_numpy_array) - - # evaluation - metrics = evaluate(input_numpy_array) - - print(f"finish round: {input_model.current_round}", flush=True) - - # send back the model - print(f"send back: {output_numpy_array}", flush=True) - flare.send( - flare.FLModel( - params={"numpy_key": output_numpy_array}, - params_type="FULL", - metrics={"accuracy": metrics}, - current_round=input_model.current_round, - ) - ) - - -if __name__ == "__main__": - main() diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_metrics.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_metrics.py deleted file mode 100755 index c6b24e877d..0000000000 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_client_api/code/src/train_metrics.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. -# -# 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 copy -import time - -import nvflare.client as flare -from nvflare.client.tracking import MLflowWriter - - -def train(input_arr, current_round, epochs=3): - writer = MLflowWriter() - output_arr = copy.deepcopy(input_arr) - num_of_data = 2000 - batch_size = 16 - num_of_batches = num_of_data // batch_size - for i in range(epochs): - for j in range(num_of_batches): - global_step = current_round * num_of_batches * epochs + i * num_of_batches + j - writer.log_metric( - key="global_step", - value=global_step, - step=global_step, - ) - print(f"logged records from epoch: {i}") - # mock training with plus 1 - output_arr += 1 - # assume each epoch takes 1 seconds - time.sleep(1.0) - return output_arr - - -def evaluate(input_arr): - # mock evaluation metrics - return 100 - - -def main(): - # initializes NVFlare interface - flare.init() - - # get system information - sys_info = flare.system_info() - print(f"system info is: {sys_info}") - - while flare.is_running(): - input_model = flare.receive() - print(f"received weights is: {input_model.params}") - - input_numpy_array = input_model.params["numpy_key"] - - # training - output_numpy_array = train(input_numpy_array, current_round=input_model.current_round, epochs=3) - - # evaluation - metrics = evaluate(input_numpy_array) - - print(f"finish round: {input_model.current_round}") - - # send back the model - print(f"send back: {output_numpy_array}") - flare.send( - flare.FLModel( - params={"numpy_key": output_numpy_array}, - params_type="FULL", - metrics={"accuracy": metrics}, - current_round=input_model.current_round, - ) - ) - - -if __name__ == "__main__": - main() diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/data/prepare_heart_disease_data.sh b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/data/prepare_heart_disease_data.sh similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/data/prepare_heart_disease_data.sh rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/data/prepare_heart_disease_data.sh diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/data/utils/convert_data_to_np.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/data/utils/convert_data_to_np.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/data/utils/convert_data_to_np.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/data/utils/convert_data_to_np.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/figs/tb-metrics.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/figs/tb-metrics.png similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/figs/tb-metrics.png rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/figs/tb-metrics.png diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_client.json b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_client.json similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_client.json rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_client.json diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_server.json b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_server.json similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_server.json rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/config/config_fed_server.json diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_persistor.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_persistor.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_persistor.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_persistor.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_train.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_train.py similarity index 97% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_train.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_train.py index 419b9ed70b..1f426e4a77 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_train.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_train.py @@ -20,7 +20,6 @@ from sklearn.metrics import accuracy_score, precision_score import nvflare.client as flare -from nvflare.apis.fl_constant import FLMetaKey from nvflare.app_common.abstract.fl_model import FLModel, ParamsType from nvflare.app_common.np.constants import NPConstants from nvflare.client.tracking import SummaryWriter @@ -169,7 +168,7 @@ def main(): # Send result to server for aggregation. result_model = FLModel(params=result_dict, params_type=ParamsType.FULL) - result_model.meta[FLMetaKey.NUM_STEPS_CURRENT_ROUND] = data["train_X"].shape[0] + result_model.meta["sample_size"] = data["train_X"].shape[0] print( ( diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_workflow.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_workflow.py similarity index 98% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_workflow.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_workflow.py index a4094cb7f6..40a01d6063 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/src/newton_raphson_workflow.py +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/app/custom/newton_raphson_workflow.py @@ -17,7 +17,6 @@ import numpy as np -from nvflare.apis.fl_constant import FLMetaKey from nvflare.app_common.abstract.fl_model import FLModel from nvflare.app_common.aggregators.weighted_aggregation_helper import WeightedAggregationHelper from nvflare.app_common.app_constant import AppConstants @@ -54,7 +53,6 @@ def run(self) -> None: # converted `FLModel` by `ModelController`. # model = self.load_model() - model.start_round = self.start_round model.total_rounds = self.num_rounds @@ -119,7 +117,7 @@ def newton_raphson_aggregator_fn(self, results: List[FLModel]): for curr_result in results: self.aggregator.add( data=curr_result.params, - weight=curr_result.meta.get(FLMetaKey.NUM_STEPS_CURRENT_ROUND, 1.0), + weight=curr_result.meta.get("sample_size", 1.0), contributor_name=curr_result.meta.get("client_name", AppConstants.CLIENT_UNKNOWN), contribution_round=curr_result.current_round, ) diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/meta.json b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/meta.json similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/meta.json rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/newton_raphson/meta.json diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/train_centralized.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/train_centralized.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/code/train_centralized.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/code/train_centralized.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb new file mode 100644 index 0000000000..96fef946b5 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb @@ -0,0 +1,687 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e8c19632", + "metadata": {}, + "source": [ + "# Converting Logistic Regression to Federated Learning\n", + "\n", + "\n", + "Logistic regression is a fundamental classification algorithm that models the probability of a binary outcome. Despite its name, it's used for classification rather than regression. The model uses the logistic (sigmoid) function to transform a linear combination of features into a probability between 0 and 1.\n", + "\n", + "The Newton-Raphson method is a powerful second-order optimization technique that uses both first-order (gradient) and second-order (Hessian) information to find the optimal model parameters. Unlike first-order methods like gradient descent, Newton's method incorporates curvature information through the Hessian matrix, often leading to faster convergence, especially near the optimum.\n", + "\n", + "In this section, we will convert logistics regression with the 2nd order Newton-Raphson optimization to Federated Learning\n" + ] + }, + { + "cell_type": "markdown", + "id": "7f9d96ed", + "metadata": {}, + "source": [ + "## Federated Logistic Regression with Second-Order Newton-Raphson optimization\n", + "This example shows how to implement a federated binary classification via logistic regression with second-order Newton-Raphson optimization.\n", + "\n", + "The [UCI Heart Disease dataset](https://archive.ics.uci.edu/dataset/45/heart+disease) is\n", + "used in this example. Scripts are provided to download and process the\n", + "dataset as described\n", + "[here](https://github.com/owkin/FLamby/tree/main/flamby/datasets/fed_heart_disease).\n", + "\n", + "This dataset contains samples from 4 sites, splitted into training and\n", + "testing sets as described below:\n", + "|site | sample split |\n", + "|-------------|---------------------------------------|\n", + "|Cleveland | train: 199 samples, test: 104 samples |\n", + "|Hungary | train: 172 samples, test: 89 samples |\n", + "|Switzerland | train: 30 samples, test: 16 samples |\n", + "|Long Beach V | train: 85 samples, test: 45 samples |\n", + "\n", + "The number of features in each sample is 13." + ] + }, + { + "cell_type": "markdown", + "id": "e54f0dcc", + "metadata": {}, + "source": [ + "## Introduction\n", + "\n", + "The [Newton-Raphson\n", + "optimization](https://en.wikipedia.org/wiki/Newton%27s_method) problem\n", + "can be described as follows.\n", + "\n", + "In a binary classification task with logistic regression, the\n", + "probability of a data sample $x$ classified as positive is formulated\n", + "as:\n", + "$$p(x) = \\sigma(\\beta \\cdot x + \\beta_{0})$$\n", + "where $\\sigma(.)$ denotes the sigmoid function. We can incorporate\n", + "$\\beta_{0}$ and $\\beta$ into a single parameter vector $\\theta =\n", + "( \\beta_{0}, \\beta)$. Let $d$ be the number\n", + "of features for each data sample $x$ and let $N$ be the number of data\n", + "samples. We then have the matrix version of the above probability\n", + "equation:\n", + "$$p(X) = \\sigma( X \\theta )$$\n", + "Here $X$ is the matrix of all samples, with shape $N \\times (d+1)$,\n", + "having it's first column filled with value 1 to account for the\n", + "intercept $\\theta_{0}$.\n", + "\n", + "The goal is to compute parameter vector $\\theta$ that maximizes the\n", + "below likelihood function:\n", + "$$L_{\\theta} = \\prod_{i=1}^{N} p(x_i)^{y_i} (1 - p(x_i)^{1-y_i})$$\n", + "\n", + "The Newton-Raphson method optimizes the likelihood function via\n", + "quadratic approximation. Omitting the maths, the theoretical update\n", + "formula for parameter vector $\\theta$ is:\n", + "$$\\theta^{n+1} = \\theta^{n} - H_{\\theta^{n}}^{-1} \\nabla L_{\\theta^{n}}$$\n", + "where\n", + "$$\\nabla L_{\\theta^{n}} = X^{T}(y - p(X))$$\n", + "is the gradient of the likelihood function, with $y$ being the vector\n", + "of ground truth for sample data matrix $X$, and\n", + "$$H_{\\theta^{n}} = -X^{T} D X$$\n", + "is the Hessian of the likelihood function, with $D$ a diagonal matrix\n", + "where diagonal value at $(i,i)$ is $D(i,i) = p(x_i) (1 - p(x_i))$.\n", + "\n", + "In federated Newton-Raphson optimization, each client will compute its\n", + "own gradient $\\nabla L_{\\theta^{n}}$ and Hessian $H_{\\theta^{n}}$\n", + "based on local training samples. A server will aggregate the gradients\n", + "and Hessians computed from all clients, and perform the update of\n", + "parameter $\\theta$ based on the theoretical update formula described\n", + "above." + ] + }, + { + "cell_type": "markdown", + "id": "32003ba9", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "Using `nvflare`, The federated logistic regression with Newton-Raphson\n", + "optimization is implemented as follows.\n", + "\n", + "On the server side, all workflow logics are implemented in\n", + "class `FedAvgNewtonRaphson`, which can be found\n", + "[here](code/newton_raphson/app/custom/newton_raphson_workflow.py). The\n", + "`FedAvgNewtonRaphson` class inherits from the\n", + "[`BaseFedAvg`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/base_fedavg.py)\n", + "class, which itself inherits from the **ModelController**\n", + "([`ModelController`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py))\n", + "class. This is the preferrable approach to implement a custom\n", + "workflow, since `ModelController` decouples communication logic from\n", + "actual workflow (training & validation) logic. The mandatory\n", + "method to override in `ModelController` is the\n", + "[`run()`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L37)\n", + "method, where the orchestration of server-side workflow actually\n", + "happens. The implementation of `run()` method in\n", + "[`FedAvgNewtonRaphson`](code/newton_raphson/app/custom/newton_raphson_workflow.py)\n", + "is similar to the classic\n", + "[`FedAvg`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/fedavg.py#L44):\n", + "- Initialize the global model, this is acheived through method `load_model()`\n", + " from base class\n", + " [`ModelController`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L292),\n", + " which relies on the\n", + " [`ModelPersistor`](https://nvflare.readthedocs.io/en/main/glossary.html#persistor). A\n", + " custom\n", + " [`NewtonRaphsonModelPersistor`](code/newton_raphson/app/custom/newton_raphson_persistor.py)\n", + " is implemented in this example, which is based on the\n", + " [`NPModelPersistor`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/np/np_model_persistor.py)\n", + " for numpy data, since the _model_ in the case of logistic regression\n", + " is just the parameter vector $\\theta$ that can be represented by a\n", + " numpy array. Only the `__init__` method needs to be re-implemented\n", + " to provide a proper initialization for the global parameter vector\n", + " $\\theta$.\n", + "- During each training round, the global model will be sent to the\n", + " list of participating clients to perform a training task. This is\n", + " done using the\n", + " [`send_model_and_wait()`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/workflows/model_controller.py#L41)\n", + " method. Once\n", + " the clients finish their local training, results will be collected\n", + " and sent back to server as\n", + " [`FLModel`](https://nvflare.readthedocs.io/en/main/programming_guide/fl_model.html#flmodel)s.\n", + "- Results sent by clients contain their locally computed gradient and\n", + " Hessian. A [custom aggregation\n", + " function](code/newton_raphson/app/custom/newton_raphson_workflow.py)\n", + " is implemented to get the averaged gradient and Hessian, and compute\n", + " the Newton-Raphson update for the global parameter vector $\\theta$,\n", + " based on the theoretical formula shown above. The averaging of\n", + " gradient and Hessian is based on the\n", + " [`WeightedAggregationHelper`](https://github.com/NVIDIA/NVFlare/blob/main/nvflare/app_common/aggregators/weighted_aggregation_helper.py#L20),\n", + " which weighs the contribution from each client based on the number\n", + " of local training samples. The aggregated Newton-Raphson update is\n", + " returned as an `FLModel`.\n", + "- After getting the aggregated Newton-Raphson update, an\n", + " [`update_model()`](code/newton_raphson/app/custom/newton_raphson_workflow.py#L172)\n", + " method is implemented to actually apply the Newton-Raphson update to\n", + " the global model.\n", + "- The last step is to save the updated global model, again through\n", + " the `NewtonRaphsonModelPersistor` using `save_model()`.\n", + "\n", + "\n", + "On the client side, the local training logic is implemented\n", + "[here](code/newton_raphson/app/custom/newton_raphson_train.py). The\n", + "implementation is based on the [`Client\n", + "API`](https://nvflare.readthedocs.io/en/main/programming_guide/execution_api_type.html#client-api). This\n", + "allows user to add minimum `nvflare`-specific code to turn a typical\n", + "centralized training script into a federated client side local training\n", + "script.\n", + "- During local training, each client receives a copy of the global\n", + " model, sent by the server, using `flare.receive()` from the Client API.\n", + " The received global model is an instance of `FLModel`.\n", + "- A local validation is first performed, where validation metrics\n", + " (accuracy and precision) are streamed to server using the\n", + " [`SummaryWriter`](https://nvflare.readthedocs.io/en/main/apidocs/nvflare.client.tracking.html#nvflare.client.tracking.SummaryWriter). The\n", + " streamed metrics can be loaded and visualized using tensorboard.\n", + "- Then each client computes it's gradient and Hessian based on local\n", + " training data, using their respective theoretical formula described\n", + " above. This is implemented in the\n", + " [`train_newton_raphson()`](code/newton_raphson/app/custom/newton_raphson_train.py#L82)\n", + " method. Each client then sends the computed results (always in\n", + " `FLModel` format) to server for aggregation, using the Client API call\n", + " `flare.send()`.\n", + "\n", + "Each client site corresponds to a site listed in the data table above.\n", + "\n", + "A [centralized training script](code/train_centralized.py) is also\n", + "provided, which allows for comparing the federated Newton-Raphson\n", + "optimization versus the centralized version. In the centralized\n", + "version, training data samples from all 4 sites were concatenated into\n", + "a single matrix, used to optimize the model parameters. The\n", + "optimized model was then tested separately on testing data samples of\n", + "the 4 sites, using accuracy and precision as metrics.\n", + "\n", + "Comparing the federated [client-side training\n", + "code](code/newton_raphson/app/custom/newton_raphson_train.py) with the\n", + "centralized [training code](code/train_centralized.py), we can see that\n", + "the training logic remains similar: load data, perform training\n", + "(Newton-Raphson updates), and valid trained model. The only added\n", + "differences in the federated code are related to interaction with the\n", + "FL system, such as receiving and send `FLModel`." + ] + }, + { + "cell_type": "markdown", + "id": "c3fc55e0", + "metadata": {}, + "source": [ + "## Install requirements\n", + "First, install the required packages:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04911ca3", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -r code/requirements.txt" + ] + }, + { + "cell_type": "markdown", + "id": "33ea8504", + "metadata": {}, + "source": [ + "## Download and prepare data\n", + "\n", + "Execute the following script\n", + "```\n", + "bash ./code/data/prepare_heart_disease_data.sh\n", + "```\n", + "This will download the heart disease dataset under\n", + "`/tmp/flare/dataset/heart_disease_data/`\n", + "\n", + "Please note that you may need to accept the data terms in order to complete the download." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b395c0d9", + "metadata": {}, + "outputs": [], + "source": [ + "# Note: the the download site remember your download history and abort the 2nd download attempt. \n", + "\n", + "! echo y | bash ./code/data/prepare_heart_disease_data.sh\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61e13343", + "metadata": {}, + "outputs": [], + "source": [ + "! ls -al /tmp/flare/dataset/heart_disease_data/" + ] + }, + { + "cell_type": "markdown", + "id": "d548b466", + "metadata": {}, + "source": [ + "## Centralized Logistic Regression\n", + "\n", + "Two implementations of logistic regression are provided in the\n", + "centralized training script, which can be specified by the `--solver`\n", + "argument:\n", + "- One is using `sklearn.LogisticRegression` with the `newton-cholesky`\n", + " solver\n", + "- The other one is manually implemented using the theoretical update\n", + " formulas described above.\n", + "\n", + "Both implementations were tested to converge in 4 iterations and to\n", + "give the same result.\n", + "\n", + "Launch the following script:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c68fe1a", + "metadata": {}, + "outputs": [], + "source": [ + "%cd code\n", + "! python3 train_centralized.py --solver custom\n", + "\n", + "%cd -" + ] + }, + { + "cell_type": "markdown", + "id": "a1c8d278", + "metadata": {}, + "source": [ + "## Federated Logistic Regression\n", + "\n", + "\n", + "To convert the centralized logistic regression to federated learning, we need to do the following:\n", + "\n", + "1. Decide what model parameters will be transmitted between the server and clients\n", + "2. Define the workflow that orchestrates the federated learning process\n", + "3. Define how to load the initial model on the server side\n", + "4. Modify the client-side training logic to handle models received from the server\n", + "5. Implement the aggregation logic for the gradients and Hessians computed by the clients\n", + "6. Configure the job via FLARE job API\n", + "\n", + "Let's examine each step.\n", + "\n", + "### Model Parameters\n", + "\n", + "We decided to simply capture the model parameters in the FLModel:\n", + "\n", + "\n", + "```python\n", + "\n", + "model = FLModel(params={\"gradient\": gradient, \"hessian\": hessian})\n", + "```\n", + "\n", + "We could optionally use FLModel.optimizer_params to store the Hessian, but either approach works.\n", + "\n", + "We add a few metadata fields to help with the training process. We use the training sample size as the weight, storing this information in the metadata:\n", + "\n", + "```python\n", + "\n", + "model = FLModel(params=result_dict, params_type=ParamsType.FULL)\n", + "model.meta[\"sample_size\"] = data[\"train_X\"].shape[0]\n", + "```\n", + "\n", + "### Workflow\n", + "\n", + "We decided to choose the FedAvg type of scatter and gather workflow. So we can based the class using the `BaseFedAvg` class. \n", + "\n", + "```python\n", + "\n", + "class FedAvgNewtonRaphson(BaseFedAvg):\n", + "\n", + " def __init__(self, damping_factor, epsilon=1.0, *args, **kwargs):\n", + " super().__init__(*args, **kwargs)\n", + " \"\"\"\n", + " Args:\n", + " damping_factor: damping factor for Newton Raphson updates.\n", + " epsilon: a regularization factor to avoid empty hessian for\n", + " matrix inversion\n", + " \"\"\"\n", + " self.damping_factor = damping_factor\n", + " self.epsilon = epsilon\n", + " self.aggregator = WeightedAggregationHelper()\n", + "\n", + " def run(self) -> None:\n", + " \n", + " # First load the model and set up some training params.\n", + " # A `persisitor` (NewtonRaphsonModelPersistor) will load\n", + " # the model in `ModelLearnable` format, then will be\n", + " # converted `FLModel` by `ModelController`.\n", + " #\n", + " model = self.load_model()\n", + "\n", + " model.start_round = self.start_round\n", + " model.total_rounds = self.num_rounds\n", + "\n", + " \n", + " for self.current_round in range(self.start_round, self.start_round + self.num_rounds):\n", + "\n", + " # Get the list of clients.\n", + " clients = self.sample_clients(self.num_clients)\n", + "\n", + " model.current_round = self.current_round\n", + "\n", + " results = self.send_model_and_wait(targets=clients, data=model)\n", + "\n", + " # Aggregate results receieved from clients.\n", + " aggregate_results = self.aggregate(results, aggregate_fn=self.newton_raphson_aggregator_fn)\n", + "\n", + " # Update global model based on the following formula:\n", + " # weights = weights + updates, where\n", + " # updates = -damping_factor * Hessian^{-1} . Gradient\n", + " self.update_model(model, aggregate_results)\n", + "\n", + " # Save global model.\n", + " self.save_model(model)\n", + "\n", + " self.info(\"Finished FedAvg.\")\n", + "\n", + "```\n", + "As you can see the `run()` method is the only method we need to implement. Its nothing but a for loop that sends the model to the clients and aggregate the results. \n", + "\n", + "### Model Loader\n", + "\n", + "we need to decide how to load the initial model on the server side. We decide to implement a custom persistor that loads the model from a numpy file. \n", + "\n", + "```python\n", + "\n", + "class NewtonRaphsonModelPersistor(NPModelPersistor):\n", + " \"\"\"\n", + " This class defines the persistor for Newton Raphson model.\n", + "\n", + " A persistor controls the logic behind initializing, loading\n", + " and saving of the model / parameters for each round of a\n", + " federated learning process.\n", + "\n", + " In the 2nd order Newton Raphson case, a model is just a\n", + " 1-D numpy vector containing the parameters for logistic\n", + " regression. The length of the parameter vector is defined\n", + " by the number of features in the dataset.\n", + "\n", + " \"\"\"\n", + "\n", + " def __init__(self, model_dir=\"models\", model_name=\"weights.npy\", n_features=13):\n", + " super().__init__()\n", + "\n", + " self.model_dir = model_dir\n", + " self.model_name = model_name\n", + " self.n_features = n_features\n", + "\n", + " # A default model is loaded when no local model is available.\n", + " # This happen when training starts.\n", + " #\n", + " # A `model` for a binary logistic regression is just a matrix,\n", + " # with shape (n_features + 1, 1).\n", + " # For the UCI ML Heart Disease dataset, the n_features = 13.\n", + " #\n", + " # A default matrix with value 0s is created.\n", + " #\n", + " self.default_data = np.zeros((self.n_features + 1, 1), dtype=np.float32)\n", + "\n", + "```\n", + "\n", + "\n", + "### Client Training Logic \n", + "\n", + "Now, we need to convert the centralized training logic to the federated training logic with Client API.\n", + "\n", + "```python\n", + "\n", + "\n", + "def main():\n", + " \n", + " args = parse_arguments()\n", + "\n", + " flare.init()\n", + "\n", + " site_name = flare.get_site_name()\n", + " \n", + " # Load client site data.\n", + " data = load_data(args.data_root, site_name)\n", + "\n", + "\n", + " # keep running until the job is terminated or end of training round\n", + " while flare.is_running():\n", + "\n", + " # Receive global model (FLModel) from server.\n", + " global_model = flare.receive()\n", + "\n", + " # Get the weights, aka parameter theta for logistic regression.\n", + " global_weights = global_model.params[\"weights\"]\n", + "\n", + " # Local validation before training\n", + " validation_scores = validate(data, global_weights)\n", + "\n", + " # Local training\n", + " result_dict = train_newton_raphson(data, theta=global_weights)\n", + "\n", + " # Send result to server for aggregation.\n", + " local_model = FLModel(params=result_dict, params_type=ParamsType.FULL)\n", + " local_model.meta[\"sample_size\"] = data[\"train_X\"].shape[0]\n", + "\n", + " flare.send(local_model)\n", + "\n", + "```\n", + "\n", + "This is pretty straight forward. We receive the global model, perform the local training and send the result to the server. The code structure is the same to the centralized training with additional loop for the federated training. \n", + "\n", + "We added the sample size to the meta data so we can use it in weighted aggregation as the aggregation weight.\n", + "\n", + "\n", + "### Aggregation Logic\n", + "\n", + "Now, lets loop at the aggregation logic. \n", + "\n", + "```python\n", + "\n", + " def newton_raphson_aggregator_fn(self, results: List[FLModel]):\n", + " \"\"\"\n", + " This uses the default thread-safe WeightedAggregationHelper,\n", + " which implement a weighted average of all values received from\n", + " a `result` dictionary.\n", + "\n", + " Args:\n", + " results: a list of `FLModel`s. Each `FLModel` is received\n", + " from a client. The field `params` is a dictionary that\n", + " contains values to be aggregated: the gradient and hessian.\n", + " \"\"\"\n", + " \n", + " # On client side the `sample_size` key is used to track the number of samples for each client.\n", + " for curr_result in results:\n", + " self.aggregator.add(\n", + " data=curr_result.params,\n", + " weight=curr_result.meta.get(\"sample_size\", 1.0),\n", + " contributor_name=curr_result.meta.get(\"client_name\", AppConstants.CLIENT_UNKNOWN),\n", + " contribution_round=curr_result.current_round,\n", + " )\n", + "\n", + " aggregated_dict = self.aggregator.get_result()\n", + " \n", + " # Compute global model update:\n", + " # update = - damping_factor * Hessian^{-1} . Gradient\n", + " # A regularization is added to avoid empty hessian.\n", + " #\n", + " reg = self.epsilon * np.eye(aggregated_dict[\"hessian\"].shape[0])\n", + "\n", + " newton_raphson_updates = self.damping_factor * np.linalg.solve(\n", + " aggregated_dict[\"hessian\"] + reg, aggregated_dict[\"gradient\"]\n", + " )\n", + " \n", + " # Convert the aggregated result to `FLModel`, this `FLModel`\n", + " # will then be used by `update_model` method from the base class,\n", + " # to update the global model weights.\n", + " #\n", + " aggr_result = FLModel(\n", + " params={\"newton_raphson_updates\": newton_raphson_updates},\n", + " params_type=results[0].params_type,\n", + " meta={\n", + " \"nr_aggregated\": len(results),\n", + " AppConstants.CURRENT_ROUND: results[0].current_round,\n", + " AppConstants.NUM_ROUNDS: self.num_rounds,\n", + " },\n", + " )\n", + " return aggr_result\n", + "\n", + " def update_model(self, model, model_update, replace_meta=True) -> FLModel:\n", + " \"\"\"\n", + " Update logistic regression parameters based on\n", + " aggregated gradient and hessian.\n", + "\n", + " \"\"\"\n", + " if replace_meta:\n", + " model.meta = model_update.meta\n", + " else:\n", + " model.meta.update(model_update.meta)\n", + "\n", + " model.metrics = model_update.metrics\n", + " model.params[NPConstants.NUMPY_KEY] += model_update.params[\"newton_raphson_updates\"]\n", + "\n", + "```\n", + "Again, we just need to use FLModel to store the result and update the model. \n", + "\n", + "\n", + "### Job Configuration\n", + "\n", + "With the above steps, we have converted the centralized training to the federated training. \n", + "\n", + "Now, lets connect the pieces together and define the job configuration and run with simulator. \n", + "\n", + "In this example, we decided to sub-process instead of in-process training. \n", + "\n", + "We manually define the job configuration and run with simulator. \n", + "\n", + "#### server job configuration\n", + "\n", + "The key is defined a workflow ```FedAvgNewtonRaphson``` and corresponding arguments: number round, clients and damping factor. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c5767f4", + "metadata": {}, + "outputs": [], + "source": [ + "! cat code/newton_raphson/app/config/config_fed_server.json" + ] + }, + { + "cell_type": "markdown", + "id": "f13fdf5d", + "metadata": {}, + "source": [ + "#### client job configuration\n", + "\n", + "Notice that we used the ClientAPILauncherExecutor with a Cell Pipe, we also need a separate pipe for metrics relay" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e9b8eef", + "metadata": {}, + "outputs": [], + "source": [ + "! cat code/newton_raphson/app/config/config_fed_client.json" + ] + }, + { + "cell_type": "markdown", + "id": "9a3fe4de", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "0b72ef2b", + "metadata": {}, + "source": [ + "## Running Federated Logistic Regression Job\n", + "\n", + "Execute the following command to launch federated logistic\n", + "regression. This will run in `nvflare`'s simulator mode.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2faea343", + "metadata": {}, + "outputs": [], + "source": [ + "! nvflare simulator -w /tmp/nvflare/job/lr/workspace -n 4 -t 4 code/newton_raphson/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "Accuracy and precision for each site can be viewed in Tensorboard:\n", + "```\n", + "tensorboard --logdir=/tmp/nvflare/job/lr/workspace/server/simulate_job/tb_events\n", + "```\n", + "As can be seen from the figure below, per-site evaluation metrics in\n", + "federated logistic regression are on-par with the centralized version.\n", + "\n", + "\"Tensorboard\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0858459", + "metadata": {}, + "outputs": [], + "source": [ + "! tensorboard --logdir=/tmp/nvflare/job/lr/workspace/server/simulate_job/tb_events" + ] + }, + { + "cell_type": "markdown", + "id": "d8383681", + "metadata": {}, + "source": [ + "Now that we have converted the centralized logistic regression to federated learning, let's move on to the next example." + ] + }, + { + "cell_type": "markdown", + "id": "d990f546", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nvflare_env", + "language": "python", + "name": "nvflare_env" + }, + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/figs/minibatch.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/figs/minibatch.png similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/figs/minibatch.png rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/figs/minibatch.png diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/kmeans_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/kmeans_job.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/kmeans_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/kmeans_job.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/src/kmeans_assembler.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/src/kmeans_assembler.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/src/kmeans_assembler.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/src/kmeans_assembler.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/src/kmeans_fl.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/src/kmeans_fl.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/src/kmeans_fl.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/src/kmeans_fl.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/utils/prepare_data.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/utils/prepare_data.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/utils/prepare_data.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/utils/prepare_data.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/utils/split_data.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/utils/split_data.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/code/utils/split_data.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/code/utils/split_data.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb similarity index 99% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb index 9a8cb7a548..20376a251f 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb @@ -14,6 +14,7 @@ "metadata": {}, "source": [ "## Introduction to Scikit-learn, tabular data, and federated k-Means\n", + "\n", "### Scikit-learn\n", "This example shows how to use [NVIDIA FLARE](https://nvflare.readthedocs.io/en/main/index.html) on tabular data.\n", "It uses [Scikit-learn](https://scikit-learn.org/),\n", diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_baseline.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_baseline.png similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_baseline.png rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_baseline.png diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl.png similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl.png rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl.png diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl_he.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl_he.png similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl_he.png rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/figs/km_curve_fl_he.png diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/km_job.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/km_job.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/km_job.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/km_job.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/requirements.txt b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/requirements.txt similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/requirements.txt rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/requirements.txt diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train_he.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train_he.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train_he.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_train_he.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf_he.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf_he.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf_he.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/src/kaplan_meier_wf_he.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/baseline_kaplan_meier.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/baseline_kaplan_meier.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/baseline_kaplan_meier.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/baseline_kaplan_meier.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_data.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_data.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_data.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_data.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_he_context.py b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_he_context.py similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_he_context.py rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/code/utils/prepare_he_context.py diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb similarity index 100% rename from examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb rename to examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/02.4.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb new file mode 100644 index 0000000000..0efe327f83 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.4_convert_machine_learning_to_federated_learning/convert_ml_to_fl.ipynb @@ -0,0 +1,36 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to Convert Centralized Machine Learning to Federated Learning\n", + "\n", + "Converting different deep learning algorithms to federated learning is very similar, but for traditional machine learning, we have to deal with them case by case. However, they all essentially still follow the same process using the Client API:\n", + "\n", + "* Formulating the algorithm: see how to structure the model exchange to be represented by `FLModel`\n", + "* Receive model from global\n", + "* Update and train local model \n", + "* Send the global model back to aggregator\n", + " \n", + "In this section, we will study three different commonly used machine learning algorithms:\n", + "\n", + "* [Convert Logistic Regression to federated learning](./02.4.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb)\n", + "* [Convert KMeans to federated learning](./02.4.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", + "* [Convert Survival Analysis to federated learning](./02.4.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.5_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.5_recap/recap.ipynb index 77f82177a4..a6898b699f 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.5_recap/recap.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.5_recap/recap.ipynb @@ -5,40 +5,32 @@ "id": "7b152728-3366-4432-adb1-29aa3051dc22", "metadata": {}, "source": [ - "# Summary of Chapter 2\n", + "# Recap: Chapter 2 Summary\n", "\n", - "We covered developing federated learning applications in Chapter 2. Here is an overview:\n", "\n", - "1. **Federated Statistics**\n", - " - **Federated Statistics with Image Data**: How to compute local and global image statistics with the consideration that data is private at each of the client sites.\n", - " - [federated_statistics_with_image_data.ipynb](../02.1_federated_statistics/federated_statistics_with_image_data/federated_statistics_with_image_data.ipynb)\n", - " - **Federated Statistics with Tabular Data**: How to create federated statistics for data that can be represented as Pandas DataFrames.\n", - " - [federated_statistics_with_tabular_data.ipynb](../02.1_federated_statistics/federated_statistics_with_tabular_data/federated_statistics_with_tabular_data.ipynb)\n", - "\n", - "2. **Converting PyTorch Lightning to FL**\n", - " - **PyTorch Lightning to FL**: Guide on converting PyTorch Lightning scripts to federated learning.\n", - " - [convert_torch_lightning_to_fl.ipynb](../02.2_convert_torch_lightning_to_federated_learning/convert_torch_lightning_to_fl.ipynb)\n", + "We covered a lot of ground in developing federated learning applications in this Chapter. We focused on how to compute federated statistics and how to leverage the NVFLARE Client API to convert machine learning models to federated learning.\n", "\n", - "3. **Simple ML/DL to FL transition with NVFlare**\n", - " - **Converting Logistic Regression to FL**: How to implement a federated binary classification via logistic regression with second-order Newton-Raphson optimization. \n", - " - [convert_logistic_regression_to_fl.ipynb](../02.3_convert_machine_learning_to_federated_learning/02.3.1_convert_logistic_regression_to_federated_learning/convert_logistic_regression_to_fl.ipynb)\n", - " - **Converting KMeans to FL**: ADD CONTENT HERE. \n", - " - [convert_kmeans_to_fl.ipynb](../02.3_convert_machine_learning_to_federated_learning/02.3.2_convert_kmeans_to_federated_learning/convert_kmeans_to_fl.ipynb)\n", - " - **Secure Federated Kaplan-Meier Analysis via Time-Binning and Homomorphic Encryption**: ADD CONTENT HERE. \n", - " - [convert_survival_analysis_to_fl.ipynb](../02.3_convert_machine_learning_to_federated_learning/02.3.3_convert_survival_analysis_to_federated_learning/convert_survival_analysis_to_fl.ipynb)\n", - "\n", - "4. **Client API**\n", - " - **Client API**: Here we focus on the core concepts of the Client API and explain how to configure it to run within the same process or in a separate subprocess. \n", - " - [client_api.ipynb](../02.4_client_api/client_api.ipynb)\n", + "1. **Federated Statistics**\n", + " Users can leverage NVFLARE's statistics feature to aggregate and visualize global statistics as well as site-specific statistics.\n", "\n", - "5. **Recap of Covered Topics**\n", - " - **Summary and Recap**: A recap of the topics covered in the previous sections.\n", + " This process is fairly straightforward.\n", + " \n", + "2. **Client API**\n", + " We discussed the Client API in detail, including the types of implementations and how to configure it to run within the same process or in a separate subprocess.\n", "\n", - "Each section is designed to provide comprehensive guidance and practical examples to help you implement and customize federated learning in your applications. For detailed instructions and examples, refer to the respective notebooks linked in each section.\n", + " Then we moved on to PyTorch Lightning and several traditional machine learning models and how to convert them to federated learning with the Client API.\n", + " \n", + " We hope that by now, you should be very confident in converting most deep learning and traditional machine learning models to federated learning with NVIDIA FLARE.\n", "\n", "\n", - "Now let's move on to the [Chapter 3](../../../part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb)." + "Now let's explore the [Federated Computing Platform](../../../part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb)." ] + }, + { + "cell_type": "markdown", + "id": "bbcd8e9d", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/part_1_introduction.ipynb b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/part_1_introduction.ipynb index bf2e5b6589..dc895cf38f 100644 --- a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/part_1_introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/part_1_introduction.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In part 1, we will use two chapters illustate how to run and develop federated learning applications. " + "we will use two chapters to illustrate how to run and develop federated learning applications. " ] }, { @@ -27,18 +27,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In Part 1, we explored the fundamentals of federated learning. We will cover:\n", + "In Part 1, we will explore the fundamentals of federated learning. We will cover:\n", "\n", "#### Chapter 1: \n", "* How to train an image classification model with PyTorch\n", - "* How to convert a standard PyTorch training code to federated learning code\n", - "* How to customize client and server side logics\n", - "* Understanding the federated job structure and configurations\n", + "* How to convert standard PyTorch training code to federated learning code\n", + "* How to customize client and server side logic\n", + "* Understanding federated job structure and configurations\n", "\n", "#### Chapter 2: \n", - "* federated statistics for both image and tabular data.\n", - "* convert porch lightning to federated learning\n", - "* convert traditional ML training code to federated learning code,\n", + "* Federated statistics for both image and tabular data\n", + "* Converting PyTorch Lightning to federated learning\n", + "* Converting traditional ML training code to federated learning code\n", "* FLARE Client API" ] }, diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb index 82509ddce4..0a43ccbc6a 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.0_introduction/introduction.ipynb @@ -103,7 +103,7 @@ "The core property of FLComponent is event support. FLComponent is able to fire and receive events, enabling the FLARE system to be an event-driven, pluggable system.\n", "\n", "### FLContext\n", - "One of the most important features of NVIDIA FLARE is ```nvflare.apis.fl_context``` to pass data between the FL components. FLContext is available to every method of all FLComponent types (Controller, Aggregator, Filter, Executor).\n", + "One of the most important features of NVIDIA FLARE is nvflare.apis.fl_context, which is used to pass data between the FL components. FLContext is available to every method of all FLComponent types (Controller, Aggregator, Filter, Executor).\n", "\n", "\n", "Through the FL Context, the component developer can:\n", diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.1_federated_computing_architecture/system_architecture.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.1_federated_computing_architecture/system_architecture.ipynb index e6ebe72a7f..adbebcb9a5 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.1_federated_computing_architecture/system_architecture.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.1_federated_computing_architecture/system_architecture.ipynb @@ -103,7 +103,7 @@ "\n", "## Event-Based System\n", "\n", - "ALL NVIDIA FLARE's components (FLComponent) has event handling and event firing via the runtine engine. As result, user can write a FLComponent as plugin and listen to event and write any customized logics at any layers. \n", + "ALL NVIDIA FLARE's components (FLComponent) has event handling and event firing via the runtime engine. As a result, users can write an FLComponent as a plugin and listen to events and write any customized logic at any layer.\n", "\n", "\n", "## Federated Learning Framework\n", @@ -126,7 +126,7 @@ "\n", "## Different type of FLARE APIs\n", "\n", - "At its Core, Flare uses controller and executor assign tasks and execute tasks for each job. There we have the \n", + "At its Core, Flare uses controller and executor to assign tasks and execute tasks for each job. There we have the:\n", "\n", "### Python APIs\n", "\n", @@ -150,17 +150,17 @@ " ...\n", "\n", " ```\n", - "This data structure essentially capture the model ( parameter type (Full, Diff), model paramaters (weights), optmizer parameters), metrics, metadata. This kind data structure is understandable by most data scientists. \n", + "This data structure essentially captures the model (parameter type (Full, Diff), model parameters (weights), optimizer parameters), metrics, metadata. This kind of data structure is understandable by most data scientists.\n", "\n", - "The Server side, we have ModelController -- Controller use and consume FLModel, on the client side we have Client API that receive and send model update via FLModel. You already seen this in previous chapters. \n", + "On the Server side, we have ModelController -- Controller uses and consumes FLModel, on the client side we have Client API that receives and sends model updates via FLModel. You have already seen this in previous chapters.\n", "\n", "\n", "* **Job API** -- FLARE Job API is a way to generate job configuration. Although once can direct edit configuration files, one can also use the Job API to construct the needed components and generate the job configuration. The job API can also call job.simulate_run() -- which is combined step of export job configuration and call simulator run. \n", "\n", - "* **Simulator API** -- one can directly invokve simulator_run() method start simulation in python\n", + "* **Simulator API** -- one can directly invoke simulator_run() method to start simulation in python\n", "\n", "\n", - "* **FLARE API** -- FLARE python API is equivallent FLARE Console command API. Instead of interact with FL system via Console command, we can perform most of the command functions via FLARE API. These includes connect to the server, checking status, monitoring jobs, submit job etc. \n", + "* **FLARE API** -- FLARE python API is equivalent to FLARE Console command API. Instead of interacting with FL system via Console command, we can perform most of the command functions via FLARE API. These include connecting to the server, checking status, monitoring jobs, submitting jobs etc.\n", "\n", "\n", "### Command Line Interface\n", @@ -194,7 +194,7 @@ "\n", "# Job Template\n", "\n", - "Job templates are set of existing job configurations with specified structure \n", + "Job templates are a set of existing job configurations with specified structure\n", "\n", "For example \n", "```\n", @@ -207,9 +207,9 @@ "\n", "```\n", "\n", - "Each job template consits \"information card\", info.conf, display card \"info.md\" and job configuration files. \n", + "Each job template consists of an \"information card\", info.conf, display card \"info.md\" and job configuration files.\n", "\n", - "The configuraiton is defined in pyhocon format so we can add comments and explain the details \n", + "The configuration is defined in pyhocon format so we can add comments and explain the details.\n", "\n", "we can take a look at one example \n", "\n", diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.2_deployment_simulation/simulate_real_world_deployment.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.2_deployment_simulation/simulate_real_world_deployment.ipynb index f1dc6c6e40..f16635a56e 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.2_deployment_simulation/simulate_real_world_deployment.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.2_deployment_simulation/simulate_real_world_deployment.ipynb @@ -29,7 +29,7 @@ "\n", "[POC command](https://nvflare.readthedocs.io/en/main/user_guide/nvflare_cli/poc_command.html) provides a set of command to create different software packages and simulate client and server. You can also find the tutorials in [here](../../../../setup_poc.ipynb) on how to setup POC. \n", "\n", - "> With POC mode, it is ideally use terminal instead of notebook to setup, as there are some non-consistent behavior when running scripts.\n", + "> With POC mode, it is ideally to use terminal instead of notebook for setup, as there are some inconsistent behaviors when running scripts.\n", "\n", "### POC Prepare\n", "\n", @@ -118,20 +118,21 @@ "```\n", "\n", "\n", - "Notice the command create a working directory at ```/tmp/nvflare/poc/example_project/prod_00```\n", + "Notice the command creates a working directory at ```/tmp/nvflare/poc/example_project/prod_00```\n", "\n", - "based on the default values: \n", "\n", - "POC workspace = \"/tmp/nvflare/poc\"\n", - "project_name = \"example_project\"\n", - "and default folder \"prod_00\"\n", + "based on the default values:\n", "\n", - "All sites are with the default name with \"site-\". \n", + "* POC workspace = \"/tmp/nvflare/poc\"\n", + "* project_name = \"example_project\"\n", + "* and default folder \"prod_00\"\n", "\n", - "The actual process of generate such software package (startup kit) is called **\"provision\"**, the POC is special mode of provision, where both client and server are at localhost\n", "\n", + "All sites are with default names starting with \"site-\".\n", "\n", - "Each site ( site-N and server) representing one location in the federated learning site and running federated learning client. \n", + "The actual process of generating such software packages (startup kit) is called **\"provision\"**. The POC is a special mode of provision, where both client and server are at localhost.\n", + "\n", + "Each site (site-N and server) represents one location in the federated learning system and runs a federated learning client.\n", "\n", "\n", "#### Simulating the real-world deployment\n", @@ -243,8 +244,7 @@ "source": [ "#### Prepare with Named Clients\n", "\n", - "If you just want to have default deployment, but specifiy the client site names ((instead of use default site-1,2 etc.) and not writing a project.yaml file, you do the following\n", - "\n", + "If you just want to have a default deployment but specify the client site names (instead of using default site-1,2 etc.) without writing a project.yaml file, you can do the following:\n", "\n", "\n", "nvflare poc prepare -c [CLIENTS ...]" @@ -331,7 +331,7 @@ "\n", "> Note: Using %%bash -bg to run the above command in a code cell may not always work\n", "\n", - "**Homework**: run the nvflare poc start command with or without -ex option\n", + "**Homework**: run the nvflare poc start command with or without the -ex option\n", "\n", "\n", "#### POC start individial site Only \n", diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.3_interact_with_federated_computing_system/ ways_to_interact_with_fl_system.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.3_interact_with_federated_computing_system/ ways_to_interact_with_fl_system.ipynb index e89c853bf8..f3d01cf3b9 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.3_interact_with_federated_computing_system/ ways_to_interact_with_fl_system.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.3_interact_with_federated_computing_system/ ways_to_interact_with_fl_system.ipynb @@ -81,7 +81,7 @@ "source": [ "Now start a FLARE system in POC mode\n", "\n", - "And use a terminal to start the POC withut admin console.\n", + "And use a terminal to start the POC without admin console.\n", "\n", "```nvflare poc start -ex admin@nvidia.com```\n", "\n", @@ -111,7 +111,7 @@ "metadata": {}, "source": [ "\n", - "You can submit job, list jobs and check results, check status of sites, list jobs, abort jobs\n" + "You can submit jobs, list jobs and check results, check status of sites, and abort jobs " ] }, { @@ -127,7 +127,8 @@ "id": "95bce19f", "metadata": {}, "source": [ - "Another way to interact with FLARE system is using FLARE python APIs. These APIs have the equivallent functions of the Admin Commands. And they can be issued directly from notebooks. \n", + "Another way to interact with FLARE system is using FLARE python APIs. These APIs have the equivalent functions of the Admin Commands. And they can be issued directly from notebooks. \n", + "\n", "\n", "Let's take a look how this can be done. \n", "\n", @@ -178,7 +179,7 @@ "id": "22612078", "metadata": {}, "source": [ - "In the terminal, you should see the training output, but here we like to use API to monitoring the job \n", + "In the terminal, you should see the training output, but here we would like to use API to monitor the job \n", "\n", "#### Monitor job\n", "The command ```monitor_job()``` allows you to follow a job until the job is done.\n", @@ -397,9 +398,9 @@ "id": "a216ce5d", "metadata": {}, "source": [ - "So far, we have learnt three different ways to interact with FLARE system. Although we used POC model to simulate the real deployment. In production, the same interaction commands can be used in production setup\n", + "So far, we have learned three different ways to interact with FLARE system. Although we used POC mode to simulate the real deployment, in production, the same interaction commands can be used in production setup.\n", "\n", - "Next, lets see how do we [monitoring FLARE system](../03.4_system_monitoring/system_monitorinig.ipynb)\n", + "Next, lets see how do we [monitor FLARE system](../03.4_system_monitoring/system_monitorinig.ipynb)\n", "\n" ] }, diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/job_example.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/job_example.ipynb index e2fc01868f..0469518e11 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/job_example.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/job_example.ipynb @@ -5,8 +5,10 @@ "metadata": {}, "source": [ "# FLARE Monitoring\n", - "FLARE Monitoring provides a initial solution for tracking system metrics of your federated learning jobs.\n", - "Different from Machine learning experiment tracking, where it focused on the training metrics, the monitoring here focused on the FL system: i.e. job and system lifecycle metrics. \n", + "\n", + "FLARE Monitoring provides an initial solution for tracking system metrics of your federated learning jobs.\n", + "Unlike machine learning experiment tracking, which focuses on training metrics, this monitoring focuses on the FL system: i.e., job and system lifecycle metrics.\n", + "\n", "\n", "This guide will walk you through the steps to set up and use the monitoring system effectively.\n", "\n", @@ -97,7 +99,7 @@ "\n", "![setup-1](./figures/setup-1.png)\n", "\n", - "As described in the [system monitorinig introduction](./system_monitorinig.ipynb), we will make different component configurations depending on the setups.\n", + "As described in the [system monitoring introduction](./system_monitorinig.ipynb), we will create different component configurations depending on the setups.\n", "\n", "In this setup, all sites (server and clients) will share the same monitoring system with the same host and port.\n", "\n", @@ -133,27 +135,25 @@ "\n", "#### System Metrics Monitoring Configuration\n", "\n", - "We need to manually edit the configuration files for System Metrics collections.\n", + "We need to manually edit the configuration files for System Metrics collection.\n", "\n", - "For example, we need to add server to include \n", + "For example, we need to add to the server:\n", "\n", "* system metrics collector \n", "* statsd reporter\n", "\n", - "In the default POC setup, these components are added to \n", + "In the default POC setup, these components are added to:\n", "\"/tmp/nvflare/poc/example_project/prod_00/server/local/resources.json\"\n", "\n", - "For Client sides, we need to add \n", + "For client sides, we need to add:\n", "\n", "* system metrics collector \n", "* statsd reporter\n", "\n", - "\"/tmp/nvflare/poc/example_project/prod_00//local/resources.json\"\n", - "\n", + "to \"/tmp/nvflare/poc/example_project/prod_00//local/resources.json\"\n", "for the default POC setup.\n", "\n", - "\n", - "Instead of manually, go through each file, we wrote a small python program to do this: \n", + "Instead of manually going through each file, we wrote a small Python program to do this:\n", "\n", "```bash\n", "cd setup-1\n", @@ -202,11 +202,10 @@ "nvflare job submit -j /tmp/nvflare/jobs/job_config/fedavg\n", "```\n", "\n", - "\n", "## Monitoring View\n", "\n", - "Once you setup the system, you can view from the followingt website\n", - "for statsd-exporter, you can look at \n", + "Once you set up the system, you can view from the following websites.\n", + "For statsd-exporter, you can look at:\n", "\n", "### Statsd-exporter metrics view\n", "\n", @@ -241,15 +240,13 @@ "\n", "\n", "\n", - "## Complete steps\n", - "\n", - "Now, lets go to terminal and following all the steps to do the excersize\n", + "Now, let's go to the terminal and follow all the steps to do the exercise:\n", "\n", - "* install dependencies \n", + "* Install dependencies:\n", "\n", - " ```\n", - " pip install -r jobs/requirements.txt\n", - " \n", + " ```bash\n", + " \n", + " pip install -r jobs/requirements.txt\n", " ```\n", "\n", "* start monitoring systems (statsD, prometheus and grafana)\n", diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/system_monitorinig.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/system_monitorinig.ipynb index 13f8b85f0b..b9dc31430c 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/system_monitorinig.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.4_system_monitoring/system_monitorinig.ipynb @@ -15,8 +15,9 @@ "source": [ "# NVFLARE System Metrics Monitoring\n", "\n", - "FLARE Monitoring provides a initial solution for tracking system metrics of your federated learning jobs.\n", - "Different from Machine learning experiment tracking, where it focused on the training metrics, the monitoring here focused on the FL system: i.e. job and system lifecycle metrics.\n", + "FLARE Monitoring provides an initial solution for tracking system metrics of your federated learning jobs.\n", + "Different from Machine learning experiment tracking, where it focuses on the training metrics, the monitoring here focuses on the FL system: i.e. job and system lifecycle metrics.\n", + "\n", "\n", "This guide describes how to set up NVFLARE metrics publishing to StatsD Exporter, which then can be scraped by Prometheus and visualized with Grafana.\n", "\n", @@ -35,7 +36,7 @@ "4. **Set up Grafana** to visualize the metrics from Prometheus.\n", "\n", "> side notes: \n", - " don't confuse statsd-exporter and statsd-reporter. statsd-exporter is a libary (such as from datadog) used to receive metrics and for prometheus to scrape from; statsd-reporter is the FLARE component which export metrics to statsd-exporter. \n", + "Don't confuse statsd-exporter and statsd-reporter. statsd-exporter is a library (such as from datadog) used to receive metrics and for prometheus to scrape from; statsd-reporter is the FLARE component which exports metrics to statsd-exporter. \n", "\n", "\n", "\n", @@ -148,7 +149,6 @@ "2. **JobMetricsCollector**: This component collects job-level metrics and publishes them to the databus. It can be added to the workflow components on both client and server sites.\n", "3. **SysMetricsCollector**: This component collects system-level metrics running in the parent process of the server and clients. The metrics will be published to the databus.\n", "4. **RemoteMetricsReceiver**: This component receives the federated metrics streamed from client sides and publish the metriics. \n", - "4. **RemoteMetricsReceiver**: This component receives the federated metrics streamed from client sides and publishes the metrics.\n", "\n", "\n", "### Components Configuration\n", @@ -222,7 +222,6 @@ "}\n", "``` \n", "\n", - "tags can be key, value pair, they are used for group metrics in the report. Here we used \"site\" to indicate origin of the metrics, the \"dev\" env. to indicating the dev environment. \n", "Tags can be key-value pairs used for grouping metrics in the report. Here we used \"site\" to indicate the origin of the metrics and \"env\" to indicate the development environment.\n", "\n", "\n", @@ -234,7 +233,6 @@ "\n", "```//local/resources.json```\n", "\n", - "by rename ```resources.json.default``` to ```resources.json```\n", "by renaming ```resources.json.default``` to ```resources.json```\n", "in ```//local/resources.json```\n", "\n", @@ -266,7 +264,9 @@ "\n", "\n", "#### 2. Clients Forward Metrics to Server Site\n", + "\n", "In this setup, all client-side metrics will not directly post to the StatsD Exporter. Instead, the metrics are streamed to the server site. Therefore, the client side will need the following components:\n", + "\n", "In this setup, all client-side metrics will not be directly posted to the StatsD Exporter. Instead, the metrics are streamed to the server site. Therefore, the client side will need the following components:\n", "- **JobMetricsCollector**\n", "- **SysMetricsCollector**\n", diff --git a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.5_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.5_recap/recap.ipynb index 08c8ad0df8..b264d9cf81 100644 --- a/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.5_recap/recap.ipynb +++ b/examples/tutorials/self-paced-training/part-2_federated_learning_system/chapter-3_federated_computing_platform/03.5_recap/recap.ipynb @@ -5,15 +5,25 @@ "id": "7c3c89fa-6355-4d34-8d85-a9447152996f", "metadata": {}, "source": [ - "# Chapter 3 Summary\n", + "# Recap Chapter 3: Federated Computing Platform\n", "\n", + "In this chapter, we explored key components and features of FLARE's federated computing platform:\n", "\n", - "In this chapter, we explored:\n", + "1. System Architecture\n", + " * Core components and their interactions\n", + " * high level system architecture design\n", "\n", - "* FLARE's overall system architecture\n", - "* POC mode to simulate deployment locally\n", - "* Different ways to interact with the FLARE system\n", - "* Monitoring the system with StatsD, Prometheus, and Grafana\n" + "2. POC (Proof of Concept) Mode\n", + " * Local deployment simulation\n", + " \n", + "3. System Interaction Methods\n", + " * Command-line interface (CLI)\n", + " * Python API\n", + " * FLARE Console\n", + "\n", + "4. System Monitoring and Observability\n", + " * System event metrics with StatsD, prometheus and Grafana dashboards\n", + " " ] }, { diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_identity_security/identity_security.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_identity_security/identity_security.ipynb index b6e2936d42..9db2e404a4 100644 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_identity_security/identity_security.ipynb +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_identity_security/identity_security.ipynb @@ -182,7 +182,7 @@ "\n", "For more details please refer [documentation](https://nvflare.readthedocs.io/en/main/user_guide/security/identity_security.html)\n", "\n", - " \n" + "Now, lets move on to [site_security](../06.2_site_security_privacy_policy/site_policy.ipynb)\n" ] }, { diff --git a/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.2_tasks_and_data_share/modules.py b/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.2_tasks_and_data_share/modules.py index 62ccfb06f2..f7c0a44985 100644 --- a/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.2_tasks_and_data_share/modules.py +++ b/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.2_tasks_and_data_share/modules.py @@ -22,7 +22,6 @@ class HelloController(Controller): - def control_flow(self, abort_signal: Signal, fl_ctx: FLContext): # Create the task with name "hello" task = Task(name="hello", data=Shareable()) @@ -43,7 +42,6 @@ def stop_controller(self, fl_ctx: FLContext): class HelloExecutor(Executor): - def execute( self, task_name: str, @@ -57,7 +55,6 @@ def execute( class HelloDataController(Controller): - def control_flow(self, abort_signal: Signal, fl_ctx: FLContext): # Prepare any extra parameters to send to the clients data = DXO( @@ -84,7 +81,6 @@ def stop_controller(self, fl_ctx: FLContext): class HelloDataExecutor(Executor): - def execute( self, task_name: str, @@ -100,7 +96,6 @@ def execute( class HelloResponseController(Controller): - def control_flow(self, abort_signal: Signal, fl_ctx: FLContext): # Prepare any extra parameters to send to the clients dxo = DXO( @@ -136,7 +131,6 @@ def _process_client_response(self, client_task, fl_ctx: FLContext) -> None: class HelloResponseExecutor(Executor): - def execute( self, task_name: str, diff --git a/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.3_p2p_communication/modules.py b/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.3_p2p_communication/modules.py index 6efc10c997..211a1fcfd4 100644 --- a/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.3_p2p_communication/modules.py +++ b/examples/tutorials/self-paced-training/part-4_advanced_federated_learning/chapter-9_flare_low_level_apis/09.3_p2p_communication/modules.py @@ -23,7 +23,6 @@ class BasicController(Controller): - def control_flow(self, abort_signal: Signal, fl_ctx: FLContext): self.broadcast_and_wait( task=Task(name="talk", data=Shareable()), @@ -40,7 +39,6 @@ def stop_controller(self, fl_ctx: FLContext): class P2PExecutor(Executor): - def execute( self, task_name: str, diff --git a/nvflare/app_common/abstract/statistics_spec.py b/nvflare/app_common/abstract/statistics_spec.py index b34dd93f68..2d5a056398 100644 --- a/nvflare/app_common/abstract/statistics_spec.py +++ b/nvflare/app_common/abstract/statistics_spec.py @@ -318,7 +318,7 @@ def failure_count(self, dataset_name: str, feature_name: str) -> int: """ return 0 - def percentiles(self, dataset_name: str, feature_name: str, percentiles: List) -> Dict: + def quantiles(self, dataset_name: str, feature_name: str, percentiles: List) -> Dict: """Return failed count for given dataset and feature. To perform data privacy min_count check, failure_count is always required. diff --git a/nvflare/app_common/app_constant.py b/nvflare/app_common/app_constant.py index a7c34b8444..fa9fcd2718 100644 --- a/nvflare/app_common/app_constant.py +++ b/nvflare/app_common/app_constant.py @@ -163,7 +163,7 @@ class StatisticsConstants(AppConstants): STATS_VAR = "var" STATS_STDDEV = "stddev" STATS_HISTOGRAM = "histogram" - STATS_PERCENTILE = "percentile" + STATS_QUANTILE = "quantile" STATS_MAX = "max" STATS_MIN = "min" STATS_FEATURES = "stats_features" @@ -174,8 +174,7 @@ class StatisticsConstants(AppConstants): STATS_BIN_RANGE = "range" STATS_TARGET_STATISTICS = "statistics" - STATS_PERCENTILES_KEY = "percentiles" - STATS_CENTROIDS_KEY = "centroids" + STATS_DIGEST_COORD = "digest_coord" FED_STATS_PRE_RUN = "fed_stats_pre_run" FED_STATS_TASK = "fed_stats" @@ -196,7 +195,7 @@ class StatisticsConstants(AppConstants): STATS_MEAN, STATS_MIN, STATS_MAX, - STATS_PERCENTILE, + STATS_QUANTILE, ], STATS_2nd_STATISTICS: [STATS_HISTOGRAM, STATS_VAR, STATS_STDDEV], } diff --git a/nvflare/app_common/executors/statistics/statistics_task_handler.py b/nvflare/app_common/executors/statistics/statistics_task_handler.py index e3b1bb45a7..560b9a464d 100644 --- a/nvflare/app_common/executors/statistics/statistics_task_handler.py +++ b/nvflare/app_common/executors/statistics/statistics_task_handler.py @@ -23,7 +23,7 @@ from nvflare.app_common.app_constant import StatisticsConstants as StC from nvflare.app_common.statistics.numeric_stats import filter_numeric_features from nvflare.app_common.statistics.statisitcs_objects_decomposer import fobs_registration -from nvflare.app_common.statistics.statistics_config_utils import get_feature_bin_range, get_target_percents +from nvflare.app_common.statistics.statistics_config_utils import get_feature_bin_range, get_target_quantiles from nvflare.fuel.utils import fobs from nvflare.security.logging import secure_format_exception @@ -96,7 +96,7 @@ def statistic_functions(self) -> dict: StC.STATS_HISTOGRAM: self.get_histogram, StC.STATS_MAX: self.get_max_value, StC.STATS_MIN: self.get_min_value, - StC.STATS_PERCENTILE: self.get_percentiles_and_centroids, + StC.STATS_QUANTILE: self.get_quantiles_and_centroids, } def _populate_result_statistics(self, statistics_result, ds_features, tm: StatisticConfig, shareable, fl_ctx, fn): @@ -319,7 +319,7 @@ def get_bin_range( return bin_range - def get_percentiles_and_centroids( + def get_quantiles_and_centroids( self, dataset_name: str, feature_name: str, @@ -328,8 +328,8 @@ def get_percentiles_and_centroids( fl_ctx: FLContext, ) -> dict: percentile_config = statistic_configs.config - target_percents = get_target_percents(percentile_config, feature_name) - result = self.stats_generator.percentiles(dataset_name, feature_name, target_percents) + target_percents = get_target_quantiles(percentile_config, feature_name) + result = self.stats_generator.quantiles(dataset_name, feature_name, target_percents) return result def _get_global_value_from_input(self, statistic_key: str, dataset_name: str, feature_name: str, inputs): diff --git a/nvflare/app_common/statistics/numeric_stats.py b/nvflare/app_common/statistics/numeric_stats.py index 046f0ce0b4..3c6273f75d 100644 --- a/nvflare/app_common/statistics/numeric_stats.py +++ b/nvflare/app_common/statistics/numeric_stats.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,17 +15,18 @@ from math import sqrt from typing import Dict, List, TypeVar -from tdigest import TDigest - from nvflare.app_common.abstract.statistics_spec import Bin, BinRange, DataType, Feature, Histogram, HistogramType from nvflare.app_common.app_constant import StatisticsConstants as StC -from nvflare.app_common.statistics.statistics_config_utils import get_target_percents +from nvflare.app_opt.statistics.quantile_stats import get_quantiles +from nvflare.fuel.utils.log_utils import get_module_logger T = TypeVar("T") +logger = get_module_logger(name=__name__) + def get_global_feature_data_types( - client_feature_dts: Dict[str, Dict[str, List[Feature]]] + client_feature_dts: Dict[str, Dict[str, List[Feature]]], ) -> Dict[str, Dict[str, DataType]]: global_feature_data_types = {} for client_name in client_feature_dts: @@ -85,14 +86,8 @@ def get_global_stats( ds_stddev[ds_name][feature] = round(sqrt(feature_vars[feature]), precision) global_metrics[StC.STATS_STDDEV] = ds_stddev - elif metric == StC.STATS_PERCENTILE: - global_digest = {} - for client_name in stats: - - global_digest = aggregate_centroids(stats[client_name], global_digest) - - percent_config = statistic_configs.get(StC.STATS_PERCENTILE) - global_metrics[metric] = compute_percentiles(global_digest, percent_config, precision) + elif metric == StC.STATS_QUANTILE: + global_metrics[metric] = get_quantiles(stats, statistic_configs, precision) return global_metrics @@ -231,42 +226,3 @@ def filter_numeric_features(ds_features: Dict[str, List[Feature]]) -> Dict[str, numeric_ds_features[ds_name] = n_features return numeric_ds_features - - -def aggregate_centroids(metrics: Dict[str, Dict[str, Dict]], g_digest: dict) -> dict: - for ds_name in metrics: - if ds_name not in g_digest: - g_digest[ds_name] = {} - - feature_metrics = metrics[ds_name] - for feature_name in feature_metrics: - if feature_metrics[feature_name] is not None: - centroids: List = feature_metrics[feature_name].get(StC.STATS_CENTROIDS_KEY) - if feature_name not in g_digest[ds_name]: - g_digest[ds_name][feature_name] = TDigest() - - for centroid in centroids: - mean = centroid.get("m") - count = centroid.get("c") - g_digest[ds_name][feature_name].update(mean, count) - - return g_digest - - -def compute_percentiles(g_digest: Dict[str, Dict[str, TDigest]], quantile_config: Dict, precision: int = 4) -> dict: - g_ds_metrics = {} - for ds_name in g_digest: - if ds_name not in g_ds_metrics: - g_ds_metrics[ds_name] = {} - - feature_metrics = g_digest[ds_name] - for feature_name in feature_metrics: - digest = feature_metrics[feature_name] - percentiles = get_target_percents(quantile_config, feature_name) - percentile_values = {} - for percentile in percentiles: - percentile_values[percentile] = round(digest.percentile(percentile), precision) - - g_ds_metrics[ds_name][feature_name] = percentile_values - - return g_ds_metrics diff --git a/nvflare/app_common/statistics/statistics_config_utils.py b/nvflare/app_common/statistics/statistics_config_utils.py index b128df2394..76b208c2fc 100644 --- a/nvflare/app_common/statistics/statistics_config_utils.py +++ b/nvflare/app_common/statistics/statistics_config_utils.py @@ -30,7 +30,7 @@ def get_feature_bin_range(feature_name: str, hist_config: dict) -> Optional[List return bin_range -def get_target_percents(percentile_config: dict, feature_name: str): +def get_target_quantiles(percentile_config: dict, feature_name: str): if feature_name in percentile_config: percents = percentile_config.get(feature_name) elif "*" in percentile_config: diff --git a/nvflare/app_common/workflows/statistics_controller.py b/nvflare/app_common/workflows/statistics_controller.py index a835c95900..a43b8a531a 100644 --- a/nvflare/app_common/workflows/statistics_controller.py +++ b/nvflare/app_common/workflows/statistics_controller.py @@ -70,7 +70,7 @@ def __init__( "*": {"bins": 20}, "Age": {"bins": 10, "range": [0, 120]} }, - percentile: { + quantile: { "*": [25, 50, 75, 90], "Age": [50, 75, 95] } @@ -211,7 +211,7 @@ def _get_all_statistic_configs(self) -> List[StatisticConfig]: StC.STATS_MEAN: StatisticConfig(StC.STATS_MEAN, {}), StC.STATS_VAR: StatisticConfig(StC.STATS_VAR, {}), StC.STATS_STDDEV: StatisticConfig(StC.STATS_STDDEV, {}), - StC.STATS_PERCENTILE: StatisticConfig(StC.STATS_PERCENTILE, {}), + StC.STATS_QUANTILE: StatisticConfig(StC.STATS_QUANTILE, {}), } if StC.STATS_HISTOGRAM in self.statistic_configs: @@ -409,14 +409,12 @@ def _combine_all_statistics(self): hist: Histogram = self.client_statistics[statistic][client][ds][feature_name] buckets = StatisticsController._apply_histogram_precision(hist.bins, self.precision) result[feature_name][statistic][client][ds] = buckets - elif statistic == StC.STATS_PERCENTILE: - percentiles = self.client_statistics[statistic][client][ds][feature_name][ - StC.STATS_PERCENTILES_KEY - ] - formatted_percentiles = {} - for p in percentiles: - formatted_percentiles[p] = round(percentiles.get(p), self.precision) - result[feature_name][statistic][client][ds] = formatted_percentiles + elif statistic == StC.STATS_QUANTILE: + quantiles = self.client_statistics[statistic][client][ds][feature_name][StC.STATS_QUANTILE] + formatted_quantiles = {} + for p in quantiles: + formatted_quantiles[p] = round(quantiles.get(p), self.precision) + result[feature_name][statistic][client][ds] = formatted_quantiles else: result[feature_name][statistic][client][ds] = round( self.client_statistics[statistic][client][ds][feature_name], self.precision @@ -434,9 +432,9 @@ def _combine_all_statistics(self): if statistic == StC.STATS_HISTOGRAM: hist: Histogram = self.global_statistics[statistic][ds][feature_name] result[feature_name][statistic][StC.GLOBAL][ds] = hist.bins - elif statistic == StC.STATS_PERCENTILE: - percentiles = self.global_statistics[statistic][ds][feature_name] - result[feature_name][statistic][StC.GLOBAL][ds] = percentiles + elif statistic == StC.STATS_QUANTILE: + quantiles = self.global_statistics[statistic][ds][feature_name] + result[feature_name][statistic][StC.GLOBAL][ds] = quantiles else: result[feature_name][statistic][StC.GLOBAL].update( {ds: self.global_statistics[statistic][ds][feature_name]} diff --git a/nvflare/app_opt/statistics/df/df_core_statistics.py b/nvflare/app_opt/statistics/df/df_core_statistics.py index 5404889e8e..ad0c0ae4d0 100644 --- a/nvflare/app_opt/statistics/df/df_core_statistics.py +++ b/nvflare/app_opt/statistics/df/df_core_statistics.py @@ -12,23 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. from abc import ABC +from math import sqrt from typing import Dict, List, Optional import numpy as np import pandas as pd from pandas.core.series import Series -from tdigest import TDigest from nvflare.app_common.abstract.statistics_spec import BinRange, Feature, Histogram, HistogramType, Statistics from nvflare.app_common.app_constant import StatisticsConstants from nvflare.app_common.statistics.numpy_utils import dtype_to_data_type, get_std_histogram_buckets +from nvflare.fuel.utils.import_utils import optional_import class DFStatisticsCore(Statistics, ABC): - def __init__(self): + def __init__(self, max_bin=None): # assumption: the data can be loaded and cached in the memory self.data: Optional[Dict[str, pd.DataFrame]] = None super(DFStatisticsCore, self).__init__() + self.max_bin = max_bin def features(self) -> Dict[str, List[Feature]]: results: Dict[str, List[Feature]] = {} @@ -92,24 +94,25 @@ def min_value(self, dataset_name: str, feature_name: str) -> float: df = self.data[dataset_name] return df[feature_name].min() - def percentiles(self, dataset_name: str, feature_name: str, percents: List) -> Dict: - digest = self._prepare_t_digest(dataset_name, feature_name) + def quantiles(self, dataset_name: str, feature_name: str, percents: List) -> Dict: + TDigest, flag = optional_import("fastdigest", name="TDigest") results = {} + if not flag: + results[StatisticsConstants.STATS_QUANTILE] = {} + return results + + df = self.data[dataset_name] + data = df[feature_name] + max_bin = self.max_bin if self.max_bin else round(sqrt(len(data))) + digest = TDigest(data) + digest.compress(max_bin) + p_results = {} for p in percents: - v = round(digest.percentile(p), 4) + v = round(digest.quantile(p), 4) p_results[p] = v - results[StatisticsConstants.STATS_PERCENTILES_KEY] = p_results + results[StatisticsConstants.STATS_QUANTILE] = p_results - # Extract centroids (mean, count) from the digest to used for merge for the global - x = digest.centroids_to_list() - results[StatisticsConstants.STATS_CENTROIDS_KEY] = x + # Extract the Q-Digest into a dictionary + results[StatisticsConstants.STATS_DIGEST_COORD] = digest.to_dict() return results - - def _prepare_t_digest(self, dataset_name: str, feature_name: str) -> TDigest: - df = self.data[dataset_name] - data = df[feature_name] - digest = TDigest() - for value in data: - digest.update(value) - return digest diff --git a/nvflare/app_opt/statistics/quantile_stats.py b/nvflare/app_opt/statistics/quantile_stats.py new file mode 100644 index 0000000000..1daef0e6b7 --- /dev/null +++ b/nvflare/app_opt/statistics/quantile_stats.py @@ -0,0 +1,98 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# 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 + +from nvflare.app_common.app_constant import StatisticsConstants as StC +from nvflare.fuel.utils.log_utils import get_module_logger + +try: + from fastdigest import TDigest + + TDIGEST_AVAILABLE = True +except ImportError: + TDIGEST_AVAILABLE = False + + +logger = get_module_logger(name="quantile_stats") + + +def get_quantiles(stats: Dict, statistic_configs: Dict, precision: int): + + logger.info(f"get_quantiles: stats: {TDIGEST_AVAILABLE=}") + + if not TDIGEST_AVAILABLE: + return {} + + global_digest = {} + for client_name in stats: + global_digest = merge_quantiles(stats[client_name], global_digest) + + quantile_config = statistic_configs.get(StC.STATS_QUANTILE) + return compute_quantiles(global_digest, quantile_config, precision) + + +def get_target_quantiles(quantile_config: dict, feature_name: str): + if feature_name in quantile_config: + percents = quantile_config.get(feature_name) + elif "*" in quantile_config: + percents = quantile_config.get("*") + else: + raise ValueError(f"feature: {feature_name} target percents are not defined.") + + return percents + + +def merge_quantiles(metrics: Dict[str, Dict[str, Dict]], g_digest: dict) -> dict: + + if not TDIGEST_AVAILABLE: + return g_digest + + for ds_name in metrics: + if ds_name not in g_digest: + g_digest[ds_name] = {} + + feature_metrics = metrics[ds_name] + for feature_name in feature_metrics: + if feature_metrics[feature_name] is not None: + digest_dict: Dict = feature_metrics[feature_name].get(StC.STATS_DIGEST_COORD) + feature_digest = TDigest.from_dict(digest_dict) + if feature_name not in g_digest[ds_name]: + g_digest[ds_name][feature_name] = feature_digest + else: + g_digest[ds_name][feature_name] = g_digest[ds_name][feature_name].merge(feature_digest) + + return g_digest + + +def compute_quantiles(g_digest: dict, quantile_config: Dict, precision: int) -> Dict: + g_ds_metrics = {} + if not TDIGEST_AVAILABLE: + return g_digest + + for ds_name in g_digest: + if ds_name not in g_ds_metrics: + g_ds_metrics[ds_name] = {} + + feature_metrics = g_digest[ds_name] + for feature_name in feature_metrics: + digest = feature_metrics[feature_name] + percentiles = get_target_quantiles(quantile_config, feature_name) + quantile_values = {} + for percentile in percentiles: + quantile_values[percentile] = round(digest.quantile(percentile), precision) + + g_ds_metrics[ds_name][feature_name] = quantile_values + + return g_ds_metrics diff --git a/setup.cfg b/setup.cfg index b772acd3b7..386c4e42e9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,6 @@ install_requires = docker>=6.0 websockets>=10.4 pyhocon - tdigest [options.extras_require] HE = diff --git a/tests/unit_test/app_common/statistics/quantile_test.py b/tests/unit_test/app_common/statistics/quantile_test.py new file mode 100644 index 0000000000..38a85fe964 --- /dev/null +++ b/tests/unit_test/app_common/statistics/quantile_test.py @@ -0,0 +1,266 @@ +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# +# 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 +from typing import List + +import numpy as np +import pandas as pd +import pytest + +from nvflare.apis.fl_context import FLContext +from nvflare.app_common.app_constant import StatisticsConstants +from nvflare.app_opt.statistics.df.df_core_statistics import DFStatisticsCore +from nvflare.app_opt.statistics.quantile_stats import compute_quantiles, merge_quantiles + +try: + from fastdigest import TDigest + + TDIGEST_AVAILABLE = True +except ImportError: + TDIGEST_AVAILABLE = False + + +class MockDFStats(DFStatisticsCore): + def __init__(self, given_median: int): + super().__init__() + self.median = given_median + self.data = {"train": None} + + def initialize(self, fl_ctx: FLContext): + self.load_data() + + def load_data(self): + data = np.concatenate( + (np.arange(0, self.median), [self.median], np.arange(self.median + 1, self.median * 2 + 1)) + ) + + # Shuffle the data to make it unordered + np.random.shuffle(data) + + # Create the DataFrame + df = pd.DataFrame(data, columns=["Feature"]) + self.data = {"train": df} + + +class MockDFStats2(DFStatisticsCore): + def __init__(self, data_array: List[int]): + super().__init__() + self.raw_data = data_array + self.data = {"train": None} + + def initialize(self, fl_ctx: FLContext): + self.load_data() + + def load_data(self): + # Create the DataFrame + df = pd.DataFrame(self.raw_data, columns=["Feature"]) + self.data = {"train": df} + + +class TestQuantile: + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest1(self): + # Small dataset + data = [1, 2, 3, 4, 5] + fd = TDigest(data) + + # Insert values + np_data = pd.Series(data) + + assert fd.quantile(0.25) == np_data.quantile(0.25) + assert fd.quantile(0.5) == np_data.quantile(0.5) + assert fd.quantile(0.75) == np_data.quantile(0.75) + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest2(self): + # Small dataset + data = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5] + fd = TDigest(data) + # Insert values + np_data = pd.Series(data) + + assert fd.quantile(0.25) == np_data.quantile(0.25) + assert fd.quantile(0.5) == np_data.quantile(0.5) + assert fd.quantile(0.75) == np_data.quantile(0.75) + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest3(self): + # Small dataset + data = [-50.0, -40.4, -30.3, -20.3, -10.1, 0, 1.1, 2.2, 3.3, 4.4, 5.5] + fd = TDigest(data) + + np_data = pd.Series(data) + + assert round(fd.quantile(0.25), 2) == np_data.quantile(0.25) + assert round(fd.quantile(0.5), 2) == np_data.quantile(0.5) + assert round(fd.quantile(0.75), 2) == np_data.quantile(0.75) + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest4(self): + # Small dataset + data = [-5, -4, -3, -2, -1, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0] + fd = TDigest(data) + + np_data = pd.Series(data) + + assert round(fd.quantile(0.25), 2) == np_data.quantile(0.25) + assert round(fd.quantile(0.5), 2) == np_data.quantile(0.5) + assert round(fd.quantile(0.75), 2) == np_data.quantile(0.75) + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest5(self): + # Small dataset + data1 = [x for x in range(-5, 0)] + data2 = [x * 1.0 for x in range(0, 6)] + data = data1 + data2 + fd = TDigest(data) + + assert fd.quantile(0.5) == 0 + assert fd.quantile(0.1) == -4 + assert fd.quantile(0.9) == 4 + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest6(self): + # Small dataset + data1 = [x for x in range(-10000, 0)] + data2 = [x * 1.0 for x in range(0, 10000 + 1)] + fd = TDigest(data1) + merged_fd = fd.merge(TDigest(data2)) + + fdx = TDigest(data1 + data2) + + np_data = pd.Series(data1 + data2) + + assert fdx.quantile(0.5) == np_data.quantile(0.5) + assert merged_fd.quantile(0.5) == np_data.quantile(0.5) + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest7(self): + median = 10 + data = np.concatenate((np.arange(0, median), [median], np.arange(median + 1, median * 2 + 1))) + # Shuffle the data to make it unordered + np.random.shuffle(data) + + fd = TDigest(data) + + v = fd.quantile(0.5) + + print(sorted(data), v, median) + + assert v == median + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest8(self): + + median = 10 + data = np.concatenate((np.arange(0, median), [median], np.arange(median + 1, median * 2 + 1))) + # Shuffle the data to make it unordered + np.random.shuffle(data) + data1 = [0, 1, 2, 3, 4, 5] + data2 = [100, 110, 120, 130, 140, 150] + + fd1 = TDigest(data1) + fd2 = TDigest(data2) + + fd = TDigest(data) + + fd.merge(fd1) + fd.merge(fd2) + + v = fd.quantile(0.5) + + print(sorted(data), v, median) + + assert v == median + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest_merge_serde(self): + + median = 10 + data = np.concatenate((np.arange(0, median), [median], np.arange(median + 1, median * 2 + 1))) + # Shuffle the data to make it unordered + np.random.shuffle(data) + data1 = [0, 1, 2, 3, 4, 5] + data2 = [100, 110, 120, 130, 140, 150] + + fd1 = TDigest(data1) + fd2 = TDigest(data2) + + fd = TDigest(data) + + fd.merge(fd1.from_dict(fd1.to_dict())) + fd.merge(fd2.from_dict(fd2.to_dict())) + + v = fd.quantile(0.5) + + print(sorted(data), v, median) + + assert v == median + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_tdigest_compress(self): + + digest = TDigest(range(101)) + print(f"Before: {len(digest)} centroids") + + before_median = digest.quantile(0.5) + before_25 = digest.quantile(0.25) + before_75 = digest.quantile(0.75) + + digest.compress(10) # compress to 10 (or fewer) centroids + + print(f" After: {len(digest)} centroids") + + print(json.dumps(digest.to_dict(), indent=2)) + + after_median = digest.quantile(0.5) + after_25 = digest.quantile(0.25) + after_75 = digest.quantile(0.75) + + assert before_median == after_median + assert before_25 == after_25 + assert before_75 == after_75 + assert len(digest) == 10 + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest is not installed") + def test_percentile_metrics(self): + stats_generator = MockDFStats(given_median=100) + stats_generator.load_data() + percentiles = stats_generator.quantiles("train", "Feature", percents=[0.5]) + result = percentiles.get(StatisticsConstants.STATS_QUANTILE) + digest_dict = percentiles.get(StatisticsConstants.STATS_DIGEST_COORD) + assert digest_dict is not None + assert result is not None + print(sorted(stats_generator.data["train"]["Feature"])) + + assert result.get(0.5) == stats_generator.median + + @pytest.mark.skipif(not TDIGEST_AVAILABLE, reason="fastdigest package not installed") + def test_percentile_metrics_aggregation(self): + stats_generators = [ + MockDFStats2(data_array=[0, 1, 2, 3, 4, 5, 6]), + MockDFStats(given_median=10), + MockDFStats2(data_array=[100, 110, 120, 130, 140, 150, 160]), + ] + global_digest = {} + for g in stats_generators: # each site/client + g.load_data() + local_quantiles = g.quantiles("train", "Feature", percents=[0.5]) + local_metrics = {"train": {"Feature": local_quantiles}} + global_digest = merge_quantiles(local_metrics, global_digest) + + result = compute_quantiles(global_digest, {"Feature": [0.5]}, 2) + + expected_median = 10 + assert result["train"]["Feature"].get(0.5) == expected_median diff --git a/tests/unit_test/app_opt/statistics/__init__.py b/tests/unit_test/app_opt/statistics/__init__.py deleted file mode 100644 index d9155f923f..0000000000 --- a/tests/unit_test/app_opt/statistics/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. -# -# 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. diff --git a/tests/unit_test/app_opt/statistics/percentiles_test.py b/tests/unit_test/app_opt/statistics/percentiles_test.py deleted file mode 100644 index 8a4aa6a428..0000000000 --- a/tests/unit_test/app_opt/statistics/percentiles_test.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. -# -# 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 List - -import numpy as np -import pandas as pd - -from nvflare.apis.fl_context import FLContext -from nvflare.app_common.app_constant import StatisticsConstants -from nvflare.app_common.statistics.numeric_stats import aggregate_centroids, compute_percentiles -from nvflare.app_opt.statistics.df.df_core_statistics import DFStatisticsCore - - -class MockDFStats(DFStatisticsCore): - def __init__(self, given_median: int): - super().__init__() - self.median = given_median - self.data = {"train": None} - - def initialize(self, fl_ctx: FLContext): - self.load_data() - - def load_data(self): - data = np.concatenate( - (np.arange(0, self.median), [self.median], np.arange(self.median + 1, self.median * 2 + 1)) - ) - - # Shuffle the data to make it unordered - np.random.shuffle(data) - - # Create the DataFrame - df = pd.DataFrame(data, columns=["Feature"]) - self.data = {"train": df} - - -class MockDFStats2(DFStatisticsCore): - def __init__(self, data_array: List[int]): - super().__init__() - self.raw_data = data_array - self.data = {"train": None} - - def initialize(self, fl_ctx: FLContext): - self.load_data() - - def load_data(self): - # Create the DataFrame - df = pd.DataFrame(self.raw_data, columns=["Feature"]) - self.data = {"train": df} - - -class TestPercentiles: - def test_percentile_metrics(self): - stats_generator = MockDFStats(given_median=100) - stats_generator.load_data() - percentiles = stats_generator.percentiles("train", "Feature", percents=[50]) - result = percentiles.get(StatisticsConstants.STATS_PERCENTILES_KEY) - print(f"{percentiles=}") - assert result is not None - assert result.get(50) == stats_generator.median - - def test_percentile_metrics_aggregation(self): - stats_generators = [ - MockDFStats2(data_array=[0, 1, 2, 3, 4, 5]), - MockDFStats(given_median=10), - MockDFStats2(data_array=[100, 110, 120, 130, 140, 150]), - ] - global_digest = {} - result = {} - for g in stats_generators: # each site/client - g.load_data() - local_percentiles = g.percentiles("train", "Feature", percents=[50]) - local_metrics = {"train": {"Feature": local_percentiles}} - aggregate_centroids(local_metrics, global_digest) - result = compute_percentiles(global_digest, {"Feature": [50]}, 2) - - expected_median = 10 - assert result["train"]["Feature"].get(50) == expected_median

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 diff --git a/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/hist_plot.png b/examples/tutorials/self-paced-training/part-1_federated_learning_introduction/chapter-2_develop_federated_learning_applications/02.1_federated_statistics/federated_statistics_with_tabular_data/code/df_stats/demo/hist_plot.png deleted file mode 100644 index 9fef1da1ecca4cc924f0d1fd98cb48de0e65ae35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239374 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 z zLoGBKRmgK>XN=#8>J{2{Tj!s9J?`)*G6pOI^dwuTfgb^86y2T3(#tv8WwB0lKY>&?NG3H50NRAz*+C; zcA!p>@maR$(00p4^CK_>;$zfKA$%c)zm+OD8km)CbG<)(>KHoV8-gYp1R;P**f3pN zhoa;sj)igTVkjpMDUZfXcsxeb20?L$zSzn%vq|wEQ2RFcud@U0S)OU~<3d5f-LH@L zfXqwx*o9Ue3k$;tWPlXr#Ee^VCligUO_qa;E(X+nxQhf|-=nWb?LvqTu7I<^4fcoA)HtSnN--?Thxo{S!P;1Hz z8aqGXYU-j_+Uwc!!`8?2y6oFL-NHe1^!VQ+v94{A;VAr^ZiDklfKYd@1e31*3*UNI>)DTvaNs@S4f{+s>`OFJ$pEdRFoRijVf@2D91< zG3UXS@4VfaoK3EnbC0&woo>rj#O~*ws>0DHS}jTCfV3u4!=M2t*jVvyAQ+3FKhEUu z1Bnxr$JE()yT#*yq?>O;MA7{X2x%x-wKP?~ls;r7eLp6SHN2#x=tawC2b`lrvq0Qu zSy)&Fd#|ZX3d?Dnb;COyxnMcP9M3mIU6vh5=uWJPW9OB$!5_4}b2bh8B^%kPgG#Re z>VVBZ&?o%31vlyWwFq_zheH!u715Q*yeRA`Q&!R?NBgLV7cNI>$C30TubZwdx^d2?`b6L3%sE_G)WzRJ6xEsD*F-d6U&rP}4 z+v9g9dCkGhrEMP*m*7O7R;<@LF}Ou}VdCQ1LeBP|gqQ5_7F9W`_LOt4kXPz)j(>C^ zg=ce9RX#p-zM`$j8mN z)_1vynY{(K%xvFqti7aRIX3&6Rq&dMXxf^@G%YwJX^&!)e_!%G>%~H#F!W=tvlJ!& zyW7sbXLfc)7`!5M{^tS$05R+cYB~A&h3&bTlOKEES0B^ILTFsR`%Mw z$6EL>LeU03)l&`OG_;}{XRYBs6p#Jk$1r!g@XTxZ5?vgzT>aC3kjmbM@g_APdjA_a z5cyd>_GmmhNHRJr;m=ZR?k4qJ@Rp+*h07^lmPBk(p>wH%h_F#Xwg_Tk)lv5QKZc89 z-d){tPVo?m8#6vM@BH1IHc0Okl8` z0trh@sLoStz`-C*70EfBpvt(Q z4W8x>gEpIIls}_N398P1N+YFsRA{E^KR{xs22@^^`QkB0EweYC8 z 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