From fc7825666235b447acd065c4f61b25e137a89166 Mon Sep 17 00:00:00 2001 From: Charles Beauville Date: Tue, 23 Jul 2024 13:50:52 +0200 Subject: [PATCH 01/16] docs(framework) Fix install instructions for all shells (#3864) Co-authored-by: KarhouTam --- doc/locales/fr/LC_MESSAGES/framework-docs.po | 24 +++++++-------- doc/locales/ko/LC_MESSAGES/framework-docs.po | 22 +++++++------- .../pt_BR/LC_MESSAGES/framework-docs.po | 12 ++++---- .../zh_Hans/LC_MESSAGES/framework-docs.po | 30 +++++++++---------- ...or-how-to-install-development-versions.rst | 6 ++-- doc/source/how-to-install-flower.rst | 2 +- doc/source/how-to-upgrade-to-flower-1.0.rst | 2 +- doc/source/how-to-upgrade-to-flower-next.rst | 2 +- doc/source/ref-changelog.md | 2 +- .../superlink/fleet/vce/backend/__init__.py | 2 +- src/py/flwr/simulation/__init__.py | 2 +- 11 files changed, 53 insertions(+), 53 deletions(-) diff --git a/doc/locales/fr/LC_MESSAGES/framework-docs.po b/doc/locales/fr/LC_MESSAGES/framework-docs.po index 6624d91f9e64..efa10a69531c 100644 --- a/doc/locales/fr/LC_MESSAGES/framework-docs.po +++ b/doc/locales/fr/LC_MESSAGES/framework-docs.po @@ -650,8 +650,8 @@ msgid "``pip install -U --pre flwr`` (without extras)" msgstr "``pip install -U --pre flwr`` (sans les extras)" #: ../../source/contributor-how-to-install-development-versions.rst:33 -msgid "``pip install -U --pre flwr[simulation]`` (with extras)" -msgstr "``pip install -U --pre flwr[simulation]`` (avec les extras)" +msgid "``pip install -U --pre 'flwr[simulation]'`` (with extras)" +msgstr "``pip install -U --pre 'flwr[simulation]'`` (avec les extras)" #: ../../source/contributor-how-to-install-development-versions.rst:35 msgid "" @@ -676,10 +676,10 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:40 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(with extras)" msgstr "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(avec les extras)" #: ../../source/contributor-how-to-install-development-versions.rst:42 @@ -698,11 +698,11 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:45 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git" -"@branch-name`` (with extras)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git``" +"@branch-name'`` (with extras)" msgstr "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git" -"@nom-de-branche`` (avec des extras)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git``" +"@nom-de-la-branche'`` (avec des extras)" #: ../../source/contributor-how-to-install-development-versions.rst:49 msgid "Open Jupyter Notebooks on Google Colab" @@ -6963,10 +6963,10 @@ msgstr "" #: ../../source/how-to-upgrade-to-flower-1.0.rst:15 msgid "" -"``python -m pip install -U flwr[simulation]`` (when using " +"``python -m pip install -U 'flwr[simulation]'`` (when using " "``start_simulation``)" msgstr "" -"``python -m pip install -U flwr[simulation]`` (lors de l'utilisation de " +"``python -m pip install -U 'flwr[simulation]'`` (lors de l'utilisation de " "``start_simulation``)" #: ../../source/how-to-upgrade-to-flower-1.0.rst:17 @@ -20007,12 +20007,12 @@ msgid "" "Simulations (using the Virtual Client Engine through `start_simulation`) " "now work more smoothly on Jupyter Notebooks (incl. Google Colab) after " "installing Flower with the `simulation` extra (`pip install " -"flwr[simulation]`)." +"'flwr[simulation]'`)." msgstr "" "Les simulations (utilisant le moteur de client virtuel via " "`start_simulation`) fonctionnent maintenant plus facilement sur les " "Notebooks Jupyter (y compris Google Colab) après avoir installé Flower " -"avec l'option `simulation` (`pip install flwr[simulation]`)." +"avec l'option `simulation` (`pip install 'flwr[simulation]'`)." #: ../../source/ref-changelog.md:887 msgid "" diff --git a/doc/locales/ko/LC_MESSAGES/framework-docs.po b/doc/locales/ko/LC_MESSAGES/framework-docs.po index f01f9eaf7bd9..d0ba4f6ed5a1 100644 --- a/doc/locales/ko/LC_MESSAGES/framework-docs.po +++ b/doc/locales/ko/LC_MESSAGES/framework-docs.po @@ -666,8 +666,8 @@ msgid "``pip install -U --pre flwr`` (without extras)" msgstr "``pip install -U --pre flwr`` (extras 제외)" #: ../../source/contributor-how-to-install-development-versions.rst:33 -msgid "``pip install -U --pre flwr[simulation]`` (with extras)" -msgstr "``pip install -U --pre flwr[simulation]`` (extras 포함)" +msgid "``pip install -U --pre 'flwr[simulation]'`` (with extras)" +msgstr "``pip install -U --pre 'flwr[simulation]'`` (extras 포함)" #: ../../source/contributor-how-to-install-development-versions.rst:35 msgid "" @@ -689,10 +689,10 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:40 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(with extras)" msgstr "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(extras 포함)" #: ../../source/contributor-how-to-install-development-versions.rst:42 @@ -709,11 +709,11 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:45 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git@branch-" -"name`` (with extras)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git@branch-" +"name'`` (with extras)" msgstr "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git@branch-" -"name`` (extras 포함)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git@branch-" +"name'`` (extras 포함)" #: ../../source/contributor-how-to-install-development-versions.rst:49 msgid "Open Jupyter Notebooks on Google Colab" @@ -7021,10 +7021,10 @@ msgstr "" #: ../../source/how-to-upgrade-to-flower-1.0.rst:15 msgid "" -"``python -m pip install -U flwr[simulation]`` (when using " +"``python -m pip install -U 'flwr[simulation]'`` (when using " "``start_simulation``)" msgstr "" -"``python -m pip install -U flwr[simulation]``(``start_simulation`` 사용 시)" +"``python -m pip install -U 'flwr[simulation]'``(``start_simulation`` 사용 시)" #: ../../source/how-to-upgrade-to-flower-1.0.rst:17 msgid "" @@ -18594,7 +18594,7 @@ msgid "" "Simulations (using the Virtual Client Engine through `start_simulation`) now " "work more smoothly on Jupyter Notebooks (incl. Google Colab) after " "installing Flower with the `simulation` extra (`pip install " -"flwr[simulation]`)." +"'flwr[simulation]'`)." msgstr "" #: ../../source/ref-changelog.md:887 diff --git a/doc/locales/pt_BR/LC_MESSAGES/framework-docs.po b/doc/locales/pt_BR/LC_MESSAGES/framework-docs.po index 49bb01908421..e50c290432cc 100644 --- a/doc/locales/pt_BR/LC_MESSAGES/framework-docs.po +++ b/doc/locales/pt_BR/LC_MESSAGES/framework-docs.po @@ -674,7 +674,7 @@ msgid "``pip install -U --pre flwr`` (without extras)" msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:33 -msgid "``pip install -U --pre flwr[simulation]`` (with extras)" +msgid "``pip install -U --pre 'flwr[simulation]'`` (with extras)" msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:35 @@ -695,7 +695,7 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:40 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(with extras)" msgstr "" @@ -711,8 +711,8 @@ msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:45 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git" -"@branch-name`` (with extras)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git" +"@branch-name'`` (with extras)" msgstr "" #: ../../source/contributor-how-to-install-development-versions.rst:49 @@ -5758,7 +5758,7 @@ msgstr "" #: ../../source/how-to-upgrade-to-flower-1.0.rst:15 msgid "" -"``python -m pip install -U flwr[simulation]`` (when using " +"``python -m pip install -U 'flwr[simulation]'`` (when using " "``start_simulation``)" msgstr "" @@ -17221,7 +17221,7 @@ msgid "" "Simulations (using the Virtual Client Engine through `start_simulation`) " "now work more smoothly on Jupyter Notebooks (incl. Google Colab) after " "installing Flower with the `simulation` extra (`pip install " -"flwr[simulation]`)." +"'flwr[simulation]'`)." msgstr "" #: ../../source/ref-changelog.md:887 diff --git a/doc/locales/zh_Hans/LC_MESSAGES/framework-docs.po b/doc/locales/zh_Hans/LC_MESSAGES/framework-docs.po index d07217ea35f7..e9279db19043 100644 --- a/doc/locales/zh_Hans/LC_MESSAGES/framework-docs.po +++ b/doc/locales/zh_Hans/LC_MESSAGES/framework-docs.po @@ -664,11 +664,11 @@ msgstr "从 PyPI 安装 ``flwr`` 预发行版:" #: ../../source/contributor-how-to-install-development-versions.rst:32 msgid "``pip install -U --pre flwr`` (without extras)" -msgstr "`pip install -U -pre flwr``(不含额外功能)" +msgstr "``pip install -U -pre flwr``(不含额外功能)" #: ../../source/contributor-how-to-install-development-versions.rst:33 -msgid "``pip install -U --pre flwr[simulation]`` (with extras)" -msgstr "`pip install -U -pre flwr[simulation]``(包含额外功能)" +msgid "``pip install -U --pre 'flwr[simulation]'`` (with extras)" +msgstr "``pip install -U -pre 'flwr[simulation]'``(包含额外功能)" #: ../../source/contributor-how-to-install-development-versions.rst:35 msgid "" @@ -684,15 +684,15 @@ msgstr "从 GitHub 的默认分支 (``main`) 安装 ``flwr``:" msgid "" "``pip install flwr@git+https://github.com/adap/flower.git`` (without " "extras)" -msgstr "`pip install flwr@git+https://github.com/adap/flower.git`` (不含额外功能)" +msgstr "``pip install flwr@git+https://github.com/adap/flower.git`` (不含额外功能)" #: ../../source/contributor-how-to-install-development-versions.rst:40 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` " +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` " "(with extras)" msgstr "" -"`pip install " -"flwr[simulation]@git+https://github.com/adap/flower.git``(带附加功能)" +"``pip install " +"'flwr[simulation]@git+https://github.com/adap/flower.git'``(带附加功能)" #: ../../source/contributor-how-to-install-development-versions.rst:42 msgid "Install ``flwr`` from a specific GitHub branch (``branch-name``):" @@ -703,14 +703,14 @@ msgid "" "``pip install flwr@git+https://github.com/adap/flower.git@branch-name`` " "(without extras)" msgstr "" -"`pip install flwr@git+https://github.com/adap/flower.git@branch-name`` " +"``pip install flwr@git+https://github.com/adap/flower.git@branch-name`` " "(不含附加功能)" #: ../../source/contributor-how-to-install-development-versions.rst:45 msgid "" -"``pip install flwr[simulation]@git+https://github.com/adap/flower.git" -"@branch-name`` (with extras)" -msgstr "`pip安装flwr[模拟]@git+https://github.com/adap/flower.git@分支名``(带附加功能)" +"``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git" +"@branch-name'`` (with extras)" +msgstr "``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git@分支名'``(带附加功能)" #: ../../source/contributor-how-to-install-development-versions.rst:49 msgid "Open Jupyter Notebooks on Google Colab" @@ -6561,9 +6561,9 @@ msgstr "`python -m pip install -U flwr``(当使用`start_server`和`start_clie #: ../../source/how-to-upgrade-to-flower-1.0.rst:15 msgid "" -"``python -m pip install -U flwr[simulation]`` (when using " +"``python -m pip install -U 'flwr[simulation]'`` (when using " "``start_simulation``)" -msgstr "`python -m pip install -U flwr[simulation]``(当使用`start_simulation``时)" +msgstr "``python -m pip install -U 'flwr[simulation]'``(当使用`start_simulation``时)" #: ../../source/how-to-upgrade-to-flower-1.0.rst:17 msgid "" @@ -21363,10 +21363,10 @@ msgid "" "Simulations (using the Virtual Client Engine through `start_simulation`) " "now work more smoothly on Jupyter Notebooks (incl. Google Colab) after " "installing Flower with the `simulation` extra (`pip install " -"flwr[simulation]`)." +"'flwr[simulation]'`)." msgstr "" "通过 `start_simulation` 在 Jupyter 笔记本(包括 Google Colab)上安装 Flower 并附加 " -"`simulation` (`pip install flwr[simulation]`)后,模拟(通过 `start_simulation` " +"`simulation` (`pip install 'flwr[simulation]'`)后,模拟(通过 `start_simulation` " "使用虚拟客户端引擎)现在可以更流畅地运行。" #: ../../source/ref-changelog.md:887 diff --git a/doc/source/contributor-how-to-install-development-versions.rst b/doc/source/contributor-how-to-install-development-versions.rst index 15e2939ef138..0f0773c85e73 100644 --- a/doc/source/contributor-how-to-install-development-versions.rst +++ b/doc/source/contributor-how-to-install-development-versions.rst @@ -30,19 +30,19 @@ Using pip (recommended on Colab) Install a ``flwr`` pre-release from PyPI: - ``pip install -U --pre flwr`` (without extras) -- ``pip install -U --pre flwr[simulation]`` (with extras) +- ``pip install -U --pre 'flwr[simulation]'`` (with extras) Python packages can be installed from git repositories. Use one of the following commands to install the Flower directly from GitHub. Install ``flwr`` from the default GitHub branch (``main``): - ``pip install flwr@git+https://github.com/adap/flower.git`` (without extras) -- ``pip install flwr[simulation]@git+https://github.com/adap/flower.git`` (with extras) +- ``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git'`` (with extras) Install ``flwr`` from a specific GitHub branch (``branch-name``): - ``pip install flwr@git+https://github.com/adap/flower.git@branch-name`` (without extras) -- ``pip install flwr[simulation]@git+https://github.com/adap/flower.git@branch-name`` (with extras) +- ``pip install 'flwr[simulation]@git+https://github.com/adap/flower.git@branch-name'`` (with extras) Open Jupyter Notebooks on Google Colab diff --git a/doc/source/how-to-install-flower.rst b/doc/source/how-to-install-flower.rst index b00e2ae803ab..b9107995c226 100644 --- a/doc/source/how-to-install-flower.rst +++ b/doc/source/how-to-install-flower.rst @@ -68,7 +68,7 @@ New (possibly unstable) versions of Flower are sometimes available as pre-releas For simulations that use the Virtual Client Engine, ``flwr`` pre-releases should be installed with the ``simulation`` extra:: - python -m pip install -U --pre flwr[simulation] + python -m pip install -U --pre 'flwr[simulation]' Install nightly release ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/source/how-to-upgrade-to-flower-1.0.rst b/doc/source/how-to-upgrade-to-flower-1.0.rst index 3a55a1a953f5..c0721b0f3736 100644 --- a/doc/source/how-to-upgrade-to-flower-1.0.rst +++ b/doc/source/how-to-upgrade-to-flower-1.0.rst @@ -12,7 +12,7 @@ Here's how to update an existing installation to Flower 1.0 using either pip or - pip: add ``-U`` when installing. - ``python -m pip install -U flwr`` (when using ``start_server`` and ``start_client``) - - ``python -m pip install -U flwr[simulation]`` (when using ``start_simulation``) + - ``python -m pip install -U 'flwr[simulation]'`` (when using ``start_simulation``) - Poetry: update the ``flwr`` dependency in ``pyproject.toml`` and then reinstall (don't forget to delete ``poetry.lock`` via ``rm poetry.lock`` before running ``poetry install``). diff --git a/doc/source/how-to-upgrade-to-flower-next.rst b/doc/source/how-to-upgrade-to-flower-next.rst index a17756247566..e1e94f095b60 100644 --- a/doc/source/how-to-upgrade-to-flower-next.rst +++ b/doc/source/how-to-upgrade-to-flower-next.rst @@ -55,7 +55,7 @@ or if you need Flower Next with simulation: .. code-block:: bash - $ python -m pip install -U flwr[simulation] + $ python -m pip install -U "flwr[simulation]" Ensure you set the following version constraint in your ``requirements.txt`` diff --git a/doc/source/ref-changelog.md b/doc/source/ref-changelog.md index 58fc8b4f69b1..d28446c4dd06 100644 --- a/doc/source/ref-changelog.md +++ b/doc/source/ref-changelog.md @@ -882,7 +882,7 @@ We would like to give our **special thanks** to all the contributors who made Fl - **Improved Virtual Client Engine compatibility with Jupyter Notebook / Google Colab** ([#866](https://github.com/adap/flower/pull/866), [#872](https://github.com/adap/flower/pull/872), [#833](https://github.com/adap/flower/pull/833), [#1036](https://github.com/adap/flower/pull/1036)) - Simulations (using the Virtual Client Engine through `start_simulation`) now work more smoothly on Jupyter Notebooks (incl. Google Colab) after installing Flower with the `simulation` extra (`pip install flwr[simulation]`). + Simulations (using the Virtual Client Engine through `start_simulation`) now work more smoothly on Jupyter Notebooks (incl. Google Colab) after installing Flower with the `simulation` extra (`pip install 'flwr[simulation]'`). - **New Jupyter Notebook code example** ([#833](https://github.com/adap/flower/pull/833)) diff --git a/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py b/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py index d751cf4bcae1..a8c671810a51 100644 --- a/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +++ b/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py @@ -38,7 +38,7 @@ To install the necessary dependencies, install `flwr` with the `simulation` extra: - pip install -U flwr["simulation"] + pip install -U "flwr[simulation]" """ diff --git a/src/py/flwr/simulation/__init__.py b/src/py/flwr/simulation/__init__.py index 5db90a352e3f..a171347b1507 100644 --- a/src/py/flwr/simulation/__init__.py +++ b/src/py/flwr/simulation/__init__.py @@ -28,7 +28,7 @@ To install the necessary dependencies, install `flwr` with the `simulation` extra: - pip install -U flwr["simulation"] + pip install -U "flwr[simulation]" """ def start_simulation(*args, **kwargs): # type: ignore From d66214b562c589e8e31d47d8f56a0843d327c120 Mon Sep 17 00:00:00 2001 From: Charles Beauville Date: Tue, 23 Jul 2024 14:19:01 +0200 Subject: [PATCH 02/16] refactor(framework) Rename `flwr run` CLI argument (#3880) --- src/py/flwr/cli/run/run.py | 49 ++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/py/flwr/cli/run/run.py b/src/py/flwr/cli/run/run.py index 04949d255647..ae49981d765e 100644 --- a/src/py/flwr/cli/run/run.py +++ b/src/py/flwr/cli/run/run.py @@ -37,18 +37,21 @@ def run( app_dir: Annotated[ Path, - typer.Argument(help="Path of the Flower project to run"), + typer.Argument(help="Path of the Flower project to run."), ] = Path("."), - federation_name: Annotated[ + federation: Annotated[ Optional[str], - typer.Argument(help="Name of the federation to run the app on"), + typer.Argument(help="Name of the federation to run the app on."), ] = None, config_overrides: Annotated[ Optional[List[str]], typer.Option( "--run-config", "-c", - help="Override configuration key-value pairs", + help="Override configuration key-value pairs, should be of the format:\n\n" + "`--run-config key1=value1,key2=value2 --run-config key3=value3`\n\n" + "Note that `key1`, `key2`, and `key3` in this example need to exist " + "inside the `pyproject.toml` in order to be properly overriden.", ), ] = None, ) -> None: @@ -78,11 +81,9 @@ def run( typer.secho("Success", fg=typer.colors.GREEN) - federation_name = federation_name or config["tool"]["flwr"]["federations"].get( - "default" - ) + federation = federation or config["tool"]["flwr"]["federations"].get("default") - if federation_name is None: + if federation is None: typer.secho( "❌ No federation name was provided and the project's `pyproject.toml` " "doesn't declare a default federation (with a SuperExec address or an " @@ -93,13 +94,13 @@ def run( raise typer.Exit(code=1) # Validate the federation exists in the configuration - federation = config["tool"]["flwr"]["federations"].get(federation_name) - if federation is None: + federation_config = config["tool"]["flwr"]["federations"].get(federation) + if federation_config is None: available_feds = { fed for fed in config["tool"]["flwr"]["federations"] if fed != "default" } typer.secho( - f"❌ There is no `{federation_name}` federation declared in the " + f"❌ There is no `{federation}` federation declared in " "`pyproject.toml`.\n The following federations were found:\n\n" + "\n".join(available_feds), fg=typer.colors.RED, @@ -107,14 +108,14 @@ def run( ) raise typer.Exit(code=1) - if "address" in federation: - _run_with_superexec(federation, app_dir, config_overrides) + if "address" in federation_config: + _run_with_superexec(federation_config, app_dir, config_overrides) else: - _run_without_superexec(app_dir, federation, federation_name, config_overrides) + _run_without_superexec(app_dir, federation_config, federation, config_overrides) def _run_with_superexec( - federation: Dict[str, Any], + federation_config: Dict[str, Any], app_dir: Optional[Path], config_overrides: Optional[List[str]], ) -> None: @@ -123,8 +124,8 @@ def on_channel_state_change(channel_connectivity: str) -> None: """Log channel connectivity.""" log(DEBUG, channel_connectivity) - insecure_str = federation.get("insecure") - if root_certificates := federation.get("root-certificates"): + insecure_str = federation_config.get("insecure") + if root_certificates := federation_config.get("root-certificates"): root_certificates_bytes = Path(root_certificates).read_bytes() if insecure := bool(insecure_str): typer.secho( @@ -152,7 +153,7 @@ def on_channel_state_change(channel_connectivity: str) -> None: raise typer.Exit(code=1) channel = create_channel( - server_address=federation["address"], + server_address=federation_config["address"], insecure=insecure, root_certificates=root_certificates_bytes, max_message_length=GRPC_MAX_MESSAGE_LENGTH, @@ -168,7 +169,9 @@ def on_channel_state_change(channel_connectivity: str) -> None: override_config=user_config_to_proto( parse_config_args(config_overrides, separator=",") ), - federation_config=user_config_to_proto(flatten_dict(federation.get("options"))), + federation_config=user_config_to_proto( + flatten_dict(federation_config.get("options")) + ), ) res = stub.StartRun(req) typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN) @@ -176,18 +179,18 @@ def on_channel_state_change(channel_connectivity: str) -> None: def _run_without_superexec( app_path: Optional[Path], - federation: Dict[str, Any], - federation_name: str, + federation_config: Dict[str, Any], + federation: str, config_overrides: Optional[List[str]], ) -> None: try: - num_supernodes = federation["options"]["num-supernodes"] + num_supernodes = federation_config["options"]["num-supernodes"] except KeyError as err: typer.secho( "❌ The project's `pyproject.toml` needs to declare the number of" " SuperNodes in the simulation. To simulate 10 SuperNodes," " use the following notation:\n\n" - f"[tool.flwr.federations.{federation_name}]\n" + f"[tool.flwr.federations.{federation}]\n" "options.num-supernodes = 10\n", fg=typer.colors.RED, bold=True, From 7ce98551c29fabb59b9afab9b7c20a2e7c148bcc Mon Sep 17 00:00:00 2001 From: Heng Pan Date: Tue, 23 Jul 2024 13:27:43 +0100 Subject: [PATCH 03/16] refactor(framework:skip) Manage `sys.path` in `object_ref` module (#3847) --- src/py/flwr/cli/config_utils.py | 28 +++-- src/py/flwr/cli/config_utils_test.py | 6 +- src/py/flwr/client/supernode/app.py | 55 ++------- src/py/flwr/common/object_ref.py | 105 ++++++++++++++---- src/py/flwr/server/run_serverapp.py | 3 - .../server/superlink/fleet/vce/vce_api.py | 4 +- src/py/flwr/superexec/app.py | 5 +- 7 files changed, 115 insertions(+), 91 deletions(-) diff --git a/src/py/flwr/cli/config_utils.py b/src/py/flwr/cli/config_utils.py index d150e1b5f53d..74eda81f5c16 100644 --- a/src/py/flwr/cli/config_utils.py +++ b/src/py/flwr/cli/config_utils.py @@ -77,6 +77,9 @@ def load_and_validate( A tuple with the optional config in case it exists and is valid and associated errors and warnings. """ + if path is None: + path = Path.cwd() / "pyproject.toml" + config = load(path) if config is None: @@ -86,7 +89,7 @@ def load_and_validate( ] return (None, errors, []) - is_valid, errors, warnings = validate(config, check_module) + is_valid, errors, warnings = validate(config, check_module, path.parent) if not is_valid: return (None, errors, warnings) @@ -94,14 +97,8 @@ def load_and_validate( return (config, errors, warnings) -def load(path: Optional[Path] = None) -> Optional[Dict[str, Any]]: +def load(toml_path: Path) -> Optional[Dict[str, Any]]: """Load pyproject.toml and return as dict.""" - if path is None: - cur_dir = Path.cwd() - toml_path = cur_dir / "pyproject.toml" - else: - toml_path = path - if not toml_path.is_file(): return None @@ -167,7 +164,9 @@ def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]] def validate( - config: Dict[str, Any], check_module: bool = True + config: Dict[str, Any], + check_module: bool = True, + project_dir: Optional[Union[str, Path]] = None, ) -> Tuple[bool, List[str], List[str]]: """Validate pyproject.toml.""" is_valid, errors, warnings = validate_fields(config) @@ -176,16 +175,15 @@ def validate( return False, errors, warnings # Validate serverapp - is_valid, reason = object_ref.validate( - config["tool"]["flwr"]["app"]["components"]["serverapp"], check_module - ) + serverapp_ref = config["tool"]["flwr"]["app"]["components"]["serverapp"] + is_valid, reason = object_ref.validate(serverapp_ref, check_module, project_dir) + if not is_valid and isinstance(reason, str): return False, [reason], [] # Validate clientapp - is_valid, reason = object_ref.validate( - config["tool"]["flwr"]["app"]["components"]["clientapp"], check_module - ) + clientapp_ref = config["tool"]["flwr"]["app"]["components"]["clientapp"] + is_valid, reason = object_ref.validate(clientapp_ref, check_module, project_dir) if not is_valid and isinstance(reason, str): return False, [reason], [] diff --git a/src/py/flwr/cli/config_utils_test.py b/src/py/flwr/cli/config_utils_test.py index 077f254fb914..cad6714521e3 100644 --- a/src/py/flwr/cli/config_utils_test.py +++ b/src/py/flwr/cli/config_utils_test.py @@ -79,7 +79,7 @@ def test_load_pyproject_toml_load_from_cwd(tmp_path: Path) -> None: f.write(textwrap.dedent(pyproject_toml_content)) # Execute - config = load() + config = load(toml_path=Path.cwd() / "pyproject.toml") # Assert assert config == expected_config @@ -135,7 +135,7 @@ def test_load_pyproject_toml_from_path(tmp_path: Path) -> None: } # Current directory - origin = os.getcwd() + origin = Path.cwd() try: # Change into the temporary directory @@ -144,7 +144,7 @@ def test_load_pyproject_toml_from_path(tmp_path: Path) -> None: f.write(textwrap.dedent(pyproject_toml_content)) # Execute - config = load(path=tmp_path / "pyproject.toml") + config = load(toml_path=tmp_path / "pyproject.toml") # Assert assert config == expected_config diff --git a/src/py/flwr/client/supernode/app.py b/src/py/flwr/client/supernode/app.py index f3fb0e97805a..2c60f803f960 100644 --- a/src/py/flwr/client/supernode/app.py +++ b/src/py/flwr/client/supernode/app.py @@ -62,8 +62,8 @@ def run_supernode() -> None: root_certificates = _get_certificates(args) load_fn = _get_load_client_app_fn( default_app_ref=getattr(args, "client-app"), - dir_arg=args.dir, - flwr_dir_arg=args.flwr_dir, + project_dir=args.dir, + flwr_dir=args.flwr_dir, multi_app=True, ) authentication_keys = _try_setup_client_authentication(args) @@ -100,7 +100,7 @@ def run_client_app() -> None: root_certificates = _get_certificates(args) load_fn = _get_load_client_app_fn( default_app_ref=getattr(args, "client-app"), - dir_arg=args.dir, + project_dir=args.dir, multi_app=False, ) authentication_keys = _try_setup_client_authentication(args) @@ -176,9 +176,9 @@ def _get_certificates(args: argparse.Namespace) -> Optional[bytes]: def _get_load_client_app_fn( default_app_ref: str, - dir_arg: str, + project_dir: str, multi_app: bool, - flwr_dir_arg: Optional[str] = None, + flwr_dir: Optional[str] = None, ) -> Callable[[str, str], ClientApp]: """Get the load_client_app_fn function. @@ -189,38 +189,21 @@ def _get_load_client_app_fn( If `multi_app` is False, it ignores `fab_id` and `fab_version` and loads a default ClientApp. """ - # Find the Flower directory containing Flower Apps (only for multi-app) - if not multi_app: - flwr_dir = Path("") - else: - if flwr_dir_arg is None: - flwr_dir = get_flwr_dir() - else: - flwr_dir = Path(flwr_dir_arg).absolute() - - inserted_path = None - if not multi_app: log( DEBUG, "Flower SuperNode will load and validate ClientApp `%s`", default_app_ref, ) - # Insert sys.path - dir_path = Path(dir_arg).absolute() - sys.path.insert(0, str(dir_path)) - inserted_path = str(dir_path) - valid, error_msg = validate(default_app_ref) + valid, error_msg = validate(default_app_ref, project_dir=project_dir) if not valid and error_msg: raise LoadClientAppError(error_msg) from None def _load(fab_id: str, fab_version: str) -> ClientApp: + runtime_project_dir = Path(project_dir).absolute() # If multi-app feature is disabled if not multi_app: - # Get sys path to be inserted - dir_path = Path(dir_arg).absolute() - # Set app reference client_app_ref = default_app_ref # If multi-app feature is enabled but the fab id is not specified @@ -231,43 +214,29 @@ def _load(fab_id: str, fab_version: str) -> ClientApp: ) from None log(WARN, "FAB ID is not provided; the default ClientApp will be loaded.") - # Get sys path to be inserted - dir_path = Path(dir_arg).absolute() # Set app reference client_app_ref = default_app_ref # If multi-app feature is enabled else: try: - project_dir = get_project_dir(fab_id, fab_version, flwr_dir) - config = get_project_config(project_dir) + runtime_project_dir = get_project_dir( + fab_id, fab_version, get_flwr_dir(flwr_dir) + ) + config = get_project_config(runtime_project_dir) except Exception as e: raise LoadClientAppError("Failed to load ClientApp") from e - # Get sys path to be inserted - dir_path = Path(project_dir).absolute() - # Set app reference client_app_ref = config["tool"]["flwr"]["app"]["components"]["clientapp"] - # Set sys.path - nonlocal inserted_path - if inserted_path != str(dir_path): - # Remove the previously inserted path - if inserted_path is not None: - sys.path.remove(inserted_path) - # Insert the new path - sys.path.insert(0, str(dir_path)) - - inserted_path = str(dir_path) - # Load ClientApp log( DEBUG, "Loading ClientApp `%s`", client_app_ref, ) - client_app = load_app(client_app_ref, LoadClientAppError, dir_path) + client_app = load_app(client_app_ref, LoadClientAppError, runtime_project_dir) if not isinstance(client_app, ClientApp): raise LoadClientAppError( diff --git a/src/py/flwr/common/object_ref.py b/src/py/flwr/common/object_ref.py index ac52be160c2e..9723c14037a0 100644 --- a/src/py/flwr/common/object_ref.py +++ b/src/py/flwr/common/object_ref.py @@ -33,22 +33,41 @@ """ +_current_sys_path: Optional[str] = None + + def validate( module_attribute_str: str, check_module: bool = True, + project_dir: Optional[Union[str, Path]] = None, ) -> Tuple[bool, Optional[str]]: """Validate object reference. - The object reference string should have the form :. Valid - examples include `client:app` and `project.package.module:wrapper.app`. It must - refer to a module on the PYTHONPATH and the module needs to have the specified - attribute. + Parameters + ---------- + module_attribute_str : str + The reference to the object. It should have the form `:`. + Valid examples include `client:app` and `project.package.module:wrapper.app`. + It must refer to a module on the PYTHONPATH or in the provided `project_dir` + and the module needs to have the specified attribute. + check_module : bool (default: True) + Flag indicating whether to verify the existence of the module and the + specified attribute within it. + project_dir : Optional[Union[str, Path]] (default: None) + The directory containing the module. If None, the current working directory + is used. If `check_module` is True, the `project_dir` will be inserted into + the system path, and the previously inserted `project_dir` will be removed. Returns ------- Tuple[bool, Optional[str]] A boolean indicating whether an object reference is valid and the reason why it might not be. + + Note + ---- + This function will modify `sys.path` by inserting the provided `project_dir` + and removing the previously inserted `project_dir`. """ module_str, _, attributes_str = module_attribute_str.partition(":") if not module_str: @@ -63,6 +82,9 @@ def validate( ) if check_module: + # Set the system path + _set_sys_path(project_dir) + # Load module module = find_spec(module_str) if module and module.origin: @@ -89,18 +111,40 @@ def load_app( # pylint: disable= too-many-branches ) -> Any: """Return the object specified in a module attribute string. - The module/attribute string should have the form :. Valid - examples include `client:app` and `project.package.module:wrapper.app`. It must - refer to a module on the PYTHONPATH, the module needs to have the specified - attribute. + Parameters + ---------- + module_attribute_str : str + The reference to the object. It should have the form `:`. + Valid examples include `client:app` and `project.package.module:wrapper.app`. + It must refer to a module on the PYTHONPATH or in the provided `project_dir` + and the module needs to have the specified attribute. + error_type : Type[Exception] + The type of exception to be raised if the provided `module_attribute_str` is + in an invalid format. + project_dir : Optional[Union[str, Path]], optional (default=None) + The directory containing the module. If None, the current working directory + is used. The `project_dir` will be inserted into the system path, and the + previously inserted `project_dir` will be removed. + + Returns + ------- + Any + The object specified by the module attribute string. + + Note + ---- + This function will modify `sys.path` by inserting the provided `project_dir` + and removing the previously inserted `project_dir`. """ - valid, error_msg = validate(module_attribute_str) + valid, error_msg = validate(module_attribute_str, check_module=False) if not valid and error_msg: raise error_type(error_msg) from None module_str, _, attributes_str = module_attribute_str.partition(":") try: + _set_sys_path(project_dir) + if module_str not in sys.modules: module = importlib.import_module(module_str) # Hack: `tabnet` does not work with `importlib.reload` @@ -116,19 +160,15 @@ def load_app( # pylint: disable= too-many-branches module = sys.modules[module_str] else: module = sys.modules[module_str] + if project_dir is None: - path: Optional[str] = getattr(module, "__file__", None) - if path is not None: - project_dir = str(Path(path).parent) - else: - project_dir = str(Path(project_dir).absolute()) + project_dir = Path.cwd() # Reload cached modules in the project directory - if project_dir is not None: - for m in list(sys.modules.values()): - path = getattr(m, "__file__", None) - if path is not None and path.startswith(project_dir): - importlib.reload(m) + for m in list(sys.modules.values()): + path: Optional[str] = getattr(m, "__file__", None) + if path is not None and path.startswith(str(project_dir)): + importlib.reload(m) except ModuleNotFoundError as err: raise error_type( @@ -140,15 +180,38 @@ def load_app( # pylint: disable= too-many-branches try: for attribute_str in attributes_str.split("."): attribute = getattr(attribute, attribute_str) - except AttributeError: + except AttributeError as err: raise error_type( f"Unable to load attribute {attributes_str} from module {module_str}" f"{OBJECT_REF_HELP_STR}", - ) from None + ) from err return attribute +def _set_sys_path(directory: Optional[Union[str, Path]]) -> None: + """Set the system path.""" + if directory is None: + directory = Path.cwd() + else: + directory = Path(directory).absolute() + + # If the directory has already been added to `sys.path`, return + if str(directory) in sys.path: + return + + # Remove the old path if it exists and is not `""`. + global _current_sys_path # pylint: disable=global-statement + if _current_sys_path is not None: + sys.path.remove(_current_sys_path) + + # Add the new path to sys.path + sys.path.insert(0, str(directory)) + + # Update the current_sys_path + _current_sys_path = str(directory) + + def _find_attribute_in_module(file_path: str, attribute_name: str) -> bool: """Check if attribute_name exists in module's abstract symbolic tree.""" with open(file_path, encoding="utf-8") as file: diff --git a/src/py/flwr/server/run_serverapp.py b/src/py/flwr/server/run_serverapp.py index b6baca0dff54..3f062351e48d 100644 --- a/src/py/flwr/server/run_serverapp.py +++ b/src/py/flwr/server/run_serverapp.py @@ -57,9 +57,6 @@ def run( "but not both." ) - if server_app_dir is not None: - sys.path.insert(0, str(Path(server_app_dir).absolute())) - # Load ServerApp if needed def _load() -> ServerApp: if server_app_attr: diff --git a/src/py/flwr/server/superlink/fleet/vce/vce_api.py b/src/py/flwr/server/superlink/fleet/vce/vce_api.py index 320f839e9e01..4327783045ad 100644 --- a/src/py/flwr/server/superlink/fleet/vce/vce_api.py +++ b/src/py/flwr/server/superlink/fleet/vce/vce_api.py @@ -347,8 +347,8 @@ def _load() -> ClientApp: if client_app_attr: app = _get_load_client_app_fn( default_app_ref=client_app_attr, - dir_arg=app_dir, - flwr_dir_arg=flwr_dir, + project_dir=app_dir, + flwr_dir=flwr_dir, multi_app=True, )(run.fab_id, run.fab_version) diff --git a/src/py/flwr/superexec/app.py b/src/py/flwr/superexec/app.py index 9f1753ce041b..b852577d943f 100644 --- a/src/py/flwr/superexec/app.py +++ b/src/py/flwr/superexec/app.py @@ -163,11 +163,8 @@ def _load_executor( args: argparse.Namespace, ) -> Executor: """Get the executor plugin.""" - if args.executor_dir is not None: - sys.path.insert(0, args.executor_dir) - executor_ref: str = args.executor - valid, error_msg = validate(executor_ref) + valid, error_msg = validate(executor_ref, project_dir=args.executor_dir) if not valid and error_msg: raise LoadExecutorError(error_msg) from None From 54b26828e6f632cea69fc871fa025cfb57b8c005 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 23 Jul 2024 13:41:43 +0100 Subject: [PATCH 04/16] feat(framework) Use dataset caching in `flwr new` templates (#3877) --- .../cli/new/templates/app/code/task.hf.py.tpl | 14 +++++++++++++- .../cli/new/templates/app/code/task.mlx.py.tpl | 15 ++++++++++++++- .../new/templates/app/code/task.pytorch.py.tpl | 15 +++++++++++++-- .../new/templates/app/code/task.tensorflow.py.tpl | 14 +++++++++++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl b/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl index eb43acfce976..51a21dd17418 100644 --- a/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl @@ -10,15 +10,27 @@ from torch.utils.data import DataLoader from transformers import AutoTokenizer, DataCollatorWithPadding from flwr_datasets import FederatedDataset +from flwr_datasets.partitioner import IidPartitioner + warnings.filterwarnings("ignore", category=UserWarning) DEVICE = torch.device("cpu") CHECKPOINT = "distilbert-base-uncased" # transformer model checkpoint +fds = None # Cache FederatedDataset + + def load_data(partition_id: int, num_partitions: int): """Load IMDB data (training and eval)""" - fds = FederatedDataset(dataset="imdb", partitioners={"train": num_partitions}) + # Only initialize `FederatedDataset` once + global fds + if fds is None: + partitioner = IidPartitioner(num_partitions=num_partitions) + fds = FederatedDataset( + dataset="stanfordnlp/imdb", + partitioners={"train": partitioner}, + ) partition = fds.load_partition(partition_id) # Divide data: 80% train, 20% test partition_train_test = partition.train_test_split(test_size=0.2, seed=42) diff --git a/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl b/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl index 88053b0cd590..1759fe8c0b42 100644 --- a/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl @@ -5,10 +5,12 @@ import mlx.nn as nn import numpy as np from datasets.utils.logging import disable_progress_bar from flwr_datasets import FederatedDataset +from flwr_datasets.partitioner import IidPartitioner disable_progress_bar() + class MLP(nn.Module): """A simple MLP.""" @@ -43,8 +45,19 @@ def batch_iterate(batch_size, X, y): yield X[ids], y[ids] +fds = None # Cache FederatedDataset + + def load_data(partition_id: int, num_partitions: int): - fds = FederatedDataset(dataset="mnist", partitioners={"train": num_partitions}) + # Only initialize `FederatedDataset` once + global fds + if fds is None: + partitioner = IidPartitioner(num_partitions=num_partitions) + fds = FederatedDataset( + dataset="ylecun/mnist", + partitioners={"train": partitioner}, + trust_remote_code=True, + ) partition = fds.load_partition(partition_id) partition_splits = partition.train_test_split(test_size=0.2, seed=42) diff --git a/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl b/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl index d5971ffb6ce5..bd2fad5be589 100644 --- a/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl @@ -6,9 +6,10 @@ import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoader -from torchvision.datasets import CIFAR10 from torchvision.transforms import Compose, Normalize, ToTensor from flwr_datasets import FederatedDataset +from flwr_datasets.partitioner import IidPartitioner + DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") @@ -34,9 +35,19 @@ class Net(nn.Module): return self.fc3(x) +fds = None # Cache FederatedDataset + + def load_data(partition_id: int, num_partitions: int): """Load partition CIFAR10 data.""" - fds = FederatedDataset(dataset="cifar10", partitioners={"train": num_partitions}) + # Only initialize `FederatedDataset` once + global fds + if fds is None: + partitioner = IidPartitioner(num_partitions=num_partitions) + fds = FederatedDataset( + dataset="uoft-cs/cifar10", + partitioners={"train": partitioner}, + ) partition = fds.load_partition(partition_id) # Divide data on each node: 80% train, 20% test partition_train_test = partition.train_test_split(test_size=0.2, seed=42) diff --git a/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl b/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl index fa07f93713ed..c495774ffeb3 100644 --- a/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl @@ -4,11 +4,13 @@ import os import tensorflow as tf from flwr_datasets import FederatedDataset +from flwr_datasets.partitioner import IidPartitioner # Make TensorFlow log less verbose os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" + def load_model(): # Load model and data (MobileNetV2, CIFAR-10) model = tf.keras.applications.MobileNetV2((32, 32, 3), classes=10, weights=None) @@ -16,9 +18,19 @@ def load_model(): return model +fds = None # Cache FederatedDataset + + def load_data(partition_id, num_partitions): # Download and partition dataset - fds = FederatedDataset(dataset="cifar10", partitioners={"train": num_partitions}) + # Only initialize `FederatedDataset` once + global fds + if fds is None: + partitioner = IidPartitioner(num_partitions=num_partitions) + fds = FederatedDataset( + dataset="uoft-cs/cifar10", + partitioners={"train": partitioner}, + ) partition = fds.load_partition(partition_id, "train") partition.set_format("numpy") From 4636b12f1c63c8bd68579ec425421774ab183cb2 Mon Sep 17 00:00:00 2001 From: Robert Steiner Date: Tue, 23 Jul 2024 14:55:10 +0200 Subject: [PATCH 05/16] feat(framework:skip) Upgrade system Python pip and setuptools (#3820) Signed-off-by: Robert Steiner --- src/docker/base/alpine/Dockerfile | 8 ++++++-- src/docker/base/ubuntu/Dockerfile | 13 ++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/docker/base/alpine/Dockerfile b/src/docker/base/alpine/Dockerfile index 9e58d82e3bda..441e0fdd9b85 100644 --- a/src/docker/base/alpine/Dockerfile +++ b/src/docker/base/alpine/Dockerfile @@ -26,7 +26,7 @@ ARG PYTHON_VERSION=3.11 ARG DISTRO=alpine ARG DISTRO_VERSION=3.19 -FROM python:${PYTHON_VERSION}-${DISTRO}${DISTRO_VERSION} as compile +FROM python:${PYTHON_VERSION}-${DISTRO}${DISTRO_VERSION} AS compile # Install system dependencies RUN apk add --no-cache \ @@ -49,7 +49,11 @@ RUN pip install -U --no-cache-dir \ setuptools==${SETUPTOOLS_VERSION} \ ${FLWR_PACKAGE}==${FLWR_VERSION} -FROM python:${PYTHON_VERSION}-${DISTRO}${DISTRO_VERSION} as base +FROM python:${PYTHON_VERSION}-${DISTRO}${DISTRO_VERSION} AS base + +# Upgrade system Python pip and setuptools +# hadolint ignore=DL3013 +RUN pip install -U --no-cache-dir pip setuptools # required by the grpc package RUN apk add --no-cache \ diff --git a/src/docker/base/ubuntu/Dockerfile b/src/docker/base/ubuntu/Dockerfile index 960ed07edf96..31cc8381b7c5 100644 --- a/src/docker/base/ubuntu/Dockerfile +++ b/src/docker/base/ubuntu/Dockerfile @@ -16,7 +16,7 @@ # hadolint global ignore=DL3008 ARG DISTRO=ubuntu ARG DISTRO_VERSION=22.04 -FROM $DISTRO:$DISTRO_VERSION as python +FROM $DISTRO:$DISTRO_VERSION AS python ENV DEBIAN_FRONTEND=noninteractive @@ -50,9 +50,12 @@ RUN LATEST=$(pyenv latest -k ${PYTHON_VERSION}) \ ENV PATH=/usr/local/bin/python/bin:$PATH -# Use a virtual environment to ensure that Python packages are installed in the same location -# regardless of whether the subsequent image build is run with the app or the root user -RUN python -m venv /python/venv +# Upgrade system Python pip and setuptools +# hadolint ignore=DL3013 +RUN pip install -U --no-cache-dir pip setuptools \ + # Use a virtual environment to ensure that Python packages are installed in the same location + # regardless of whether the subsequent image build is run with the app or the root user + && python -m venv /python/venv ENV PATH=/python/venv/bin:$PATH ARG PIP_VERSION @@ -64,7 +67,7 @@ RUN pip install -U --no-cache-dir \ setuptools==${SETUPTOOLS_VERSION} \ ${FLWR_PACKAGE}==${FLWR_VERSION} -FROM $DISTRO:$DISTRO_VERSION as base +FROM $DISTRO:$DISTRO_VERSION AS base COPY --from=python /usr/local/bin/python /usr/local/bin/python From d32d3123cb990494f42077a837957e0a3e5a25e0 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 23 Jul 2024 14:03:29 +0100 Subject: [PATCH 06/16] fix(framework:skip) Convert `UserConfig` to `str` for simulation executor (#3878) --- src/py/flwr/superexec/simulation.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/py/flwr/superexec/simulation.py b/src/py/flwr/superexec/simulation.py index be49c83be716..5f0b5bf814fa 100644 --- a/src/py/flwr/superexec/simulation.py +++ b/src/py/flwr/superexec/simulation.py @@ -32,6 +32,25 @@ from .executor import Executor, RunTracker +def _user_config_to_str(user_config: UserConfig) -> str: + """Convert override user config to string.""" + user_config_list_str = [] + for key, value in user_config.items(): + if isinstance(value, bool): + user_config_list_str.append(f"{key}={str(value).lower()}") + elif isinstance(value, (int, float)): + user_config_list_str.append(f"{key}={value}") + elif isinstance(value, str): + user_config_list_str.append(f'{key}="{value}"') + else: + raise ValueError( + "Only types `bool`, `float`, `int` and `str` are supported" + ) + + user_config_str = ",".join(user_config_list_str) + return user_config_str + + class SimulationEngine(Executor): """Simulation engine executor. @@ -129,7 +148,8 @@ def start_run( ] if override_config: - command.extend(["--run-config", f"{override_config}"]) + override_config_str = _user_config_to_str(override_config) + command.extend(["--run-config", f"{override_config_str}"]) # Start Simulation proc = subprocess.run( # pylint: disable=consider-using-with From 3f79f140b7a23432ab88a7dc9e29a9d6fd2d2a94 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 23 Jul 2024 14:57:41 +0100 Subject: [PATCH 07/16] fix(framework) Remove `str` casting for node config (#3886) --- src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl | 4 ++-- src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl | 4 ++-- src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl | 4 ++-- src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl | 4 ++-- .../flwr/cli/new/templates/app/code/client.tensorflow.py.tpl | 4 ++-- src/py/flwr/server/superlink/fleet/vce/vce_api.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl index e79952ea09ae..5a2037897d4d 100644 --- a/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl @@ -50,8 +50,8 @@ def client_fn(context: Context): CHECKPOINT, num_labels=2 ).to(DEVICE) - partition_id = int(context.node_config["partition-id"]) - num_partitions = int(context.node_config["num-partitions"]) + partition_id = context.node_config["partition-id"] + num_partitions = context.node_config["num-partitions"] trainloader, valloader = load_data(partition_id, num_partitions) local_epochs = context.run_config["local-epochs"] diff --git a/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl index 3817b325f5e3..a28c59eda232 100644 --- a/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl @@ -70,8 +70,8 @@ class FlowerClient(NumPyClient): def client_fn(context: Context): - partition_id = int(context.node_config["partition-id"]) - num_partitions = int(context.node_config["num-partitions"]) + partition_id = context.node_config["partition-id"] + num_partitions = context.node_config["num-partitions"] data = load_data(partition_id, num_partitions) num_layers = context.run_config["num-layers"] diff --git a/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl index 6fb201e20b28..ec7f5ffd9b00 100644 --- a/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl @@ -42,8 +42,8 @@ class FlowerClient(NumPyClient): def client_fn(context: Context): # Load model and data net = Net().to(DEVICE) - partition_id = int(context.node_config["partition-id"]) - num_partitions = int(context.node_config["num-partitions"]) + partition_id = context.node_config["partition-id"] + num_partitions = context.node_config["num-partitions"] trainloader, valloader = load_data(partition_id, num_partitions) local_epochs = context.run_config["local-epochs"] diff --git a/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl index 9642ae490155..af1cdb512bee 100644 --- a/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl @@ -69,8 +69,8 @@ class FlowerClient(NumPyClient): def client_fn(context: Context): - partition_id = int(context.node_config["partition-id"]) - num_partitions = int(context.node_config["num-partitions"]) + partition_id = context.node_config["partition-id"] + num_partitions = context.node_config["num-partitions"] fds = FederatedDataset(dataset="mnist", partitioners={"train": num_partitions}) dataset = fds.load_partition(partition_id, "train").with_format("numpy") diff --git a/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl index 54a7c28dedf9..2e1d55d82aa0 100644 --- a/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl @@ -44,8 +44,8 @@ def client_fn(context: Context): # Load model and data net = load_model() - partition_id = int(context.node_config["partition-id"]) - num_partitions = int(context.node_config["num-partitions"]) + partition_id = context.node_config["partition-id"] + num_partitions = context.node_config["num-partitions"] x_train, y_train, x_test, y_test = load_data(partition_id, num_partitions) epochs = context.run_config["local-epochs"] batch_size = context.run_config["batch-size"] diff --git a/src/py/flwr/server/superlink/fleet/vce/vce_api.py b/src/py/flwr/server/superlink/fleet/vce/vce_api.py index 4327783045ad..f11576d63396 100644 --- a/src/py/flwr/server/superlink/fleet/vce/vce_api.py +++ b/src/py/flwr/server/superlink/fleet/vce/vce_api.py @@ -72,8 +72,8 @@ def _register_node_states( node_states[node_id] = NodeState( node_id=node_id, node_config={ - PARTITION_ID_KEY: str(partition_id), - NUM_PARTITIONS_KEY: str(num_partitions), + PARTITION_ID_KEY: partition_id, + NUM_PARTITIONS_KEY: num_partitions, }, ) From ec088a8cedac216deb7cc262cf9416d3bdaa408e Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 23 Jul 2024 15:19:19 +0100 Subject: [PATCH 08/16] fix(framework:skip) Update `flwrtune` templates to use new `client_fn` and `server_fn` (#3885) --- .../templates/app/code/flwr_tune/app.py.tpl | 37 ++++++++++--------- .../app/code/flwr_tune/client.py.tpl | 8 ++-- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl b/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl index a0f781df04a1..637658c5b23c 100644 --- a/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl @@ -9,8 +9,8 @@ from hydra import compose, initialize from hydra.utils import instantiate from flwr.client import ClientApp -from flwr.common import ndarrays_to_parameters -from flwr.server import ServerApp, ServerConfig +from flwr.common import Context, ndarrays_to_parameters +from flwr.server import ServerApp, ServerAppComponents, ServerConfig from $import_name.client_app import gen_client_fn, get_parameters from $import_name.dataset import get_tokenizer_and_data_collator_and_propt_formatting @@ -67,20 +67,23 @@ init_model = get_model(cfg.model) init_model_parameters = get_parameters(init_model) init_model_parameters = ndarrays_to_parameters(init_model_parameters) -# Instantiate strategy according to config. Here we pass other arguments -# that are only defined at runtime. -strategy = instantiate( - cfg.strategy, - on_fit_config_fn=get_on_fit_config(), - fit_metrics_aggregation_fn=fit_weighted_average, - initial_parameters=init_model_parameters, - evaluate_fn=get_evaluate_fn( - cfg.model, cfg.train.save_every_round, cfg_static.num_rounds, save_path - ), -) +def server_fn(context: Context): + # Instantiate strategy according to config. Here we pass other arguments + # that are only defined at runtime. + strategy = instantiate( + cfg.strategy, + on_fit_config_fn=get_on_fit_config(), + fit_metrics_aggregation_fn=fit_weighted_average, + initial_parameters=init_model_parameters, + evaluate_fn=get_evaluate_fn( + cfg.model, cfg.train.save_every_round, cfg_static.num_rounds, save_path + ), + ) + + config = ServerConfig(num_rounds=cfg_static.num_rounds) + + return ServerAppComponents(strategy=strategy, config=config) + # ServerApp for Flower Next -server = ServerApp( - config=ServerConfig(num_rounds=cfg_static.num_rounds), - strategy=strategy, -) +server = ServerApp(server_fn=server_fn) diff --git a/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl b/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl index c0d5842964fd..2472e23ece44 100644 --- a/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +++ b/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl @@ -10,6 +10,7 @@ from transformers import TrainingArguments from trl import SFTTrainer from flwr.client import NumPyClient +from flwr.common import Context from flwr.common.typing import NDArrays, Scalar from $import_name.dataset import reformat from $import_name.models import cosine_annealing, get_model @@ -102,13 +103,14 @@ def gen_client_fn( model_cfg: DictConfig, train_cfg: DictConfig, save_path: str, -) -> Callable[[str], FlowerClient]: # pylint: disable=too-many-arguments +) -> Callable[[Context], FlowerClient]: # pylint: disable=too-many-arguments """Generate the client function that creates the Flower Clients.""" - def client_fn(cid: str) -> FlowerClient: + def client_fn(context: Context) -> FlowerClient: """Create a Flower client representing a single organization.""" # Let's get the partition corresponding to the i-th client - client_trainset = fds.load_partition(int(cid), "train") + partition_id = context.node_config["partition-id"] + client_trainset = fds.load_partition(partition_id, "train") client_trainset = reformat(client_trainset, llm_task="$llm_challenge_str") return FlowerClient( From 4a9286cc4dc4d2ad7f4b42191d60b8fe7363da9d Mon Sep 17 00:00:00 2001 From: Charles Beauville Date: Tue, 23 Jul 2024 17:39:01 +0200 Subject: [PATCH 09/16] fix(framework:skip) Use full name for HuggingFace template (#3883) --- .github/workflows/e2e.yml | 2 +- src/py/flwr/cli/new/new.py | 2 +- .../app/code/{client.hf.py.tpl => client.huggingface.py.tpl} | 0 .../app/code/{server.hf.py.tpl => server.huggingface.py.tpl} | 0 .../app/code/{task.hf.py.tpl => task.huggingface.py.tpl} | 0 .../{pyproject.hf.toml.tpl => pyproject.huggingface.toml.tpl} | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename src/py/flwr/cli/new/templates/app/code/{client.hf.py.tpl => client.huggingface.py.tpl} (100%) rename src/py/flwr/cli/new/templates/app/code/{server.hf.py.tpl => server.huggingface.py.tpl} (100%) rename src/py/flwr/cli/new/templates/app/code/{task.hf.py.tpl => task.huggingface.py.tpl} (100%) rename src/py/flwr/cli/new/templates/app/{pyproject.hf.toml.tpl => pyproject.huggingface.toml.tpl} (100%) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 241ec8057c7c..f5ed1d99012a 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -213,7 +213,7 @@ jobs: needs: wheel strategy: matrix: - framework: ["numpy", "pytorch", "tensorflow", "hf", "jax", "sklearn"] + framework: ["numpy", "pytorch", "tensorflow", "huggingface", "jax", "sklearn"] name: Template / ${{ matrix.framework }} diff --git a/src/py/flwr/cli/new/new.py b/src/py/flwr/cli/new/new.py index 306f20efccfa..237b8847e193 100644 --- a/src/py/flwr/cli/new/new.py +++ b/src/py/flwr/cli/new/new.py @@ -38,7 +38,7 @@ class MlFramework(str, Enum): PYTORCH = "PyTorch" TENSORFLOW = "TensorFlow" JAX = "JAX" - HUGGINGFACE = "HF" + HUGGINGFACE = "HuggingFace" MLX = "MLX" SKLEARN = "sklearn" FLOWERTUNE = "FlowerTune" diff --git a/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl b/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl similarity index 100% rename from src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl rename to src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl diff --git a/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl b/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl similarity index 100% rename from src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl rename to src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl diff --git a/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl b/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl similarity index 100% rename from src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl rename to src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl diff --git a/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl b/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl similarity index 100% rename from src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl rename to src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl From edee810e1f4acc9662e2da2d0c834c9064f9d4e4 Mon Sep 17 00:00:00 2001 From: Chong Shen Ng Date: Tue, 23 Jul 2024 17:29:40 +0100 Subject: [PATCH 10/16] fix(framework:skip) Fix `SimulationEngine` log (#3888) --- src/py/flwr/superexec/simulation.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/py/flwr/superexec/simulation.py b/src/py/flwr/superexec/simulation.py index 5f0b5bf814fa..3c182fd8b002 100644 --- a/src/py/flwr/superexec/simulation.py +++ b/src/py/flwr/superexec/simulation.py @@ -152,9 +152,8 @@ def start_run( command.extend(["--run-config", f"{override_config_str}"]) # Start Simulation - proc = subprocess.run( # pylint: disable=consider-using-with + proc = subprocess.Popen( # pylint: disable=consider-using-with command, - check=True, text=True, ) @@ -162,7 +161,7 @@ def start_run( return RunTracker( run_id=run_id, - proc=proc, # type:ignore + proc=proc, ) # pylint: disable-next=broad-except From 723c56f272bfa1d54d07b0c5a8605c1bcf11b2be Mon Sep 17 00:00:00 2001 From: Charles Beauville Date: Tue, 23 Jul 2024 18:37:17 +0200 Subject: [PATCH 11/16] refactor(framework:skip) Improve SuperExec docs (#3889) --- src/py/flwr/superexec/app.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/py/flwr/superexec/app.py b/src/py/flwr/superexec/app.py index b852577d943f..2ad5f12d227f 100644 --- a/src/py/flwr/superexec/app.py +++ b/src/py/flwr/superexec/app.py @@ -93,7 +93,9 @@ def _parse_args_run_superexec() -> argparse.ArgumentParser: ) parser.add_argument( "--executor-config", - help="Key-value pairs for the executor config, separated by commas.", + help="Key-value pairs for the executor config, separated by commas. " + 'For example:\n\n`--executor-config superlink="superlink:9091",' + 'root-certificates="certificates/superlink-ca.crt"`', ) parser.add_argument( "--insecure", From 8cd9ab1d80c291f59e108d3c2f38da4806b9d388 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 23 Jul 2024 18:07:17 +0100 Subject: [PATCH 12/16] fix(framework:skip) Unify default `client_resources` and deprecate setting GPU growth as input argument (#3890) --- src/py/flwr/simulation/run_simulation.py | 36 +++++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/py/flwr/simulation/run_simulation.py b/src/py/flwr/simulation/run_simulation.py index 7cebb90451d6..51799074ef6f 100644 --- a/src/py/flwr/simulation/run_simulation.py +++ b/src/py/flwr/simulation/run_simulation.py @@ -32,7 +32,11 @@ from flwr.common import EventType, event, log from flwr.common.config import get_fused_config_from_dir, parse_config_args from flwr.common.constant import RUN_ID_NUM_BYTES -from flwr.common.logger import set_logger_propagation, update_console_handler +from flwr.common.logger import ( + set_logger_propagation, + update_console_handler, + warn_deprecated_feature_with_example, +) from flwr.common.typing import Run, UserConfig from flwr.server.driver import Driver, InMemoryDriver from flwr.server.run_serverapp import run as run_server_app @@ -93,6 +97,14 @@ def run_simulation_from_cli() -> None: """Run Simulation Engine from the CLI.""" args = _parse_args_run_simulation().parse_args() + if args.enable_tf_gpu_growth: + warn_deprecated_feature_with_example( + "Passing `--enable-tf-gpu-growth` is deprecated.", + example_message="Instead, set the `TF_FORCE_GPU_ALLOW_GROWTH` environmnet " + "variable to true.", + code_example='TF_FORCE_GPU_ALLOW_GROWTH="true" flower-simulation <...>', + ) + # We are supporting two modes for the CLI entrypoint: # 1) Running an app dir containing a `pyproject.toml` # 2) Running any ClientApp and SeverApp w/o pyproject.toml being present @@ -223,6 +235,15 @@ def run_simulation( When disabled, only INFO, WARNING and ERROR log messages will be shown. If enabled, DEBUG-level logs will be displayed. """ + if enable_tf_gpu_growth: + warn_deprecated_feature_with_example( + "Passing `enable_tf_gpu_growth=True` is deprecated.", + example_message="Instead, set the `TF_FORCE_GPU_ALLOW_GROWTH` environmnet " + "variable to true.", + code_example='import os;os.environ["TF_FORCE_GPU_ALLOW_GROWTH"]="true"' + "\n\tflwr.simulation.run_simulationt(...)", + ) + _run_simulation( num_supernodes=num_supernodes, client_app=client_app, @@ -264,7 +285,7 @@ def server_th_with_start_checks( """ try: if tf_gpu_growth: - log(INFO, "Enabling GPU growth for Tensorflow on the main thread.") + log(INFO, "Enabling GPU growth for Tensorflow on the server thread.") enable_gpu_growth() # Run ServerApp @@ -475,6 +496,14 @@ def _run_simulation( if "init_args" not in backend_config: backend_config["init_args"] = {} + # Set default client_resources if not passed + if "client_resources" not in backend_config: + backend_config["client_resources"] = {"num_cpus": 2, "num_gpus": 0} + + # Initialization of backend config to enable GPU growth globally when set + if "actor" not in backend_config: + backend_config["actor"] = {"tensorflow": 0} + # Set logging level logger = logging.getLogger("flwr") if verbose_logging: @@ -580,8 +609,7 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser: parser.add_argument( "--backend-config", type=str, - default='{"client_resources": {"num_cpus":2, "num_gpus":0.0},' - '"actor": {"tensorflow": 0}}', + default="{}", help='A JSON formatted stream, e.g \'{"":, "":}\' to ' "configure a backend. Values supported in are those included by " "`flwr.common.typing.ConfigsRecordValues`. ", From 26411b04ed06b8483d637189f27f75b63c5fe934 Mon Sep 17 00:00:00 2001 From: Adam Narozniak <51029327+adam-narozniak@users.noreply.github.com> Date: Wed, 24 Jul 2024 00:18:53 +0200 Subject: [PATCH 13/16] docs(datasets) Rewrite Flower Datasets quickstart tutorial as a notebook (#3854) Co-authored-by: jafermarq --- .../tutorial-quickstart/choose-hf-dataset.png | Bin 0 -> 808670 bytes .../tutorial-quickstart/copy-dataset-name.png | Bin 0 -> 392600 bytes datasets/doc/source/tutorial-quickstart.ipynb | 550 ++++++++++++++++++ datasets/doc/source/tutorial-quickstart.rst | 99 ---- 4 files changed, 550 insertions(+), 99 deletions(-) create mode 100644 datasets/doc/source/_static/tutorial-quickstart/choose-hf-dataset.png create mode 100644 datasets/doc/source/_static/tutorial-quickstart/copy-dataset-name.png create mode 100644 datasets/doc/source/tutorial-quickstart.ipynb delete mode 100644 datasets/doc/source/tutorial-quickstart.rst diff --git a/datasets/doc/source/_static/tutorial-quickstart/choose-hf-dataset.png b/datasets/doc/source/_static/tutorial-quickstart/choose-hf-dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..ffce2008e178883307b951efe0f77b3ba2730b6c GIT binary patch literal 808670 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

krJ^quga%Cq!fB)2|Ltj^v$tBotB!) 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