From 8662a98f7c1800b79843737dd40c1cc00730c55d Mon Sep 17 00:00:00 2001 From: Chester Chen <512707+chesterxgchen@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:37:19 -0800 Subject: [PATCH] Self-paced-training tutorial: Chapter 6: Security (#3205) ### Description Chapter 6: Related to the Security aspect of NVFLARE I completed most of the sections except the following * Message serialization -- FOBs * Unsafe components * Audit log There are few issues encountered * Federated Policy -- original example using provision, I could follow the same approach, but I was hoping to use POC mode to simplify the process, but there are some issues (bugs) related to the nvflare poc -i project.yml * some strange error when running jobs -- but not in others machine But I think the first few sections can merged in, I will finish the remaining section after 1-week ### 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. --- .../system_architecture.ipynb | 6 +- .../06.0_introduction/federated_policy.png | Bin 0 -> 198711 bytes .../filters_and_privacy_policy.png | Bin 0 -> 210768 bytes .../06.0_introduction/introduction.ipynb | 201 +++++++- .../identity_security.ipynb | 215 ++++++++ .../Seurity_architecture.ipynb | 33 -- ...fic_authentication_and_authorization.ipynb | 33 -- .../federated-policies/jobs/data/download.py | 60 +++ .../code/federated-policies/jobs/fl_job.py | 54 ++ .../federated-policies/jobs/job1/meta.json | 11 + .../federated-policies/jobs/job2/meta.json | 11 + .../federated-policies/jobs/job3/meta.json | 11 + .../federated-policies/jobs/job4/meta.json | 10 + .../federated-policies/jobs/job5/meta.json | 11 + .../federated-policies/jobs/requirements.txt | 3 + .../federated-policies/jobs/src/client.py | 193 +++++++ .../federated-policies/jobs/src/fedavg.py | 158 ++++++ .../federated-policies/jobs/src/fl_job.py | 64 +++ .../federated-policies/jobs/src/network.py | 37 ++ .../policies/site_a/authorization.json | 29 ++ .../policies/site_a/resources.json | 24 + .../policies/site_b/custom/test_filter.py | 34 ++ .../policies/site_b/privacy.json | 54 ++ .../code/federated-policies/project.yml | 55 ++ .../site_policy.ipynb | 476 ++++++++++++++++++ .../admin/local/custom/admin_auth.py | 76 +++ .../admin/local/resources.json | 14 + .../code/data/download.py | 60 +++ .../code/fl_jobs.py | 50 ++ .../code/requirements.txt | 3 + .../code/src/client.py | 193 +++++++ .../code/src/fedavg.py | 158 ++++++ .../code/src/network.py | 37 ++ .../edit_site_local_resources.py | 64 +++ .../get_keycloak_access_token.py | 69 +++ .../keycloak-setup/docker-compose.yml | 45 ++ .../keycloak-setup/dockerfile | 18 + .../keycloak-setup/init.sh | 70 +++ .../keycloak_integration.ipynb | 372 ++++++++++++++ .../local/custom/keycloak_security_handler.py | 77 +++ .../site/local/resources.json | 26 + .../client_side_security_check.ipynb | 211 ++++++++ .../code/data/download.py | 60 +++ .../code/fl_jobs.py | 51 ++ .../code/requirements.txt | 3 + .../code/src/client.py | 193 +++++++ .../code/src/fedavg.py | 158 ++++++ .../code/src/network.py | 37 ++ .../site-1/custom/security_handler.py | 42 ++ .../security/site-1/resources.json | 36 ++ .../edit_site_local_resources.py | 64 +++ .../server/custom/security_handler.py | 30 ++ .../server_side_security_plugin.ipynb | 163 ++++++ .../customized_site_security.ipynb | 73 +++ .../local_security_policy.ipynb | 33 -- .../communication_security.ipynb | 193 +++++++ .../06.4_recap/recap.ipynb | 33 -- .../06.5_message_serialization/fobs.ipynb | 133 +++++ .../cc_tech_stack.png | Bin 0 -> 104858 bytes .../confidential_federated_ai.ipynb | 115 +++++ .../06.6_trust_based_security/gpu_cc.png | Bin 0 -> 39847 bytes .../06.7_recap/recap.ipynb | 47 ++ .../part-3_introduction.ipynb | 37 +- .../utils/create_configs.py | 2 +- .../autofedrl/autofedrl_model_aggregator.py | 2 +- 65 files changed, 4686 insertions(+), 145 deletions(-) create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/federated_policy.png create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/filters_and_privacy_policy.png create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_identity_security/identity_security.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_security_architecture/Seurity_architecture.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_authentication_and_authorization/site_specific_authentication_and_authorization.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/data/download.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/fl_job.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job1/meta.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job2/meta.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job3/meta.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job4/meta.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job5/meta.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/requirements.txt create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/client.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fedavg.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fl_job.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/network.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/authorization.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/resources.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/custom/test_filter.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/privacy.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/project.yml create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/site_policy.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/custom/admin_auth.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/resources.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/data/download.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/fl_jobs.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/requirements.txt create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/client.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/fedavg.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/network.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/edit_site_local_resources.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/get_keycloak_access_token.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/docker-compose.yml create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/dockerfile create mode 100755 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/init.sh create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak_integration.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/custom/keycloak_security_handler.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/resources.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/client_side_security_check.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/data/download.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/fl_jobs.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/requirements.txt create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/client.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/fedavg.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/network.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/custom/security_handler.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/resources.json create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/edit_site_local_resources.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/security/server/custom/security_handler.py create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/server_side_security_plugin.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/customized_site_security.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_local_security_policy/local_security_policy.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_communication_security/communication_security.ipynb delete mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_recap/recap.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.5_message_serialization/fobs.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/cc_tech_stack.png create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/confidential_federated_ai.ipynb create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/gpu_cc.png create mode 100644 examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.7_recap/recap.ipynb 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 fedff218d2..e6ebe72a7f 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 @@ -85,12 +85,16 @@ "From top to bottom, FCI has the following layers:\n", "\n", "* **API Layer**: This is the API exposed to application developers, like Communicator and Cellnet.\n", + "\n", "* **Streamable Framed Message (SFM)**: This is the core of FCI and it provides abstraction on top of different communication protocols. It manages endpoints and connections.\n", + "\n", "* **Transport Drivers**: This layer is responsible for sending frames to other endpoints. It treats the frame as opaque bytes.\n", + "One can use one of driver out of box such as gRPC, TCP, HTTP/Websocket. One can also develop custom driver for alternative protocols. Switch driver will not affect the application layers \n", "\n", "\"FLARE\n", "\n", - "## Federated Computing Architecture\n", + "\n", + "## Federated Job Processing Architecture\n", "\n", "There are two parent control processes with corresponding job processes on each site. This enables support of concurrent, multi-job processes.\n", "\n", diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/federated_policy.png b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/federated_policy.png new file mode 100644 index 0000000000000000000000000000000000000000..86b8938f0048f2c767cd6f3e3a6ce24d39debcfb GIT binary patch literal 198711 zcmeEtW0WAvvTkeIwmEIv?rGc8wr$(CG2K0F+qP}nwqNhF_da*ucklWCe!N<%R%Jy- zL}o@*qQ1xsm6aBOfy9Ia004jy6BUvN005By007bj2mPWn^YS1706>=ifUHPcJ9{1fXYsyLs+OyA!#jd3&t- z`SH=2#uc62{S5$;pUpS9TT0}KiD96b(3S+C$V_NaJ&`=^01JG!Pt+G2PSSpcDq6kq1GSDnJRKE1n(O77@U}Q>f6`Ha>>UKqi1XkjocdcaPOZN=Ca|5PcXb0s#-9 zXZ9Kc!aFqnt}z8-CIwqMF2VSbLElA&KZq={_Tcjk`*U?>_PaehbS%F#>T3`IqdeMN zc1w@;NKe48Eq2r^qc>x=pF3FWgKN;rYuLAJSsyd?ru=~R8Dv*R61xU9LXfG~f zhxbVr+}yjguP9ad=8W+~9{KKvV~dk$42SwgeWK>O*WB#~o`m@yxsq_EG;(SobJ^Jk zMDvU_Jzw0h!0eqYLN721Y+eNR&|JP~;C#3oI)GR@P-U^Cm@bAlDl*w}U1|hsM5y11 zjb~DasCQ?V1uFW1TI%!baR6qWogPHn&a<1tV-UTxB!U5}*nPWpTqCoAyP6k=?pHZ0 zkAs2mTd{pc!!`yx1pG}0Z3#-8{~H@fl+W(gcN3t)E<+ofHPFmoU|b;nIv{NTyIb5Te)!;E za`+U#Ax#BAV=xS0=|3kWts04M+=;w3~9m0Fu6XX{AWl&5&ANoNJ*xIBvajki+ z(Xai`V6_5y1eED9-z~r1cw%dV&-SMs!0XrUa^4lWRsdo51MCikm)t^FfOkSHfuIiH z3_$2Xmdi2`av%_fR|rWDCGK8Ji99tw1v{ynt(^7N;iJ<*|BiLWXu_Dn z#KaK6vSzkq@H8gcA7Ytcsc6ikBT4VXsAZ~Q=rIXm-a{wG%&s$I3Yor=N|K(GxYggo&o;H9PCBdYi$F`LPPLVv z1wWP5dFte=ZfZxW&8pq>EzQR3X=*!+1*@+cmQ7|YZdVq@lC0gQ8aAWM&`cWVE9Ni4 z+x^>@IySt<_%{hQa@KO9`SkO?phi(tfKHt(31E+-TVl+i=|2<#FOM_oR8&^LY1ketoEBUe<7; zc3+$9wr<~4@~-i2@-F_22bcx0<&(h2K0<3EwZR|47e${#hW1zL=P;3ekMl7 z!bDU{M8HMhB*GQO6cHy>&ojtN5}Fs55_T6x6NVe0iuj3V zqU48MvU93CE48k(+pR_}7T6HDwQag%gM!>rcgc06uqHae4(sZGvGXXxPiVIs6B)y5;S-S4V0}wM^a2_MGoS zOoq}XeJxcinkoq+&7JW=P0dkGfRl}z?WJ6VFNvb1nNzQKA4U_KN+!e9G-JBIk+`ep zZ7T(uP|cLb9v{Rca*n7!>>QUvwOCeD23MM^oT*0Lsn*ou8F`#$X)avbUhAzEt~IK; z+9GYde&8s0ntDpf%7=x>QfD={n$l`(5I2%)wnJKxerwf75oTtVM>*YwvX1n+UjvRuD7}q=Go^N=jl%jNId>} z|9H9b+04{jS2&hemZOp9q5ixFxZ!)@e*tz%$wUcB!Shb`RNXmKSW`VxRq_P?AiI!L zI4?JE$xH85QZ83YUi56I>f&-Gx)fVl4_jX^!W?x`=70L#QGYNA`;_a#wXJ!ht)qs& zIA;rlje!07?eHnvUFId*g1eth$$MqX;Thv3^-Z|QR%+Kp!ERQ^-ok$IXJ>6W^#rxC zSM}5W6?>+=;UUW8WgA~xjQjR#|5-RvvQV;?mUIi(T1(sgc47+UV?~hGdDDUS`GDi) zsme-EqI))g#Eg!@cms!z1-E*4g1bZ)>*G=e>U!m;xLtj1K4x-Y_?XSJ`#b32Xc& zCg?fXB%CX3Juig!jZF&Y+sS5w9|5qmB*@mdE&y3IfGj5fUkWEc_mGCKDCkg3GYB7e?vEzmr2%1%gO|-zEzgy`D8Mb< zBLrlmtE1;{S2F46yPxupyvF#EFOARI?6@HJa1G@dU&~izLsc;&DJcMouQWISV6Z6w z$X5#R>&E=L0RVvGf&jq2o`_$!&@Z6Bb3r720sox_(*1*xUqMhz?CYtZZ)a#|Wp85b zkke#q|D|ftR8iGIRZ5aW-`bK!*T7oOkjBN*<_{47E*Flkq@|&QF20MUg_S*r3pe4v zI5@u2e~@Vj@&Co*V9rgbDkY0AXl-YR&q6~-Lr2I1iI0!ZWoKZ-AulBSm-yEkH=&7x zgAE5Qt+TT;jWZ*SwVg37Jv%!)Egb_b0|WIJ2erMcm4mJewUs^5pGyALBV=f=Z)a-b zU}|lJ|A$^(J!?k?ZbHI83i|i;XFUyFO#iDSEBn8i_0>SyKXPd4Y3OMGt@}%q>klf2 ztf`Bk#ZMtq%P;eMmBGV8$IkUH{{NBlUnTxSQuV(i>FL=2o9I8X{%=twdqX=xYs;@P z9eDoBHGh@+&&R%n{ z-rYWuME$ef+0?oI{lnW{g|d7NCJ3EvchcK{l7^6$QJ|=qQcN45cy9WJ|V<4;QyQ2KXky0@b$&9q1%!DuLXZ` zAV?U%{HKcHM}6tGrQ4JJM{WLFEeMl_F#ktu{$l3C{?fgpGnDf`+xsVn5LGPm|85U( za9=hc!lb_L7{UKwG4K#oLi7J_#DCP$_RC_S{sh7Qt*-xksTNxJU)=DghMh0nh+u-S zf&Ym^FSP7GITE}N0lxY>Y!Ei&f8yvv{0aQen*8%q2qD7P6T^mPNB$@ApXU8?H0b|# z^#6DC|EoQE%sFc zyiskqxz7$-#4uq0dt})X0uM1B4wa4L__KIA(XFny;Om!>$R(R9EYsA~ru)u|Zj9ql zo3!YP&dW`epx2Mf!y}jggoQAh+49A$70QVM6#)Rulk2?C7CfbTYQ7cpgo!3(-Zsw% z@>|s-6YJg&&wX$;`B)#GJ21k+vh%7!;LJ-NzijSSEX($Hbk0Wx4V!gKHrC7C$5SP! zZ(F9t{l1>eCKvbmY7&&jm+i?NCC=5J`;R`Gd0k(&5-hLQJr1-~2qet!9XWu8z zj!$|z-cjh(#^{!ArcQa9<=jph^e1ZyuUZ>Vk3x}p)>b-PJig zyzrofDaV}9YG$$ToH#B#}nD)zy`&oAAk;ylmkV z77PVr$>4%;;*r5Tq|ptn0LxZbAXj^vBvZuxIE7#u0YNTg5WgTg#4^|}mpiYlGbJKG zxV6O7>j6p$+1Y~uYy}!&Z5OBs?&TmJ#CwdOyg+zJ5Cmvpcq5b9S6iy(dVM(DmqC3O zFMURn*j}D{4%PGK6!o+h>)$!Y1nOo=!hQs*7DjFanQLy>&a64QubeIi%a$)q5yopi zVvG|#LYld=WML*QH=%>om2UuJVy;6NjR2dSo>92C57yXERT3g(33p2E{=7U*n3~+U z5ozw!6U|2q8JXU8R6)!Xw0{rG9(`XE$PGd|-EqYqR@>T?!pGiY-FZ7mRVMDqsj{LI ziPC2desZNl|D7YHAA4Y&5_B|04jRyd`3+{CBpPgmOG&#<1o{qMc8V+xJ(C9WElAo(v0(G7lq z2}Q}2?8r;6m$F%LDu`G2ZOgTYL0orqDa-a0Br1WMI|=fn48*>fkiS2OXppa2o(FOE zd*;7ptqdNJ1U4P)tBEN=u%}&@gWqwYce%XPA3g-dh=D-LzY7bAI1Ay1M1PpYy(hr3 z04dzfNG_P>s0y6k&(%-HK=$(;b}2_nf|m49@kITYO@Ktksl?14W}_>-)UEmmf;l={ zi>_c(JWu}&j4Bzv5)Dwta z!YR#>Fk+UIDU6kHh&L+H`D;1sruf1rkMc=j!PG#woE57qljs{tDleUdl43mBB!t7Z zSuVV_q~w9XxaY>7XSei0ff9)b?{Y{^qAU4*_;k3Bbmj9Z%LvC~U=mP(VJf{jfN)II ziBRHhAD(z~2ai|MvhT$MEU>mz*U|fxLVb9eg^r_Zu9n!3)b@=q+cOXwjx{%JeM${J zR5C0=BnJ|aqevS|V$1bO(wS2x2skl9QE1~hn<(l{h-mUOQg zbXU{Hm+A~jPt;nE*>!Tz_`H}Z`t z>Al9tzQdSsjk_!BTRTFft@D4+H`aYyzLm@9qPB|G8Ev@GjJ6}0usnh4*|yU?@RNu! zJ!t4G!?J12%WnWG-CXxQ2||7H8^hWW6_D;0jmTuesU?j@Kj20@1i9(BZfoeoF*jdF zCX&~kObz;2nOEEpSbBR9ry5W9DZT9Y0AB>J7H8E`uY$gQW__NxZmc?o{(!YNE%06Raj|n*vH<(%3M+}bv~vf|9f^dAgTxRVNk>GuHK(y|ij7K0BWbaySw2vTJ?{tNor%XPqd(d8Fe~ zn=Z}><>}O}E?EXUpy~2hETb3D!9;2?sVYxet&EI0@Wc5=R5|BkZsz097(XdJaZuqX zjA&EijL_-j&^BH|vehRVB1)5+czBJk3FaqARt28jaQ zy$}RZW{2JJd`hy6pxBh3VKdW2^c`&aRhK9Dh!1%M1(26k8x_{@jG6PSG|uAbTpq!;JBafA(MetS+%Zgue833b7(E zTCP{*5lS=Nk?c@YG-5a;iM4X(rCLksEVm1ovkmRgg($0aA9*e62M|&`Sc8t#pkI@4 zos+>_m_FKR9;i2pXM$~h@J4zw6X#E}p4K^)`Jj&DmMvu4g({+cLgonTP8J9D0_VctNA=uY^B zhxYlDXr5NvEw8$`@3*q4E{06tvig}VB9-EZG3ADf3oCG?1=D&xU?Lk7oMiD#$HL%k zUa64M*JkhyDm?2dyln9KqIe=wN-QP0KDK|S6 zf!m0G4RylW5x~n^qacIm{tgF8&)p0~9gf%KkJXM0>sM4- zy7-EA-xa8Ad)DW}`aj>e z7u>0?mW6dkj;N3epQ_wWc^q1~!9jpTGd)mfIv67L#2DTzQCvqB8t&~`22M{#3G3z9M8AdvpPU|$ z;GuL9sp~;1y(*G(u+F}9BjfU&^u}H!FLd*xQnMOSSA>M(Rd{DL*&|y|Y-Va+(NE4F zOG3H4SG|;_`}B8F91{#pn22ZnYSq!R$n{cfc$KYordQN@D*C;})%|R`4sC;lTC}6O zQ*XjnPY>lp{&hO@+`}uIye^Kl+?h#{!Xh&fEhm`sh7*R`%E16r3we9F=mF23_*^)}M0VH1XB+U=ZL#~b|^~RlX6)c1sS)DB~h&=;v z*W+$Pe%EDbi$Y^T!&)>Vk#|~>eNsYSElvWrq`SGZfgs1zyMh9y`aB;!iS;aM)#hC0 z4p$R?+BM5W)k%@Ey)n@r)BUE?$q1|)Ki?>D-Hzzn>g^cUDDH;ie1s18rv<#8N<5b8 zJ&}~lHhdbg;5%Fo$Jy*}(2GJa5L`d-~s2>)xz!WLmcBK6)H`0t`LN^t-%&5)rOs!e%~YS zoY}kYn*D%FG?r8lWNxt7DC>+h?}WEpZv*@Jw!w3@S%*=Y27JX{Vylym09%gon$G=l zcp_3_{asj^7p|KJEz4~W?`ahHv!_DbO;E0hf!sIxQKCy^lEE5a)g|)$j_Ksa>}f&8 zieD=XIO)leX{iMJZw!l#$~@-Gy{S05hyMt#%2)k#Oh9WsuJBuzptkg#D> zQmEOxD&caIw~lB?H|eQpY!8b;KKCYB5d0hCJqI23oi_a+QdK;6fv2gjlOjP0%_vd4s zo&X^PQ9qY%@Oe6ua-GR<9EqjWUWMOfh3E`JdH2uKwueUUk5_Rj$ZE*@$>kFxt5exH z*X4AyK-SkYo2++2bhcjt9;`_X6zxEPy>NSY^lHPvo|AzgbD}%l6dE_=<`w{>qBV|> z2*K7wtuHB=s>N9~ky_ zYcLtbL*z*apDenbPH*n`8Ykyg_X4YkbJ$^I#cRv@+zC;(sA0;gD+LA>7@cjlq4RcF zbCJA#NdHbcfNj+%GQ{gaCY`azVCcD*k4c6?8kAMgj68WUa%fo8@68>&if&ff_C}rH zvjx3PC)1^q-j{P~;bu?Am5HY>EsrJ?2H#&}X=<#LLF2&|TSiyUsJLV>*u%tgUBF;7 z7N(z^nQAa5#(g^6bE5pduGC z(jpl6olZ{0wA=mJ3PxML4prdCZ|6ocC>yfY#>G~y>(IcIlSW|acsKI%c1Qc_YOXeR z+)J9*oP^;GS$>V0EYGK~EhFRDb!cSweMk1$wFmkKgRT+zWxo*c$z4E`Swh-{roEyj z(}lm_r5tlUMYPpYZ?y~bn!rl8y91NFCM+m)U@W~YGDG?MQl}w=m&fG0$q`JKI9yTO z8zC|p%FHV{#>NKAoQ-s;IhL$;H89-g2W~_*JJjMNPPpVmGxEQu3n`zUulfJ(Il4et zA8&@|1B^8ZnPm;a(_>DhM%)v zr)b`%XSzGy9?Tm}kr>Zjnpp}ZT8}DtO*qXsKzZTr>P=)mcV^XejcOQ{@7#zA$EQA& zR`Xr`b=x;8FW#$#6-=*QD&n43Ch;_WJA#6yPb>4@aa(@eA-LiAGip<^Jr=5&HwJrh zIzc$hnV@*LOH+zFA019K@0+jazwTi23>?FxYt4Lo;30v&GGEV3n!{18Fr7sNX`5!(wH=0ha^YCM3TFswo z*xr__)$^oiS>80sVV=vw9DKK2D=V!>0doVLoUQX|u%3rnanwg-4mv$L^m;$+oQJ&= zVX~g}I#_8)-LC*WfY`LtCw}Z&ZJh;ln7o}JzaQdZ&&O8 zC{MGrnTT9@E47~0+SK57p_Z~Ym)U&uv~&Y~>UYHfi@EzfNcs%Ek6`Yu7QW8G^-W?7^ZvGv4{>!;(D$?TuJW%8%pmMhvH zuWsWOEXU{jnYT*kXfl^OObzDc=^wug4ZojWs%t#2xGs8XuFg;Kx_JG{*LXc_-<&y; z$XgVnX_j|)TuwSVe3w!?<#aZ0#-MqxUCw?key~~IZijw#t1Ca<(8(kljKF9#f8?q$ zy27mX_i6m$elxv!Y)M}5jP|bTZkM`)vT*WXwZM~ZJ)ffg{iV6P3?-6N@b%ii(%juV zy{_UyYyAA)bpKR)(aTw|dO$Pf&TY2xCHG-#r@UI?Xc7fWYp$d2O5oi-Z@B_x{MENX zS7p44<3`{wu(>M~5nXh0LR(Y*ZyzX($A5`R`v}w_s9=mQ4V-CmJCAX0c z1{zP#+Pi)bc`>^YL9!_+WbtSiWk@WlU>-l`8aKNpyRFB)4yC z)7?CN)uC7b7?-T@*e3(3$4O}lFa3nMQ0;E+sdcyKryKNU^JC>wjU^G%inNXnJkq8x zTUFD|z4fLqt@pLU(3E505m=s)rauJI0imE2r*i|ugQbBBY-5KqZEC!bYg1oXAh!M} zcgs7&B8q8A?f??x3;YyP@eC~`>PN0!>(zVVqpR%TRa!vAaEimi_|ph+yx#c9Bzbcl z-Q|jP?vllfpmobb1^?+p;@I%4pUUMcRL{Fs`$izE7v$#KGMsD%s?ztl^ny7;s-`zk zuGiPg-Hu?bo|7NmJzON>%C(p}6NqM!XF3j=rLwJF-gVw3(bZNnDj_F_F^`EW^yGb? zP_Wc5P0h1PWn`0x-hA`BpLll~+cx^i0>fveRafer-HR2xX#GD;Z8#89;D{qiPMo;j zlrtxW;uui0n+^~)oFAH0<6rEr=blp--z6n&F^)A+1Vs8z$J!aV?o5{;{;M0%gG0Xu zaS9VZi~iLy__%yiMB3+#1g`^zk#UcT;A?YtDbheA1}ZLavDZ4S$&g8nEc@qioJ3E> z!V~1Gjsi)$=zKB+BDkyx#3Ajr>e9jb;4nQTPf`YiGLy4Y{rw~7O*p35%Tje|p;0kk zcI8HFA_OpX7rOT<9bTOah%#GEf3J>R*%Zdcw8jl6vzZ|apZDuZWrm@hdjUVxy(}Tq z>VWHAo73hbZ39yP7OdFzi32aiCIr-YzQWJJc$2I`+dtx31zLz>j!yXlWyD(bEkwbm zvGRmwWrc4=CiHAu`c>Y*C^op0rvc2;aN;S@boh}=w%F>NGXy<0-DBh7FdM4A_H1rx z?fOI#Mz7E;j0BHk3&^N&|Hv*%QBro`@KEFMd0mXkLT8I zwiqv9Kzyig_YzZNGa<#gdk?JHmGxuHe>$@B^9E4kZd5(iE5U>Opw89?B`X}lHMO^5 zb$KJ?1cuTiNF*?+8Hz;jp;_UMF0(rf6lvyWP)FE|$8G>rRz5|-*FQJ0W+gb$AYyd9 zFCbSkhz`b6$M!cN?{v^K)5xm3t8`Its1O{tbCK5>8D^H#lV4a+*7dA!^bw{2LJdZ_ zWYvjbEvh$Zf7SfceB~>fN(NEA@Eqge_-Ff(z^zRq_Ce#%jv7dwZ1E{G z;ymOrylh}6=PGn+C*%Za0W%{OH!0I0F`0uFEO=W*UcF2?<15wn2)I}*iz9BlJ}6xa zb?d=^V+E0&G|EW=^^*3*w#^6udD=8x9A8Ky{5++7g=%s3{ZQ2$T>@@bt zXB)L>2=|NBhc($fxq8JD7<^df@>zd}Xt9&O;?#pbzN7q&2KmGWg^uX|3R{uW@3zby z96S5&c{=mtcB1NwpTT+OSHVO+wA;P_rVI7e4$A)u*en#y%V53Pi zJuUSt7a@AWK+fuNK~>@g+m{EhBx9zClxspki*>p?0rX85amPz9d#EOWBp&OF0oAh} zWM|d`dTx?;V0njQ8BCC9v--sFML*7c%^+o`nVNB!_f_8oxLIb>2L*_h$6V`E61Po_ zK0?3`**KgpE@0g-U7B9Q;@|gF!7MbaLKueF78>)ogWXQ1k$8REF2jv=BxR(7o2e?dq0h2zA4*;1 zp2lkK&@wh8BhwSnMvxJ$Gv34W-;si;lHOySP}I$u3={(KwzCh8wMFmU|#Y46?%U-scZv*BONg;* zTYf8e#K@4{Muov(G8pUy$WT^IsJwZqxnooPqt3b`PvmrL>epSfSSDnQLS(L7BnK!z<3vyw76k6GLP>ciu;B+r*7BQSvC5^kmQwlWDfDE zr@gU#n%cR#W@fNT;3=DUC}s@e!bF2(yvIw6V`C2Mlp)Jvpc4f{Le)E)>e4pXvL2E; z+NrHZE^_*z>OP=u{X&1I8nfy5dC*kc`L^5J%?fO5RJ8W{;W zxj4?-Mt?{Ba8a;-ll3$C+=;B+t!KY`zUqK!_kNnzk<#qL2oJB!2rkyYy_+VF71G=+ zgWhV&jo8z`>>W|)PEZTmi<6)yd?sZRos0*z=8gtdh>!7B=3%K5i9CwC<%x`#mb-*v zwnFJZ!1BIMv2D5uN{=xO3$p3c4AO$(U+)!h9Y$v))tUK?jk#r3y4bCCIv?B_W=-(H z=2zZ&ay2N@0NYXAK)X?b>wk&;yhV%bCwzdczqhv2ODS8-7N-(~xKOr0upL3J`3u*< zkFDPDDc5LKM0N4C3W^t%p7D0x1uKlTST}UrBLj}&|_f-?s6afvF-UlWqZJwSkuu=EuE(Z z?q+mYNJ*yZQuYVQYrb5-*yIF{!MreUV)ow~2BJiCj##g+%|;IYrtnY!ouu0=qNkjN zw$M#2ZbWfkw)tP->@NFnD_0K0_|9XUOif`+RXyuEUcYOJuwE>MWQo*HhDfBU?7fs8 zoQNqZt&VglIVR|qAr4X4)AvoGhdYX14arD#MO&jsSMq2E(O9EARJdcu9w<7tXmxzx z8S8G85xy_=#6-@-K0~Xp4K4B;L}v!MHf{z&$(sxfsFwf-6~}HPgNCsnTrmCy0r!^p zQ8yj`R{U%}wX728-%Des7dh8<2X&_@<^LqAH!PQC(~L-Orbx3~e;VZO$lBO=K2Jv| zg~0V57WF!1Rs6<*8pTPHk}@MlcfjTGij_=YHw0l8nc~`6WPwYe@x!%s?qVbC?K_c^ zvjTB$GAytiYqHK2X>L-PqrOPxrChD~!jQ8z#t>Sy$6vec| zR3eEHFiPW6ALRlMGWs%V#t3zyzlQ;ZJ zuTCyF6rGE!0(X;ly+?7+vl#?7CD^BHZ?KKVMCCez66G3klrl3-?y-*Fa}ZrtbQ)Lh z4>KjQ2YD}=u^xHrp$QJqy`V$j_?K|EyNg5PGS((aK)xwRnHU-0D2O1o?1`P6v zMiF3?=r|E$8@C`yYNh5P2f5WBxAzA(7LZy8DvGnpuX0+Aa8SJtXt*9HVC(K}ABiwa zr^zvS_M$*nLg z=LK__%3-ih+^fnXvly@&c$}-R@w)x_HTzU;OJ ztDc1e)m#6`NcYYD+Rip8=g%E4s!cn9b5CGsWc>y~Vxh`YNB5~!Pd2=~lfsh0HtLds zR!7#CRtm7yXdDa8dzvKf&hHO)OSL?OgZxH&%nTVU5r-c;CsD`dt9~mJEOmh?OUxHq za)X>IZ9%Wzcbaea&GSdmvIcuAiG+WL-P_^eC*vLkq$Uvl1Z&}ZeE^d)7(-iqEc$cD z=Z`GcB453)kl_2bEhlh#r!|W)O@m$E z(+Sp_8W~xKbaK{Fa{yUQZww+RsJmbm#|8#O7O(YrwY(n4F9c2p`wz!-qTsRO8y@T% zqdi@&Qwysd=8a6gp%h&bJe}nA zZA3d4^7Lfx*?cB(CT)I#_s;4@zaT^Fe7`bWXEf-)8As=}A}QFUyKY*PN1>{~{vO?o{v+yD_HtpW%KqDiOHwOIsyn@< zB)xM#y)D{-w1rkRcqOeH(q%$%X4*)M`(}FzgV7#@<}SC&%()XI;&Yi0d}335o*hJ% zyCcxo0R;)NEn}J_=--D?U3YPcYfRqX-MG)$rdERdIg@rbHn{>Q55|S~l^NP8flSIP z`vwxjujkCew^mjojG_@1HEjuu4vlv+R(ZfyceH(0_jMLqDX+KikbZfd$R|V%`Nylj zIxwr~uh+0%oyAZ7nurPZ1Y5CvWVIFnCaTPb+#qdv(b~7?gH=A@>Y^6an()2?@oa^#=P;9X`mfqD(XWgt3v~r z7$q!cq6)34bj`m_bz0+-{9CJ!VtI8~k#bAkAVxU*5Ai-CJ@9pU)}6i4&?a#MC9FCy zWT>!kW-q}CpM@{t1YdGDNZO6y6D)1w+BWKXE{lIG86BMR&QawUR$+- zP9y~|or54+T4l8wz%DB^!@aaYP!flaPL8J!RnFb?@b{JusLdGTcei{O+Obw)7xKz7 z#q@EGhq4@~#p9_(P{fhf=FYez+h3f%e?BSQ*-$H5{0v?{9prD-jl+fQ`&L+Di-v;b z;l_aYzCQ&Q4i)-S;i?&nre{<8XZXQ|n}y~hsv2gg?Z;1rZ9BE0X2^6F%fYOgcX0J{ zle4rTo1zdNX>S9v%}})j%*EGO@uA5~Z9OfhJv|no#qt56Jk$x#GF6K;9AkJzhlL4D zZ6E*r;iYlc%QE#~-gRp}3U1O2Nj-~U^zdn8tw$?CtGe+45lE56j$ zPIP_dxgDjE;y_%tFReDi`K~D`abdJH8a~-{#WvoJSn7>sBAk=#-U~u0ez*yjE@=Bo z_eJMM(kQUn>xC4H5z%jRkn*i62%b#M43w(Pkq^3o_E`$DA?8+}R9TxYaIj4GI-$PY7H7hGpEPxLP==qT__??&xUPbK0zo{8Uwf{fMJ3}M zNxg@xwbgA2P3xjJ ztW08e&aZ#ZGp8sNABUL=uwZsb!!Q8Q#?t11J-8}zF*2lJ%*Q`8Y`v-VfT14&9{6Y@6&s;1qb{ioGab-BegKYzn?Tb;*( z?zEGxq?i!wiwkN&4r-gEDW)3YS zmHk0BE%vH2h`YIq8Do5EZXC3YXG^OK`y=7{;5xlYKW0~o0~@ek%wG|-&n5qfiT9=X zFOhXIJCQRpin`v|xX`v-gr~Q4 zUJ+fZ*bby<#Lgg;db%jt1X1)>xVb_9bfwuUya%56n}NyXlGoJ0+o_G&fT+gCyu!tC z>V#yu?-5#yN(^|lh`C~};gg-fP#fjKP=g)2Iz$}m58J6C55**)knw5qI+7DZ{2M9F zP0w+|s&vGfpJQ>VKA#^a<;V$4Wx7L3#>P+!ZO=dpebW22%X)(1!nifJ61IJEWVK%pK$KXFAmNuuN8U`TS_+<+DId&@t_UxhATA8r2pDXdUBX2HsM=Lx{ zE-kt)lGM($8rj^4g93;P3kb=Hfj6=qOdgO~a&KaaayKuzBI>b1Axfuf!MsU~q6LP3 zLfO71QeN$Gw#v?Ty&6smV=vX)Rz)E~&O05r_UF;Njc|F~&Kl>jX|{>)01W?i9w7t7 zm+14G4I+%F(x2h5rvQXsu_q5Mcl?j^$^0>5$Z+#KutYsE$kEPx@PLyTMkc}2mlw0n zRL7U6f;va$F72tqhgwmWpD)=@tK6G??6cyrBj=8ZITg_I<0gVeAEFto+<48V(=Z~v zOwvjA3wYz=us`h*~icw&I}~Y_Cnumy(Nhl3BRqv zC_<)ZmvcKHe%ki@?0KwA4awL$dgueK@K>EqK{_-U;N;A!G+iG%w4$wcERFE~f{ura zgUv6dEHud|)s0kqo#{eBAH{F2Q*apm%a-VTHC0QINb1|>oV?X%`tU{CGkFE*)BYhgp6QlFB)7=)WGCtko33Z4>grZ=)6Be%Hg@h)9 z3+T9E$u9@Ix2nAIZQImi7fZXRc~&BJXj0EFsHLq%toT~W;DMx1~vRO z%uAe0IfMQZQ=|Q=);}y{aTg1j8V0%W&1=K{WC6;Z%njBxsXuKhn|z0u9&gN% zQ9ZjiwM{!hWGhyV2{rp=r}3&s!n^+n8ZG5O=-(L8qmU17y~xw(883lbQ=Yth`tp|LrEOR#c|CglVVfJiU})Ce4WMuX zS@cNWZszP0QubZK&YwvKBz1LlSK=f>W#s6Lgjmv$G{H#?K^zVaPThm&ri$R>Db@PT z-_EO@XQl+aKw7ZmhBICK%+%9;bG_S#X0D~x0V-r>SV)CeJ#EnIzUbY3q&ip(o$}0q{t?{@eQhqbjBk4oRgLSq? zmlog&`|;d4IOnvtM{Yol7g<^S;O#|GtcZ^olSH=jl4q=mjs4@e6N)YminBej8HYzp zRbp(Wf5saZ_v1j$`JmRK%7yVnq*s{!U5u{XOdP$w)mYiGCw5Lm$55)9t&HtMNOoHz&WcJk^pVkF~7fnfX^;9dc9v zh>%D7l~ZGGO@E#{dp??cfT$FpV})+Nh}`dFU4!*@TsNU__m01uI2o4Xx8xuBtZw)` zVX``K>l&G+Ie+_WiQOM551Tae$j>musHg@+)FB(tr&ea3-pf)`FI@_wEh^jFGpeOy zPOmMG*PHDyGsMITMkCt|?P1#A;Ii0Z_e!9zOY*IbSEcbVN3Zp$uiu^=*c%=YaT6f{ zVuaisO->A&6FL~ae#|S@ z!)rkY1&a^d9TKpTez>yg>CoE?4*q)JOmyMN73{^U(TmrhJn?=m+eq9lSzZ8H`k z3k4$`{A*Wd&DR=&{imM1_FroXE+B$~Z5L;h4Xql;{Va>O6Ju?`fhy|?Q=Mn^>;6*O z-rW0E3@yZggjD-0hDHn;1FNv^3`9Jw=*`7MKR~>fcC9C%yNxZ@k!*`+NjL5k}U zkzzV)No#A`cGad===jQ&voY!&$*CWWyD)9C)DsuAGD~K_Cpvt#7HzU_- z91n*CVPjDB@@lu=5^zq(ilT1H|$8 zR|v0^+uwyrl>UrvY!S))y6tLJeP2O(8r%(^F4_NuKk0kCD?&&#JZu9Txk<-r4;Epm z+7Y}#bGO@AXxF+u(>zqI9(8p!X0(p)*nv|IHxvQYPcw|29PkM!6%#srFGQv0s25>so z>8+^BO0}8r`7iRi@Q`rRJe81cu-S_Sd7$*KZlJm!r5_*EKz4(I$gofyUd=|dZ zM7}%E+1)?Z3C_yP{ttWa6yDj=?F)Bo+eyc^?WAMdM#pBywr#s(+qUhF?ev%KUhCa! z?QierIXCC-Tqbk=YgX0psNWbhu%k7`x%0JuARz+ii7#2%mouRl8&Wwik_bg|KuJYA z^kUs35S$oqupi$5@pn$)kNyl2)J(mbU?p z<9N!t8z-L*lhI)K)zUUWH?BJ{8%tyR-6AIi6O)Fi{rGzWewXDze-!Ku(_#O8JSr^; z2ymV}Jw5ZSFwx0MYZS*ec`7Dt+@=wc5J}SxEa_Bp@6gT!Hc7!hcGecKK<4jM<;SVj zWAI1e;2t51-i+2CZ{(k4f4_KR%a7Q`{2}Z`_l2V3Uvu~yz4PlGAkvTdfJLg(d<3lj zQ}v=p{IAj!xm4=ovcLH4_wM}HtCv1V(G`BYHhp$~wvE(}k51O_`J8!a`a9zIn-sW^ zZ*|IS^bUH^OgI!h@r`9NOc86?TLrDY#w;Sy;VUqjp>bDFMM!Tqi;G{ojfMD-qp_DR zkgCcPV|-(kXcek)toj{XFkhJVWU?RfVL_AU4t3GqvjoL?!1P`ZJ7Fj6D!JL!9_I0- zvLNHi*7w8A>k}|f&gqqBbZx6I-4zPweC9nN)lzBj9MP)^i*PDl5Vw;0aw4TufpjrCPY2KQI+slYgRzL%`5i; zkemQY*+ZUS%t@XmOJu~2B-Pv;-l=eIW?s>>6VBvBdffhrd>=2etI=;F&M5My#FysN zi-Q+?FJ*e)#L;MGPeHgi`nw$YWdxOWflTYugVN)hlhYAtWieuOhXw5V`Ya^=Wb8h~ zb^4dMikejB7yTC3*+jm+Rsa+njVY8m{fVK;TsHbF{Sb(^Zl}73uenRrATXZp2s6gJ z4)6VO+o_;MoGG4ID|auX5_o$bpYQa`jlBpC57vKJ95lIWE-jLIt`_uc<}4 z2{MY1CSkW;2VItQM~BDz4<{=`55HXdT@uesE%dstDfej{h6{=q4h+?~k_9)#bjkFU z?ZI*ftjLgu7 zaYn{IJvKy_K5gBn1I)p_eZ-u`yXMPl44jVcvd*53HXZfJ5RfPb7FfRoUfI@rt47To z42sx{E$T5F=F26fpm1n%Ce$DCjW{Gt3G%8J_PslTc!Zxi9g?P+N;|bl>Nb@&4i1Cx z;UnZVXo~*I6}y}$4(9=J-Rk_#_&BvwqAw;#$?>WM9&~~}QXO+)fqe*mKRp7UVeAlK zIV448JTxJD#P9!=<=#qEzsEE%_8gvu6H=41bA)Ka0+leeJJOyYILCJP?e9&uCoMqSEgtb%OcAF&=|wEJj~W=h z`zBh1FZ+8Q2X>V+WOt8Ko1I`ddX#|3(*oLz>h2AnyU`C)Lbu7>T8RV#s)2oRj&{<) z2mujL#=sV_bg*ko!G*b&kN!7X7 zpPa+)?J;#~(msAIyNQD;#YTM=eFy0z4DD=##55I7+V1qWo}ll6~}0C_?X^gE842g{IUa`6&1Ihb( zw$>wFdUHBUfFm30!N_OPngU14l~;h|ai{Q!7UX*X_?V?UWD z#ARk_%e;WyvwBN^NSOvp_Nh#~TED%`8*TFAo55m7#uQh*P*SX|laal0SCXYd=`2F2 zYQ24q{gT;R@wDzzahkTYDmOVz7T1pZVC|A10Aw@K#7WO=gv{~dyca6t>9KpclRuE# zeyZyxsO9ppa8mEONk^})1XgNXW;>(u)4Rz#hblQV&he__U1p)X`q4VqK$P~Wg&Uv- zCfc^H4rf0u9jzq71kDp}p_^>* zHNze2aN9+D;_eM)z&G-8l-|YO{zA z`JPlH9o~~FGAZ6TK*0XMhQll4JE-D^nP`$HCbt~Pv1S03h-bKUx`ij<=cD>M(6EP} z059%j$u`;yng;abM!*9a1_w7WVsOx^-jLmsP78N#w)4ruLsDn_uDu#d>NjYban75% z!cr%~o)`MBW;gAR%TE_wMoI#{6w}dZ-d`W#_QE}(O-P+{3f>U7>b;?aX(#MYdR=Pv z2|UAz%?#KFlJ061iByQz0tPCDRWGoQSdu!nKA6Rw74!X8Qt(ayt_Q%GI&v; z_h?rx%SeyQt{1ZLHoE)Wn|i|It8LDCN%As3HkdW+={RnjJX}Y-FC)B8&D?}0cNJDe zrz65M8Wbg|+n`MLY4{?WL+tPH&o@6Bu-UY&$SXF|cFVIE)-PT8xmpvBpY~x!)(or$ zPfoZ%(`XB7l?}F|aAIclwvL~;>b&UgxKT=G2wo(m*@{fG0dzC_eg*6B1KpKO&Zza7 zc&W*&jeMJmKERA%gyM;?Z{|S)9q2OtF9^2LuL#J9tbpLRtszbL25^6i6|>~_$(>`f zhtVA-IhiF67aC-2Gd}0TT@JcI;s@U9 zNKJQ#b%DeSmC{%NFqLCtr*UPMzI2PTiK!qyhn2X+WcZ!Nt97zLl8Y97xVwiOF1Pv2 z_S8%};w-1u=5TNIHk}ya*1QJOQ;ca1R`kVsdK9>Nn5Cmgqq`#bwo}>~083=5daRMO zH`)urnAqPD=u*`w<2js%rKS@1%9TCNFVUSG+HfsYf@Iup9iC5NQ9^a`k`!HFehB*t z1pSD5dh?DhQK=KqWCwbUZvSOS+@^b7C&anTTL_>O&KVUW|M-d#0{K4fq*9M zQWUw#4jyt&f8IyOz%vhsTOHH5z@(a2B=nP0x%ozae)~<0%`=WzBV!0HH#Q5-BYo+M zAQ|~9O{GkhkPITPxdv`m1IvV7wU2%uE1lU46j@~QRnK`VeBHjmLhwaSUw)gxDY7yd zpHQmo`WuNh+v8^v)U|-oS<>0VzOcZFeliPBOgIom+mqraO$FGApHNG(FH9{|v&&I< zgzE=FSf{2Rq>iNYPmhNGHy3yiEBU0XO!OeZhUmsz=oMLaa(U z6|<=a1>mzU26n?THm>?KfE{+_Ro=K1SrSt$IERJ8FP$Yn4wvR_KZ&v7HAZ#BKRJB< zsLxu!`8rzty%6*Ms#7SlqfMz*1k#lH62s2sY_5|a;e>WnZcOcD>H?_j{G)T8^?-1} z&xmHij#41`w;2IumzyrUE#}Cs6k(O?H#$tr^PH&ze*Sx$CWjuyC1`>=8?VF#?yiR6 zqAgJ5{dd}T$}`HP>JzBq`Y}PX1*PPa%u!Tov6}o7->{gqvD?1T7^u6d{?wMi={-1u z^JJY|qLNSDpX{;bc|*_c;PRFigUUoSa~{SG>w4E40Y{Ju=-!+>Y8-OU^}gr5BPcR; z`e*8X=3#!eYp;C$JGio;fPj9xbD_{kX!sK^Z6OJF=~DG!Jh9ID8B+gPf2nELBVE7e zMkYsB@3k(yQ8>_*pQsmWBr~XuvwA@}D(ZH657v;|!34pIC}DDk>;-I@T5Ez{b#tR* zr3T_$ZJaW7)Tdg_jCTcv5eDmlU}sulbchNiB8lNPmeWbVQ)Y7cyjIi8fHYfs@L9O| zYL@Zfve44uiq=0Xi&K&%`E$yUO?d9K88+QBpqTEXG%h!IgA)tGnD1^K=k`6bf%TgO zUBMb3+&4hCYNDK}*dRqWU~EqIasVE0_8%*F{m)*3ds8n0Xs+QPVkVCRNAVt**-~T| zB?9~h^U1N^%-2H#0kGtGO>K9ardJKw={@ox#NYPkX$kk(@Q72AK3e=iA@AP$3ydJb zxYU+9Mt?vxi8#xCMox$kfJ9T$(Ho%lTAhNg+S7UWd6b)%=Bw6#ixq+Q)*=_B-$K#R zSQFgXhUc3iOP$Nb-l**{gcOY{`!i`^4r21h?o+aDy`!`=Dve8NSVjx-Ym^GBi?Z`5Z{gC9olTAzac#hQeuXHUXd4*Xoo{$ zGQkfB!Zpqgh&$Q3v@RF)HZDPyxHiNr8&uk1UYVmmM$rP&Y<^}BIK$4`&BuN3tfVV- z=C&qAGJS`|580bSg1R0ePomafYZWhx0E;J0I9=M~691|23pf_+Yl@FN2zrbg!a(yJ zl^nFVMzE_i(xPkPIlB>qKRF~vO~Lusz+%T-pA(02LZFmL!;LglH^PFc8~>Xuco^4N zEQ~fVg9mePqr0d)!su`1b5QgVyDATk{ySQL0kwA#5>r#{{_?9R$Rl$jQ^{m2eN*`Y zW5cb%Pb#m20=HCvKiqBlb>V>GL)&4FhWh?k)jtbZc{)9ds<_M)(yw(i*5Z{lT zy5;TbB^?^ScXb%2pF?)(8S??`@gOmwbpW*;y!JuE5!`GZ{@k~g^8hiQH>;9ur$d~;$8He8PS*`SOw9y;3p2#)3oGWACdfBHZ=LO zz!bmU-7-Gb#yh1a7C@#~802KCg_u_+aNvgNu>MIdENz#Uhr9)ES!<;bc?!ea!ATng z8NARqfu-Iygn+yWA?<6TdqzwkBL?GKx|=WgbgxEyS$zH4Iy^3Z@nl0%#Pa7)Rg zXpM=hfk$FA=@rirMF}$C;I_hK4|0^;YD>6T72NLWbzc>H_X^d8?y-Xo@T?j1tH681 z_aCWzQyin&UP&LUNC3O8MW2n1lf3$FzzLFjW@@Yu;KrJ)6}&5DJ0S#mQDj=J zpGtHk?5an$tBvt~B|MAN^WDnu=nXsy=~!=jZ+8k&k8?UdTX3M#T#(p9DF-qLwRJgQ z*mY6&xM48mn>{L0gmE{PrI6rKWY}!jQ9Giw7_Qs><)WVUYL9=y@C3$?V+t6zMEHTe z8)<$lm@uH5X|b)7D~0SNQCW;ng{@MSAT+D|Fnz?@dVm)cGHLQ+cL`!1tcHD#O%9{I+DWp>qD-;$>8+$O~gh`>hu-QR8 z?LdzG*6+vU{L|qfj#7KwnYc5)*Xs0)YE%*C#EID7ad#+RUcsi$mVI~{VhxP-SG-uC zll>Kmv&O|o{DYpjI9_$~i-3E}mf)gmC`M-WiiI#r=L-gqG>k^Nu5!wjF+WpB?=a>YnYzYd zqh9cyPs({WMP6U)V6ZHAMNaiBrHMx-9sus6Yk6tN{qBx-SQmE^1L2smH!lb z%!0JTxa;>A>?TlB@9MIF(=X;~1*4gC<`5LGn*tIi0!ltcLUv^(rI9uMS2F{f}Pt3b!E!Ko8C1SKJm`V;8GGTFc%uy@a zI6MR(`Bv~Ej@_HwjaCoo2&Bxqk((<~p1T4- zZjPHSUwAI+CgWX6$_6b2H1U`3_DOgQvq(hk&8Ez zniH!t5_cfgrp2lNrB7e6g)+sb7%@h{+iz(|=;^eBA}yrlT&-kVQ_4I{dmXQiK~|YP z&tR&_6kFjyb>c-tZQ2G^N{>%aG#yGJ7U|LD%f8RHRf;$58sST`^%1qhgOx$&*W!z3 z;>m*1Hq(yYQ`$Bs4_?G<&Io${>u^13We0g=#r0+7GRAx|;43W%OcU$TG1sTs&&-I| zE)JA)Zv~p)C+=QP8{5DbQk*6>EGTY}6j*I}H+s?HfvKzIk&(Ko=&jNArSBUIZ|;@f zvoZ62$eG}hlLMQj%n2tYHKK3bzb$$OF6b$lT!bl#TyiYEMzP`6Ox2s9XjLXouZNu* zzOIM69~+BmA42h~b;}31@^q468jeORTQ4~`2=wv{#Qk_sVqXnMc3l5%8D46!Rvx*) zun=0h+a|zDORO95F2#M}{`8UH{Cyap>-%B&Q}FrNHUFH%p>ybNsT4;wMVn|u)Mt)B zMHh#}egPQ$$;LmEY!PD&9nB>{P^;#_L>O8OG&k}(bSrmO77Cfn0WU!ZZ;0K0s3w-4 zc3tvz9qv{~-)|OP$;(%=5>KAdeJ+U&SMjxfh{T*GU3!LFNUD~Gio(-6H16vPP}^I@ z7qj%-(dg7i3V`j`T=nvPP!*m?=*B!x-A^FLv#PRpj?z5|E=>2i6B%McY-+gF2H_l; zJ~YgUD0TP2`W^0sEb)v>mVrM4PRSDb1jr7AzJK&?RYEPi!bx~0$#8)(Q}67nKbL$# zzGEHC;%p0xW$R0IKSBpv?Q>&^?hhmzE7!Z)Fua9h#x zXR=Z$j#Fz7;Q9fXTwj21%w{Ou!WiX8j5JDW$NtWxB$8psn5|?``L*j9+ai8Ap}c5t z^@`~j#9|Rvjppg!p+jaVMEf!1ge}x07AEPuM3rALq{>*=f>6C_6;L-55l~P@nLy$V zpLcFbGRYrU?qjQB)IXczctK63zcZt%cp)*@k<~cSxA?cSPlcSEy!+S+TNzZZ zp3cj&2zYJe$*IGT>rrYbj=u(ep6`ECQd|at4+ngDp zFiXZ}DmJ9Tcl0jX3?dRvus<9*&wNt8dk{d_*Zg`N_xCv{1VYmslA{31NcW#pGP(!w zJ&bYm+%l=RE=sWhJU*oj0ZRx`- zMvc>2{oyuEA+`ukxr9qWoT#3-%F^g6O=t{hBLt^r&yeX#(D>$hx{EHHkxp-zUK5&C zW$*ULvv|7VSC~xBxJJs!I(fbOg{zUUZ$4UVJ!AOX(6DN;DTYxOElZLCbq%_@YWI1( z*Luc})!*Uj%-JZ3ibJkKOQW_Fdr!jqZJ^2B5zcAI4)$m`QIyrBpMgZDF{BI}m%%FG z_mn~ak|=+qm(gvWb{%)OGgYd7JAqVY3?|*m;~dt&siKSQH7_S`Wi_a`H@P$Bn!iy< zU%2}$b3+4qxu=srL{wHla1S4x+R<3u+7 zNbbo|QEBx+eE&`|l{4kZIdYWgn0@!cHr4qFN~^xwRAJ4T)*$*+&t;XmsmueW!u+7S zz~nxC$coGD8Ei@Z-AdaY>UG-y+N}la4)cXm`%2M)6Qn={(ka2^!dHet)s$$K;|uVz zGDC*V(0&)3OlK&5ZC@Xg#L)7@?I1+q;TwcihBMrSFsDHvcHeX)UiTMUJt5`K!IB3_ zuCQ2|_g2FqK=&AX3{ zw{!GUyHPO1%M8Ru)wpC-x^?GAE%4)xfzf~Zu33m~{m5Kdtkkk2`QyhX^8=SRz!W<^ z5O6yHleXX;5UEPx%#W}y1~Sqx87;|s!d>5v^zcQ2WO6n^W(;6ljJmKtf*u;D?@V)( zq%;stww!*=$?3Vt3|H!@>3&<9zNJm~s8K&hGtdm%;W8f7JB4Php`?0*M+No{6xrly zb7%>OGb5CASR`{&WC$izcq(N{r#2TT*3_n9E>T3K9w`-26A4GoGeY62gmnSMHCgx0 zP}{B~bNf`EsX;zh3~DQX+=K;tHkvX;Cii9+pQ@Ouc!xs`n@c)9{nO$!r=>PlKO}X* zxO3R!?Vh((YsAiPy;V|9RNcn&?t=c?DFM?RPmh~-N=5ivnAsP((#grWtio1l;bBr) zv?m0E5X;_$EuQ3ClFAvZ;~%w|{Pr43GK|nn>0O8JJi!UwbR2-9)fF|F`cP*iN6LsH zaM@$E@ffm-E-RM3@hAOHw&aR3P&ISyfYd%DZB7Rg(C{Ot{OXjGYEm*Gd2MZnoF?UD zEeKZ|jW&gElrEN2;*?NZ4Io*1sjI}vS>B`zpviK@Ctz%|c`c$A;OZJj4r3IGiUV%* z?FFJr@2Cyd=s`i+T?>~qp$H@mtI`sQYzt`AeNYvp-bsPWQ#aUdf&@!A&e=nX9uOP0 zO)zlXnO=$Afvd7x;CX8dc+QHQP%ogHJ@bu7x{ZGGVP}2Yo|374Q52p z^4H{+rfXPBnobbXx1j3QW?a(bfB~@wX1|3%4{imE8|VA-x_I`<*Vv$~5S}RI!WFO2 zm--}1*NFk%5UkXNb8or&TZUnvAa%Oxxc7OP-n35j9xz~xmF^s%Ubq5s8|qXv9uKQu z@ys5;S7T`B>XoR6)cGSU6P*7J-{M619vZ3QR5Ip>{&*esG2aqvIMWLe*}|dOQlRC) zA?y+3cKkzjf(kI1!!^E_J}OsEn5cApP0!{S7aj|o^^@%xe49615(Y4&PDEap9z{ZN z7Ick5W;6yiNIt4h7lWC-<%Omu9XFa7m$Y|>f;0ojDg2@C2?2tLMOrTIua>2L*qDr} z4?_BEWzP&Gu1rU4zOcqSHg5~IZubSdUeYN2>*Nq~7$akF;yF!!<+$dRGC#Q*>uLeR zCHj#S!p#O1&>Ao^{^1$%aKtyn6Z^! zno_z@8)fWGd}MxeaNC?bNXT_oHO z_Z>!Ax`WbXTscO*fz6a!FLzWlU0*W!K_d1Xi#bzjxvo7u8f`|HawuFJK^ty=MBkVt zp27Hwnp_i$JzNRnO7io`10*C1p$WIUT?b6D zC1aran8A+~R~FF8_Tp&B+4sN{kO9fXA`eg?nueB-V^FcMG`)=~g6rvCy%J&OS?a@+ zAO>Z6VpLXYCbBHKrW*BQs{vIW@r_#gP;Qd;Fu=(>u23J#lz^h>Wz7-QEYDl&A!u%h z4MEUZz_|n3@wyTI6ErNw0aKTaPZzu>;7dI(u0DrW#vv^+s4Qwh_>P_eWAbsBk$^NS~fi;%qkFBL{`FaB+g*C?5G04mQuHh}-r7l^jJC_pZ*v{%x9C~}V~Iv}nrZ@Jq{J&m zVJ%e#!$h;e?n4x5I2L=Hu4sUNxkVVjOo}hG$S0(E+9iKM@%_8f@uStA4*cIj^0Gt~ zb-J1AbcCn_P|5#+H-ZObOzJwi3r|^vGHd?Z=OQP_?lBseUbv|`g1qnTX2bj(FF70# z9rurB=DP9_LoM{vwLq%XXo@dJVV1$e#JJ!yyX4+T~K_*im1a374x zg0}i`@}E!brSkdLh)F+mj-eB{rl2F!*b@MSXO4!&p4>>h{o{x5fXyG^5^<}hFBSj# z?|=U2f+ohNmoPpGh%^3QKvDk(1LzM!x7*BE{;ik(Gx+aF2%q&M5*mh4DN*_p3H@32 z-)*kH!6)bZij;EDq*JN?ik<%J+3#b9y}*wwRr5AQ{Xcf`pRX{+e>`Wr?Gdm22L|r% zIP4exZ4LgTr97)&F zE>ZsfF`;fLL|?A$ts`9aog@~fOylRwnJzRbLU^#xX4JVM$U1yvnIaS*rp%Z}j+kuJ znhH`yx{F16jGs{3L0RHpZ$`L_E6POV%m5@&XBC}gCTM{_RLl?tfK)26Nxek>e-|lD zB*1AgWWhJ>x_XD4qQ#&bvMF}#L0y5U=tdTS zYvD7JDL6=?zcYMD4uGkj_7aTQUYd_U87QoJR(x|ru?>do0h6w_BgVC6Wcf9NkHSdK zujTrbeEvWbD#j$;{99%E*usN93tm16px*{ePos5}4B%p4gl7}#3oU7b3#t*xq$;$}$h(X^9ur5XH%+dXTtXHjdqK7nd+_6pG8ma9`H1Sg|J5|pAt(}ZPf9Z|^ z$5`cmeQZn*aKxTRcr%5~ARL?512hPhSG#B*i0FKEu&&N5JEJuI=0Z;u}ePE{Fob$P#1Zj$aubc%n zFy{pNz!l5(Wru6+ZAyzSm6-07%^HYZ@?!%n#6C2#1-ORvU+C<=nW!?b>+)NYG7*f6 zrwpU|4XUo{g;3uS--@Bn02`1{kRc*Cm@c&Y_JY40>W{t^NF?Q|a*_R>&@z64m*2Zn zN&c}}mE>0JDgQP#O$*sW!#SVY_~Of>Zvc+aBoGYZT1mb4@Fn&C5v}f*5Ud z`;nnvbC1nM0*C{J@7YkBzo9r96>BQG9`73dwhg+Fzbrw(<^J5?GycoVVDcfWUA?`B zHF(HTKCQ$PNUQwhH{fw3F=~>?$IzmH_L>d}l5=7ulG6!ua-d$tC~ssa&~P~!N9 z%7qXg6EFPmWsLs;m;Nw)Ujev7IDs8Z-gH?tcIg^I|M8=I$UmfG7+L2N`$rA?FS7nUuqC@ z$Gzp$g4#r2uJ{Zm@Y^WwpkU*|me#{p0e-V?s*5@YnGbTM@O_Xg#U>#?;veI{1J=g! zrPgqPx`AC?8gSau9d+68!{i=tnU159G^UU&f3=g!OtEKrCs=Bg){9^aZ)H`~-w!Nk z<|&)|twUTyKlrST5claXBd^9no#Rk>YGX$6WFr@ zh5*;S1H{9m_nZ~jdR!7Z>sZMw)BIB8$qs<}Y7EC>1p@yTb{ig_kN$cq3q&weKG&_XmDG7Z1iVaLap<;PL*<=0qU<@j4s zPQ7R+{P-(TeC2RghTzjepU8<~z7R89xJ4jvR3MnWn@n@+F`{;5*Y;T5b{UlTiqrBe z)b1EZOaC5@gbyDzBCpIHKB~>$Zl0Z1l$qS>x^K$mY#E!?S4)hp+U?%<5w z=R}#-zt<>>5{ z0(33GbCRPr!D7BB(1;gAixuh3{UD1x%APkRkKVi5FXYqr8`TVzf01XCDyUB7N^x$j zfp@Dgb92;G|EtFiJ8|@v!l~(vAQk8Ify!*G$Q3(NYRRCqiDNSpnf<-|oB;7q8VPRI z2otAMzt*V;^*jLMGA;#^$$-SnkGcK2|LWLTDqr|x)|!NXBbY=9()c1_2-f*X>+id4 zjE^Lkpw4-;Ou*&@%RP#LrRkodUTiPynO_9j6|V;4&1|d>Oqju?x6RlhP{*99yJLM< zA3H#$8U3D)Pm!g@kX0R)J@<9~Q1>Iy@%5o|!ZRJ9)i&eXc=1LPt1cs)Oj27t8NNvV zPB-lmT2s{tI3L8Z<)BJel?$$Z79evt%-cBkaXnYp8WBE#_ThnJlJ-X|!v`4uWeUr@ zYhnR!%kU%9Bk56xDlSKqvL;t9lIH^nUyyevUSR^V5byQvf^{0QK&;a5j~*Jc1C)7x z6&@fD$+eho6(&jvw;0c^Drv9U@wOZpe7Vqu2#ZkWkpC?o?D!uR9ya?+!Y_(i1J)SA zS8Tkot-L_12j2Ih;RvuHd~EK50Fg?CiiHkppr4q3IbE&@p0yb+%N{8r9H} z6Pi0rUF=XX+H|COddjF#6?iN0OZC#ZL*%1}Ga-X-_qU&!*3#&In-MT2Sv0l1?`f5v zG_4pusyuR5($i7F`r(AzeH}5{k8}8CZO{FKZk4GY0hmgJBo;|zKPRj|CyH*H2rx3ctp}R5KZ)$b1T78Q zij^84=ra`&u4$8e?w7}0Yb{LCF`U`ZO?5r)px zO>YiPzyxIMDLk{^XwHEu!X?@&?@e+MiZYf=h)T(?>51crVxd>F5fC$OgReivXC6*%k!e)I~6fk!d9OR*cR=8fuu+3_Vw6 ziX;c@ye181F~Q~trz{3d73o*1=036GQz};9I)YQyn|{V4@3SCB;5%Bfc0BUIRBC7f z)+&`t6z-`Hi3fC1{kqSFs;zj2n1F5(q8OdHL=l^o)eA+`Ok3Q=wS=kIXH`Dc10z z>5TB*8kkDoylOVLM=A(GYw6yjxtSH=GnWM75-RB#T@O2=9TNXuVsOwzeDr1Dv$m5Q zS~8>dmh%2#C1viMb#htac0twES{%4`cM#=rZMK{rd%C|U-vtg3qQ)Q~u<^n3$;`kz z!*ouKZ|GpHnf$z-)r@6^jK$9MG=~`&mVH>`n*#&aQMx>g`@y;lel*!k9~l}Sc8RT} zE0$BXFM9gRT6GKAHa65ycTs!zXkeg`J@BiMfRkRT5k=cnGTleYp95La-lUo*!;6lX z=-8N%HC(DmU{`GzsXTG$;IjCZ+=1yg)lDH61Wrym7y|L{d$WeRcDVy zl^nkf+nw%~h)4deg-ZWrX>M$WzzFDg0EZpYq1fp=K8q1OeHm1ZVK9=K&QE}|jflJ= zyG_Z?a8rjscPJb)sgH^uCWhBrNGt4St*Ji-lbjy?<~Snc42sGPlze*Z0YuUs;itv= z#ZtnBR%_Si0eX)_>UWk#62&K*^&1km9@FDpwFXzi#W?!;N`&qX4-rzM;E85e6Uib=nsl8T zi1fWv&VeMSa)ky1`&)wg2SX>%{>pI8Ch2hS;sR2%e))_d9J>>IEvWo60I3%}(xGQi z1%D+=Tmeh3EgYF}?4(X4*^x!s?W`J8(?;Wfa8f8s9Vp3|ZAlhMw|#++pg$Qwd0>`= zokW69D+zX!pUeAz^0Hrm5jPA{#QnSVNB;kF6UAY7uJiaKk2u(GfvQdDx)QuYZ$RyC zDGVpUT`W#A=f_Xso8Ig6IOd6IktysV;=7 znG{&?KVshnSN{_$C*T9Q0WLwN`!48nS!VY8naI-J*D($!hZLR4%Q7N{w&K**g zMx(JEY(}PB{(S>UG9;im0ueg6-jou6&Ir(3f$|r-scHwJaHc`{KqMWJV``Y{gQ9F4 znXLtJ%d~}Jp9=hd?~WC8%27fRW4+RV1H>Ui-! ziTpPFpdV`t2Z%joaE5>uU70#qk4oJ3#E8i!o$|$B=geL9aKoV6jbWSvW)rVn2G{98 z2jhHQLpv2N`pJ|U^pNXy={ROjb-3pOq~&BfLAf6aoEqq~W%yGW)ZuP|BZOR%zjECf z^o7GaGL3>a!}hr4GyF3DpJ1;N!bg!Jf)MP;cQ-frD_IANGI2P6tSK*`)?gl)h6i+{ z9U%k7c)&sVqJP&D>2xZ2GICK4YaM~>4-;@0)o2FGz=iJYvSv%XlLhvh>G|n^^`JDe z#Pm&?r{4!+P3ph$1l07)-U~>w^x^_n{I^rS`L3p<0byszlBwuPL=(xMDFlZ1mfgd_ zsY^G+7$R+Kz9|C(nPPMJBEDGN24RvVTjqyNd|rwWuFZTC;&A!?lUTbb4yi<69j}Zk z8FtFtSm_vOXmMh)uP0>zCUM|*K=vUD^-DQ@u}RuXQ8}d=Ipd=PgrjDQt`jaNwnxvI zeEi*IHZ+WcC`Izo5(GQuoPA^Lg`aUC1qY{Q@38#c$EJ>0`3zWezDlXocZyUAPHpj7 zkkQ(wxA2&U6aVh5MTh%~WI?Iej1~~ZmMpz7uq|uYeXxa@XSa=p!ie{5SYbqsT6nJM zK|AzJ&>4D~@y0ECr#+6u7s3^XsBC1(rpK9a36^%Ni7E1}BW!zNj(MZrhydzu;dJTb zXLuHzyLHBxkmZsdRU^eT+!3sp1i$pOD-dP1Q7(&YjJ9JWU{3zX%B zocTnXYl`z-U^rgBX>547heZc2>4BLj@Gkh|I9IVf9HwLJJ+6-3$eu8}iceG!401F~ zmx;X5`1hfTPZ=qG3}97e3O0Qh#BES&b^VpjRW0GqpamQg^eF!YB852}#|^S|hsXz< zZiS+b(4+|ujP6HxEvHJQ;5YIgk4l-!5Sp~C9w6M^3u-83d-CY|$dZ{AKRE(&@{*p_ z8~*A7!b}qV0S>{r?zQXHnsTr70U;AT?_SK}?_a4PQ^U*BULZ=+tqSLWR6dEh*a(~} z5e0CA+OLz%o>n~rKRSKfNa_INon`-nVGRG(GkKSoba0#ku*3n|ofCJ!TKb)tG3qo~ zIT33lm-x%{0kFc*yY5d>o6-v-^;Q=Xl%F9EBF$3uuz31i>qA1NDF}lU_WCHh188UZ z-?p~GO>3Ec=NjnJApCvh(o3v^8mhx-NF?LZMq?#EGc!TUOvlk-cx3DChm)DLkh72I zlNB!qZI!L29Iy>eS{MU;Ifgkpx+925Cx|xgONbYN^lAQORGXd03kLJR$Iu};1~~tfnH63DkE3Ej(AH}XLz+FJ3Mh-s^56;m`*BOif|USX(_CKb72_!RvBTq z8}Pj)8H%`@-=yd#o55;&Ce(VupFqEm*+)-3q3v=Hmd8)=$J!cfnZi4dzqUJiCWsVW zYo$-;q+yJSf|NAO={e2O3ogJ;Z(Z=P-b?ckvWx}&Q90iiQW~~6M~nho0y;E^z5A+X zO(F`pnD25E5?o?(ZxZI%?OiwD|q zP9=P8L9JQ&`%+YKa!0A@4xuu+yZF^!x?nADgN04Rc5c6YqcxK3^0%HEV5d_aKhAE zaiG#L6RAOI)vdcp4&$!$yOBB1jA#=0JbaXCNv1dsB?N<~M7gh>oNw)t%X2^C|f7cR3>`u)^_GA&%@_YBu*&HJZs*fA*P6DT=;+ z*!#hh;x=1HCXPBTs$oIv>oc`9k?vt?c2L<`zxL*lG8>3&U zI3?zk9twge7J&)&ylb|oGtstHd;)oJQ*JT0e|11NOJ}$5iOkcE^c@~g=`Q?W2FqcD-CIBz)b-D4!ftKA5%6XWD5Q^PVw`x}ao_BF@VaEgKEC8ngWPJy z^Tg13Ij6mR?nYhcDj)~lkeQJu#*MN+?MG*Dh!}5jU~JIzUEqbVQu(~nuPy}H%T2v> zzZZ3R%=;5ElBs@I{+`0eM+BS44ZbzXxqV&V2qR9>@g|`SA2jS)`m4&B+}Vzs`amp6 z_r2k2@_OOQ#_F^`Yt|Dp$7i!X8mq0_rCCa9JAgmR0M0gIG1{y?RU2=|Mp!z6WzY5;2qfMVrBFqR@J%pOjS)I zP*(;C_IxucE`vvrX7!uK0&T#c*}iJv-H+QO_M4&QJ*^Mtar(nM$B+{A%0vSG0jAyC zeZDyrk>frv*evU#zlj;#F#qw2Vk%G!V5FVLvF2cPtX*{1FFaj)q;hyy5#xB)ar$Vqqi4aySjxjvG#{c z2cikPM~=3?evHI3WmExfy$l^oaJLPm=0Ru;?&p`k3>Fch>^Y7nkoFO_u-M^DSKJkK zc_uFMS7VP#B5H{NRS{aE^fWgekIVevM>G}pVd^hH)d}V?E>E9guawx4BpAxD=a61Y zYFg8=SD#46CL)SUH9&%TyYGwim}&SU$is&&;qMtw8pY=ITY zdfy#u(uW1-4T1xd)sxX!$=k_)E&f3kdW5Yk1abjgEBNdj!-22csu%XAxEy1*tx4CY z8Lm`w_=mS$1nD{8OvqL#t~lr>VF{{Jc&VyuutDT-Wux9;H!0_~Yz~-b9lb{o4TO>e zLX#BHGF>zOztrlv8%% z1uVQuW~7Y&D6@^<7GrgLB^|KM$NsCdKaL-N3ofTIEk(;t6VbC`s(-Spri-n?p&R)i z0+h0JJ*=irA?PVmU=KrzjxJKP#)2T-jT;)7+CdY4h>=}Z&v~l$Fk>&?`Fv~W<|5;P z9)QP;1ehSvnayDb*UOJhYg^fGFL?h29au*m*N{Gq9@fZWT zdv(>vzXCgfIjlN=48q%+v;o)j|D)*|7$aSq<;J#c+cr10JsaD$Z9Cc6&c?|E8+((D zZQHpy=Y01kOiw@cc2`$d1JAkE1F|^{!Y$~-YV$s#y#Ra8yW$B77c|k$RFIy%A z={os+b&EX}FxjPo=w;T+7dQ4}FV-#om9>;7z)2g+*!CE+w$BGdDm-fzD^}%P+8Mb5 z{s)3ye>Ag2eq68unoTPNK0S*PK3E?GcUS}7xr45(vH75{=?ZQ{Gk|)h%(NP$#1jrX zPzbvF4>&XjSLxDoLR0P{28t4P)3SsMG-WO(n4Nmc*4UxQ(p{ZP+oRa<`L2(22*ejTZ!Xu zxW=aAop_NJ|7G%#^$TBfXmW(rWIeWQ{cp>?+YmbzZPQPgNuEpZ;tlZV3gk3#q_7I;=dCD$@CxNXBi4g)xD57H$jS;v=N#{+4m@P^Mim-1L0mL6ntg6NN}oC&XvD z#PO*p^Jh)`Az;%q)|VV-vN;8&b;E~ba({s5_+>PUhx&BZ))QCzLLKDtN<(89lf6{u z)%hBEh0Ob_9Kd{%SZeL|U4ljd5)Aw7914gGEKqBV&VGEjzWIk2KScX-SMnjeu}ni% z>Tgr?3IB&e73>g>F&Adeoh>)7A4^cR@P>`qf9>4d`Bw7nalsddLGIFe&U=e>=y>>+^}+43KPbuD_>X7(&m+I1T_E>HORDJD z6Maq*K78nIa=wm(3S*qwzmGKo418dl+9#McLEMfn8}~$<_V*c!RnI%3gg^s+DJwm7 z7h0S8S|sp1zHej*oorVP``#@B-b`(8Ggy2zeWn;e1mMsIU^rw!iTe0Ew%7yNlhTz? zpoFaa_n_UvXzP)dHahMP4enHHar2ZqfF|5j5Hsx^MJCvAsHc#`<;&Ft9_M7DmV2O< z8Z5R_!>|yr2G9#tr#cda(^-ruq1WnyhFbACva6M{seyuIV54HCwzggl^3)-qUBk^e z*ohcA_&xYhkPkPa@0D`o&-$HJm`>9MTUaC8 zGCU4626w!a)rRJHCRI}wjsyYAMluRj2T})dYY5A*ziI^dw3F|TDiCMjlK0aUVRysA zMW$4_-%>lC$DPGZa)s@rNK?u6RTp2SIbcD^MfH<{gUuwt9Dq8PWZt zQ`vM}>c^4L^?ICYgvG?uy1Jo6s?>-U_hhEGjUgEX8X_*&pAVF%>ZSe^9|CU$e*!La zromGL!-0l8fL<)_Co;>hhz&aqH@Rnv5V@XC^*mP-Eg zaxYw;mgCZ-hQwRNKq8T6q0-C@QJY4?jG{p29ahm;dl&IJgxlO-2F3Qdyr*tBs^8Uy z^fi6R=qSQnP{QVs5fP2V;Vq%Gq}OWkq7b|ZJiR_r?2VO(PTMXf`qZ!1Q}O&eZ%OTC z!HzCS-Jv(OA)y$ZFjJrYhnW`EhESuHda!nWU8{aM`iCX50K)4QO`VA2A|yP~8jSx; z0*)*-5A_*B!Ra6&<6%a_wE&U{aE$kiSJaxEaSWRpd-e}_q%<;^LEfee?+bpUTKajn z4+*##;TN4}w!x8%86Vt-tWVzB_KqCMQtcK~{9@@WjTHQc@Wc~VHhN>SuY@r!a!-(&mR#b=q;q`ids9X!%3cMxKHfAmgHjO~SpLYLNxJ`u4?_CXkfFf`j?VFLb@3Cg zITI?Z1lq_xgYHe=Gkk#ch`1TSI` zNzhO&j(SjGp;T+BzQ#MWeW2CQoMH?6aahs&ot>`3wVevu)H46rDe+8>*+q%(L$?(6 zuTRB{2SmG6wOwf+-IDI(nI&irLudBgUfuZqXc@zZto;t4sg1gS3Wn0XdXu%^N=E7l z50b?7iiUdhKXSjSU9}VL`0Rt2lq)E%!C?}*rN#AaX128z*EQ$5@SPU$xXjIVoI2Qj zYwE2r%_{T%d)F+!UXb&8rk>@96-Y#ADodFRLi`8md&#IuqFrlxjnG1 zR#9v6zXaJ@VEdrChPqFms14v|L7Z|k%g5d{+e{mkgGt1NX3AK!=lCA>WV9d|LKWI=dv4z(wI-BE2BmkdJGe%UZl9bsBkwd^xd{2~1~B(W$ak zOd5qwF_<;iCSrIQ{Hx6sN|*UOJhadk?Knc!6QCBGn0bV*%K$r$wOtD( z6vhWjSGc?LyVX2j^gZ$2qU*zpzQM3B|4$|2w9nhR<_Bh#)xrG7?v9C@y3shnrO5M+ z;GQOr$42Z^&13d#e+Jns`g+CDOVdk-Oa~}lLs~^p?vT303E`GUz=cTYV!6In)Xt7m z%Ax^O##ud!?@gL+aI;s1gz zOj_WtL=pp3a$HAqTfo&mMd9ha>R*@2uWbS;$SC!$>hmbNHTzX#c~9HDljWG(X`$S6 z8#V_{lJI8s>_rk1brJCOvgQQw3Gsj0*N5VOM{SuIadC)GE{7mHG3nc84926J%i~xl zkuRA|93vO8(E7@3w3K0%naRbt@kGbqvxJTCgd6fR+ zg()S8C93+xgJ@s13w=#m^uK&Z6)iF{JoU}u+qme)M^d~tuCUn*X;a?$M(JpgJ&6go zE@%@xac*dgJb>>0a6Az$WpZ+nmfW7gvPD%Tr0aNQI-ZtOG z;cN%Skkeo17mZfcnsv_EtU{@2Q@|pOQ^w`2cdZr^v`P)V8@j*$C>SWdguYHN)Qy&I zC`WJ$yAxZrw}*92Rndp{l!FD<=8#CNyNX0Z;N#VkF@U{*0XuwuSWt}UK_bh+k38FD zH3uxPbpi?M!ccidp`9l`e4H~8_kw)NYCBjwI~NDyz4%sh&=pst9*FD<%xZ_tKnfVR z_t4y#5O>E}rm4FHls~KYZpho%5}C{+K`b5b<$YE)J#NeL>g8?^$}W~TZCWO!N&vQ) z-p|8z_M87F@v{PE3&MwFUcYf%PZt^`!Q&;U5prkZJniqtvr9x9$ARdTg3?bpZ(%nT z3{oFuP-FjyS1A&pdTN%N7=t?5L?IEGh6uuj3@V#pZ|5U>JH_te$0Q2s*8q)gO7O1y zR8!6+unceP`Pm7JW!{{w2F(hkcc(Z^w_;?RFn7)5rKffrinmON;F)868p-_urAE5@tKhm3|o}AY#Waz<{%p%u|z4Ym7 zdPkEDB7QKwNh^l1anDHuv^O5U$WYP1RTaU)7cgZeMD|a-j&3@ZP37^_c4}NG#Uj7@ zz$y>iuC*ru`rmY02}qTHMTV!83fz+UiZ{b-}@C|$JqZ%C~7^%C=; z#RBnc!2vqkfCTPOl0l%^Q~MhFp{wW1o=`EPKaO4pKO$q@mcL)-Mg>V_t_B66?7rzk z!sI`5E)bFgYf#E)5YMmekLRiNOf}jsFerkMh@-<`$Y+V|VQj}%drJ%L4L%^-+`Xj> zMLi_d;UC0lXBQ_Ss?Vyx`pzYO+#`BUAxoCzbori!bluhYz1`NN~5Vlm=_Z==+ zuetsX{3ovFUnHO0VHKHeHgjO11D!nCDo(s;&B=6b5x+>sJC)K8L%D`Q4mv)&GA$Jo zUH-zJ*flh;9<(cnQ*{dsNI*$G*K@_CNdsXNm9HL0@k~F+_HiB-cfrq0hF&Ss7{5*9 zC(w~+5eQw=GcOEgCe|3V?z;IlEeTp>lkaFC4T;p2|~#gAD8)T{}HBF1!9)Hl#e%r45yZ!i{pU7nqOR8W)Aoz!%BR;UX@Y7VSk z{f$tt=UCH+Uzr@{vcG4_+>w7dw7X_=L_pm?y8lV2kY@0W+NQmc{kxOM*7Jd(iTdoi zhsC*A#5^r4icqj&{u}2$Qfc1)txVlG>|0h05<=6m1-u^rk%;Vce1qkz&=znAYfx~G%a+{(CYC}*watJ3v2{0V}6>q$9SIUWs!b<3nK%I zU{=tOnpV8B=?m@`h7v{h&L0R<9O>jI;Ph2r=Jp30IzADBJS0@P^=Z^n(@sxlvo1=7+ zK^#>h!Nl1}^Zn$;McZk_;5+xaKY0`Iw`Zfb;m4*@erUfD!3>6>U;gNmBv1lzy<8%G zwA|T+z*6TzoXpteUW%oTJwMRN^@!W^o4mO~U&}sFYcPg;*b%XC&c^*T@X(Q8DX8)U zqC8u%|BN=OG3x%&m2{|}5wi)0vXutWV#A&=yvueRxXLlhadHW0IV8~CxBFbe*mMo(Kspp?HePS?!kvD_>T(w! z&L${V3052gJtfnziQynLX{^f|SwTL0LBtdLd|YL z$&B(8u`QnDK6&9V7a)#nEfq3@aIvgZ}I z=16nR-U?8nzvgO0i>`FCqCs%Eoz*lUZU69PQ& zG44D^jbF?$$XB7t3T^{`aWYzVKm0^E4=61!(@JVwBIXnyGKo3dVJ0ODpmr4NmL%eQ zX=PrQatVpKmaX>ADP9mbiL zTgbXqam`=HghME9dS=e^IR}61uU5A_jTG>>*AyBiG0eKw+t}Ws^Br@HcM#KN}>s-@(@klh>IF{+}@~M zb?9)X1M@_jTULV#@6Y*CfBdowLo$GWohDA=9I(~>CS{etNcxwpYP9PHMnm-lod}k; zH5Ava{CrHpf}FMcML|0h+k&B?^@NF;`-*ub9H~eMb(=+#r)aAJF#7E@x}JdDwOiDZ z=LXX6p*w#|)1K30sH4S!`Oo;S&?ki3<}J$GcD^5C8xwE^St4I9AS`z=Jw4^mircQU`X7N(u_PSjvf3Go zY(qV=5CDU|Zc(5+p&kcS`x3*$A0Qu(Se8KFPPo#AFErx8h=yf3Y^9yFPClY>a#M*?JSxg! zx9IIa6nwZM?*;BFw~248$1%LE3K|?2=#@GYk=gW%q>f3IXdaFwwE@SCZg&(M>T22l z9V+eUpkMeD)jBV(g|gx1Ln!#m=2Rg&({X_mIyB>kr&dL<%vi})2b(AylMSRUf0y6P zWT##2e%*q#-?%N0t5l;Rzc>-OE07!BONWXAHM5~`(yT0%gN>ddgJg!t1Rj6bwivaH zYM$TBO2t=mCkvOdi3-{}_i0z?h5A4}g$2Sn>B5KwoaaC-^A`p}s;f+_0ATN6bXsR| z7zi>^s& z_gwnpnNtL;d)lOTQJx)UN9crDi*|G%iO^>R8#dm$M0K;D*4f{0Pz;K^;jP8Nvwu~2 z@%ZCRp~G>NQhPxt#~1{9k}Y5m`)%|iL#HTw`ZmHzn;<5|!X0heKP&raGbQi+UEX5G zH4}!58Rkvp?}$r4kV6fsH1Ky!Phae1cv}2v?=@M{!Fm zs}s*AWBaRa&-VDkCN}h+)QB!DS0~_gxBJtq-95@_a?x;Y1#7>|yg20kQ-Egxz**BM z6!3N!fDX`QG zTIh*f@Hx@D@bPgs(f?VNzqJ!(9ZZm3-<@sau|aXSe{%6@rA#P>u?Y-B%Xmx6^7fUm zukG`tsl5G=$H;V*4*#@V_JIW`KQ^Y;3yb&J zL3^6(MDy)fcGt~xzz z{PCKej~!3N{A0p5+~MGTsjeUW-#iy;b)(WQ{O(Gl98NnoqM3XSfQOM3!RO)EJ8bbg z(>*;1r&ylIcizfP7YbdUh4EV(2)8WD&0vOao%UNZqm)OtRT%o9mZE6mLG@Vo`%zV!&HNn2RRturbdLo8AcXXTM37fdp|VH z!2QljE_WB_oAGr#zUZBg62Py)#(3m*D^S4espI0}7>KBm7qavmgoL)WT)EN$Gj0_& zbq&;Hk3qig*Qu@08IYe!$mWl@%X(0gms=vE&2SAPQ z1-5R?GzPaBY-I};hmadG)B_Sdk;?oi7+vZiB+r$6CDn=JT!QEKLKI&{{tGv0=TwG* zKp?88htXpVqup6vUXogQWX*9G_KbHf=Aks$;{NdVey8*!}v^o}R!qanlVe!#DYBKVazAiDEtPg9&S@;J9C&YSUvRJm!E zc=AIonqyM@fBC4u(LxzE^%9RCJu*gF{#Uy4fWuRQ?F#?g@;!Ck+w{R=>(rtw+kvy* zhV2?whm*f2&ojK( ze4+A>d==z}_t!+rd;8OCv|15wQp0CGSy)ZR8j7?-%|NuHcc9a5gCcn2eL2)?&oqc7 z^lE2g&yJLEdME4NXj*lkk9Q5 zSl4rF@9}xyZ<=fHQ>895Q zsp_%^=W)}UZmj0}+q}OZd>an;-2mCqMfJ$T%c;X<6kkKbiICEBp%Cx@&t6JD5aK(b z_vV0qcyP4WI)e9%!x48@EZy}j(Wk&$4B5?YzWvaJs6d(~FET<%{agR^R=)|9o6t4d zoh#9huCJvHy;9mN8FdCl-?Z92s}xqrA`V^?ds}&J?A=Rz|6Z0fpep-_OXAkEp-d*ji7^4_NiStB7hFpIA?8 zrLefO7D_tGQNv#|M1ketk+>lTO;>R52M#i;f{3PC+EwglP3XOVzQJ@i=Nak>6=*q3 zkd~mtjIEz~#m+Mf!?1u3BEKvw1L_oN8p%3kzY3Q!#^D6p2kwu|PF7lxAyBh;GU$*Lp2`VA}t35FC(;eTdFGhs{VI>W(YG4{VOxNo)M z{TWEQ+0HyP91h~hb~qJyEG(+bI(C7w^emRs!gzNcGIQSQdG&{DDN#V@J(qSWaQq-V zd?0vL#5KT!OT*ZJP0w62^PE+U&`l7^chsrGuG?F4&Dvj2yZBcsP)Y&PZ6IZ>67^}0 zD3%O3m8@yPJ`R#UTB)q&rfP>~mta?A8K%XNCb8}n47XCYa@2T8}xa*p)eKDVyNWG3fdxuHIjrh-;G zkh45kdL6BC7QzwN2JjpODy!PnfK=;0yB$L%4hJ|5-k-*I`5REOla%z@zaUS!Y{k_J zp+L9TMgGt@y68X$6Dl;;xZs5(;cdl2l_@3&ulp5?5S=qW58ZjzD=X zV-Qu%aGtyq{zkah$BU7M`TL_|JYj)VTW55qE+YwBd4x(UT4e(b_^RS>`)cYoF%K(V zZ^Wbx*k^E@#)~%?%Pzos>OWFj=T^dKyEWLBvufIH8MgXEw|gx8B0(C1&C56(9s3&vg171U~jZrs#RHw*806GH$~9v^Q+Ni^2>@F|zceI+k_O?G^G+eMK53|urY z&Vw41Ok&uH(0Zqnk~4-Z{Pb4<){yPvdZ4TIk};6?k2WU~2mD)y*{;*uO~c`=?+bEP zu}h*!TKUkBOKcJ;xRdx7F^eCVYE=dm7~?%rE_AYMnJTGmHsjA)!lL?JQ)G_Ouf0n3 zN8WQY_jguF=>UX zuoD)i!c~)IkCXY!V3qKUDtilV6bYohH^j{%wa9Are=y(1Hbz7`9WMVKgK>X&0YXdS zP~=;Jr!rNFHXNsAw~IQW(T-PbH{!Adh2O-ttYDW7+LV0z5fEBsi-j0;hp#q4=XA|S zSd5zr;&zOwKdC_gMNc;_DBSRqI$83`DlXUZwQ`yBbeyn2SIhLkYqI%4*85+rQB!0< zT5XHf+^_QAgXV^I-lZ+93Ds4I`sTG#{9lvzF)C+D3{I{CsE)^ZouU^73!cPjQxXzv zZyjnCEhD3~*oKthcP7AV9D&6xrP0sdMlB9{gHIHhKX_eEdF-D?Bv>i5E6#+hOHEP--zL7P4q}tWtb+_Ev$5qx#v-x029y7|bBs{itv@pcL6b<$} zg!mFHa=Rj`XP%US7O-U*Z^uK%*@tt7;mc`l?TG3T#zwFJ8$lodYJ0} zwOsnE`{3a||GxWhH_E@S390egjWcx%$RHS^)B!)FK}9N(C0zMU!v{O-32JQ|-Rnf; z$8Y|?1?>eeb%>fd5wUA=SuuJ0E9&`^ZplFMA((E#v8zu=DSZ5DH>$XveG4>pD8q z=&NbWcqo7h@KqM7dRvH7H2x5W3|bN$e5yqo^hK z8ZB_D7nhen5!M}rc}(c{x1tq^w|^m2arVGfP3C%BFBcz~6=;A3|1HZLGT@zL!Cb8|0cuz1!6SIiuChfW?R-vexPSYtoTJ@4$}?>< z^_}kADwQlrm^kQLrcDeFUXF9u)hZVLG?tIx=5x*!Pp&*Or4BYTXh=dr2&gDewZ=-$ z?b+GhU2oQ65HhN?%|=bo?9`o$re^oW@yp5LW49uG48q@B$Bn9~7aTK+ zooFFT)YOInyW4|NK@C_9!X!1VzARF@VAyjr@ei`RLTFoy4>t=ox^|EB1J0t_5;!SD zu7O0;AEi0SE|`q1nQQf(6>vvF0X2ND+XmOlDH@YRpt2uyDA;7+j3$^IlICfPGT_5t zAgH)|!=tKjD_a6-KSBrzU60@^9Zf%8>#y$sSFGc4687f5WAMCn73J4(YD*fQ=n*Lum6qA3GF0@V*k_eQ^r{6NT(GTji8WFt+?m8jweo-a0rm_J1A)?j~4Trv$LW*L%ihbd4SFtvx*}6z< zy24$v9pH6}a7^l!9!)bnF*6<0%&tJ=J0wEI?Jl2VO|p3!v@|$5C>t6`^4|am*|Dp; z!f#&=7n&Bs7thtq83l$8I46EAcqOOqiRB~*WX$%%r%^DfRBPEroasJVcCXe+g2j9v zy){H8#!;MUExkBnDZ0N`AGj|etJZU1fsq%UnQ+FgPm8UPVSk#1dmS*<;8X2*J@IuP zFT{4IM(XpEKPt77Hc&OZ!ZRGK4uQ)LsA48hJ>!aXu}9fnjxvmbk=22%6a45?iemR% zy%AV!KHNXg`agCjq0wtZNG34}YScv@%)(uzaPC4o)6BQQ2wSZoc4S+mnBO4~%|U9EtTPFTH*PtU?tWQ7;9a zp+`N2f7?cg#J*UjP!Bx#!yr1tJsbdX z5{@4}?#6LowidF_!&S7VJ*6II#_sfW(HOjS&=o?@#rO<{z0c+se(fL$J4>pA=8tb) zVi+0+-9*u>bz&9kkq$qD=}>upYGaA)`ePu-`9s_Kyab1s8I-$K>Z`ZFI6BK>9zWT^+aYiGu_RwF9?u9|~T&jq&ZD=Wn<>UKT zsK1Y1T#S76?l}J}Qe2pn7$u_-+MybQa#%IqUSja9sC8)Q7!dQb7gm>$*&!!Hn6DZB zKI4o6N2Z{P6E2s*U6@bS12l(imvA4Eydv8y4#5OyLtw^~BQF{Zr;Me{8eMh7BVrQt zGk~KT+VE-4yr6{2ale{WEp=Zx8W@t*!D*FPEoo^+dC!hnRR0qkQ3~>$gE@s4rilv6 z5)o}~-R*}aqePlP2s2a$0}ULHXGwJ#bk+CTp$d$h_-tnXA&mCJ+S5z|<@mn7Z#M^w zq6%h^F%{!k;`C?XjLwK_I$nk$-i57Yz#?@L{3}&i#+b7=6?(%4NJxJI(l56WgBC(r zOf};93NZ;!9H;RNS880D(C%dd!X%;R2=JFgWltX1%+j_l>TugJN!v-9qj~e)I6iw| zR*AEb(NR)TUf->z;S@NOoF)N`u>G_!r$DUp(JZ^o2E>c5@}>i9=V_!Xq(I_)RQ<)* zP<#A^gPfC|x>^T>Gt_`wkXw2{&;KyIp^`s%TQV<&P*%YW^X?Bjy6N9pEREg9lG{X8 zt*EX6)|4{q*_BxY0hU}<<-i>qB%pVYk}8wEzddHHb~nB{1Rz8CnDheY*VmZ(CTec3mgYwnwE*iqv7(_CF$W&@ZLm_qURQ-6J-YG zRE7N+(@)Zj7T^io@-)9lfHL5%96w<0Bm82VZB-%{2%ry>(+Vl|pr-%V*?M zI*1Wt17UXG%FU;|35L2F4IGs_3b?GD0 zhF{QMH^;eE3js-zp*K54pjNTm$oTkuX@_~D*GY6LV867hhJ`ih+yp;*m)Gq>GaYLX z!XI~9fCw3`kM38u)B1?r2YO_Tkv%Kj+-umO8=0XL>Y-#^jP^stzE|J|_WLIaK!98( z{hL&oA4)p^bXG7Ote`~E#etf~(!yoxS>S(3P6!RX9%{rKr0D-(ex&U~mckdmL*z_mb*Bi?+Ifr0Bi+GF;^~YgS?!Dt`4lDg`7H(1sVsgtT!XqzlYJC1>%V zz*Z`^K*Z$kP!8~(LGo+%*JOv$A_+Ku`>r^T$DLGE?j;o{(r0&_uj2c?1s zKfHcv=<;7Rq}WM_;=g0`vNkMb7J(ZYGwGR|QZ#3)@r+D$0s_q7x`oDgx%|E3X5!w? zWTJW@&K>yh>Bfy9UhzN7l+d{`C9SRL#Pm@Y6dHiL%)r$R;rDDkEoue2W{I~Rzh-8E z`Y6k20ZT%y3KmooEmwD4EPjbl^u`j6$hK(F#=A6@GUo=lCmW>H+7|&2&vDAPEeJBd ztG|m5XlUW%5b@)J=nCTUDHm~^cdu_s

V#^BK|sj_YUkeXC%G39hK=E}*U*6>!Iv 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
os=B(B*S^t@OU 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 JDundD{vW75DOmsj literal 0 HcmV?d00001 diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/filters_and_privacy_policy.png b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/filters_and_privacy_policy.png new file mode 100644 index 0000000000000000000000000000000000000000..29c46127a2e6bfcd1a4ea6f93fe6ca8bc81f1fb2 GIT binary patch literal 210768 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 literal 0 HcmV?d00001 diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/introduction.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/introduction.ipynb index 76eb2b5cd7..68c10ee5e2 100644 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.0_introduction/introduction.ipynb @@ -1,11 +1,206 @@ { "cells": [ { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "ceca45d8-437c-44ae-8ed9-7a784983731f", "metadata": {}, - "outputs": [], + "source": [ + "# Security in NVIDIA FLARE Federated Computing Systems \n", + "\n", + "\n", + "### Critical Security Concerns in Federated Learning System\n", + "\n", + "#### Data Privacy\n", + "* Model inversion attacks (reconstructing training data from model parameters)\n", + "* Membership inference attacks (determining if specific data was used in training)\n", + "* Property inference attacks (learning properties about training data)\n", + "* Gradient leakage during parameter sharing\n", + "\n", + "#### System Security\n", + "* Authentication of participants\n", + "* Man-in-the-middle attacks\n", + "* Sybil attacks (malicious entities creating multiple fake identities)\n", + "* Denial of Service (DoS) attacks\n", + "* Network security during model/gradient transmission\n", + "\n", + "#### Model Security\n", + "* Model poisoning attacks\n", + "* Backdoor attacks\n", + "* Model stealing/extraction\n", + "* Adversarial attacks on the trained model\n", + "\n", + "#### Participant Privacy\n", + "* Protection of participant identities\n", + "* Confidentiality of participation in the FL system\n", + "* Protection of organizational intellectual property\n", + "\n", + "#### Computation Integrity\n", + "* Verification of correct computation by participants\n", + "* Detection of malicious or faulty updates\n", + "* Ensuring honest execution of the FL protocol\n", + "\n", + "#### Access Control\n", + "* Role-based access control\n", + "* Resource usage control\n", + "* Model access permissions\n", + "* Data access restrictions\n", + "\n", + "#### Regulatory Compliance\n", + "* Adherence to data protection regulations (GDPR, HIPAA, etc.)\n", + "* Cross-border data governance\n", + "* Audit trails and accountability\n", + "\n", + "#### Infrastructure Security\n", + "* Edge device security\n", + "* Server security\n", + "* Communication channel security\n", + "* Storage security for model checkpoints\n", + "\n", + "#### Trust Management\n", + "* Reputation systems for participants\n", + "* Trust establishment between parties\n", + "* Verification of participant legitimacy\n", + "\n", + "#### Aggregation Security\n", + "* Secure aggregation protocols\n", + "* Protection against colluding participants\n", + "* Byzantine-robust aggregation\n", + "\n", + "----------\n", + "\n", + "### Security Mechanisms in Federated Learning System\n", + "\n", + "A Federated Computing System requires robust security mechanisms to ensure that only legitimate and trusted participants can contribute, while also protecting communication channels and enforcing authorization policies. Below are the critical security components of an Federated Learning system:\n", + "\n", + "\n", + "* **Authentication**\n", + "\n", + "Ensures communicating parties have sufficient confidence about each other's identities: everyone is who they claim to be.\n", + "\n", + "* **Authorization** \n", + "\n", + "Ensures that users can only perform actions they are authorized to do.\n", + "\n", + "Due to the distributed nature of federated computing systems, additional authentication and authorization are needed for each participating organization. \n", + "\n", + "You can learn how NVIDIA FLARE implements these through event-based Federated Authentication and Authorization.\n", + "\n", + "* **Privacy Protection**: \n", + "\n", + "\n", + "Privacy protection in Federated Learning (FL) refers to techniques and mechanisms that ensure sensitive user data remains private while enabling collaborative model training across decentralized devices or servers. Since FL involves training models without sharing raw data, privacy protection is crucial to prevent information leakage from model updates.\n", + "\n", + "\n", + "We have introduced different privacy-enhancing technologies (PETs) in [Chapter 5](../../chapter-5_Privacy_In_Federated_Learning/05.0_introduction/introduction.ipynb). Here, we are going to explore privacy protection mechanisms at the organization level. \n", + "\n", + "* **Trust-based Security** \n", + "\n", + "Trust-based mechanisms add another layer of protection to the security system by leveraging confidential computing's VM-based trusted execution environment (TEE). NVIDIA FLARE will enable end-to-end confidential federated AI. We will briefly touch on this topic in this chapter, with more details to be added in the future. \n", + "\n", + "* **Communication Security**\n", + "\n", + "Uses secure protocols – TLS for secure transmission. FLARE supports both mutual TLS (mTLS) as well as normal TLS with signed messages.\n" + ] + }, + { + "cell_type": "markdown", + "id": "c7a65a24", + "metadata": {}, + "source": [ + "# NVIDIA FLARE Security Architecture\n", + "\n", + "NVFLARE is an application that runs in the IT environment of each participating site. The overall security of this application is a combination of security measures implemented within the application and those provided by the site's IT infrastructure.\n", + "\n", + "\n", + "NVFLARE implements security measures in the following areas:\n", + "\n", + "* **Identity Security**: the authentication and authorization of communicating parties\n", + "\n", + "* **Site Policy Management**: the policies for resource management, authorization, and privacy protection defined by each site\n", + "\n", + "* **Communication Security**: the confidentiality of data communication messages\n", + "\n", + "* **Message Serialization**: techniques for ensuring safe serialization/deserialization process between communicating parties\n", + "\n", + "* **Data Privacy Protection**: techniques for preventing local data from being leaked and/or reverse-engineered\n", + "\n", + "\n", + "All other security concerns must be handled by the site’s IT security infrastructure. The security framework does not operate in vacuum; we assume that physical security is already in place for all participating server and client machines. TLS provides the authentication mechanism within the trusted environments.\n", + "\n", + "\n", + "--- \n", + "\n", + "## Terminologies and Roles\n", + "### Terminologies\n", + "NVIDIA FLARE uses the following terminology:\n", + "\n", + "* Project: A federated learning study with identified participants\n", + "* Org: An organization that participates in the study\n", + "* Site: The computing system that runs NVIDIA FLARE application as part of the study. There are two kinds of sites: Server and Clients. Each site belongs to an organization.\n", + "* FL Server: An application running on a Server site responsible for client coordination based on federation workflows\n", + "* FL Client: An application running on a client site that responds to the Server's task assignments and performs learning actions based on its local data\n", + "* User: A human that participates in the FL project\n", + "\n", + "### Roles\n", + "\n", + "A role defines a type of users that have certain privileges of system operations. Each user is assigned a role in the project. There are four defined roles: Project Admin, Org Admin, Lead Researcher, and Member Researcher.\n", + "\n", + "* Project Admin Role: The Project Admin is responsible for provisioning the participants and coordinating personnel from all sites for the project. There is only one Project Admin for each project.\n", + "\n", + "* Org Admin Role: This role is responsible for the management of the sites of his/her organization.\n", + "\n", + "* Lead Researcher Role: This role can be configured with a higher level of privileges for a scientist within an organization who collaborates with other researchers to ensure the project's success.\n", + "\n", + "* Member Researcher Role: This role can be configured with a lower level of privileges for a scientist who works with the Lead Researcher to ensure their site is properly prepared for the project\n", + "\n", + "* FLARE Console: A console application running on a user’s machine that allows the user to perform NVFLARE system operations with a command line interface.\n", + "\n", + "\n", + "## Security Architecture\n", + "\n", + "NVIDIA FLARE uses PKI for identity authentication and TLS for data transmission, in addition to the following security mechanisms:\n", + "\n", + "* Filter mechanism and local organization privacy policy\n", + "* Federated Authorization - allows local control of authorization rules\n", + "* Site-specific authentication - each site can have custom local authenticators\n", + "* Privacy Algorithms:\n", + " * Differential privacy\n", + " * Homomorphic Encryption\n", + " * Multi-party computing (Private Set Intersection)\n", + "* Confidential Computing\n", + "\n", + "\"Security \n", + "\n", + "\n", + "\"Security\n", + "\n", + "\n", + "\n", + "In this chapter, we will cover all these security mechanisms\n", + "\n", + "[6.1 Identity Security](../06.1_identity_security/identity_security.ipynb)\n", + " \n", + "[6.2 site security and privacy Policy](../06.2_site_security_privacy_policy/site_policy.ipynb)\n", + " \n", + "[6.3 Customized site security](../06.3_customized_site_security/customized_site_security.ipynb) \n", + "\n", + "[6.4 Communication Security](../06.4_communication_security/communication_security.ipynb) \n", + "\n", + "[6.5 Message Serialization](../06.5_message_serialization/message_serialization.ipynb)\n", + "\n", + "[6.6 Trust-based Security](../06.6_trust_based_security/trust_based_security.ipynb)\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1db61f71", + "metadata": {}, "source": [] } ], 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 new file mode 100644 index 0000000000..b6e2936d42 --- /dev/null +++ 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 @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# **Indentity Security** \n", + "\n", + "\n", + "## Authentication\n", + "\n", + "NVFLARE’s authentication model is based on Public Key Infrastructure (PKI) technology\n", + "\n", + "For the FL project, the Project Admin uses the Provisioning Tool to create a Root CA with a self-signed root certificate. This Root CA will be used to issue all other certs needed by communicating parties.\n", + "\n", + "Identities involved in the project (Server, Clients, participants) are provisioned with the [Provisioning Tool](https://nvflare.readthedocs.io/en/main/real_world_fl/overview.html#provision). Each identity is defined with a unique common name. For each identity, the Provisioning Tool generates a separate password-protected Startup Kit, which includes security credentials for mutual TLS authentication:\n", + "\n", + "* The certificate of the Root CA\n", + "* The cert of the identity\n", + "* The private key of the identity\n", + "\n", + "Startup Kits are distributed to the intended identities:\n", + "* The FL Server’s kit is sent to the Project Admin\n", + "* The kit for each FL Client is sent to the Org Admin responsible for the site\n", + "* FLARE Console (previously called Admin Client) kits are sent to the user(s)\n", + "\n", + "To ensure the integrity of the Startup Kit, each file in the kit is signed by the Root CA.\n", + "\n", + "Each Startup Kit also contains a “start.sh” file, which can be used to properly start the NVFLARE application.\n", + "\n", + "Once started, the FL client attempts to establish a mutual TLS or standard TLS connection with the FL server, using the PKI credentials in its Startup Kit. This is possible only if both the FL client and the FL server have the correct Startup Kits. \n", + "\n", + "Similarly, when a user tries to operate the NVFLARE system using the Flare Console app, the Flare Console tries to establish a mutual TLS or standard TLS connection with the Server, using the PKI credentials in its Startup Kits. This is possible only if both the Flare Console and the FL server have the correct Startup Kits. The user must also enter his/her assigned user name correctly.\n", + "\n", + "We supports both normal TLS and mutal TLS. \n", + "\n", + "\n", + "The security of the system comes from the PKI credentials in the Startup Kits. As you can see, this mechanism involves manual processing and human interactions for Startup Kit distribution, and hence the identity security of the system depends on the trust of the involved people. To minimize security risk, we recommend that people involved follow these best practice guidelines:\n", + "\n", + "The Project Admin, who is responsible for the provisioning process of the study, should protect the study’s configuration files and store created Startup Kits securely.\n", + "\n", + "When distributing Startup Kits, the Project Admin should use trusted communication methods, and never send passwords of the Startup Kits in the same communication. It is preferred to send the Kits and passwords with different communication methods.\n", + "\n", + "Org Admin and users must protect their Startup Kits and only use them for intended purposes.\n", + "\n", + "> Note\n", + "The provisioning tool tries to use the strongest cryptography suites possible when generating the PKI credentials. All of the certificates are compliant with the X.509 standard. All private keys are generated with a size of 2048-bits. The backend is openssl 1.1.1f, released on March 31, 2020, with no known CVE. All certificates expire within 360 days.\n", + "\n", + "> NVFlare Dashboard is a website that supports user and site registration. Users will be able to download their Startup Kits (and other artifacts) from the website.\n", + "\n", + "Let's see above in action\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, let's generate a default startup kits using the POC (Proof-Of-Concept) command. The POC command internally calls the provision tool to generate the default startup kits" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! echo y | nvflare poc prepare\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! tree /tmp/nvflare/poc/example_project/prod_00" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at the each site's start up kit. We see\n", + "\n", + "```\n", + "startup\n", + "│ │ ├── client.crt <-- certificate\n", + "│ │ ├── client.key <-- private key\n", + "│ │ ├── fed_client.json\n", + "│ │ ├── rootCA.pem <-- root certificate\n", + "│ │ ├── signature.json\n", + "│ │ ├── start.sh\n", + "│ │ ├── stop_fl.sh\n", + "│ │ └── sub_start.sh\n", + "\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Authorization\n", + "\n", + "Federated learning is conducted over computing resources owned by different organizations. Naturally these organizations have concerns about their computing resources being misused or abused. Even if an NVFLARE docker is trusted by participating orgs, researchers can still bring their own custom code to be part of a study, which could be a big concern to many organizations. In addition, organizations may also have IP (intellectual property) requirements on the studies performed by their own researchers.\n", + "\n", + "Some frameworks disable the BYOC (bring your own code) feature and only allow pre-installed packages during production. However, during research and development, researchers need to modify code constantly during experiments.\n", + "\n", + "\n", + "\n", + "NVFLARE comes with an authorization system that can help address these security concerns and IP requirements. With this system, an organization can define strict policy to control access to their computing resources and/or FL jobs.\n", + "\n", + "Here are some examples that an org can do:\n", + "\n", + "* Restrict BYOC to only the org’s own researchers;\n", + "\n", + "* Allow jobs only from its own researchers, or from specified other orgs, or even from specified trusted other researchers;\n", + "\n", + "* Totally disable remote shell commands on its sites\n", + "\n", + "* Allow the “ls” shell command but disable all other remote shell commands\n", + "\n", + "\n", + "### Centralized vs. Federated Authorization\n", + "\n", + "Instead of relying on a centralized (FL Server) to authorizate and authenticate users, NVFLARE now uses federated authorization where each organization defines and enforces its own authorization policy.\n", + "\n", + "Each organization defines its policy in its own authorization.json (in the local folder of the workspace). This locally defined policy is loaded by FL Clients owned by the organization, The policy is also enforced by these FL Clients.\n", + "\n", + "This decentralized authorization has an added benefit: since each organization takes care of its own authorization, there will be no need to update the policy of any other participants (FL Server or Clients) when new orgs or clients are added.\n", + "\n", + "### Simplified Authorization Policy Configuration\n", + "Since each organization defines its own policy, there will be no need to centrally define all orgs and users. The policy configuration for an org is simply a matrix of role/right permissions. Each role/right combination in the permission matrix answers this question: what kind of users in this role can have this right?\n", + "\n", + "To answer this question, the role/right combination defines one or more conditions, and the user must meet one of these conditions to have the right. The set of conditions is called a control.\n", + "\n", + "### Roles\n", + "Users are classified into roles. NVFLARE defines four roles:\n", + "\n", + "* **Project Admin** - this role is responsible for the whole FL project;\n", + "\n", + "* **Org Admin** - this role is responsible for the administration of all sites in its org. Each org must have one Org Admin;\n", + "\n", + "* **Lead (researcher)** - this role conducts FL studies\n", + "\n", + "* **Member (researcher)** - this role observes the FL study but cannot submit jobs\n", + "\n", + "### Rights\n", + "\n", + "* Admin commands are grouped into categories. For example, commands like abort_job, delete_job, start_app are in manage_job category; all shell commands are put into the shell_commands category. Each category is also a right.\n", + "\n", + "* BYOC is defined as a right so that some users are allowed to submit jobs with BYOC whereas some are not.\n", + "\n", + "This right system makes it easy to write simple policies that only use command categories. It also makes it possible to write policies to control individual commands. When both categories and commands are used, command-based control takes precedence over category-based control.\n", + "\n", + "\n", + "## Controls and Conditions\n", + "\n", + "\n", + "| Notation | Condition | Examples |\n", + "|----------------|-----------------------------------------------------|--------------------|\n", + "| o:site | The user belongs to the site’s organization | |\n", + "| n:submitter | The user is the job submitter | |\n", + "| o:submitter | The user and the job submitter belong to the same org| |\n", + "| n:| The user is a specified person | n:john@nvidia.com |\n", + "| o: | The user is in a specified org | o:nvidia |\n", + "\n", + "The words “site” and “submitter” are reserved.\n", + "\n", + "For more details please refer [documentation](https://nvflare.readthedocs.io/en/main/user_guide/security/identity_security.html)\n", + "\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nvflare_env", + "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": 2 +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_security_architecture/Seurity_architecture.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_security_architecture/Seurity_architecture.ipynb deleted file mode 100644 index cc2eeea833..0000000000 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.1_security_architecture/Seurity_architecture.ipynb +++ /dev/null @@ -1,33 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "c563b1cd-2176-4198-96a7-52b096b0b656", - "metadata": {}, - "outputs": [], - "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_authentication_and_authorization/site_specific_authentication_and_authorization.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_authentication_and_authorization/site_specific_authentication_and_authorization.ipynb deleted file mode 100644 index 4f5d8c430a..0000000000 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_authentication_and_authorization/site_specific_authentication_and_authorization.ipynb +++ /dev/null @@ -1,33 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0e725a2d-af59-43ae-8ef8-aeabe5581d4b", - "metadata": {}, - "outputs": [], - "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/data/download.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/data/download.py new file mode 100644 index 0000000000..ebd8cfdc41 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/data/download.py @@ -0,0 +1,60 @@ +# 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. + +# This Dirichlet sampling strategy for creating a heterogeneous partition is adopted +# from FedMA (https://github.com/IBM/FedMA). + +# MIT License + +# Copyright (c) 2020 International Business Machines + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import argparse + +import torchvision.datasets as datasets + +# default dataset path +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + args = parser.parse_args() + return args + + +def main(args): + datasets.CIFAR10(root=args.dataset_path, train=True, download=True) + datasets.CIFAR10(root=args.dataset_path, train=False, download=True) + + +if __name__ == "__main__": + main(define_parser()) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/fl_job.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/fl_job.py new file mode 100644 index 0000000000..4e813132a0 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/fl_job.py @@ -0,0 +1,54 @@ +# 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 os +import shutil + +from src.fedavg import FedAvg +from src.network import SimpleNetwork + +from nvflare.job_config.api import FedJob +from nvflare.job_config.script_runner import ScriptRunner + +if __name__ == "__main__": + num_clients = 2 + num_rounds = 2 + train_script = "src/client.py" + job_config_dir = "/tmp/nvflare/jobs/workdir" + + for i in range(5): + job_name = f"job_{i + 1}" + job = FedJob(name=job_name, min_clients=num_clients) + + controller = FedAvg( + stop_cond="accuracy > 25", + save_filename="global_model.pt", + initial_model=SimpleNetwork(), + num_clients=num_clients, + num_rounds=num_rounds, + ) + + job.to_server(controller) + + # Add clients + for site_name in ["site_a", "site_b"]: + executor = ScriptRunner(script=train_script) + job.to(executor, site_name) + + print("job-config is at ", os.path.join(job_config_dir, job_name)) + job.export_job(job_config_dir) + source_meta_file = os.path.join(f"job{i + 1}", "meta.json") + dest_meta_file = os.path.join(job_config_dir, job_name, "meta.json") + shutil.copy2(source_meta_file, dest_meta_file) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job1/meta.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job1/meta.json new file mode 100644 index 0000000000..a80f369770 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job1/meta.json @@ -0,0 +1,11 @@ +{ + "name": "job_1", + "resource_spec": {}, + "min_clients" : 1, + "deploy_map": { + "app": [ + "@ALL" + ] + }, + "scope": "public" +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job2/meta.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job2/meta.json new file mode 100644 index 0000000000..0fa0b5c4d6 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job2/meta.json @@ -0,0 +1,11 @@ +{ + "name": "job_2", + "resource_spec": {}, + "min_clients" : 1, + "deploy_map": { + "app": [ + "@ALL" + ] + }, + "scope": "test" +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job3/meta.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job3/meta.json new file mode 100644 index 0000000000..35404ba28d --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job3/meta.json @@ -0,0 +1,11 @@ +{ + "name": "job_3", + "resource_spec": {}, + "min_clients" : 1, + "deploy_map": { + "app": [ + "@ALL" + ] + }, + "scope": "private" +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job4/meta.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job4/meta.json new file mode 100644 index 0000000000..6ca06b879b --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job4/meta.json @@ -0,0 +1,10 @@ +{ + "name": "job_4", + "resource_spec": {}, + "min_clients" : 1, + "deploy_map": { + "app": [ + "@ALL" + ] + } +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job5/meta.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job5/meta.json new file mode 100644 index 0000000000..2aba09beda --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/job5/meta.json @@ -0,0 +1,11 @@ +{ + "name": "job_5", + "resource_spec": {}, + "min_clients" : 1, + "deploy_map": { + "app": [ + "@ALL" + ] + }, + "scope": "foo" +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/requirements.txt b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/requirements.txt new file mode 100644 index 0000000000..57b4df2ed4 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/requirements.txt @@ -0,0 +1,3 @@ +torch +torchvision +tensorboard \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/client.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/client.py new file mode 100644 index 0000000000..220559b3cf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/client.py @@ -0,0 +1,193 @@ +# 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 + +import torch +import torch.nn as nn +import torch.optim as optim +import torchvision +import torchvision.transforms as transforms +from network import SimpleNetwork + +# (1) import nvflare client API +import nvflare.client as flare +from nvflare.app_common.app_constant import ModelName + +# (optional) set a fix place so we don't need to download everytime +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + +# (optional) We change to use GPU to speed things up. +# if you want to use CPU, change DEVICE="cpu" +DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + parser.add_argument("--batch_size", type=int, default=4, nargs="?") + parser.add_argument("--learning_rate", type=float, default=0.001, nargs="?") + parser.add_argument("--num_workers", type=int, default=1, nargs="?") + parser.add_argument("--local_epochs", type=int, default=2, nargs="?") + parser.add_argument("--model_path", type=str, default=f"{CIFAR10_ROOT}/cifar_net.pth", nargs="?") + return parser.parse_args() + + +def main(): + # define local parameters + args = define_parser() + + dataset_path = args.dataset_path + batch_size = args.batch_size + num_workers = args.num_workers + local_epochs = args.local_epochs + model_path = args.model_path + lr = args.learning_rate + + transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) + trainset = torchvision.datasets.CIFAR10(root=dataset_path, train=True, download=True, transform=transform) + trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers) + testset = torchvision.datasets.CIFAR10(root=dataset_path, train=False, download=True, transform=transform) + testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers) + + net = SimpleNetwork() + best_accuracy = 0.0 + + # wraps evaluation logic into a method to re-use for + # evaluation on both trained and received model + def evaluate(input_weights): + net = SimpleNetwork() + net.load_state_dict(input_weights) + # (optional) use GPU to speed things up + net.to(DEVICE) + + correct = 0 + total = 0 + # since we're not training, we don't need to calculate the gradients for our outputs + with torch.no_grad(): + for data in testloader: + # (optional) use GPU to speed things up + images, labels = data[0].to(DEVICE), data[1].to(DEVICE) + # calculate outputs by running images through the network + outputs = net(images) + # the class with the highest energy is what we choose as prediction + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + return 100 * correct // total + + # (2) initialize NVFlare client API + flare.init() + + # (3) run continously when launch_once=true + while flare.is_running(): + + # (4) receive FLModel from NVFlare + input_model = flare.receive() + client_id = flare.get_site_name() + + # Based on different "task" we will do different things + # for "train" task (flare.is_train()) we use the received model to do training and/or evaluation + # and send back updated model and/or evaluation metrics, if the "train_with_evaluation" is specified as True + # in the config_fed_client we will need to do evaluation and include the evaluation metrics + # for "evaluate" task (flare.is_evaluate()) we use the received model to do evaluation + # and send back the evaluation metrics + # for "submit_model" task (flare.is_submit_model()) we just need to send back the local model + # (5) performing train task on received model + if flare.is_train(): + print(f"({client_id}) current_round={input_model.current_round}, total_rounds={input_model.total_rounds}") + + # (5.1) loads model from NVFlare + net.load_state_dict(input_model.params) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.9) + + # (optional) use GPU to speed things up + net.to(DEVICE) + # (optional) calculate total steps + steps = local_epochs * len(trainloader) + for epoch in range(local_epochs): # loop over the dataset multiple times + + running_loss = 0.0 + for i, data in enumerate(trainloader, 0): + # get the inputs; data is a list of [inputs, labels] + # (optional) use GPU to speed things up + inputs, labels = data[0].to(DEVICE), data[1].to(DEVICE) + + # zero the parameter gradients + optimizer.zero_grad() + + # forward + backward + optimize + outputs = net(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + # print statistics + running_loss += loss.item() + if i % 2000 == 1999: # print every 2000 mini-batches + print(f"({client_id}) [{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}") + running_loss = 0.0 + break + + print(f"({client_id}) Finished Training") + + # (5.2) evaluation on local trained model to save best model + local_accuracy = evaluate(net.state_dict()) + print(f"({client_id}) Evaluating local trained model. Accuracy on the 10000 test images: {local_accuracy}") + if local_accuracy > best_accuracy: + best_accuracy = local_accuracy + torch.save(net.state_dict(), model_path) + + # (5.3) evaluate on received model for model selection + accuracy = evaluate(input_model.params) + print( + f"({client_id}) Evaluating received model for model selection. Accuracy on the 10000 test images: {accuracy}" + ) + + # (5.4) construct trained FL model + output_model = flare.FLModel( + params=net.cpu().state_dict(), + metrics={"accuracy": accuracy}, + meta={"NUM_STEPS_CURRENT_ROUND": steps}, + ) + + # (5.5) send model back to NVFlare + flare.send(output_model) + + # (6) performing evaluate task on received model + elif flare.is_evaluate(): + accuracy = evaluate(input_model.params) + print(f"({client_id}) accuracy: {accuracy}") + flare.send(flare.FLModel(metrics={"accuracy": accuracy})) + + # (7) performing submit_model task to obtain best local model + elif flare.is_submit_model(): + model_name = input_model.meta["submit_model_name"] + if model_name == ModelName.BEST_MODEL: + try: + weights = torch.load(model_path) + net = SimpleNetwork() + net.load_state_dict(weights) + flare.send(flare.FLModel(params=net.cpu().state_dict())) + except Exception as e: + raise ValueError("Unable to load best model") from e + else: + raise ValueError(f"Unknown model_type: {model_name}") + + +if __name__ == "__main__": + main() diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fedavg.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fedavg.py new file mode 100644 index 0000000000..a63f0005bf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fedavg.py @@ -0,0 +1,158 @@ +# 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 os +from typing import Callable, Dict, List, Optional + +import torch + +from nvflare.app_common.abstract.fl_model import FLModel +from nvflare.app_common.utils.math_utils import parse_compare_criteria +from nvflare.app_common.workflows.base_fedavg import BaseFedAvg +from nvflare.app_opt.pt.decomposers import TensorDecomposer +from nvflare.fuel.utils import fobs + + +class FedAvg(BaseFedAvg): + """Controller for FedAvg Workflow with Early Stopping and Model Selection. + + Args: + num_clients (int, optional): The number of clients. Defaults to 3. + num_rounds (int, optional): The total number of training rounds. Defaults to 5. + stop_cond (str, optional): early stopping condition based on metric. + string literal in the format of " " (e.g. "accuracy >= 80") + save_filename (str, optional): filename for saving model + initial_model (nn.Module, optional): initial PyTorch model + """ + + def __init__( + self, + *args, + stop_cond: str, + num_rounds: int, + save_filename: str = "FL_global_model.pt", + initial_model=None, + **kwargs, + ): + super().__init__(*args, **kwargs) + + self.stop_cond = stop_cond + self.num_rounds = num_rounds + + if stop_cond: + self.stop_condition = parse_compare_criteria(stop_cond) + else: + self.stop_condition = None + self.save_filename = save_filename + self.initial_model = initial_model + self.best_model: Optional[FLModel] = None + + def run(self) -> None: + self.info("Start FedAvg.") + + if self.initial_model: + # Use FOBS for serializing/deserializing PyTorch tensors (self.initial_model) + fobs.register(TensorDecomposer) + # PyTorch weights + initial_weights = self.initial_model.state_dict() + else: + initial_weights = {} + + model = FLModel(params=initial_weights) + + model.start_round = self.start_round + model.total_rounds = self.num_rounds + + for self.current_round in range(self.start_round, self.start_round + self.num_rounds): + self.info(f"Round {self.current_round} started.") + model.current_round = self.current_round + + clients = self.sample_clients(self.num_clients) + + results: List[FLModel] = self.send_model_and_wait(targets=clients, data=model) + aggregate_results = self.aggregate( + results, aggregate_fn=self.aggregate_fn + ) # using default aggregate_fn with `WeightedAggregationHelper`. Can overwrite self.aggregate_fn with signature Callable[List[FLModel], FLModel] + + model = self.update_model(model, aggregate_results) + + self.info(f"Round {self.current_round} global metrics: {model.metrics}") + + self.select_best_model(model) + + self.save_model(self.best_model, os.path.join(os.getcwd(), self.save_filename)) + + if self.should_stop(model.metrics, self.stop_condition): + self.info( + f"Stopping at round={self.current_round} out of total_rounds={self.num_rounds}. Early stop condition satisfied: {self.stop_condition}" + ) + break + + self.info("Finished FedAvg.") + + def should_stop(self, metrics: Optional[Dict] = None, stop_condition: Optional[str] = None): + if stop_condition is None or metrics is None: + return False + + key, target, op_fn = stop_condition + value = metrics.get(key, None) + + if value is None: + raise RuntimeError(f"stop criteria key '{key}' doesn't exists in metrics") + + return op_fn(value, target) + + def select_best_model(self, curr_model: FLModel): + if self.best_model is None: + self.best_model = curr_model + return + + if self.stop_condition: + metric, _, op_fn = self.stop_condition + if self.is_curr_model_better(self.best_model, curr_model, metric, op_fn): + self.info("Current model is new best model.") + self.best_model = curr_model + else: + self.best_model = curr_model + + def is_curr_model_better( + self, best_model: FLModel, curr_model: FLModel, target_metric: str, op_fn: Callable + ) -> bool: + curr_metrics = curr_model.metrics + if curr_metrics is None: + return False + if target_metric not in curr_metrics: + return False + + best_metrics = best_model.metrics + return op_fn(curr_metrics.get(target_metric), best_metrics.get(target_metric)) + + def save_model(self, model, filepath=""): + params = model.params + # PyTorch save + torch.save(params, filepath) + + # save FLModel metadata + model.params = {} + fobs.dumpf(model, filepath + ".metadata") + model.params = params + + def load_model(self, filepath=""): + # PyTorch load + params = torch.load(filepath) + + # load FLModel metadata + model = fobs.loadf(filepath + ".metadata") + model.params = params + return model diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fl_job.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fl_job.py new file mode 100644 index 0000000000..8fc6f73846 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/fl_job.py @@ -0,0 +1,64 @@ +# 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 os + +from src.fedavg import FedAvg +from src.network import SimpleNetwork + +from nvflare.job_config.api import FedJob +from nvflare.job_config.script_runner import ScriptRunner + +if __name__ == "__main__": + num_clients = 5 + num_rounds = 5 + job_name = "fedavg" + train_script = "src/client.py" + + job = FedJob(name=job_name, min_clients=num_clients) + + controller = FedAvg( + stop_cond="accuracy > 25", + save_filename="global_model.pt", + initial_model=SimpleNetwork(), + num_clients=num_clients, + num_rounds=num_rounds, + ) + + job.to_server(controller) + + # Add clients + + executor_1 = ScriptRunner(script=train_script, script_args="--learning_rate 0.01 --batch_size 12") + job.to(executor_1, "site-1") + + executor_2 = ScriptRunner(script=train_script, script_args="--learning_rate 0.01 --batch_size 10") + job.to(executor_2, "site-2") + + executor_3 = ScriptRunner(script=train_script, script_args="--learning_rate 0.001 --batch_size 8") + job.to(executor_3, "site-3") + + executor_4 = ScriptRunner(script=train_script, script_args="--learning_rate 0.001 --batch_size 6") + job.to(executor_3, "site-4") + + executor_5 = ScriptRunner(script=train_script, script_args="--learning_rate 0.0001 --batch_size 4") + job.to(executor_3, "site-5") + + job_config_dir = "/tmp/nvflare/jobs/workdir" + + print("job-config is at ", os.path.join(job_config_dir, job_name)) + + # job.export_job(job_config_dir) + job.simulator_run(job_config_dir) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/network.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/network.py new file mode 100644 index 0000000000..609b0b1581 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/jobs/src/network.py @@ -0,0 +1,37 @@ +# 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 torch +import torch.nn as nn +import torch.nn.functional as F + + +class SimpleNetwork(nn.Module): + def __init__(self): + super(SimpleNetwork, self).__init__() + self.conv1 = nn.Conv2d(3, 6, 5) + self.pool = nn.MaxPool2d(2, 2) + self.conv2 = nn.Conv2d(6, 16, 5) + self.fc1 = nn.Linear(16 * 5 * 5, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = self.pool(F.relu(self.conv1(x))) + x = self.pool(F.relu(self.conv2(x))) + x = torch.flatten(x, 1) # flatten all dimensions except batch + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/authorization.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/authorization.json new file mode 100644 index 0000000000..b1c9e1909f --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/authorization.json @@ -0,0 +1,29 @@ +{ + "format_version": "1.0", + "permissions": { + "project_admin": "any", + "org_admin": { + "submit_job": "none", + "clone_job": "none", + "manage_job": "o:submitter", + "download_job": "o:submitter", + "view": "any", + "operate": "o:site", + "shell_commands": "o:site", + "byoc": "none" + }, + "lead": { + "submit_job": "o:site", + "clone_job": "n:submitter", + "manage_job": "n:submitter", + "download_job": "n:submitter", + "view": "any", + "operate": "o:site", + "shell_commands": "o:site", + "byoc": "any" + }, + "member": { + "view": "any" + } + } +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/resources.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/resources.json new file mode 100644 index 0000000000..930bb28786 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_a/resources.json @@ -0,0 +1,24 @@ +{ + "format_version": 2, + "client": { + "retry_timeout": 30, + "compression": "Gzip" + }, + "components": [ + { + "id": "resource_manager", + "path": "nvflare.app_common.resource_managers.list_resource_manager.ListResourceManager", + "args": { + "resources": { + "gpu": [0, 1] + } + } + }, + { + "id": "resource_consumer", + "path": "nvflare.app_common.resource_consumers.list_resource_consumer.ListResourceConsumer", + "args": { + } + } + ] +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/custom/test_filter.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/custom/test_filter.py new file mode 100644 index 0000000000..839a689154 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/custom/test_filter.py @@ -0,0 +1,34 @@ +# 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 logging + +from nvflare.apis.filter import ContentBlockedException, Filter +from nvflare.apis.fl_context import FLContext +from nvflare.apis.shareable import Shareable + +log = logging.getLogger(__name__) + + +class TestFilter(Filter): + def __init__(self, name, block=False): + self.name = name + self.block = block + + def process(self, shareable: Shareable, fl_ctx: FLContext) -> Shareable: + if self.block: + log.info(f"Filter {self.name} blocked the content") + raise ContentBlockedException("Content blocked by filter " + self.name) + + log.info(f"Filter {self.name} is invoked") + return shareable diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/privacy.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/privacy.json new file mode 100644 index 0000000000..2e320a0f0c --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/policies/site_b/privacy.json @@ -0,0 +1,54 @@ +{ + "scopes": [ + { + "name": "public", + "task_result_filters": [ + ], + "task_data_filters": [ + ] + + }, + { + "name": "test", + "task_result_filters": [ + { + "path": "test_filter.TestFilter", + "args": { + "name": "============== Result filter for test scope ============" + } + } + ], + "task_data_filters": [ + { + "path": "test_filter.TestFilter", + "args": { + "name": "============== Data filter for test scope ============" + } + } + ] + }, + { + "name": "private", + "task_result_filters": [ + { + "path": "nvflare.app_common.filters.percentile_privacy.PercentilePrivacy", + "args": { + "percentile": 10, + "gamma": 7.5 + } + } + ], + "task_data_filters": [ + { + "path": "test_filter.TestFilter", + "args": { + "name": "============== Data filter for test scope ============" + } + } + ] + } + + + ], + "default_scope": "public" +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/project.yml b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/project.yml new file mode 100644 index 0000000000..13cdef1845 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/code/federated-policies/project.yml @@ -0,0 +1,55 @@ +api_version: 3 +name: fed_policy +description: NVFlare example for federated policies + +participants: + - name: rtx + type: server + org: org_a + fed_learn_port: 8002 + admin_port: 8003 + - name: site_a + type: client + org: org_a + - name: site_b + type: client + org: org_b + + - name: super@a.org + type: admin + org: org_a + role: project_admin + - name: admin@a.org + type: admin + org: org_a + role: org_admin + - name: trainer@a.org + type: admin + org: org_a + role: lead + - name: trainer@b.org + type: admin + org: org_b + role: lead + - name: user@b.org + type: admin + org: org_b + role: member + +# The same methods in all builders are called in their order defined in builders section +builders: + - path: nvflare.lighter.impl.workspace.WorkspaceBuilder + args: + template_file: master_template.yml + - path: nvflare.lighter.impl.static_file.StaticFileBuilder + args: + # config_folder can be set to inform NVIDIA FLARE where to get configuration + config_folder: config + overseer_agent: + path: nvflare.ha.dummy_overseer_agent.DummyOverseerAgent + overseer_exists: false + args: + sp_end_point: server1:8002:8003 + + - path: nvflare.lighter.impl.cert.CertBuilder + - path: nvflare.lighter.impl.signature.SignatureBuilder diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/site_policy.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/site_policy.ipynb new file mode 100644 index 0000000000..bec8169faf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.2_site_security_privacy_policy/site_policy.ipynb @@ -0,0 +1,476 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ef224801-e14b-4b8e-92bb-1643364fbef9", + "metadata": {}, + "source": [ + "# Site-specific security and privacy policies\n", + "\n", + "NVIDIA FLARE offers a set of security mechanisms to control user access for different operations based on their roles. These controls are not limited to centralized server control, but also exist at each site. Such site-specific level of security is done via security policies which we call federated policies. \n", + "\n", + "[FLARE's Security documentation](https://nvflare.readthedocs.io/en/main/user_guide/security/identity_security.html) has details regarding\n", + "* Centralized vs. Federated Authorization \n", + "* Policy Configuration \n", + "* Roles and Rights\n", + "* Controls and Conditions\n", + "* Command Categories\n", + "* Policy Evaluation\n", + "* Command Authorization Process\n", + "* Job Submission authorization process\n", + "* Job Management Commands authorization \n", + "\n", + "This section we are going dive into the usage of these policies via few examples, but first a refresher of terminology used in the examples. \n", + "\n", + "n the privacy policy, we notice that different scopes can be defined. The scope-specified policy is enforced by the FLARE's filter mechanism. For each non-public scope, one can define different filters to enforce the desired behavior. For example, the organization administrator can implement filters to prevent certain types of data leakage from being accidentally exposed by data scientists.\n", + "_____________\n", + "\n", + "\n", + "Refresher: Command Category and Control Notations\n", + "----------\n", + "Before we go to the Test Cases, let's refresh some concepts and notatations\n", + "\n", + "**Command Category**\n", + "\n", + "| permission | command |\n", + "|------------------|-----------------|\n", + "| MANAGE_JOB | ABORT |\n", + "| MANAGE_JOB | ABORT_JOB |\n", + "| MANAGE_JOB | START_APP |\n", + "| MANAGE_JOB | DELETE_JOB |\n", + "| MANAGE_JOB | DELETE_WORKSPACE|\n", + "| VIEW | CHECK_STATUS |\n", + "| VIEW | SHOW_STATS |\n", + "| VIEW | RESET_ERRORS |\n", + "| VIEW | SHOW_ERRORS |\n", + "| VIEW | LIST_JOBS |\n", + "| OPERATE | SYS_INFO |\n", + "| OPERATE | RESTART |\n", + "| OPERATE | SHUTDOWN |\n", + "| OPERATE | REMOVE_CLIENT |\n", + "| OPERATE | SET_TIMEOUT |\n", + "| OPERATE | CALL |\n", + "| SHELL_COMMANDS | SHELL_CAT |\n", + "| SHELL_COMMANDS | SHELL_GREP |\n", + "| SHELL_COMMANDS | SHELL_HEAD |\n", + "| SHELL_COMMANDS | SHELL_LS |\n", + "| SHELL_COMMANDS | SHELL_PWD |\n", + "| SHELL_COMMANDS | SHELL_TAIL |\n", + "\n", + "\n", + "\n", + "**Notation and Condition**\n", + "\n", + "| Notation | Condition | Examples |\n", + "|----------------|------------------------------------------------|---------------------|\n", + "| o:site | The user belongs to the site’s organization | |\n", + "| n:submitter | The user is the job submitter | |\n", + "| o:submitter | The user and the job submitter belong to the same org | |\n", + "| n:| The user is a specified person | n:john@nvidia.com |\n", + "| o: | The user is in a specified org | o:nvidia |\n", + "\n", + "The words “site” and “submitter” are reserved.\n", + "\n", + "In addition, two words are used for extreme conditions:\n", + "\n", + "* Any user is allowed: any\n", + "* No user is allowed: none\n", + "\n", + "control is a set of one or more conditions that is specified in the permission matrix. Conditions specify relationships among the subject user, the site, and the job submitter. The following are supported relationships:\n", + "\n", + "* The user belongs to the site’s organization (user org = site org)\n", + "* The user is the job submitter (user name = submitter name)\n", + "* The user and the job submitter are in the same org (user org = submitter org)\n", + "* The user is a specified person (user name = specified name)\n", + "* The user is in a specified org (user org = specified org)\n", + "* Keep in mind that the relationship is always relative to the subject user - we check to see whether the user’s name or org has the right relationship with the site or job submitter.\n", + "\n", + "\n", + "\n", + "\n", + "---- \n", + "## Overview\n", + "\n", + "\n", + "## Overview\n", + "\n", + "Now we are ready to discuss examples for federated site policy. The purpose of these examples is to demonstrate the following features of NVIDIA FLARE:\n", + "\n", + "1. Show secure FLARE console and authentication\n", + "2. Demonstrate local authorization policy \n", + "3. Demonstrate local privacy policy\n", + "\n", + "## Participants\n", + "\n", + "Site\n", + "____\n", + "* `server`: NVIDIA FLARE server owned by org a\n", + "* `site_a`: Client owned by a.org with a customized authorization policy, which only allows users from the same org to submit jobs\n", + "* `site_b`: Client owned by b.org with a customized privacy policy. The policy defines two scopes: `public` and `private`. A custom filter is applied to `private`\n", + "\n", + "Users\n", + "_____\n", + "*```super@a.org```: Super user with role `project_admin` who can do everything\n", + "*```admin@a.org```: Admin for a.org with role `org_admin`\n", + "*```trainer@a.org```: Lead trainer for a.org with role `lead`\n", + "*```trainer@b.org```: Lead trainer for b.org with role `lead`\n", + "*```user@b.org```: Regular user for b.org with role `member`\n", + "\n", + "Jobs\n", + "____\n", + "All the jobs run the same app but have different scopes defined in `meta.json`.\n", + "\n", + "* job1: Scope is `public`. No filters.\n", + "* job2: Scope is `test`. Test filters are applied to data and result.\n", + "* job3: Scope is `private`. PercentilePrivacy filter is applied to result.\n", + "* job4: It has no scope defined.\n", + "* job5: It defines an non-existent scope `foo`\n", + "\n", + "\n", + "\n", + "### Test Cases\n", + "----------\n", + "\n", + "\n", + "\n", + "\n", + "Test Cases\n", + "----------\n", + "\n", + "Authorization\n", + "_____________\n", + "We will demo some authorization behaviors.\n", + "\n", + "Since authorization decision is determined using each site's authorization.json and each admin user's role,\n", + "we just use `job1` in all the following tests.\n", + "\n", + "| User | Command | Expected behavior |\n", + "|----------------|----------------------------------------------|-----------------------------------------------------------------------------------|\n", + "| trainer@a.org | submit_job /tmp/nvflare/jobs/workdir/job_1 | Job deployed and started on all sites |\n", + "| trainer@a.org | clone_job [the job ID that we previous submitted] | Job deployed and started on all sites |\n", + "| trainer@b.org | clone_job [the job ID that we previous submitted] | Rejected because submitter is in a different org |\n", + "| admin@a.org | submit_job /tmp/nvflare/jobs/workdir/job_1 | Rejected because role \"org_admin\" is not allowed to submit jobs |\n", + "| trainer@b.org | submit_job /tmp/nvflare/jobs/workdir/job_1 | site_a rejected the job because the submitter is in a different org, while site_b accepted the job so the job will still run since in meta.json we specify min_clients as 1 |\n", + "\n", + "Privacy\n", + "_______\n", + "site_a has no privacy policy defined.\n", + "So we will test the following cases on site_b.\n", + "\n", + "In each job's meta.json we specified their \"scope\" and in site's privacy.json file each site will define its own\n", + "privacy filters to apply for that scope.\n", + "\n", + "Note that default jobs are treated in \"public\" scope.\n", + "\n", + "Let's just use user trainer@b.org for the following tests.\n", + "\n", + "| Job | Expected behavior |\n", + "|------|--------------------|\n", + "| job1 | Job deployed with no filters |\n", + "| job2 | Job deployed with TestFilter applied |\n", + "| job3 | Job deployed with PercentilePrivacy filter applied to the result |\n", + "| job4 | Job deployed using default scope `public` |\n", + "| job5 | Job rejected by site_b because `foo` doesn't exist |\n" + ] + }, + { + "cell_type": "markdown", + "id": "8674b81f", + "metadata": {}, + "source": [ + "Setup FL System, Site Policies\n", + "----------" + ] + }, + { + "cell_type": "markdown", + "id": "5d44b2c4", + "metadata": {}, + "source": [ + "* Prepare POC with given project.yml file" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "97c7bfa1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prepare poc at /tmp/nvflare/poc with code/federated-policies/project.yml\n", + "This will delete poc workspace directory: '/tmp/nvflare/poc' and create a new one. Is it OK to proceed? (y/N) provision at /tmp/nvflare/poc for 2 clients with code/federated-policies/project.yml\n", + "Generated results can be found under /tmp/nvflare/poc/fed_policy/prod_00. \n" + ] + } + ], + "source": [ + "! echo y | nvflare poc prepare -i code/federated-policies/project.yml" + ] + }, + { + "cell_type": "markdown", + "id": "37a97825", + "metadata": {}, + "source": [ + "* Setup polices for different sites " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "50540db7", + "metadata": {}, + "outputs": [], + "source": [ + "Workspace = \"/tmp/nvflare/poc/fed_policy/prod_00\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9c89760", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "! cp -r code/federated-policies/policies/site_a/* {Workspace}/site_a/local\n", + "! cp -r code/federated-policies/policies/site_b/* {Workspace}/site_b/local" + ] + }, + { + "cell_type": "markdown", + "id": "366b9749", + "metadata": {}, + "source": [ + "We can take a look at the policies for site_a\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "091c22fe", + "metadata": {}, + "outputs": [], + "source": [ + "!cat {Workspace}/site_a/local/authorization.json" + ] + }, + { + "cell_type": "markdown", + "id": "521b3607", + "metadata": {}, + "source": [ + "##### Site-a Security Policy\n", + "\n", + "the user \"org_admin\"\n", + "\n", + "| Capability | Permission Scope |\n", + "|------------------|------------------|\n", + "| submit_job | none |\n", + "| clone_job | none |\n", + "| manage_job | o:submitter |\n", + "| download_job | o:submitter |\n", + "| view | any |\n", + "| operate | o:site |\n", + "| shell_commands | o:site |\n", + "| byoc | none |\n", + "\n", + "\n", + "These table essentially set the policy for the Organization Admin \"org_admin\" \n", + "* can not submit job \n", + "* can not clone job\n", + "* can manage job (such as abort job) for the jobs that submitted by the \"job sbumitter\" from the same organization. The \"job submitter\" is the user who has the submit_job permission \n", + "* can download the jobs submitted by the same organziation \n", + "* can view any jobs\n", + "* can perform shell commands ( see job category for details) from the site of the same organization \n", + "* can not have byoc (bring your own code): customized code in the \"custom\" directory. \n", + "\n", + "Similarly we have other user role policies\n", + "\n", + "\n", + "For the **lead** user\n", + "\n", + "| Capability | Permission Scope |\n", + "|------------------|------------------|\n", + "| submit_job | o:site |\n", + "| clone_job | n:submitter |\n", + "| manage_job | n:submitter |\n", + "| download_job | n:submitter |\n", + "| view | any |\n", + "| operate | o:site |\n", + "| shell_commands | o:site |\n", + "| byoc | any |\n", + "\n", + "The user \"lead\" is a \"submitter\" that can but only can submit to its organizational own site (considering one organization has many sites)\n", + "\n", + "\n", + "\n", + "For the **member** user\n", + "\n", + "| Capability | Permission Scope |\n", + "|------------|------------------|\n", + "| view | any |\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "deb08e63", + "metadata": {}, + "source": [ + "We can take a look at the policies for \n", + "\n", + "##### Site_b privacy policy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08461d9a", + "metadata": {}, + "outputs": [], + "source": [ + "!cat {Workspace}/site_b/local/privacy.json" + ] + }, + { + "cell_type": "markdown", + "id": "319eb7a5", + "metadata": {}, + "source": [ + "| scope | default_scope | task_data_filters | task_result_filters |\n", + "|---------|----------------|-----------------------------------------|--------------------------------------------------------------------|\n", + "| public | public | | |\n", + "| test | public | test_filter.TestFilter | test_filter.TestFilter |\n", + "| private | public | test_filter.TestFilter | nvflare.app_common.filters.percentile_privacy.PercentilePrivacy |\n" + ] + }, + { + "cell_type": "markdown", + "id": "7c84b47b", + "metadata": {}, + "source": [ + "In the privacy policy, we noticed that there are different scopes can be defined. The scope-specified policy is enforced the the FLARE's filter mechanism. For each non-public scope, one can define the different filters to enforce the desired behavior. For example, the organization administrator can instrument filter to prevent certain type of data leakage accidentally exposed by data sicentists\n", + "\n", + "The filters are look like this: \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff5ac5f1", + "metadata": {}, + "outputs": [], + "source": [ + "!tree {Workspace}/site_b/local" + ] + }, + { + "cell_type": "markdown", + "id": "519dc42f", + "metadata": {}, + "source": [ + "Let's prepare the jobs. we have five different jobs each have different groups. \n", + "\n", + "##### Create Job Configs" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "26f9cf38", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/chester/projects/NVFlare/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_site_security_privacy_policy/code/federated-policies/jobs\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chester/.local/lib/python3.10/site-packages/IPython/core/magics/osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n", + " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "job-config is at /tmp/nvflare/jobs/workdir/job_1\n", + "job-config is at /tmp/nvflare/jobs/workdir/job_2\n", + "job-config is at /tmp/nvflare/jobs/workdir/job_3\n", + "job-config is at /tmp/nvflare/jobs/workdir/job_4\n", + "job-config is at /tmp/nvflare/jobs/workdir/job_5\n", + "/home/chester/projects/NVFlare/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_site_security_privacy_policy\n" + ] + } + ], + "source": [ + "%cd code/federated-policies/jobs\n", + "\n", + "! python fl_job.py\n", + "\n", + "%cd -" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9cef14a", + "metadata": {}, + "outputs": [], + "source": [ + "!cat /tmp/nvflare/jobs/workdir/job_3/meta.json" + ] + }, + { + "cell_type": "markdown", + "id": "8cc01a6e", + "metadata": {}, + "source": [ + "### Start FL System and Run Jobs\n", + "\n", + "Start POC with \n", + "\n", + "```nvflare poc start \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89b58024", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/custom/admin_auth.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/custom/admin_auth.py new file mode 100644 index 0000000000..9c6a8852f5 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/custom/admin_auth.py @@ -0,0 +1,76 @@ +# 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 getpass +import json + +import requests + +from nvflare.fuel.hci.client.event import EventContext, EventHandler, EventPropKey, EventType + + +class AdminAuth(EventHandler): + def __init__(self, orgs: dict): + # orgs is a dict of name => endpoint of the org's auth service + self.orgs = orgs + self.auth_tokens = {} + self.authentication_done = False + self.passwords = {} + + def _get_passwords_to_all_sites(self): + # This example asks the admin user to type in the password to each org. + for org_name, _ in self.orgs.items(): + password = getpass.getpass(f"Password to {org_name}:") + self.passwords[org_name] = password + + def _auth_org(self, user_name: str, org_name: str, endpoint: str) -> str: + try: + # The access token query depending on the KeyCloak user and client set up. + # We set up the user using the same admin user name for demonstrating. + payload = { + "client_id": "myclient", + "username": user_name, + "password": self.passwords[org_name], + "grant_type": "password", + } + response = requests.post(endpoint, data=payload) + token = json.loads(response.text).get("access_token") + except: + token = None + # If raising an exception here, it will prevent the admin tool connecting to the admin server + # and terminating the admin tool. + return f"{user_name}:{token}" + + def _authenticate_user_to_all_sites(self, ctx: EventContext): + user_name = ctx.get_prop(EventPropKey.USER_NAME) + for org_name, ep in self.orgs.items(): + access_token = self._auth_org(user_name, org_name, ep) + self.auth_tokens[org_name] = access_token + + def handle_event(self, event_type: str, ctx: EventContext): + if event_type == EventType.LOGIN_SUCCESS: + # called after the user is logged in successfully + # print("got event: LOGIN_SUCCESS") + if not self.authentication_done: + # print("authenticating user to orgs ...") + self._authenticate_user_to_all_sites(ctx) + elif event_type == EventType.BEFORE_EXECUTE_CMD: + cmd_name = ctx.get_prop(EventPropKey.CMD_NAME) + # print(f"got event: BEFORE_EXECUTE_CMD for cmd {cmd_name}") + if cmd_name == "submit_job": + # print(f"adding auth_tokens: {self.auth_tokens}") + ctx.set_custom_prop("auth_tokens", self.auth_tokens) + # print("added custom prop!") + elif event_type == EventType.BEFORE_LOGIN: + self._get_passwords_to_all_sites() diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/resources.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/resources.json new file mode 100644 index 0000000000..bbd34fba77 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/admin/local/resources.json @@ -0,0 +1,14 @@ +{ + "format_version": 2, + "handlers": [ + { + "id": "auth", + "path": "admin_auth.AdminAuth", + "args": { + "orgs": { + "site-1": "http://localhost:8080/realms/myrealm/protocol/openid-connect/token" + } + } + } + ] +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/data/download.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/data/download.py new file mode 100644 index 0000000000..ebd8cfdc41 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/data/download.py @@ -0,0 +1,60 @@ +# 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. + +# This Dirichlet sampling strategy for creating a heterogeneous partition is adopted +# from FedMA (https://github.com/IBM/FedMA). + +# MIT License + +# Copyright (c) 2020 International Business Machines + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import argparse + +import torchvision.datasets as datasets + +# default dataset path +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + args = parser.parse_args() + return args + + +def main(args): + datasets.CIFAR10(root=args.dataset_path, train=True, download=True) + datasets.CIFAR10(root=args.dataset_path, train=False, download=True) + + +if __name__ == "__main__": + main(define_parser()) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/fl_jobs.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/fl_jobs.py new file mode 100644 index 0000000000..e8ac41e9b9 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/fl_jobs.py @@ -0,0 +1,50 @@ +# 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 os + +from src.fedavg import FedAvg +from src.network import SimpleNetwork + +from nvflare.job_config.api import FedJob +from nvflare.job_config.script_runner import ScriptRunner + +if __name__ == "__main__": + num_clients = 2 + num_rounds = 2 + job_name = "fedavg" + train_script = "src/client.py" + config_dir = "/tmp/nvflare/jobs/workdir" + + job = FedJob(name=job_name, min_clients=num_clients) + controller = FedAvg( + stop_cond="accuracy > 25", + save_filename="global_model.pt", + initial_model=SimpleNetwork(), + num_clients=num_clients, + num_rounds=num_rounds, + ) + + job.to_server(controller) + + # Add clients + for i in range(num_clients): + executor = ScriptRunner(script=train_script, script_args="") + job.to(executor, f"site-{i + 1}") + + job_config_dir = os.path.join(config_dir, job_name) + print(f"job-config for {job_name} is at ", job_config_dir) + job.export_job(config_dir) + # job.simulator_run(config_dir) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/requirements.txt b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/requirements.txt new file mode 100644 index 0000000000..57b4df2ed4 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/requirements.txt @@ -0,0 +1,3 @@ +torch +torchvision +tensorboard \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/client.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/client.py new file mode 100644 index 0000000000..220559b3cf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/client.py @@ -0,0 +1,193 @@ +# 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 + +import torch +import torch.nn as nn +import torch.optim as optim +import torchvision +import torchvision.transforms as transforms +from network import SimpleNetwork + +# (1) import nvflare client API +import nvflare.client as flare +from nvflare.app_common.app_constant import ModelName + +# (optional) set a fix place so we don't need to download everytime +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + +# (optional) We change to use GPU to speed things up. +# if you want to use CPU, change DEVICE="cpu" +DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + parser.add_argument("--batch_size", type=int, default=4, nargs="?") + parser.add_argument("--learning_rate", type=float, default=0.001, nargs="?") + parser.add_argument("--num_workers", type=int, default=1, nargs="?") + parser.add_argument("--local_epochs", type=int, default=2, nargs="?") + parser.add_argument("--model_path", type=str, default=f"{CIFAR10_ROOT}/cifar_net.pth", nargs="?") + return parser.parse_args() + + +def main(): + # define local parameters + args = define_parser() + + dataset_path = args.dataset_path + batch_size = args.batch_size + num_workers = args.num_workers + local_epochs = args.local_epochs + model_path = args.model_path + lr = args.learning_rate + + transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) + trainset = torchvision.datasets.CIFAR10(root=dataset_path, train=True, download=True, transform=transform) + trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers) + testset = torchvision.datasets.CIFAR10(root=dataset_path, train=False, download=True, transform=transform) + testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers) + + net = SimpleNetwork() + best_accuracy = 0.0 + + # wraps evaluation logic into a method to re-use for + # evaluation on both trained and received model + def evaluate(input_weights): + net = SimpleNetwork() + net.load_state_dict(input_weights) + # (optional) use GPU to speed things up + net.to(DEVICE) + + correct = 0 + total = 0 + # since we're not training, we don't need to calculate the gradients for our outputs + with torch.no_grad(): + for data in testloader: + # (optional) use GPU to speed things up + images, labels = data[0].to(DEVICE), data[1].to(DEVICE) + # calculate outputs by running images through the network + outputs = net(images) + # the class with the highest energy is what we choose as prediction + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + return 100 * correct // total + + # (2) initialize NVFlare client API + flare.init() + + # (3) run continously when launch_once=true + while flare.is_running(): + + # (4) receive FLModel from NVFlare + input_model = flare.receive() + client_id = flare.get_site_name() + + # Based on different "task" we will do different things + # for "train" task (flare.is_train()) we use the received model to do training and/or evaluation + # and send back updated model and/or evaluation metrics, if the "train_with_evaluation" is specified as True + # in the config_fed_client we will need to do evaluation and include the evaluation metrics + # for "evaluate" task (flare.is_evaluate()) we use the received model to do evaluation + # and send back the evaluation metrics + # for "submit_model" task (flare.is_submit_model()) we just need to send back the local model + # (5) performing train task on received model + if flare.is_train(): + print(f"({client_id}) current_round={input_model.current_round}, total_rounds={input_model.total_rounds}") + + # (5.1) loads model from NVFlare + net.load_state_dict(input_model.params) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.9) + + # (optional) use GPU to speed things up + net.to(DEVICE) + # (optional) calculate total steps + steps = local_epochs * len(trainloader) + for epoch in range(local_epochs): # loop over the dataset multiple times + + running_loss = 0.0 + for i, data in enumerate(trainloader, 0): + # get the inputs; data is a list of [inputs, labels] + # (optional) use GPU to speed things up + inputs, labels = data[0].to(DEVICE), data[1].to(DEVICE) + + # zero the parameter gradients + optimizer.zero_grad() + + # forward + backward + optimize + outputs = net(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + # print statistics + running_loss += loss.item() + if i % 2000 == 1999: # print every 2000 mini-batches + print(f"({client_id}) [{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}") + running_loss = 0.0 + break + + print(f"({client_id}) Finished Training") + + # (5.2) evaluation on local trained model to save best model + local_accuracy = evaluate(net.state_dict()) + print(f"({client_id}) Evaluating local trained model. Accuracy on the 10000 test images: {local_accuracy}") + if local_accuracy > best_accuracy: + best_accuracy = local_accuracy + torch.save(net.state_dict(), model_path) + + # (5.3) evaluate on received model for model selection + accuracy = evaluate(input_model.params) + print( + f"({client_id}) Evaluating received model for model selection. Accuracy on the 10000 test images: {accuracy}" + ) + + # (5.4) construct trained FL model + output_model = flare.FLModel( + params=net.cpu().state_dict(), + metrics={"accuracy": accuracy}, + meta={"NUM_STEPS_CURRENT_ROUND": steps}, + ) + + # (5.5) send model back to NVFlare + flare.send(output_model) + + # (6) performing evaluate task on received model + elif flare.is_evaluate(): + accuracy = evaluate(input_model.params) + print(f"({client_id}) accuracy: {accuracy}") + flare.send(flare.FLModel(metrics={"accuracy": accuracy})) + + # (7) performing submit_model task to obtain best local model + elif flare.is_submit_model(): + model_name = input_model.meta["submit_model_name"] + if model_name == ModelName.BEST_MODEL: + try: + weights = torch.load(model_path) + net = SimpleNetwork() + net.load_state_dict(weights) + flare.send(flare.FLModel(params=net.cpu().state_dict())) + except Exception as e: + raise ValueError("Unable to load best model") from e + else: + raise ValueError(f"Unknown model_type: {model_name}") + + +if __name__ == "__main__": + main() diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/fedavg.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/fedavg.py new file mode 100644 index 0000000000..a63f0005bf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/fedavg.py @@ -0,0 +1,158 @@ +# 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 os +from typing import Callable, Dict, List, Optional + +import torch + +from nvflare.app_common.abstract.fl_model import FLModel +from nvflare.app_common.utils.math_utils import parse_compare_criteria +from nvflare.app_common.workflows.base_fedavg import BaseFedAvg +from nvflare.app_opt.pt.decomposers import TensorDecomposer +from nvflare.fuel.utils import fobs + + +class FedAvg(BaseFedAvg): + """Controller for FedAvg Workflow with Early Stopping and Model Selection. + + Args: + num_clients (int, optional): The number of clients. Defaults to 3. + num_rounds (int, optional): The total number of training rounds. Defaults to 5. + stop_cond (str, optional): early stopping condition based on metric. + string literal in the format of " " (e.g. "accuracy >= 80") + save_filename (str, optional): filename for saving model + initial_model (nn.Module, optional): initial PyTorch model + """ + + def __init__( + self, + *args, + stop_cond: str, + num_rounds: int, + save_filename: str = "FL_global_model.pt", + initial_model=None, + **kwargs, + ): + super().__init__(*args, **kwargs) + + self.stop_cond = stop_cond + self.num_rounds = num_rounds + + if stop_cond: + self.stop_condition = parse_compare_criteria(stop_cond) + else: + self.stop_condition = None + self.save_filename = save_filename + self.initial_model = initial_model + self.best_model: Optional[FLModel] = None + + def run(self) -> None: + self.info("Start FedAvg.") + + if self.initial_model: + # Use FOBS for serializing/deserializing PyTorch tensors (self.initial_model) + fobs.register(TensorDecomposer) + # PyTorch weights + initial_weights = self.initial_model.state_dict() + else: + initial_weights = {} + + model = FLModel(params=initial_weights) + + model.start_round = self.start_round + model.total_rounds = self.num_rounds + + for self.current_round in range(self.start_round, self.start_round + self.num_rounds): + self.info(f"Round {self.current_round} started.") + model.current_round = self.current_round + + clients = self.sample_clients(self.num_clients) + + results: List[FLModel] = self.send_model_and_wait(targets=clients, data=model) + aggregate_results = self.aggregate( + results, aggregate_fn=self.aggregate_fn + ) # using default aggregate_fn with `WeightedAggregationHelper`. Can overwrite self.aggregate_fn with signature Callable[List[FLModel], FLModel] + + model = self.update_model(model, aggregate_results) + + self.info(f"Round {self.current_round} global metrics: {model.metrics}") + + self.select_best_model(model) + + self.save_model(self.best_model, os.path.join(os.getcwd(), self.save_filename)) + + if self.should_stop(model.metrics, self.stop_condition): + self.info( + f"Stopping at round={self.current_round} out of total_rounds={self.num_rounds}. Early stop condition satisfied: {self.stop_condition}" + ) + break + + self.info("Finished FedAvg.") + + def should_stop(self, metrics: Optional[Dict] = None, stop_condition: Optional[str] = None): + if stop_condition is None or metrics is None: + return False + + key, target, op_fn = stop_condition + value = metrics.get(key, None) + + if value is None: + raise RuntimeError(f"stop criteria key '{key}' doesn't exists in metrics") + + return op_fn(value, target) + + def select_best_model(self, curr_model: FLModel): + if self.best_model is None: + self.best_model = curr_model + return + + if self.stop_condition: + metric, _, op_fn = self.stop_condition + if self.is_curr_model_better(self.best_model, curr_model, metric, op_fn): + self.info("Current model is new best model.") + self.best_model = curr_model + else: + self.best_model = curr_model + + def is_curr_model_better( + self, best_model: FLModel, curr_model: FLModel, target_metric: str, op_fn: Callable + ) -> bool: + curr_metrics = curr_model.metrics + if curr_metrics is None: + return False + if target_metric not in curr_metrics: + return False + + best_metrics = best_model.metrics + return op_fn(curr_metrics.get(target_metric), best_metrics.get(target_metric)) + + def save_model(self, model, filepath=""): + params = model.params + # PyTorch save + torch.save(params, filepath) + + # save FLModel metadata + model.params = {} + fobs.dumpf(model, filepath + ".metadata") + model.params = params + + def load_model(self, filepath=""): + # PyTorch load + params = torch.load(filepath) + + # load FLModel metadata + model = fobs.loadf(filepath + ".metadata") + model.params = params + return model diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/network.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/network.py new file mode 100644 index 0000000000..609b0b1581 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/code/src/network.py @@ -0,0 +1,37 @@ +# 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 torch +import torch.nn as nn +import torch.nn.functional as F + + +class SimpleNetwork(nn.Module): + def __init__(self): + super(SimpleNetwork, self).__init__() + self.conv1 = nn.Conv2d(3, 6, 5) + self.pool = nn.MaxPool2d(2, 2) + self.conv2 = nn.Conv2d(6, 16, 5) + self.fc1 = nn.Linear(16 * 5 * 5, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = self.pool(F.relu(self.conv1(x))) + x = self.pool(F.relu(self.conv2(x))) + x = torch.flatten(x, 1) # flatten all dimensions except batch + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/edit_site_local_resources.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/edit_site_local_resources.py new file mode 100644 index 0000000000..4b0ff4a76a --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/edit_site_local_resources.py @@ -0,0 +1,64 @@ +# 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 +import os +import sys + + +def get_security_handler() -> dict: + return json.loads( + """ + { + "id": "security_handler", + "path": "keycloak_security_handler.CustomSecurityHandler" + } + """ + ) + + +def add_components_to_json( + input_file_path, output_file_path, site: str, receiving: bool = False, streaming_to_server: bool = False +): + try: + with open(input_file_path, "r") as file: + data = json.load(file) + except (FileNotFoundError, json.JSONDecodeError): + print(f"Error: Unable to read or parse JSON file: {input_file_path}") + return + + new_components = [get_security_handler()] + + # Append new components to the list + data["components"].extend(new_components) + + # Write the updated JSON back to the file + with open(output_file_path, "w") as file: + json.dump(data, file, indent=4) + + print(f"Successfully generate file: '{output_file_path}'.") + + +if __name__ == "__main__": + + site_name = sys.argv[1] + project_root_dir = sys.argv[2] + + print(site_name, project_root_dir) + + input_file_path = os.path.join(project_root_dir, site_name, "local", "resources.json.default") + output_file_path = os.path.join(project_root_dir, site_name, "local", "resources.json") + + add_components_to_json(input_file_path, output_file_path, site_name) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/get_keycloak_access_token.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/get_keycloak_access_token.py new file mode 100644 index 0000000000..631de725ad --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/get_keycloak_access_token.py @@ -0,0 +1,69 @@ +# 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 os +import sys + +import requests + + +def save_access_token(access_token: str, destination_path): + + # Ensure the destination directory exists + os.makedirs(os.path.dirname(destination_path), exist_ok=True) + + with open(destination_path, "w") as f: + f.write(access_token) + print(f"Access token saved to {destination_path}") + + +def get_keycloak_acces_token(username, password, client_id, keycloak_url) -> str: + + # Request payload + data = {"username": username, "password": password, "grant_type": "password", "client_id": client_id} + + try: + # Make a POST request to get the access token + response = requests.post(keycloak_url, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"}) + response_data = response.json() + + # Extract the access token + access_token = response_data.get("access_token") + + if not access_token: + print("Failed to retrieve access token.") + else: + return access_token + + except Exception as e: + print(f"Error fetching access token: {e}") + + +if __name__ == "__main__": + + # Define variables + keycloak_url = "http://localhost:8080/realms/master/protocol/openid-connect/token" + username = "admin" + password = "admin123" + client_id = "admin-cli" + destination_path = sys.argv[1] + + token = get_keycloak_acces_token( + username=username, password=password, client_id=client_id, keycloak_url=keycloak_url + ) + + print("token=", token) + + save_access_token(token, destination_path=destination_path) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/docker-compose.yml b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/docker-compose.yml new file mode 100644 index 0000000000..26feecc5ec --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/docker-compose.yml @@ -0,0 +1,45 @@ +version: '3.8' + +services: + keycloak: + build: . + container_name: keycloak + environment: + - KEYCLOAK_ADMIN=admin + - KEYCLOAK_ADMIN_PASSWORD=admin123 + ports: + - "8080:8080" + volumes: + - .:/opt/keycloak-setup + depends_on: + db: + condition: service_healthy + networks: + - bridge_network + + + db: + image: postgres:15 + container_name: keycloak-db + environment: + - POSTGRES_DB=keycloak + - POSTGRES_USER=keycloak + - POSTGRES_PASSWORD=keycloak + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U keycloak"] + interval: 10s + retries: 5 + start_period: 10s + networks: + - bridge_network + +volumes: + pgdata: + +networks: + bridge_network: + driver: bridge \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/dockerfile b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/dockerfile new file mode 100644 index 0000000000..cac41467cd --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/dockerfile @@ -0,0 +1,18 @@ +FROM bitnami/keycloak:24 + +USER root + +# Install jq (and any other necessary dependencies) +RUN apt-get update && apt-get install -y jq + +# Set working directory +WORKDIR /opt/keycloak-setup + +# Copy the setup scripts to the container +COPY ./init.sh /opt/keycloak-setup/init.sh + +# Set permissions to ensure init.sh is executable +RUN chmod +x /opt/keycloak-setup/init.sh + +# Set the entrypoint +ENTRYPOINT ["/bin/sh", "-c", "/opt/bitnami/scripts/keycloak/run.sh & sleep 10 && /opt/keycloak-setup/init.sh && tail -f /dev/null"] \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/init.sh b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/init.sh new file mode 100755 index 0000000000..59708ffbf9 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak-setup/init.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# 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. + +# Wait for Keycloak to be ready +echo "Waiting for Keycloak to be ready..." +until curl -sf http://keycloak:8080/realms/master > /dev/null; do + printf '.' + sleep 5 +done + + +echo "Keycloak is ready!" + +# Get Admin Token +ACCESS_TOKEN=$(curl -s -X POST "http://keycloak:8080/realms/master/protocol/openid-connect/token" \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "username=admin" \ + -d "password=admin123" \ + -d "grant_type=password" \ + -d "client_id=admin-cli" | jq -r .access_token) + +# Create Realm +curl -X POST "http://keycloak:8080/admin/realms" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -d '{"realm": "myrealm", "enabled": true}' + +# Create User +curl -X POST "http://keycloak:8080/admin/realms/myrealm/users" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -d '{ + "username": "myuser@example.com", + "enabled": true, + "email": "myuser@example.com", + "firstName": "My", + "lastName": "User", + "credentials": [{ + "type": "password", + "value": "password123", + "temporary": false + }] + }' + +# Create Client +curl -X POST "http://keycloak:8080/admin/realms/myrealm/clients" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -d '{ + "clientId": "myclient", + "enabled": true, + "protocol": "openid-connect", + "publicClient": true, + "redirectUris": ["http://localhost:8080/*"] + }' + +echo "Setup completed!" diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak_integration.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak_integration.ipynb new file mode 100644 index 0000000000..e2761d0e32 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/keycloak_integration.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c8393461", + "metadata": {}, + "source": [ + "## Integration with external authentication system\n", + "\n", + "#### Overview\n", + "\n", + "In Federated Computing systems, many participating institutions already have their own in-house authentication systems. Instead of introducing a new authentication mechanism, we need to integrate with them. Note that this integration can be site-specific; in other words, each site may be different. Site-1 can be using OLAP, site-2 can use OAuth, and a third site can use something else.\n", + "\n", + "In this example, we demonstrate NVIDIA FLARE's event-based plugin-component that can be used to integrate any type of authentication/authorization mechanism, using open-source KeyCloak integration as an example.\n", + "\n", + "### Setup KeyCloak\n", + "\n", + "Before we start, we need to download and start the KeyCloak service. To do that, we create a [dockerfile](./examples/custom_client_side_auth_system_integration/keycloak-setup/dockerfile) and [docker-compose](./examples/custom_client_side_auth_system_integration/keycloak-setup/docker-compose.yml) file\n", + "\n", + "to start cd to ```custom_client_side_auth_system_integration/keycloak-setup``` directory and run the following command\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8dbd0c77", + "metadata": {}, + "outputs": [], + "source": [ + "%cd keycloak-setup\n", + "! docker compose up -d --build\n", + "%cd -\n" + ] + }, + { + "cell_type": "markdown", + "id": "bc6ccaa0", + "metadata": {}, + "source": [ + "#* check if the keycloak is ready \n", + "```\n", + "!docker ps\n", + "!docker logs keycloak \n", + "```\n", + "you should see something like \n", + "\n", + "```\n", + " Keycloak is ready!\n", + " ...\n", + "\n", + " Setup completed!\n", + "```\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "dd304d80", + "metadata": {}, + "source": [ + "You can also check if the website and login with credential\n", + "```\n", + "user = admin\n", + "password = admin123\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd65e072", + "metadata": {}, + "outputs": [], + "source": [ + "http://localhost:8080\n" + ] + }, + { + "cell_type": "markdown", + "id": "be7f97c7", + "metadata": {}, + "source": [ + "### Setup KeyCloak Authentication Plugin\n", + "\n", + "This integration involves two plugins: \n", + "\n", + "* At admin client during job submision, we will require the login for the given site (site-1). We also need to get the access token to pass to the job context\n", + "* one at site local, we need to plugin for job authorization\n", + "\n", + "\n", + "#### Set up FL Client Job Authorization Configuration\n", + "\n", + "First, we need to overwrite the default local resources.json.default with resources.json to add the custom security check component\n", + "\n", + " {\n", + " \"id\": \"security_handler\",\n", + " \"path\": \"keycloak_security_handler.CustomSecurityHandler\"\n", + " }\n", + "\n", + "The \"keycloak_security_handler.CustomSecurityHandler\" is defined as " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d0da496", + "metadata": {}, + "outputs": [], + "source": [ + "!cat security/custom/keycloak_security_handler.py" + ] + }, + { + "cell_type": "markdown", + "id": "8cf35e71", + "metadata": {}, + "source": [ + "We need to save the Keycloak public key in the following file:\n", + "`/tmp/nvflare/poc/example_project/prod_00/site-1/local/site-1/local/public_key.pem` \n", + "\n", + "Use this format:\n", + "\n", + "```\n", + "-----BEGIN PUBLIC KEY-----\n", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAre3kQxqOfTJ7LLRwlpotw47goqSsuyFOg9Ihx5IXDMbO8HTGuGQcdDVJaYJQYphfhp2qdw+1o6qVN2yPBxwiBWju/XZQMPbCXRBu2bVDffWJVMoelLDbr3uY9hCgYgmB7qYpDdNOmxb2+xIlg/x0q+vrRRMtdd8SGicvjg0mQSEEF4a7QOSwuDnwBX8+bMOXfyB5qQJlakNVND1Bc+MjDENkHLtImVowX9XZcz8M6Ap9Eq1z2agl6lmFxTLtZroTE6IQS/dFYPVy4rZ1Zuy5cvs/3j+SYzlplH/iP3qZs8UiKrTJMmfIuLmDbP3hEAOsEmQ/M3lRxnE4wuGxvel5rwIDAQAB\n", + "-----END PUBLIC KEY-----\n", + "```\n", + "\n", + "In the local/custom/resources.json config file, it contains the following additional security handler:\n", + "\n", + "```\n", + " {\n", + " \"id\": \"security_handler\",\n", + " \"path\": \"keycloak_security_handler.CustomSecurityHandler\"\n", + " }\n", + "```\n", + "\n", + "The CustomSecurityHandler in the custom/keycloak_security_handler.py contains the logic to validate the admin user's KeyCloak access token when the admin user submits a job, or scheduler picks up an already submitted job from the admin user. If the access token is invalid, the job will not be authorized to run.\n", + "\n", + "We can do this in the following code. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8551b25b", + "metadata": {}, + "outputs": [], + "source": [ + "# prepare poc\n", + "! echo y | nvflare poc prepare -n 2\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "636b2727", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "!python get_keycloak_access_token.py /tmp/nvflare/poc/example_project/prod_00/site-1/local/site-1/local/public_key.pem\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e8644a9", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "!python edit_site_local_resources.py site-1 /tmp/nvflare/poc/example_project/prod_00\n" + ] + }, + { + "cell_type": "markdown", + "id": "93dcf155", + "metadata": {}, + "source": [ + "\n", + "#### Set up Admin user authentication\n", + "\n", + "\n", + "In the local/custom/resources.json config file, it contains the following admin event handler. the \"orgs\" arg provides a list of site names, and it's corresponding KeyCloak access_token URLs:\n", + "\n", + "```\n", + " {\n", + " \"id\": \"auth\",\n", + " \"path\": \"admin_auth.AdminAuth\",\n", + " \"args\": {\n", + " \"orgs\": {\n", + " \"site-a\": \"http://localhost:8080/realms/myrealm/protocol/openid-connect/token\"\n", + " }\n", + " }\n", + " }\n", + "```\n", + "\n", + "The AdminAuth event handler in the custom/admin_auth.py has the logic to acquire the KeyCloak access tokens to each individual site. When the admin user submits a job, it will set the tokens in the FLContext.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89ca8b71", + "metadata": {}, + "outputs": [], + "source": [ + "! mkdir -p /tmp/nvflare/poc/example_project/prod_00/admin@nvidia.com/local/\n", + "! cp -r admin/local/* /tmp/nvflare/poc/example_project/prod_00/admin@nvidia.com/local/" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2044c070", + "metadata": {}, + "outputs": [], + "source": [ + "! cp -r site/local/* /tmp/nvflare/poc/example_project/prod_00/site-1/local/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c48462ee", + "metadata": {}, + "outputs": [], + "source": [ + "! tree /tmp/nvflare/poc/example_project/prod_00/admin@nvidia.com/local/" + ] + }, + { + "cell_type": "markdown", + "id": "e6b36385", + "metadata": {}, + "source": [ + "### Testing the setup \n", + "\n", + "start poc\n", + "\n", + "\n", + "#### Admin Console Login\n", + "\n", + "When prompted, enter the email address `admin@nvidia.com`, then provide the password for the `site-1` Keycloak instance.\n", + "\n", + "#### Authentication Requirements for Job Execution\n", + "\n", + "With this system configured, `site-1` will only allow authenticated admin users to submit and run jobs. `site-2` does not have this additional security requirement - any admin user can submit and run jobs there.\n", + "\n", + "##### Authenticated Admin Users\n", + "An admin user (`admin@nvidia.com`) who successfully authenticates with the `site-1` Keycloak system can submit and run jobs on both `site-1` and `site-2`.\n", + "\n", + "##### Unauthenticated Admin Users\n", + "If any of these occur:\n", + "- Wrong password is provided\n", + "- Keycloak system is unavailable when starting the admin tool\n", + "- Authentication fails during job submission\n", + "\n", + "Then:\n", + "- Jobs won't run on `site-1`\n", + "- `site-1` will display \"ERROR - Authorization failed\"\n", + "- Jobs can still run successfully on `site-2`\n", + "- Use `list_jobs -d JOB_ID` to view detailed job deployment information\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "40073347", + "metadata": {}, + "source": [ + "Let's try this out" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eadd3f5c", + "metadata": {}, + "outputs": [], + "source": [ + "# Prepare the data\n", + "\n", + "! python code/data/download.py" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "58688bcd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/chester/projects/NVFlare/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_site_security/custom_client_side_auth_system_integration/code\n", + "job-config for fedavg is at /tmp/nvflare/jobs/workdir/fedavg\n", + "/home/chester/projects/NVFlare/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_site_security/custom_client_side_auth_system_integration\n" + ] + } + ], + "source": [ + "# create job config\n", + "%cd code/\n", + "\n", + "! python ./fl_jobs.py\n", + "\n", + "%cd -" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "355c3624", + "metadata": {}, + "outputs": [], + "source": [ + "! nvflare simulator /tmp/nvflare/jobs/workdir/fedavg -w /tmp/nvflare/workspace/tmp" + ] + }, + { + "cell_type": "markdown", + "id": "5f3de6a0", + "metadata": {}, + "source": [ + "* Start POC without admin console\n", + "\n", + " ``` nvflare poc start -ex admin@nvidia.com```" + ] + }, + { + "cell_type": "markdown", + "id": "4228c715", + "metadata": {}, + "source": [ + "* Start POC admin console in separate terminal\n", + "\n", + " ``` nvflare poc start -p admin@nvidia.com```" + ] + }, + { + "cell_type": "markdown", + "id": "f7f2dbc4", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/custom/keycloak_security_handler.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/custom/keycloak_security_handler.py new file mode 100644 index 0000000000..0deb745b57 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/custom/keycloak_security_handler.py @@ -0,0 +1,77 @@ +# Copyright (c) 2021, 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 os +from typing import Tuple + +import jwt + +from nvflare.apis.event_type import EventType +from nvflare.apis.fl_component import FLComponent +from nvflare.apis.fl_constant import FLContextKey +from nvflare.apis.fl_context import FLContext +from nvflare.apis.job_def import JobMetaKey + + +class CustomSecurityHandler(FLComponent): + def handle_event(self, event_type: str, fl_ctx: FLContext): + if event_type == EventType.AUTHORIZE_COMMAND_CHECK: + result, reason = self.authorize(fl_ctx=fl_ctx) + if not result: + fl_ctx.set_prop(FLContextKey.AUTHORIZATION_RESULT, False, sticky=False) + fl_ctx.set_prop(FLContextKey.AUTHORIZATION_REASON, reason, sticky=False) + + def _validate_token(self, token, fl_ctx: FLContext): + try: + workspace_root = fl_ctx.get_prop(FLContextKey.WORKSPACE_ROOT) + public_key_file = os.path.join(workspace_root, "local/public_key.pem") + with open(public_key_file, "r") as f: + public_key = f.read() + + # This JWT decode is depending on the KeyCloak set up, which uses the proper algorithm and audience for + # the access token decode. + access_token_json = jwt.decode( + token, public_key, algorithms=["RS256"], audience="account", options={"verify_signature": True} + ) + # access_token_json contains more information regarding the access token. The sample code here + # only extracts the "preferred_username" for demonstrating purpose to indicate token valid or not. + user_name = access_token_json.get("preferred_username") + if user_name: + token_valid = True + else: + token_valid = False + except: + token_valid = False + + # print(f"_validate_token: {token_valid}") + return token_valid + + def authorize(self, fl_ctx: FLContext) -> Tuple[bool, str]: + command = fl_ctx.get_prop(FLContextKey.COMMAND_NAME) + if command in ["check_resources", "submit_job"]: + security_items = fl_ctx.get_prop(FLContextKey.SECURITY_ITEMS) + job_meta = security_items.get(FLContextKey.JOB_META) + auth_tokens = job_meta.get(JobMetaKey.CUSTOM_PROPS, {}).get("auth_tokens") + if not auth_tokens: + return False, f"Not authorized to execute command: {command}" + + site_name = fl_ctx.get_identity_name() + site_auth_token = auth_tokens.get(site_name).split(":")[1] + + if not self._validate_token(site_auth_token, fl_ctx): + return False, f"Not authorized to execute command: {command}" + else: + return True, "" + else: + return True, "" diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/resources.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/resources.json new file mode 100644 index 0000000000..2281f704d8 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_auth_system_integration/site/local/resources.json @@ -0,0 +1,26 @@ +{ + "format_version": 2, + "client": { + "retry_timeout": 30, + "compression": "Gzip" + }, + "components": [ + { + "id": "resource_manager", + "path": "nvflare.app_common.resource_managers.gpu_resource_manager.GPUResourceManager", + "args": { + "num_of_gpus": 0, + "mem_per_gpu_in_GiB": 0 + } + }, + { + "id": "resource_consumer", + "path": "nvflare.app_common.resource_consumers.gpu_resource_consumer.GPUResourceConsumer", + "args": {} + }, + { + "id": "security_handler", + "path": "keycloak_security_handler.CustomSecurityHandler" + } + ] +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/client_side_security_check.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/client_side_security_check.ipynb new file mode 100644 index 0000000000..1c263d11ff --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/client_side_security_check.ipynb @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e0053b6f", + "metadata": {}, + "source": [ + "## Client Side: Customized Job-level Auhtorization\n", + "\n", + "Let's take a look at authorization on the client side.\n", + "\n", + "**Setup**\n", + "\n", + "* `server`: NVFlare server\n", + "* `site-1`: Site-1 has a CustomSecurityHandler set up which does not allow the job \"secret-job\" to run. All other jobs will be able to deploy and run on site-1.\n", + "* `site-2`: Site-2 allows any job to be deployed and run.\n", + "\n", + "**Expectation**\n", + "* \"secret-job\" will be deployed and run on site-2 but not on site-1\n", + "\n", + "\n", + "What we will do: \n", + "\n", + "* Install dependencies\n", + "* Download data\n", + "* Generate two job configs using fl_jobs.py\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a9cd2a1", + "metadata": {}, + "outputs": [], + "source": [ + "# install dependencies\n", + "\n", + "! pip install -r code/requirements.txt\n", + "\n", + "# download data\n", + "\n", + "! python code/data/download.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c49a6ea6", + "metadata": {}, + "outputs": [], + "source": [ + "%cd code\n", + "\n", + "! python fl_jobs.py\n", + "\n", + "# change back\n", + "%cd - \n" + ] + }, + { + "cell_type": "markdown", + "id": "b06fce58", + "metadata": {}, + "source": [ + "Next, we will:\n", + "* Create a POC workspace\n", + "* Install the customized security handler to site-1\n", + "* Edit site-1/local/resources.json to add security handler component \n", + "> Note: \n", + " To simplify, we just copy the pre-edited resources.json to that location\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15ec4aee", + "metadata": {}, + "outputs": [], + "source": [ + "# prepare poc\n", + "! echo y | nvflare poc prepare -n 2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c1856aff", + "metadata": {}, + "outputs": [], + "source": [ + "# cp security handler and component config\n", + "!cp -r security/site-1/* /tmp/nvflare/poc/example_project/prod_00/site-1/local/.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b1699805", + "metadata": {}, + "source": [ + "Now we are ready to run the job.\n", + "\n", + "* Start POC\n", + "\n", + " Use a terminal (not notebook cell) to start the POC with the following command:\n", + "\n", + " ```\n", + " nvflare poc start -ex admin@nvidia.com \n", + " ```\n", + "\n", + " This will bring up the FL system.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79e8d608", + "metadata": {}, + "outputs": [], + "source": [ + "# Submit jobs\n", + "# Assuming at this point FL system is already running via poc start command\n", + "\n", + "! nvflare job submit -j /tmp/nvflare/jobs/workdir/fedavg\n", + "\n", + "# The job should finish as expected" + ] + }, + { + "cell_type": "markdown", + "id": "c82c3ba6", + "metadata": {}, + "source": [ + "The fedavg job completed successfully. Now let's submit \"secret-job\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1872ca6", + "metadata": {}, + "outputs": [], + "source": [ + "# Submit jobs\n", + "# Assuming at this point FL system is already running via poc start command\n", + "\n", + "! nvflare job submit -j /tmp/nvflare/jobs/workdir/secret-job" + ] + }, + { + "cell_type": "markdown", + "id": "97480fa8", + "metadata": {}, + "source": [ + "you should get something like\n", + "\n", + "```\n", + "2025-02-02 20:31:03,494 - site_security - ERROR - Authorization failed. Reason: Not authorized to execute: check_resources\n", + "2025-02-02 20:31:03,496 - ServerEngine - ERROR - Client reply error: Not authorized to execute: check_resources\n", + "\n", + "```\n", + "\n", + "* Cleanup " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b0a4532", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "! nvflare poc stop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8cf83674", + "metadata": {}, + "outputs": [], + "source": [ + "! nvflare poc clean" + ] + } + ], + "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/data/download.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/data/download.py new file mode 100644 index 0000000000..ebd8cfdc41 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/data/download.py @@ -0,0 +1,60 @@ +# 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. + +# This Dirichlet sampling strategy for creating a heterogeneous partition is adopted +# from FedMA (https://github.com/IBM/FedMA). + +# MIT License + +# Copyright (c) 2020 International Business Machines + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import argparse + +import torchvision.datasets as datasets + +# default dataset path +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + args = parser.parse_args() + return args + + +def main(args): + datasets.CIFAR10(root=args.dataset_path, train=True, download=True) + datasets.CIFAR10(root=args.dataset_path, train=False, download=True) + + +if __name__ == "__main__": + main(define_parser()) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/fl_jobs.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/fl_jobs.py new file mode 100644 index 0000000000..7b06885471 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/fl_jobs.py @@ -0,0 +1,51 @@ +# 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 os + +from src.fedavg import FedAvg +from src.network import SimpleNetwork + +from nvflare.job_config.api import FedJob +from nvflare.job_config.script_runner import ScriptRunner + +if __name__ == "__main__": + num_clients = 2 + num_rounds = 2 + job_names = ["fedavg", "secret-job"] + train_script = "src/client.py" + config_dir = "/tmp/nvflare/jobs/workdir" + + for job_name in job_names: + job = FedJob(name=job_name, min_clients=num_clients) + controller = FedAvg( + stop_cond="accuracy > 25", + save_filename="global_model.pt", + initial_model=SimpleNetwork(), + num_clients=num_clients, + num_rounds=num_rounds, + ) + + job.to_server(controller) + + # Add clients + for i in range(num_clients): + executor = ScriptRunner(script=train_script, script_args="") + job.to(executor, f"site-{i + 1}") + + job_config_dir = os.path.join(config_dir, job_name) + print(f"job-config for {job_name} is at ", job_config_dir) + job.export_job(config_dir) + # job.simulator_run(config_dir) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/requirements.txt b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/requirements.txt new file mode 100644 index 0000000000..57b4df2ed4 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/requirements.txt @@ -0,0 +1,3 @@ +torch +torchvision +tensorboard \ No newline at end of file diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/client.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/client.py new file mode 100644 index 0000000000..220559b3cf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/client.py @@ -0,0 +1,193 @@ +# 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 + +import torch +import torch.nn as nn +import torch.optim as optim +import torchvision +import torchvision.transforms as transforms +from network import SimpleNetwork + +# (1) import nvflare client API +import nvflare.client as flare +from nvflare.app_common.app_constant import ModelName + +# (optional) set a fix place so we don't need to download everytime +CIFAR10_ROOT = "/tmp/nvflare/data/cifar10" + +# (optional) We change to use GPU to speed things up. +# if you want to use CPU, change DEVICE="cpu" +DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + +def define_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--dataset_path", type=str, default=CIFAR10_ROOT, nargs="?") + parser.add_argument("--batch_size", type=int, default=4, nargs="?") + parser.add_argument("--learning_rate", type=float, default=0.001, nargs="?") + parser.add_argument("--num_workers", type=int, default=1, nargs="?") + parser.add_argument("--local_epochs", type=int, default=2, nargs="?") + parser.add_argument("--model_path", type=str, default=f"{CIFAR10_ROOT}/cifar_net.pth", nargs="?") + return parser.parse_args() + + +def main(): + # define local parameters + args = define_parser() + + dataset_path = args.dataset_path + batch_size = args.batch_size + num_workers = args.num_workers + local_epochs = args.local_epochs + model_path = args.model_path + lr = args.learning_rate + + transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) + trainset = torchvision.datasets.CIFAR10(root=dataset_path, train=True, download=True, transform=transform) + trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers) + testset = torchvision.datasets.CIFAR10(root=dataset_path, train=False, download=True, transform=transform) + testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers) + + net = SimpleNetwork() + best_accuracy = 0.0 + + # wraps evaluation logic into a method to re-use for + # evaluation on both trained and received model + def evaluate(input_weights): + net = SimpleNetwork() + net.load_state_dict(input_weights) + # (optional) use GPU to speed things up + net.to(DEVICE) + + correct = 0 + total = 0 + # since we're not training, we don't need to calculate the gradients for our outputs + with torch.no_grad(): + for data in testloader: + # (optional) use GPU to speed things up + images, labels = data[0].to(DEVICE), data[1].to(DEVICE) + # calculate outputs by running images through the network + outputs = net(images) + # the class with the highest energy is what we choose as prediction + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + return 100 * correct // total + + # (2) initialize NVFlare client API + flare.init() + + # (3) run continously when launch_once=true + while flare.is_running(): + + # (4) receive FLModel from NVFlare + input_model = flare.receive() + client_id = flare.get_site_name() + + # Based on different "task" we will do different things + # for "train" task (flare.is_train()) we use the received model to do training and/or evaluation + # and send back updated model and/or evaluation metrics, if the "train_with_evaluation" is specified as True + # in the config_fed_client we will need to do evaluation and include the evaluation metrics + # for "evaluate" task (flare.is_evaluate()) we use the received model to do evaluation + # and send back the evaluation metrics + # for "submit_model" task (flare.is_submit_model()) we just need to send back the local model + # (5) performing train task on received model + if flare.is_train(): + print(f"({client_id}) current_round={input_model.current_round}, total_rounds={input_model.total_rounds}") + + # (5.1) loads model from NVFlare + net.load_state_dict(input_model.params) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.9) + + # (optional) use GPU to speed things up + net.to(DEVICE) + # (optional) calculate total steps + steps = local_epochs * len(trainloader) + for epoch in range(local_epochs): # loop over the dataset multiple times + + running_loss = 0.0 + for i, data in enumerate(trainloader, 0): + # get the inputs; data is a list of [inputs, labels] + # (optional) use GPU to speed things up + inputs, labels = data[0].to(DEVICE), data[1].to(DEVICE) + + # zero the parameter gradients + optimizer.zero_grad() + + # forward + backward + optimize + outputs = net(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + # print statistics + running_loss += loss.item() + if i % 2000 == 1999: # print every 2000 mini-batches + print(f"({client_id}) [{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}") + running_loss = 0.0 + break + + print(f"({client_id}) Finished Training") + + # (5.2) evaluation on local trained model to save best model + local_accuracy = evaluate(net.state_dict()) + print(f"({client_id}) Evaluating local trained model. Accuracy on the 10000 test images: {local_accuracy}") + if local_accuracy > best_accuracy: + best_accuracy = local_accuracy + torch.save(net.state_dict(), model_path) + + # (5.3) evaluate on received model for model selection + accuracy = evaluate(input_model.params) + print( + f"({client_id}) Evaluating received model for model selection. Accuracy on the 10000 test images: {accuracy}" + ) + + # (5.4) construct trained FL model + output_model = flare.FLModel( + params=net.cpu().state_dict(), + metrics={"accuracy": accuracy}, + meta={"NUM_STEPS_CURRENT_ROUND": steps}, + ) + + # (5.5) send model back to NVFlare + flare.send(output_model) + + # (6) performing evaluate task on received model + elif flare.is_evaluate(): + accuracy = evaluate(input_model.params) + print(f"({client_id}) accuracy: {accuracy}") + flare.send(flare.FLModel(metrics={"accuracy": accuracy})) + + # (7) performing submit_model task to obtain best local model + elif flare.is_submit_model(): + model_name = input_model.meta["submit_model_name"] + if model_name == ModelName.BEST_MODEL: + try: + weights = torch.load(model_path) + net = SimpleNetwork() + net.load_state_dict(weights) + flare.send(flare.FLModel(params=net.cpu().state_dict())) + except Exception as e: + raise ValueError("Unable to load best model") from e + else: + raise ValueError(f"Unknown model_type: {model_name}") + + +if __name__ == "__main__": + main() diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/fedavg.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/fedavg.py new file mode 100644 index 0000000000..a63f0005bf --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/fedavg.py @@ -0,0 +1,158 @@ +# 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 os +from typing import Callable, Dict, List, Optional + +import torch + +from nvflare.app_common.abstract.fl_model import FLModel +from nvflare.app_common.utils.math_utils import parse_compare_criteria +from nvflare.app_common.workflows.base_fedavg import BaseFedAvg +from nvflare.app_opt.pt.decomposers import TensorDecomposer +from nvflare.fuel.utils import fobs + + +class FedAvg(BaseFedAvg): + """Controller for FedAvg Workflow with Early Stopping and Model Selection. + + Args: + num_clients (int, optional): The number of clients. Defaults to 3. + num_rounds (int, optional): The total number of training rounds. Defaults to 5. + stop_cond (str, optional): early stopping condition based on metric. + string literal in the format of " " (e.g. "accuracy >= 80") + save_filename (str, optional): filename for saving model + initial_model (nn.Module, optional): initial PyTorch model + """ + + def __init__( + self, + *args, + stop_cond: str, + num_rounds: int, + save_filename: str = "FL_global_model.pt", + initial_model=None, + **kwargs, + ): + super().__init__(*args, **kwargs) + + self.stop_cond = stop_cond + self.num_rounds = num_rounds + + if stop_cond: + self.stop_condition = parse_compare_criteria(stop_cond) + else: + self.stop_condition = None + self.save_filename = save_filename + self.initial_model = initial_model + self.best_model: Optional[FLModel] = None + + def run(self) -> None: + self.info("Start FedAvg.") + + if self.initial_model: + # Use FOBS for serializing/deserializing PyTorch tensors (self.initial_model) + fobs.register(TensorDecomposer) + # PyTorch weights + initial_weights = self.initial_model.state_dict() + else: + initial_weights = {} + + model = FLModel(params=initial_weights) + + model.start_round = self.start_round + model.total_rounds = self.num_rounds + + for self.current_round in range(self.start_round, self.start_round + self.num_rounds): + self.info(f"Round {self.current_round} started.") + model.current_round = self.current_round + + clients = self.sample_clients(self.num_clients) + + results: List[FLModel] = self.send_model_and_wait(targets=clients, data=model) + aggregate_results = self.aggregate( + results, aggregate_fn=self.aggregate_fn + ) # using default aggregate_fn with `WeightedAggregationHelper`. Can overwrite self.aggregate_fn with signature Callable[List[FLModel], FLModel] + + model = self.update_model(model, aggregate_results) + + self.info(f"Round {self.current_round} global metrics: {model.metrics}") + + self.select_best_model(model) + + self.save_model(self.best_model, os.path.join(os.getcwd(), self.save_filename)) + + if self.should_stop(model.metrics, self.stop_condition): + self.info( + f"Stopping at round={self.current_round} out of total_rounds={self.num_rounds}. Early stop condition satisfied: {self.stop_condition}" + ) + break + + self.info("Finished FedAvg.") + + def should_stop(self, metrics: Optional[Dict] = None, stop_condition: Optional[str] = None): + if stop_condition is None or metrics is None: + return False + + key, target, op_fn = stop_condition + value = metrics.get(key, None) + + if value is None: + raise RuntimeError(f"stop criteria key '{key}' doesn't exists in metrics") + + return op_fn(value, target) + + def select_best_model(self, curr_model: FLModel): + if self.best_model is None: + self.best_model = curr_model + return + + if self.stop_condition: + metric, _, op_fn = self.stop_condition + if self.is_curr_model_better(self.best_model, curr_model, metric, op_fn): + self.info("Current model is new best model.") + self.best_model = curr_model + else: + self.best_model = curr_model + + def is_curr_model_better( + self, best_model: FLModel, curr_model: FLModel, target_metric: str, op_fn: Callable + ) -> bool: + curr_metrics = curr_model.metrics + if curr_metrics is None: + return False + if target_metric not in curr_metrics: + return False + + best_metrics = best_model.metrics + return op_fn(curr_metrics.get(target_metric), best_metrics.get(target_metric)) + + def save_model(self, model, filepath=""): + params = model.params + # PyTorch save + torch.save(params, filepath) + + # save FLModel metadata + model.params = {} + fobs.dumpf(model, filepath + ".metadata") + model.params = params + + def load_model(self, filepath=""): + # PyTorch load + params = torch.load(filepath) + + # load FLModel metadata + model = fobs.loadf(filepath + ".metadata") + model.params = params + return model diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/network.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/network.py new file mode 100644 index 0000000000..609b0b1581 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/code/src/network.py @@ -0,0 +1,37 @@ +# 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 torch +import torch.nn as nn +import torch.nn.functional as F + + +class SimpleNetwork(nn.Module): + def __init__(self): + super(SimpleNetwork, self).__init__() + self.conv1 = nn.Conv2d(3, 6, 5) + self.pool = nn.MaxPool2d(2, 2) + self.conv2 = nn.Conv2d(6, 16, 5) + self.fc1 = nn.Linear(16 * 5 * 5, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = self.pool(F.relu(self.conv1(x))) + x = self.pool(F.relu(self.conv2(x))) + x = torch.flatten(x, 1) # flatten all dimensions except batch + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/custom/security_handler.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/custom/security_handler.py new file mode 100644 index 0000000000..84a8f58a8b --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/custom/security_handler.py @@ -0,0 +1,42 @@ +# 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. + +from typing import Tuple + +from nvflare.apis.event_type import EventType +from nvflare.apis.fl_component import FLComponent +from nvflare.apis.fl_constant import FLContextKey +from nvflare.apis.fl_context import FLContext +from nvflare.apis.job_def import JobMetaKey + + +class CustomSecurityHandler(FLComponent): + def handle_event(self, event_type: str, fl_ctx: FLContext): + if event_type == EventType.AUTHORIZE_COMMAND_CHECK: + result, reason = self.authorize(fl_ctx=fl_ctx) + if not result: + fl_ctx.set_prop(FLContextKey.AUTHORIZATION_RESULT, False, sticky=False) + fl_ctx.set_prop(FLContextKey.AUTHORIZATION_REASON, reason, sticky=False) + + def authorize(self, fl_ctx: FLContext) -> Tuple[bool, str]: + command = fl_ctx.get_prop(FLContextKey.COMMAND_NAME) + if command in ["check_resources"]: + security_items = fl_ctx.get_prop(FLContextKey.SECURITY_ITEMS) + job_meta = security_items.get(FLContextKey.JOB_META) + if job_meta.get(JobMetaKey.JOB_NAME) == "secret-job": + return False, f"Not authorized to execute: {command}" + else: + return True, "" + else: + return True, "" diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/resources.json b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/resources.json new file mode 100644 index 0000000000..14c465df84 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_client_side_job_level_authorization/security/site-1/resources.json @@ -0,0 +1,36 @@ +{ + "format_version": 2, + "client": { + "retry_timeout": 30, + "compression": "Gzip" + }, + "components": [ + { + "id": "resource_manager", + "path": "nvflare.app_common.resource_managers.gpu_resource_manager.GPUResourceManager", + "args": { + "num_of_gpus": 0, + "mem_per_gpu_in_GiB": 0 + } + }, + { + "id": "resource_consumer", + "path": "nvflare.app_common.resource_consumers.gpu_resource_consumer.GPUResourceConsumer", + "args": {} + }, + { + "id": "process_launcher", + "path": "nvflare.app_common.job_launcher.client_process_launcher.ClientProcessJobLauncher", + "args": {} + }, + { + "id": "error_log_sender", + "path": "nvflare.app_common.logging.log_sender.ErrorLogSender", + "args": {} + }, + { + "id": "security_handler", + "path": "security_handler.CustomSecurityHandler" + } + ] +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/edit_site_local_resources.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/edit_site_local_resources.py new file mode 100644 index 0000000000..d5faa325ca --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/edit_site_local_resources.py @@ -0,0 +1,64 @@ +# 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 +import os +import sys + + +def get_security_handler() -> dict: + return json.loads( + """ + { + "id": "security_handler", + "path": "security_handler.ServerCustomSecurityHandler" + } + """ + ) + + +def add_components_to_json(input_file_path, output_file_path, site: str): + + try: + with open(input_file_path, "r") as file: + data = json.load(file) + except (FileNotFoundError, json.JSONDecodeError): + print("Error: Unable to read or parse JSON file.") + return + + if "components" not in data or not isinstance(data["components"], list): + print("Error: 'components' key not found or is not a list.") + return + + new_components = [get_security_handler()] + + # Append new components to the list + data["components"].extend(new_components) + + # Write the updated JSON back to the file + with open(output_file_path, "w") as file: + json.dump(data, file, indent=4) + + print(f"Successfully generate file: '{output_file_path}'.") + + +if __name__ == "__main__": + + site_name = sys.argv[1] + project_root_dir = sys.argv[2] + + input_file_path = os.path.join(project_root_dir, site_name, "local", "resources.json.default") + output_file_path = os.path.join(project_root_dir, site_name, "local", "resources.json") + add_components_to_json(input_file_path, output_file_path, site_name) diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/security/server/custom/security_handler.py b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/security/server/custom/security_handler.py new file mode 100644 index 0000000000..33348e971a --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/security/server/custom/security_handler.py @@ -0,0 +1,30 @@ +# 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. + +from nvflare.apis.event_type import EventType +from nvflare.apis.fl_component import FLComponent +from nvflare.apis.fl_context import FLContext +from nvflare.apis.fl_exception import NotAuthenticated + + +class ServerCustomSecurityHandler(FLComponent): + def handle_event(self, event_type: str, fl_ctx: FLContext): + if event_type == EventType.CLIENT_REGISTER_RECEIVED: + self.authenticate(fl_ctx=fl_ctx) + + def authenticate(self, fl_ctx: FLContext): + peer_ctx: FLContext = fl_ctx.get_peer_context() + client_name = peer_ctx.get_identity_name() + if client_name == "site-2": + raise NotAuthenticated("site-2 not allowed to register") diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/server_side_security_plugin.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/server_side_security_plugin.ipynb new file mode 100644 index 0000000000..7a0497ca2a --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/custom_server_side_authentication/server_side_security_plugin.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c1f37174", + "metadata": {}, + "source": [ + "# Server Side Customized Authentication\n", + "\n", + "In this example, we will demonstrate how to design a custom plugin with additional authentication checks.\n", + "As a result, in this POC with two sites, site-2 will NOT be able to start and register with the server. It will be blocked by the ServerCustomSecurityHandler logic during client registration.\n", + "\n", + "## Define a server side security handler\n", + "\n", + "Note that the customized handler raises NotAuthenticated(\"site_2 not allowed to register\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "235ed0fa", + "metadata": {}, + "outputs": [], + "source": [ + "!cat security/server/custom/security_handler.py" + ] + }, + { + "cell_type": "markdown", + "id": "58c8f45a", + "metadata": {}, + "source": [ + "\n", + "To register this plugin handler, we need to add this component to the server site's local configuration\n", + "by adding it to the components array:\n", + "\n", + "```\n", + " components: [\n", + " ...\n", + " {\n", + " \"id\": \"security_handler\",\n", + " \"path\": \"security_handler.ServerCustomSecurityHandler\"\n", + " }\n", + " ] \n", + "``` \n", + "\n", + "In this example, we will copy the \"custom\" folder and use the Python script `edit_site_local_resources.py` to create \"resources.json\" in the site local directory.\n", + "\n", + "> Note: \n", + "You don't need to use the Python code to generate this resources.json. You can manually create resources.json by copying from or renaming \"resources.json.default\", then adding the above component element.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5bfe22f", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "! echo y | nvflare poc prepare" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4c63cb5a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "!cp -r security/server/* /tmp/nvflare/poc/example_project/prod_00/server/local/.\n", + "!python edit_site_local_resources.py server /tmp/nvflare/poc/example_project/prod_00" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d425be8", + "metadata": {}, + "outputs": [], + "source": [ + "# double check\n", + "! tree /tmp/nvflare/poc/example_project/prod_00/server/local/ " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a3eeae9", + "metadata": {}, + "outputs": [], + "source": [ + "!cat /tmp/nvflare/poc/example_project/prod_00/server/local/resources.json" + ] + }, + { + "cell_type": "markdown", + "id": "eb6e964e", + "metadata": {}, + "source": [ + "Now, go to a terminal and try to start FL system with \n", + "\n", + "```\n", + "\n", + "nvflare poc start -ex admin@nvidia.com\n", + "```\n", + "\n", + "See what happens" + ] + }, + { + "cell_type": "markdown", + "id": "f33e482c", + "metadata": {}, + "source": [ + "You should see something like this: \n", + "\n", + "\n", + "```\n", + "2025-02-02 16:35:40,059 - Communicator - INFO - Trying to register with server ...\n", + "2025-02-02 16:35:40,060 - ServerCustomSecurityHandler - ERROR - [identity=server, run=?, peer=site-2, peer_run=?] - Exception when handling event \"_client_register_received\": NotAuthenticated: site-2 not allowed to register\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84ab1ecd", + "metadata": {}, + "outputs": [], + "source": [ + "# Clean up\n", + "! nvflare poc stop\n", + "! nvflare poc clean" + ] + } + ], + "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/customized_site_security.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/customized_site_security.ipynb new file mode 100644 index 0000000000..13f321b533 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_customized_site_security/customized_site_security.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0e725a2d-af59-43ae-8ef8-aeabe5581d4b", + "metadata": {}, + "source": [ + "# Site-specific Authentication and Federated Job-level Authorization\n", + "\n", + "Site-specific authentication and authorization allows users to inject their own authentication and authorization methods into the NVFlare system. This includes the FL server / clients registration, authentication, and the job deployment and run authorization.\n", + "\n", + "NVFlare provides a general purpose event based pluggable authentication and authorization framework to allow for expanding functionality such as:\n", + "\n", + "* exposing the app through a WAF (Web Application Firewall) or any other network element enforcing Mutual Transport Layer Security(mTLS)\n", + "\n", + "* using a confidential certification authority to ensure the identity of each participating site and to ensure that they meet the computing requirements for confidential computing\n", + "\n", + "* defining additional roles to manage who can submit which kind of jobs to execute within NVFlare, identify who submits jobs and which dataset can be accessed\n", + "\n", + "Users can write their own FLComponents, listening to the NVFlare system events at different points of their workflow, then easily plug in their authentication and authorization logic as needed.\n", + "\n", + "### Assumptions and Risks\n", + "By enabling the customized site-specific authentication and authorization, NVFlare will make several security related data available to the external FL components, e.g. IDENTITY_NAME, PUBLIC_KEY, CERTIFICATE, etc. In order to protect them from being compromised, that data needs to be made read-only.\n", + "\n", + "Because of the external pluginable authentication and authorization processes, the results of the processes could potentially cause the jobs to not be able to be deployed or run. When configuring and using these functions, the users need to be aware of the impact and know where to plug in the authentication and authorization check.\n", + "\n", + "### Event based pluginable authentication and authorization\n", + "The NVFlare event based solution supports site-specific authentication and federated job-level authorization. Users can provide and implement any sort of additional security checks by building and plugging in FLcomponents which listen to the appropriate events and provide custom authentication and authorization functions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "928772df", + "metadata": {}, + "source": [ + "Lets look these mechanism via \n", + "\n", + "* [Customized Server Side Security Check](./custom_server_side_authentication/server_side_security_plugin.ipynb)\n", + "* [Customized Client side job-level check](./custom_client_side_job_level_authorization/client_side_security_check.ipynb)\n", + "* [client side 3rd party authentication integration](./custom_client_side_auth_system_integration/keycloak_integration.ipynb)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa94cace", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_local_security_policy/local_security_policy.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_local_security_policy/local_security_policy.ipynb deleted file mode 100644 index dc76018c81..0000000000 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.3_local_security_policy/local_security_policy.ipynb +++ /dev/null @@ -1,33 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "ef224801-e14b-4b8e-92bb-1643364fbef9", - "metadata": {}, - "outputs": [], - "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_communication_security/communication_security.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_communication_security/communication_security.ipynb new file mode 100644 index 0000000000..c99b3bd7c0 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_communication_security/communication_security.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Connection and Message Security\n", + "\n", + "For mutual TLS, FLARE's message security works as follows: the server and client authenticate each other when establishing direct connections. This ensures that only clients with the correct startup kits can connect to the server.\n", + "\n", + "However mutual TLS may be hard for some customers due to their IT infrastructure policies. To enable customers to use their own connectivity solution, Flare now supports **BYOConn** (bring your own connectivity). \n", + "\n", + "Customer provided connectivity solution must meet the following requirements:\n", + "\n", + "* A client must be able to reach the server. The client and the server do not have to be connected directly. Any number of proxies can be used to provide the communication path between the client and the server.\n", + "* The communication path between the client and the server must ensure the confidentiality and integrity of messages.\n", + "\n", + "Since the connectivity solution may expose the server to the internet and allow anyone to connect to the server, it is important to ensure that messages sent to the server are explicitly authenticated.\n", + "\n", + "Flare supports explicit message authentication: messages received by the server must have an auth token, and the token must be validated successfully to prove that it was issued by the server.\n", + "\n", + "\n", + "Here is how it works:\n", + "\n", + "* The very first thing after the client is started is to login to the server. The server and the client authenticate each other explicitly with the credentials in their startup kits. This step is independent of how the client and the server are connected (mTLS or normal TLS).\n", + "\n", + "* If the client credential is validated successfully, the server issues a token and a signature that binds the client name and token together. The signature is generated with the server's private key to prove that the signature can only be issued by the server.\n", + "\n", + "* When sending a message to the server, the client adds its name, token and the signature as headers to the message.\n", + "\n", + "* When the message is received, the server validates the token and the signature. Messages that are missing these headers or fail to validate will be rejected.\n", + "\n", + "\n", + "Note that this mechanism is based on the security of the startup kits: login processing and token signature are performed using the PKI credentials in the startup kits of the sites. All sites must protect their startup kits securely, and never share the received token and signature with others.\n", + "\n", + "\n", + "Message authentication applies to ALL messages that go through the Server, regardless of how the message is initiated (by FL clients, 3rd-party systems using client API, and even by the server itself). \n", + "\n", + "-------\n", + "## Provision Connection Security\n", + "\n", + "\n", + "The Provision system now allows you to specify connection security explicitly for each site. \n", + "\n", + "\n", + "**TLS**\n", + "\n", + "This is normal TLS (i.e. 1-way SSL). While client certificates are not required for establishing the connection, a Root Certificate is required to validate the server. You can provide a custom root cert for validating the server (usually the endpoint that represents the server, and the server is actually behind that endpoint). If you do not provide a custom root certificate, the root cert generated by the Provision tool will be used.\n", + "\n", + "\n", + "\n", + "**mTLS**\n", + "\n", + "\n", + "This is mutual TLS (i.e. 2-way SSL). PKI credentials in the startup kits will be used for client/server connections.\n", + "\n", + "\n", + ">TLS and mTLS use two different ways for authenticating the peers. In TLS, client authenticates the server, but the server does not authenticate the client. TLS is also called one-way SSL. During the SSL handshake, server has to present evidence signed with its private key; and the client has to be able to validate the evidence with the server's public key (usually contained in the server's certificate). But the client does not need to present anything to the server.\n", + "\n", + "In mTLS, client and server authenticate each other, meaning that they must present evidence signed with their private key and they must be able to validate the evidence with each other's public key.\n", + "\n", + "So both sites using TLS doesn't mean mTLS. In fact, both sites must use the same mode (mTLS or TLS) at the same time.\n", + "\n", + "\n", + "**Clear**\n", + "\n", + "\n", + "Messages are not encrypted, and this is usually used when the server is deployed behind a proxy, and the communication between the proxy and the server is in clear text.\n", + "\n", + "\n", + "### Configuration\n", + "\n", + "\n", + "To configure connection security, you need to define the connection_security\n", + "and the custom_ca_cert property. You can define them at the project level and participant level. \n", + "\n", + "Here is a snippet that shows how to use these properties:\n", + "\n", + "```yaml\n", + "\n", + "api_version: 3\n", + "name: test25\n", + "description: NVIDIA FLARE sample project yaml file\n", + "connection_security: tls\n", + "custom_ca_cert: /path/of/customRoot.pem\n", + "\n", + "\n", + "participants:\n", + " # change example.com to the FQDN of the server\n", + " - name: server\n", + " type: server\n", + " org: nvidia\n", + " fed_learn_port: 8002\n", + " admin_port: 8003\n", + " connection_security: clear\n", + " - name: site-1\n", + " type: client\n", + " org: nvidia\n", + "\n", + "```\n", + "\n", + "In this example, the default connection security for the project is “tls” since it’s specified at the project level. However the server is configured to be “clear” since it is behind a secure proxy. All clients will use “tls” to connect to the proxy. The “custom_ca_cert” is actually the cert for the clients to validate the proxy server.\n", + "\n", + "The custom_ca_cert property is only used for server authentication when making a TLS connection. If not specified, the root CA cert generated by the Provision System will be used.\n", + "\n", + "If connection_security is not specified, the default will be mTLS.\n", + "\n", + "### When to Use Custom CA Certificates\n", + "\n", + "Customers may implement their connectivity using some proxies that will sit between FL Clients and the FL Server. FL Clients only directly connect to the proxy server, which then connects to the FL Server. Typically FL Clients will use one-way SSL to connect to the proxy server. In this case, the custom_ca_cert is the CA cert used by the proxy server.\n", + "\n", + "\n", + "-----------\n", + "## Multi-Address Support of FL Server\n", + "\n", + "Currently, the FL Server uses a single address that all FL clients must use to access it. Some customers find it to be very limiting, and they want to be able to use different addresses for different clients. Another limitation is that the server address must be specified as a domain name - IP addresses are not supported. Furthermore, the domain name also has to be specified as the “name” of the server in Provision config. Since the name is set to the “common name” of the server’s certificate, it cannot exceed 63 characters. This makes it impossible to use domain names longer than 63 characters.\n", + "\n", + "Flare 2.6 will support multiple addresses for the FL Server. In this case, the FL Server can expose multiple addresses that can be used for FL clients to connect. Depending on the customer’s IT policies, different FL clients may use different addresses. For example, the FL Server may provide two addresses, one accessible from the internet, another accessible only from the internal network.\n", + "\n", + "Server address can be specified as a domain name or an IP address.\n", + "\n", + "Example\n", + "\n", + "```yaml\n", + "\n", + "participants:\n", + " # change example.com to the FQDN of the server\n", + " - name: server\n", + " type: server\n", + " org: nvidia\n", + " fed_learn_port: 8002\n", + " admin_port: 8003\n", + " host_names: [localhost, 127.0.0.1]\n", + " default_host: localhost\n", + " # connection_security: insecure\n", + " - name: red\n", + " type: client\n", + " org: nvidia\n", + " connect_to: 127.0.0.1\n", + " - name: blue\n", + " type: client\n", + " org: nvidia\n", + " connect_to: localhost\n", + " - name: silver\n", + " type: client\n", + " org: nvidia\n", + " - name: admin@nvidia.com\n", + " type: admin\n", + " org: nvidia\n", + " role: project_admin\n", + " connect_to: 127.0.0.1\n", + "\n", + "```\n", + "\n", + "In this example, the FL Server defines additional two host names using the host_names property: localhost (a domain name) and 127.0.0.1 (an IP address). To be backward compatible, the name of the server is treated as the default address if the “default_host” property is not explicitly defined. In this example, the default address is explicitly defined as “localhost”.\n", + "\n", + "Addresses specified with the host_names property are limited to 255 characters.\n", + "\n", + "Three clients are defined here: red, blue, and silver. The “connect_to” property specifies the address to use for the client. Of course, the specified address must be available from the server.\n", + "\n", + "In this example, client “red” will connect to 127.0.0.1; client “blue” will connect to “localhost”; client “silver” will connect to the default address of the server, which is “localhost”.\n", + "\n", + "The admin client will connect to 127.0.0.1.\n", + "\n", + "For this configuration to work, the IT Administrator of the FL Server must ensure that the specified addresses are actually accessible.\n", + "\n", + "## Connection Security and secure_train Flag\n", + "\n", + "Connection Security specifies how the connection will be made (Clear, TLS or mTLS), which is independent of whether training is secure mode or not. If connection security is not explicitly specified for a site, then its connection security will be decided by the “secure_train” flag. If secure_train is True, then use mTLS, otherwise use clear. This is to be backward compatible. In the past, these two things were treated as one.\n", + "\n", + "The secure_train flag applies to the whole project - you cannot have the case that this flag is True for some sites and False for another.\n", + "\n", + "Connection Security is site specific - different sites can use different settings as long as connections can be made properly. For example, the Server may define connection security to be “clear”, whereas Site-1 may define it to be TLS, and Site-2 may define it to be mTLS. You may wonder how this could ever work. It of course won’t work if the two sites connect to the Server directly. But in the case of BYOConn, you never know how the customer will set up their communication network. For example, if they use proxies between the Server and the sites, the sites won’t directly connect to the Server. The customer will have to set up the connection security properly so that the sites can connect to their proxies properly.\n", + "\n", + "The secure_train flag also triggers privacy protection features (e.g. loading privacy resources from the site’s local folder). This flag is always set to True, except when using the Simulator.\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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_recap/recap.ipynb deleted file mode 100644 index 08679f681e..0000000000 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.4_recap/recap.ipynb +++ /dev/null @@ -1,33 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "f0dd12c7-dfb7-4e60-8417-417c9b206959", - "metadata": {}, - "outputs": [], - "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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.5_message_serialization/fobs.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.5_message_serialization/fobs.ipynb new file mode 100644 index 0000000000..4d0fdb0458 --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.5_message_serialization/fobs.ipynb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NVIDIA FLARE Message Serialization\n", + "\n", + "One important design consideration in distribution system is message serialization. Python Pickle is the default object serialization mechanism used in many Python and machine learning frameworks. However, Python pickle is considered \"unsecure\" for message serialization in distributed systems by security teams.\n", + "\n", + "NVFLARE uses a secure mechanism called FOBS (Flare OBject Serializer) for message serialization and deserialization when exchanging data between the server and clients.\n", + "\n", + "# Flare Object Serializer (FOBS)\n", + "\n", + "## Overview\n", + "FOBS is a drop-in replacement for Pickle for security purposes. It uses [MessagePack](https://msgpack.org/index.html) to serialize objects.\n", + "\n", + "FOBS sacrifices convenience for security. With Pickle, most objects are supported automatically using introspection. To serialize an object using FOBS, a Decomposer must be registered for the class. Several decomposers for commonly used classes are pre-registered with the module.\n", + "\n", + "FOBS supports enum types by registering decomposers automatically for all classes that are subclasses of Enum.\n", + "\n", + "FOBS treats all other classes as dataclass by registering a generic decomposer for dataclasses. Dataclass is a class whose constructor only changes the state of the object without side-effects. Side-effects include changing global variables, creating network connection, files etc.\n", + "\n", + "FOBS throws TypeError exception when it encounters an object with no decomposer registered. For example,\n", + "\n", + "TypeError: can not serialize 'xxx' object\n", + "\n", + "## Usage\n", + "\n", + "FOBS defines following 4 functions, similar to Pickle,\n", + "\n", + "```dumps(obj)```: Serializes obj and returns bytes\n", + "\n", + "```dump(obj, stream)```: Serializes obj and writes the result to stream\n", + "\n", + "```loads(data)```: Deserializes the data and returns an object\n", + "\n", + "```load(stream)```: Reads data from stream and deserializes it into an object\n", + "\n", + "Examples,\n", + "\n", + "```\n", + "from nvflare.fuel.utils import fobs\n", + "data = fobs.dumps(dxo)\n", + "new_dxo = fobs.loads(data)\n", + "```\n", + "\n", + "\n", + "**Pickle/json compatible functions:**\n", + "\n", + "```\n", + "\n", + "data = fobs.dumps(shareable)\n", + "new_shareable = fobs.loads(data)\n", + "```\n", + "\n", + "\n", + "## Decomposers\n", + "\n", + "Decomposers are classes that inherit abstract base class fobs.Decomposer. FOBS uses decomposers to break an object into serializable objects before serializing it using MessagePack.\n", + "\n", + "Decomposers are very similar to serializers, except that they don’t have to convert object into bytes directly, they can just break the object into other objects that are serializable.\n", + "\n", + "An object is serializable if its type is supported by MessagePack or a decomposer is registered for its class.\n", + "\n", + "FOBS recursively decomposes objects till all objects are of types supported by MessagePack. Decomposing looping must be avoided, which causes stack overflow. Decomposers form a loop when one class is decomposed into another class which is eventually decomposed into the original class. For example, this scenario forms the simplest loop: X decomposes into Y and Y decomposes back into X.\n", + " \n", + "All classes defined in fobs/decomposers folder are automatically registered. Other decomposers must be registered manually like this,\n", + "\n", + "```\n", + "fobs.register(FooDecomposer)\n", + "fobs.register(BarDecomposer())\n", + "```\n", + "\n", + "fobs.register takes either a class or an instance as the argument. Decomposer whose constructor takes arguments must be registered as instance.\n", + "\n", + "A decomposer can either serialize the class into bytes or decompose it into objects of serializable types. In most cases, it only involves saving members as a list and reconstructing the object from the list.\n", + "\n", + "MessagePack can’t handle items larger than 4GB in dict. To work around this issue, FOBS can externalize the large item and just stores a reference in the buffer. DatumManager is used to handle the externalized data. For most objects which don’t deal with dict items larger than 4GB, the DatumManager is not needed.\n", + "\n", + "Here is an example of a simple decomposer. Even though datetime is not supported by MessagePack, a decomposer is included in fobs module so no need to further decompose it.\n", + "\n", + "from nvflare.fuel.utils import fobs\n", + "```\n", + "\n", + "class Simple:\n", + "\n", + " def __init__(self, num: int, name: str, timestamp: datetime):\n", + " self.num = num\n", + " self.name = name\n", + " self.timestamp = timestamp\n", + "\n", + "\n", + "class SimpleDecomposer(fobs.Decomposer):\n", + "\n", + " def supported_type(self) -> Type[Any]:\n", + " return Simple\n", + "\n", + " def decompose(self, obj, manager) -> Any:\n", + " return [obj.num, obj.name, obj.timestamp]\n", + "\n", + " def recompose(self, data: Any, manager) -> Simple:\n", + " return Simple(data[0], data[1], data[2])\n", + "\n", + "\n", + "fobs.register(SimpleDecomposer)\n", + "data = fobs.dumps(Simple(1, 'foo', datetime.now()))\n", + "obj = fobs.loads(data)\n", + "assert obj.num == 1\n", + "assert obj.name == 'foo'\n", + "assert isinstance(obj.timestamp, datetime)\n", + "```\n", + "The same decomposer can be registered multiple times. Only first one takes effect, the others are ignored with a warning message.\n", + "\n", + "Note that fobs_initialize() may need to be called if decomposers are not registered.\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-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/cc_tech_stack.png b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/cc_tech_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..4a48a82c6eff16c03d11002174361ed8b580d84e GIT binary patch literal 104858 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

MtnVD@@pZ00TQM=|M4 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 Y%D4j|I;6gma|8I%(J+9Qt6N9>KRzS3a{vGU literal 0 HcmV?d00001 diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/confidential_federated_ai.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/confidential_federated_ai.ipynb new file mode 100644 index 0000000000..0058bd3cbd --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/confidential_federated_ai.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trust-based Security\n", + "\n", + "Trust-based security refers to leveraging confidential computing's trusted execution environment (TEE) in federated learning: confidential federated AI.\n", + "\n", + "\n", + "\n", + "## Confidential Computing\n", + "\n", + "Confidential computing provides a physically isolated trusted execution environment (TEE) to secure the entire workload while data is in use. \n", + "\n", + "### Capabilities of Confidential Computing\n", + "\n", + "Confidential computing enhances data security and privacy by leveraging specialized hardware and technologies to protect sensitive computations and data in use. The key capabilities include:\n", + "\n", + "\n", + "\"NVIDIA\n", + "\n", + "* **Trusted Execution Environment (TEE)**\n", + " * Provides an isolated environment that ensures the confidentiality and integrity of applications and data during processing.\n", + " * Protects against unauthorized access, even from privileged software such as the operating system or hypervisor.\n", + "\n", + "* **Virtualization-Based Security (\"Lift & Shift\")**\n", + "\n", + " * Enables applications to run in secure environments without requiring modifications or partitioning.\n", + " * Facilitates seamless migration of existing workloads to confidential computing platforms.\n", + "\n", + "* **Secure Transfer**\n", + " * Supports high-performance hardware acceleration for encryption of data during transfers between CPUs and GPUs.\n", + " * Ensures secure communication channels for sensitive data processing.\n", + "\n", + "* **Hardware Root of Trust**\n", + "\n", + " * Establishes a secure foundation using authenticated firmware measurement and attestation mechanisms for hardware, including GPUs.\n", + " * Validates the integrity and authenticity of the system, ensuring it is operating in a trusted state.\n", + "\n", + "\n", + "\"Confidential\n", + "\n", + "## Computing Technology Stack\n", + "\n", + "There are multiple components to Confidential computing technology including hardware\n", + "\n", + "* Hardware: CPU (AMD SEV-SNP, Intel TDX, etc), GPU (H100, Blackwell) \n", + "* Attestation Service -- verify if the hardware is trust-worthy\n", + "* Virtualization:\n", + " * Confidential Virtual Machine (CVM)\n", + " * Confidential Container \n", + " * Kubernetes Pod with Kata container in kubernates (CoCo) \n", + "\n", + "* Key Broker Service -- The key broker service (KBS) is a server that facilitates remote attestation and secret delivery.\n", + " \n", + "\n", + "## Confidential Federated AI Use Cases\n", + "\n", + "Federated Training Workflow:\n", + "Confidential Federated Learning (Confidential FL) enables secure and trustworthy training environments by incorporating Confidential Computing for trust verification at different stages of the training process. These use cases demonstrate how trust among participants is explicitly managed and protected.\n", + "\n", + "There are three typical use cases:\n", + "\n", + "* **Building Explicit Trust** -- explicitly verifies that participants are trustworthy at any time\n", + "\n", + "* **Secure Aggregation** -- ensures that model updates from clients are aggregated securely without exposing individual model weights or enabling reverse engineering of private data\n", + "\n", + "* **Model Theft Prevention** -- prevents unauthorized access or theft of the model during the training process\n", + "\n", + "\n", + "\n", + "\n", + "### Build Explicit Trust Among All Participants\n", + "\n", + "Trustworthiness Verification: At different stages of the training process, we explicitly check the trustworthiness of participants using Confidential Computing Attestation. The level of trust varies depending on the use case, and different trust models are applied based on the relationship between the clients and the FL server.\n", + "\n", + "### Secure Aggregation\n", + "\n", + "**Scenario**\n", + "\n", + "Clients trust their own infrastructure and training code, but do not trust the FL server. FL Client doesn’t trust FL server due to possible model inversion attack. Secure the server to make sure the attack is not possible\n", + "\n", + "\n", + "**Solution**\n", + "\n", + "Only the FL server needs to be a Confidential Computing Node for secure aggregation. Client nodes do not need to be confidential, and the server’s trustworthiness is verified through self-attestation (server attests its own integrity).\n", + "\n", + "\n", + "### Model Theft Prevention\n", + "\n", + "**Scenario**\n", + "\n", + "The model owner wants to ensure the model IP is protected during training.\n", + "\n", + "**Solution**\n", + "\n", + "To prevent model theft, all nodes (both FL clients and the FL server) must be protected via Confidential Computing TEE. Model theft prevention aims to protect the intellectual property (IP) of a model throughout the federated learning process, ensuring that the global model is not shared among unauthorized participants. This process involves securing both the model and the training data during and after the training process to safeguard the model owner's rights." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/gpu_cc.png b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.6_trust_based_security/gpu_cc.png new file mode 100644 index 0000000000000000000000000000000000000000..c2306780e273eb0e20c48ae1acc0077dc3ddbb23 GIT binary patch literal 39847 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 literal 0 HcmV?d00001 diff --git a/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.7_recap/recap.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.7_recap/recap.ipynb new file mode 100644 index 0000000000..56f3ac6d6a --- /dev/null +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/chapter-6_Security_in_federated_compute_system/06.7_recap/recap.ipynb @@ -0,0 +1,47 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b41fb737", + "metadata": {}, + "source": [ + "# Recap: Security in federated compute systems\n", + "\n", + "In this chapter, we took a deep dive into FLARE's security features in federated computing systems, including:\n", + "\n", + "* Authentication & Authorization\n", + "* Customized server and client site policies\n", + "* Communication Security\n", + "* Message serialization \n", + "* Trust-based security: Confidential Federated AI use cases" + ] + }, + { + "cell_type": "markdown", + "id": "e649a974", + "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-3_security_and_privacy/part-3_introduction.ipynb b/examples/tutorials/self-paced-training/part-3_security_and_privacy/part-3_introduction.ipynb index 3d062d9e51..e65d4489f8 100644 --- a/examples/tutorials/self-paced-training/part-3_security_and_privacy/part-3_introduction.ipynb +++ b/examples/tutorials/self-paced-training/part-3_security_and_privacy/part-3_introduction.ipynb @@ -11,20 +11,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "[Chapter 3.1 Privacy in Federated Learning](./chapter-3.1_Privacy_In_Federated_Learning/03.1.0_introduction.ipynb)\n", "\n", - "[Chapter 3.2 Security in Federated Computing System](chapter-3.2_Security_in_federated_compute_system/03.2.0_introduction.ipynb)\n", + "Federated Learning (FL) enables decentralized model training while preserving data privacy, making it ideal for sensitive domains like healthcare and finance. However, FL introduces security and privacy risks, such as data leakage, adversarial attacks, and model integrity threats. \n", + "\n", + "## Key Concerns \n", + "\n", + "- **Privacy Risks**: Model updates can leak information through gradient leakage, membership inference, and property inference attacks. \n", + "\n", + "- **Privacy Protections**: Techniques like differential privacy, secure aggregation, and homomorphic encryption mitigate exposure. \n", + "\n", + "- **Security Challenges**: FL is vulnerable to adversarial model poisoning, unauthorized access, and communication threats. \n", + "\n", + "- **Security Solutions**: Authentication, role-based access control (RBAC), encrypted communication (TLS), and trust-based mechanisms enhance FL security. \n", + "\n", + "\n", + "NVIDIA FLARE addresses these concerns with secure aggregation, cryptographic protections, and robust access controls, ensuring FL remains both effective and trustworthy.\n", + "\n", + "[Chapter 5 Privacy in Federated Learning](./chapter-5_Privacy_In_Federated_Learning/05.0_introduction/introduction.ipynb)\n", + "\n", + "[Chapter 6 Security in Federated Computing System](./chapter-6_Security_in_federated_compute_system/06.0_introduction/introduction.ipynb) \n", "\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "Federated Learning (FL) has emerged as a groundbreaking approach to distributed machine learning, enabling collaborative model training without sharing raw data. This paradigm is particularly vital for sensitive domains like healthcare, finance, and smart cities, where data privacy is paramount. However, the distributed nature of FL introduces unique security and privacy challenges, such as safeguarding against data leakage, adversarial attacks, and ensuring the integrity of model updates. NVIDIA FLARE addresses these concerns by providing a robust, extensible framework designed for secure and privacy-preserving FL workflows. By incorporating advanced cryptographic techniques, secure aggregation protocols, and role-based access control, NVIDIA FLARE empowers organizations to harness the full potential of FL while mitigating risks associated with data and model vulnerabilities. This ensures that collaborative machine learning remains not only effective but also trustworthy.\n", - "\n", - "In this part, we will have two chapters with one focused on privacy and another focused on security. " - ] + "source": [] }, { "cell_type": "markdown", diff --git a/integration/nemo/examples/supervised_fine_tuning/utils/create_configs.py b/integration/nemo/examples/supervised_fine_tuning/utils/create_configs.py index 08567ec63b..2ceceae00d 100644 --- a/integration/nemo/examples/supervised_fine_tuning/utils/create_configs.py +++ b/integration/nemo/examples/supervised_fine_tuning/utils/create_configs.py @@ -93,7 +93,7 @@ def main(): meta_cfg["name"] = os.path.basename(args.job_folder) meta_cfg["deploy_map"] = {"server": ["server"]} for i in range(args.num_clients): - meta_cfg["deploy_map"][f"app{i+1}"] = [f"site-{i+1}"] + meta_cfg["deploy_map"][f"app{i+1}"] = [f"site-{i + 1}"] save_config(meta_cfg_file, meta_cfg) print(f"Created configs for {args.num_clients} clients") diff --git a/research/auto-fed-rl/src/autofedrl/autofedrl_model_aggregator.py b/research/auto-fed-rl/src/autofedrl/autofedrl_model_aggregator.py index be9ce6ee9f..6d6a715fbf 100644 --- a/research/auto-fed-rl/src/autofedrl/autofedrl_model_aggregator.py +++ b/research/auto-fed-rl/src/autofedrl/autofedrl_model_aggregator.py @@ -43,7 +43,7 @@ def update_aggregation_weights(self, fl_ctx: FLContext): # TODO: Here, we assume contributor_name is "site-*". # this will be wrong if contributor_name is not in this pattern. aggregation_weights_dict = { - f"site-{i+1}": received_aggregation_weights[i] for i in range(len(received_aggregation_weights)) + f"site-{i + 1}": received_aggregation_weights[i] for i in range(len(received_aggregation_weights)) } for key in self.expected_data_kind.keys(): self.dxo_aggregators[key].aggregation_weights = aggregation_weights_dict