flwr-nightly 1.11.0.dev20240822__tar.gz → 1.11.0.dev20240824__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flwr-nightly might be problematic. Click here for more details.
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/PKG-INFO +2 -2
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/README.md +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/pyproject.toml +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/build.py +1 -1
- flwr_nightly-1.11.0.dev20240824/src/py/flwr/cli/new/templates/app/README.md.tpl +20 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/run/run.py +10 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/client.py +22 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/numpy_client.py +22 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/rest_client/connection.py +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/address.py +43 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/app.py +19 -13
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/run_serverapp.py +15 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +15 -2
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +5 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +19 -8
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +11 -11
- flwr_nightly-1.11.0.dev20240824/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +184 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +1 -2
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +13 -4
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -6
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/in_memory_state.py +15 -15
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/sqlite_state.py +10 -10
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/state.py +8 -8
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/run_simulation.py +48 -17
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/simulation.py +20 -1
- flwr_nightly-1.11.0.dev20240822/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -43
- flwr_nightly-1.11.0.dev20240822/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -235
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/LICENSE +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/superexec/executor.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.11.0.
|
|
3
|
+
Version: 1.11.0.dev20240824
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -196,7 +196,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
196
196
|
- [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
|
|
197
197
|
- [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
|
|
198
198
|
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
|
|
199
|
-
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit
|
|
199
|
+
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/flowertune-vit)
|
|
200
200
|
- [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
|
|
201
201
|
- [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
|
|
202
202
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
@@ -144,7 +144,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
144
144
|
- [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
|
|
145
145
|
- [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
|
|
146
146
|
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
|
|
147
|
-
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit
|
|
147
|
+
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/flowertune-vit)
|
|
148
148
|
- [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
|
|
149
149
|
- [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
|
|
150
150
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.11.0.
|
|
7
|
+
version = "1.11.0.dev20240824"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# $project_name: A Flower / $framework_str app
|
|
2
|
+
|
|
3
|
+
## Install dependencies and project
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pip install -e .
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Run with the Simulation Engine
|
|
10
|
+
|
|
11
|
+
In the `$project_name` directory, use `flwr run` to run a local simulation:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
flwr run .
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Run with the Deployment Engine
|
|
18
|
+
|
|
19
|
+
> \[!NOTE\]
|
|
20
|
+
> An update to this example will show how to run this Flower application with the Deployment Engine and TLS certificates, or with Docker.
|
{flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/cli/run/run.py
RENAMED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"""Flower command line interface `run` command."""
|
|
16
16
|
|
|
17
17
|
import hashlib
|
|
18
|
+
import json
|
|
18
19
|
import subprocess
|
|
19
20
|
import sys
|
|
20
21
|
from logging import DEBUG
|
|
@@ -192,6 +193,8 @@ def _run_without_superexec(
|
|
|
192
193
|
) -> None:
|
|
193
194
|
try:
|
|
194
195
|
num_supernodes = federation_config["options"]["num-supernodes"]
|
|
196
|
+
verbose: Optional[bool] = federation_config["options"].get("verbose")
|
|
197
|
+
backend_cfg = federation_config["options"].get("backend", {})
|
|
195
198
|
except KeyError as err:
|
|
196
199
|
typer.secho(
|
|
197
200
|
"❌ The project's `pyproject.toml` needs to declare the number of"
|
|
@@ -212,6 +215,13 @@ def _run_without_superexec(
|
|
|
212
215
|
f"{num_supernodes}",
|
|
213
216
|
]
|
|
214
217
|
|
|
218
|
+
if backend_cfg:
|
|
219
|
+
# Stringify as JSON
|
|
220
|
+
command.extend(["--backend-config", json.dumps(backend_cfg)])
|
|
221
|
+
|
|
222
|
+
if verbose:
|
|
223
|
+
command.extend(["--verbose"])
|
|
224
|
+
|
|
215
225
|
if config_overrides:
|
|
216
226
|
command.extend(["--run-config", f"{' '.join(config_overrides)}"])
|
|
217
227
|
|
{flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/client/client.py
RENAMED
|
@@ -33,12 +33,13 @@ from flwr.common import (
|
|
|
33
33
|
Parameters,
|
|
34
34
|
Status,
|
|
35
35
|
)
|
|
36
|
+
from flwr.common.logger import warn_deprecated_feature_with_example
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class Client(ABC):
|
|
39
40
|
"""Abstract base class for Flower clients."""
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
_context: Context
|
|
42
43
|
|
|
43
44
|
def get_properties(self, ins: GetPropertiesIns) -> GetPropertiesRes:
|
|
44
45
|
"""Return set of client's properties.
|
|
@@ -141,6 +142,26 @@ class Client(ABC):
|
|
|
141
142
|
metrics={},
|
|
142
143
|
)
|
|
143
144
|
|
|
145
|
+
@property
|
|
146
|
+
def context(self) -> Context:
|
|
147
|
+
"""Getter for `Context` client attribute."""
|
|
148
|
+
warn_deprecated_feature_with_example(
|
|
149
|
+
"Accessing the context via the client's attribute is deprecated.",
|
|
150
|
+
example_message="Instead, pass it to the client's "
|
|
151
|
+
"constructor in your `client_fn()` which already "
|
|
152
|
+
"receives a context object.",
|
|
153
|
+
code_example="def client_fn(context: Context) -> Client:\n\n"
|
|
154
|
+
"\t\t# Your existing client_fn\n\n"
|
|
155
|
+
"\t\t# Pass `context` to the constructor\n"
|
|
156
|
+
"\t\treturn FlowerClient(context).to_client()",
|
|
157
|
+
)
|
|
158
|
+
return self._context
|
|
159
|
+
|
|
160
|
+
@context.setter
|
|
161
|
+
def context(self, context: Context) -> None:
|
|
162
|
+
"""Setter for `Context` client attribute."""
|
|
163
|
+
self._context = context
|
|
164
|
+
|
|
144
165
|
def get_context(self) -> Context:
|
|
145
166
|
"""Get the run context from this client."""
|
|
146
167
|
return self.context
|
|
@@ -27,6 +27,7 @@ from flwr.common import (
|
|
|
27
27
|
ndarrays_to_parameters,
|
|
28
28
|
parameters_to_ndarrays,
|
|
29
29
|
)
|
|
30
|
+
from flwr.common.logger import warn_deprecated_feature_with_example
|
|
30
31
|
from flwr.common.typing import (
|
|
31
32
|
Code,
|
|
32
33
|
EvaluateIns,
|
|
@@ -70,7 +71,7 @@ Example
|
|
|
70
71
|
class NumPyClient(ABC):
|
|
71
72
|
"""Abstract base class for Flower clients using NumPy."""
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
_context: Context
|
|
74
75
|
|
|
75
76
|
def get_properties(self, config: Config) -> Dict[str, Scalar]:
|
|
76
77
|
"""Return a client's set of properties.
|
|
@@ -174,6 +175,26 @@ class NumPyClient(ABC):
|
|
|
174
175
|
_ = (self, parameters, config)
|
|
175
176
|
return 0.0, 0, {}
|
|
176
177
|
|
|
178
|
+
@property
|
|
179
|
+
def context(self) -> Context:
|
|
180
|
+
"""Getter for `Context` client attribute."""
|
|
181
|
+
warn_deprecated_feature_with_example(
|
|
182
|
+
"Accessing the context via the client's attribute is deprecated.",
|
|
183
|
+
example_message="Instead, pass it to the client's "
|
|
184
|
+
"constructor in your `client_fn()` which already "
|
|
185
|
+
"receives a context object.",
|
|
186
|
+
code_example="def client_fn(context: Context) -> Client:\n\n"
|
|
187
|
+
"\t\t# Your existing client_fn\n\n"
|
|
188
|
+
"\t\t# Pass `context` to the constructor\n"
|
|
189
|
+
"\t\treturn FlowerClient(context).to_client()",
|
|
190
|
+
)
|
|
191
|
+
return self._context
|
|
192
|
+
|
|
193
|
+
@context.setter
|
|
194
|
+
def context(self, context: Context) -> None:
|
|
195
|
+
"""Setter for `Context` client attribute."""
|
|
196
|
+
self._context = context
|
|
197
|
+
|
|
177
198
|
def get_context(self) -> Context:
|
|
178
199
|
"""Get the run context from this client."""
|
|
179
200
|
return self.context
|
|
@@ -275,7 +275,7 @@ def http_request_response( # pylint: disable=,R0913, R0914, R0915
|
|
|
275
275
|
req = DeleteNodeRequest(node=node)
|
|
276
276
|
|
|
277
277
|
# Send the request
|
|
278
|
-
res = _request(req, DeleteNodeResponse,
|
|
278
|
+
res = _request(req, DeleteNodeResponse, PATH_DELETE_NODE)
|
|
279
279
|
if res is None:
|
|
280
280
|
return
|
|
281
281
|
|
{flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/common/address.py
RENAMED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower IP address utils."""
|
|
16
16
|
|
|
17
|
+
import socket
|
|
17
18
|
from ipaddress import ip_address
|
|
18
19
|
from typing import Optional, Tuple
|
|
19
20
|
|
|
@@ -57,3 +58,45 @@ def parse_address(address: str) -> Optional[Tuple[str, int, Optional[bool]]]:
|
|
|
57
58
|
|
|
58
59
|
except ValueError:
|
|
59
60
|
return None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def is_port_in_use(address: str) -> bool:
|
|
64
|
+
"""Check if the port specified in address is in use.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
address : str
|
|
69
|
+
The string representation of a domain, an IPv4, or an IPV6 address
|
|
70
|
+
with the port number.
|
|
71
|
+
|
|
72
|
+
For example, '127.0.0.1:8080', or `[::1]:8080`.
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
bool
|
|
77
|
+
If the port provided is in use or can't be parsed,
|
|
78
|
+
the function will return True, otherwise it will return False.
|
|
79
|
+
"""
|
|
80
|
+
parsed_address = parse_address(address)
|
|
81
|
+
if not parsed_address:
|
|
82
|
+
return True
|
|
83
|
+
host, port, is_v6 = parsed_address
|
|
84
|
+
|
|
85
|
+
if is_v6:
|
|
86
|
+
protocol = socket.AF_INET6
|
|
87
|
+
else:
|
|
88
|
+
protocol = socket.AF_INET
|
|
89
|
+
|
|
90
|
+
with socket.socket(protocol, socket.SOCK_STREAM) as s:
|
|
91
|
+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
92
|
+
try:
|
|
93
|
+
if is_v6:
|
|
94
|
+
# For IPv6, provide `flowinfo` and `scopeid` as 0
|
|
95
|
+
s.bind((host, port, 0, 0))
|
|
96
|
+
else:
|
|
97
|
+
# For IPv4
|
|
98
|
+
s.bind((host, port))
|
|
99
|
+
except OSError:
|
|
100
|
+
return True
|
|
101
|
+
|
|
102
|
+
return False
|
{flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240824}/src/py/flwr/server/app.py
RENAMED
|
@@ -271,30 +271,31 @@ def run_superlink() -> None:
|
|
|
271
271
|
ssl_keyfile,
|
|
272
272
|
ssl_certfile,
|
|
273
273
|
state_factory,
|
|
274
|
+
ffs_factory,
|
|
274
275
|
num_workers,
|
|
275
276
|
),
|
|
276
277
|
)
|
|
277
278
|
fleet_thread.start()
|
|
278
279
|
bckg_threads.append(fleet_thread)
|
|
279
280
|
elif args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE:
|
|
280
|
-
maybe_keys =
|
|
281
|
+
maybe_keys = _try_setup_node_authentication(args, certificates)
|
|
281
282
|
interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None
|
|
282
283
|
if maybe_keys is not None:
|
|
283
284
|
(
|
|
284
|
-
|
|
285
|
+
node_public_keys,
|
|
285
286
|
server_private_key,
|
|
286
287
|
server_public_key,
|
|
287
288
|
) = maybe_keys
|
|
288
289
|
state = state_factory.state()
|
|
289
|
-
state.
|
|
290
|
+
state.store_node_public_keys(node_public_keys)
|
|
290
291
|
state.store_server_private_public_key(
|
|
291
292
|
private_key_to_bytes(server_private_key),
|
|
292
293
|
public_key_to_bytes(server_public_key),
|
|
293
294
|
)
|
|
294
295
|
log(
|
|
295
296
|
INFO,
|
|
296
|
-
"
|
|
297
|
-
len(
|
|
297
|
+
"Node authentication enabled with %d known public keys",
|
|
298
|
+
len(node_public_keys),
|
|
298
299
|
)
|
|
299
300
|
interceptors = [AuthenticateServerInterceptor(state)]
|
|
300
301
|
|
|
@@ -310,6 +311,7 @@ def run_superlink() -> None:
|
|
|
310
311
|
fleet_server = _run_fleet_api_grpc_adapter(
|
|
311
312
|
address=fleet_address,
|
|
312
313
|
state_factory=state_factory,
|
|
314
|
+
ffs_factory=ffs_factory,
|
|
313
315
|
certificates=certificates,
|
|
314
316
|
)
|
|
315
317
|
grpc_servers.append(fleet_server)
|
|
@@ -342,7 +344,7 @@ def _format_address(address: str) -> Tuple[str, str, int]:
|
|
|
342
344
|
return (f"[{host}]:{port}" if is_v6 else f"{host}:{port}", host, port)
|
|
343
345
|
|
|
344
346
|
|
|
345
|
-
def
|
|
347
|
+
def _try_setup_node_authentication(
|
|
346
348
|
args: argparse.Namespace,
|
|
347
349
|
certificates: Optional[Tuple[bytes, bytes, bytes]],
|
|
348
350
|
) -> Optional[Tuple[Set[bytes], ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
|
|
@@ -371,16 +373,16 @@ def _try_setup_client_authentication(
|
|
|
371
373
|
"`--ssl-keyfile`, and `—-ssl-ca-certfile` and try again."
|
|
372
374
|
)
|
|
373
375
|
|
|
374
|
-
|
|
375
|
-
if not
|
|
376
|
+
node_keys_file_path = Path(args.auth_list_public_keys)
|
|
377
|
+
if not node_keys_file_path.exists():
|
|
376
378
|
sys.exit(
|
|
377
379
|
"The provided path to the known public keys CSV file does not exist: "
|
|
378
|
-
f"{
|
|
380
|
+
f"{node_keys_file_path}. "
|
|
379
381
|
"Please provide the CSV file path containing known public keys "
|
|
380
382
|
"to '--auth-list-public-keys'."
|
|
381
383
|
)
|
|
382
384
|
|
|
383
|
-
|
|
385
|
+
node_public_keys: Set[bytes] = set()
|
|
384
386
|
|
|
385
387
|
try:
|
|
386
388
|
ssh_private_key = load_ssh_private_key(
|
|
@@ -411,13 +413,13 @@ def _try_setup_client_authentication(
|
|
|
411
413
|
"path points to a valid public key file and try again."
|
|
412
414
|
)
|
|
413
415
|
|
|
414
|
-
with open(
|
|
416
|
+
with open(node_keys_file_path, newline="", encoding="utf-8") as csvfile:
|
|
415
417
|
reader = csv.reader(csvfile)
|
|
416
418
|
for row in reader:
|
|
417
419
|
for element in row:
|
|
418
420
|
public_key = load_ssh_public_key(element.encode())
|
|
419
421
|
if isinstance(public_key, ec.EllipticCurvePublicKey):
|
|
420
|
-
|
|
422
|
+
node_public_keys.add(public_key_to_bytes(public_key))
|
|
421
423
|
else:
|
|
422
424
|
sys.exit(
|
|
423
425
|
"Error: Unable to parse the public keys in the CSV "
|
|
@@ -425,7 +427,7 @@ def _try_setup_client_authentication(
|
|
|
425
427
|
"known SSH public keys files and try again."
|
|
426
428
|
)
|
|
427
429
|
return (
|
|
428
|
-
|
|
430
|
+
node_public_keys,
|
|
429
431
|
ssh_private_key,
|
|
430
432
|
ssh_public_key,
|
|
431
433
|
)
|
|
@@ -516,12 +518,14 @@ def _run_fleet_api_grpc_rere(
|
|
|
516
518
|
def _run_fleet_api_grpc_adapter(
|
|
517
519
|
address: str,
|
|
518
520
|
state_factory: StateFactory,
|
|
521
|
+
ffs_factory: FfsFactory,
|
|
519
522
|
certificates: Optional[Tuple[bytes, bytes, bytes]],
|
|
520
523
|
) -> grpc.Server:
|
|
521
524
|
"""Run Fleet API (GrpcAdapter)."""
|
|
522
525
|
# Create Fleet API gRPC server
|
|
523
526
|
fleet_servicer = GrpcAdapterServicer(
|
|
524
527
|
state_factory=state_factory,
|
|
528
|
+
ffs_factory=ffs_factory,
|
|
525
529
|
)
|
|
526
530
|
fleet_add_servicer_to_server_fn = add_GrpcAdapterServicer_to_server
|
|
527
531
|
fleet_grpc_server = generic_create_grpc_server(
|
|
@@ -544,6 +548,7 @@ def _run_fleet_api_rest(
|
|
|
544
548
|
ssl_keyfile: Optional[str],
|
|
545
549
|
ssl_certfile: Optional[str],
|
|
546
550
|
state_factory: StateFactory,
|
|
551
|
+
ffs_factory: FfsFactory,
|
|
547
552
|
num_workers: int,
|
|
548
553
|
) -> None:
|
|
549
554
|
"""Run Driver API (REST-based)."""
|
|
@@ -558,6 +563,7 @@ def _run_fleet_api_rest(
|
|
|
558
563
|
|
|
559
564
|
# See: https://www.starlette.io/applications/#accessing-the-app-instance
|
|
560
565
|
fast_api_app.state.STATE_FACTORY = state_factory
|
|
566
|
+
fast_api_app.state.FFS_FACTORY = ffs_factory
|
|
561
567
|
|
|
562
568
|
uvicorn.run(
|
|
563
569
|
app="flwr.server.superlink.fleet.rest_rere.rest_api:app",
|
|
@@ -97,6 +97,21 @@ def run_server_app() -> None:
|
|
|
97
97
|
|
|
98
98
|
args = _parse_args_run_server_app().parse_args()
|
|
99
99
|
|
|
100
|
+
# Check if the server app reference is passed.
|
|
101
|
+
# Since Flower 1.11, passing a reference is not allowed.
|
|
102
|
+
app_path: Optional[str] = args.app
|
|
103
|
+
# If the provided app_path doesn't exist, and contains a ":",
|
|
104
|
+
# it is likely to be a server app reference instead of a path.
|
|
105
|
+
if app_path is not None and not Path(app_path).exists() and ":" in app_path:
|
|
106
|
+
sys.exit(
|
|
107
|
+
"It appears you've passed a reference like `server:app`.\n\n"
|
|
108
|
+
"Note that since version `1.11.0`, `flower-server-app` no longer supports "
|
|
109
|
+
"passing a reference to a `ServerApp` attribute. Instead, you need to pass "
|
|
110
|
+
"the path to Flower app via the argument `--app`. This is the path to a "
|
|
111
|
+
"directory containing a `pyproject.toml`. You can create a valid Flower "
|
|
112
|
+
"app by executing `flwr new` and following the prompt."
|
|
113
|
+
)
|
|
114
|
+
|
|
100
115
|
if args.server != ADDRESS_DRIVER_API:
|
|
101
116
|
warn = "Passing flag --server is deprecated. Use --superlink instead."
|
|
102
117
|
warn_deprecated_feature(warn)
|
|
@@ -151,7 +166,6 @@ def run_server_app() -> None:
|
|
|
151
166
|
cert_path,
|
|
152
167
|
)
|
|
153
168
|
|
|
154
|
-
app_path: Optional[str] = args.app
|
|
155
169
|
if not (app_path is None) ^ (args.run_id is None):
|
|
156
170
|
raise sys.exit(
|
|
157
171
|
"Please provide either a Flower App path or a Run ID, but not both. "
|
|
@@ -23,6 +23,7 @@ from google.protobuf.message import Message as GrpcMessage
|
|
|
23
23
|
|
|
24
24
|
from flwr.common.logger import log
|
|
25
25
|
from flwr.proto import grpcadapter_pb2_grpc # pylint: disable=E0611
|
|
26
|
+
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
26
27
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
27
28
|
CreateNodeRequest,
|
|
28
29
|
CreateNodeResponse,
|
|
@@ -37,6 +38,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
37
38
|
)
|
|
38
39
|
from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
|
|
39
40
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
|
41
|
+
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
|
40
42
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
|
41
43
|
from flwr.server.superlink.state import StateFactory
|
|
42
44
|
|
|
@@ -60,10 +62,11 @@ def _handle(
|
|
|
60
62
|
class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
|
|
61
63
|
"""Fleet API via GrpcAdapter servicer."""
|
|
62
64
|
|
|
63
|
-
def __init__(self, state_factory: StateFactory) -> None:
|
|
65
|
+
def __init__(self, state_factory: StateFactory, ffs_factory: FfsFactory) -> None:
|
|
64
66
|
self.state_factory = state_factory
|
|
67
|
+
self.ffs_factory = ffs_factory
|
|
65
68
|
|
|
66
|
-
def SendReceive(
|
|
69
|
+
def SendReceive( # pylint: disable=too-many-return-statements
|
|
67
70
|
self, request: MessageContainer, context: grpc.ServicerContext
|
|
68
71
|
) -> MessageContainer:
|
|
69
72
|
"""."""
|
|
@@ -80,6 +83,8 @@ class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
|
|
|
80
83
|
return _handle(request, PushTaskResRequest, self._push_task_res)
|
|
81
84
|
if request.grpc_message_name == GetRunRequest.__qualname__:
|
|
82
85
|
return _handle(request, GetRunRequest, self._get_run)
|
|
86
|
+
if request.grpc_message_name == GetFabRequest.__qualname__:
|
|
87
|
+
return _handle(request, GetFabRequest, self._get_fab)
|
|
83
88
|
raise ValueError(f"Invalid grpc_message_name: {request.grpc_message_name}")
|
|
84
89
|
|
|
85
90
|
def _create_node(self, request: CreateNodeRequest) -> CreateNodeResponse:
|
|
@@ -129,3 +134,11 @@ class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer):
|
|
|
129
134
|
request=request,
|
|
130
135
|
state=self.state_factory.state(),
|
|
131
136
|
)
|
|
137
|
+
|
|
138
|
+
def _get_fab(self, request: GetFabRequest) -> GetFabResponse:
|
|
139
|
+
"""Get FAB."""
|
|
140
|
+
log(INFO, "GrpcAdapter.GetFab")
|
|
141
|
+
return message_handler.get_fab(
|
|
142
|
+
request=request,
|
|
143
|
+
ffs=self.ffs_factory.ffs(),
|
|
144
|
+
)
|
|
@@ -23,6 +23,7 @@ from typing import Any, Callable, Optional, Sequence, Tuple, Union
|
|
|
23
23
|
import grpc
|
|
24
24
|
|
|
25
25
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
|
26
|
+
from flwr.common.address import is_port_in_use
|
|
26
27
|
from flwr.common.logger import log
|
|
27
28
|
from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
|
|
28
29
|
add_FlowerServiceServicer_to_server,
|
|
@@ -218,6 +219,10 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments
|
|
|
218
219
|
server : grpc.Server
|
|
219
220
|
A non-running instance of a gRPC server.
|
|
220
221
|
"""
|
|
222
|
+
# Check if port is in use
|
|
223
|
+
if is_port_in_use(server_address):
|
|
224
|
+
sys.exit(f"Port in server address {server_address} is already in use.")
|
|
225
|
+
|
|
221
226
|
# Deconstruct tuple into servicer and function
|
|
222
227
|
servicer, add_servicer_to_server_fn = servicer_and_add_fn
|
|
223
228
|
|
|
@@ -51,19 +51,22 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
51
51
|
self, request: CreateNodeRequest, context: grpc.ServicerContext
|
|
52
52
|
) -> CreateNodeResponse:
|
|
53
53
|
"""."""
|
|
54
|
-
log(INFO, "
|
|
54
|
+
log(INFO, "[Fleet.CreateNode] Request ping_interval=%s", request.ping_interval)
|
|
55
|
+
log(DEBUG, "[Fleet.CreateNode] Request: %s", request)
|
|
55
56
|
response = message_handler.create_node(
|
|
56
57
|
request=request,
|
|
57
58
|
state=self.state_factory.state(),
|
|
58
59
|
)
|
|
59
|
-
log(INFO, "
|
|
60
|
+
log(INFO, "[Fleet.CreateNode] Created node_id=%s", response.node.node_id)
|
|
61
|
+
log(DEBUG, "[Fleet.CreateNode] Response: %s", response)
|
|
60
62
|
return response
|
|
61
63
|
|
|
62
64
|
def DeleteNode(
|
|
63
65
|
self, request: DeleteNodeRequest, context: grpc.ServicerContext
|
|
64
66
|
) -> DeleteNodeResponse:
|
|
65
67
|
"""."""
|
|
66
|
-
log(INFO, "
|
|
68
|
+
log(INFO, "[Fleet.DeleteNode] Delete node_id=%s", request.node.node_id)
|
|
69
|
+
log(DEBUG, "[Fleet.DeleteNode] Request: %s", request)
|
|
67
70
|
return message_handler.delete_node(
|
|
68
71
|
request=request,
|
|
69
72
|
state=self.state_factory.state(),
|
|
@@ -71,7 +74,7 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
71
74
|
|
|
72
75
|
def Ping(self, request: PingRequest, context: grpc.ServicerContext) -> PingResponse:
|
|
73
76
|
"""."""
|
|
74
|
-
log(DEBUG, "
|
|
77
|
+
log(DEBUG, "[Fleet.Ping] Request: %s", request)
|
|
75
78
|
return message_handler.ping(
|
|
76
79
|
request=request,
|
|
77
80
|
state=self.state_factory.state(),
|
|
@@ -81,7 +84,8 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
81
84
|
self, request: PullTaskInsRequest, context: grpc.ServicerContext
|
|
82
85
|
) -> PullTaskInsResponse:
|
|
83
86
|
"""Pull TaskIns."""
|
|
84
|
-
log(INFO, "
|
|
87
|
+
log(INFO, "[Fleet.PullTaskIns] node_id=%s", request.node.node_id)
|
|
88
|
+
log(DEBUG, "[Fleet.PullTaskIns] Request: %s", request)
|
|
85
89
|
return message_handler.pull_task_ins(
|
|
86
90
|
request=request,
|
|
87
91
|
state=self.state_factory.state(),
|
|
@@ -91,7 +95,14 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
91
95
|
self, request: PushTaskResRequest, context: grpc.ServicerContext
|
|
92
96
|
) -> PushTaskResResponse:
|
|
93
97
|
"""Push TaskRes."""
|
|
94
|
-
|
|
98
|
+
if request.task_res_list:
|
|
99
|
+
log(
|
|
100
|
+
INFO,
|
|
101
|
+
"[Fleet.PushTaskRes] Push results from node_id=%s",
|
|
102
|
+
request.task_res_list[0].task.producer.node_id,
|
|
103
|
+
)
|
|
104
|
+
else:
|
|
105
|
+
log(INFO, "[Fleet.PushTaskRes] No task results to push")
|
|
95
106
|
return message_handler.push_task_res(
|
|
96
107
|
request=request,
|
|
97
108
|
state=self.state_factory.state(),
|
|
@@ -101,7 +112,7 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
101
112
|
self, request: GetRunRequest, context: grpc.ServicerContext
|
|
102
113
|
) -> GetRunResponse:
|
|
103
114
|
"""Get run information."""
|
|
104
|
-
log(INFO, "
|
|
115
|
+
log(INFO, "[Fleet.GetRun] Requesting `Run` for run_id=%s", request.run_id)
|
|
105
116
|
return message_handler.get_run(
|
|
106
117
|
request=request,
|
|
107
118
|
state=self.state_factory.state(),
|
|
@@ -111,7 +122,7 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
|
111
122
|
self, request: GetFabRequest, context: grpc.ServicerContext
|
|
112
123
|
) -> GetFabResponse:
|
|
113
124
|
"""Get FAB."""
|
|
114
|
-
log(
|
|
125
|
+
log(INFO, "[Fleet.GetFab] Requesting FAB for fab_hash=%s", request.hash_str)
|
|
115
126
|
return message_handler.get_fab(
|
|
116
127
|
request=request,
|
|
117
128
|
ffs=self.ffs_factory.ffs(),
|
|
@@ -78,13 +78,13 @@ def _get_value_from_tuples(
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
81
|
-
"""Server interceptor for
|
|
81
|
+
"""Server interceptor for node authentication."""
|
|
82
82
|
|
|
83
83
|
def __init__(self, state: State):
|
|
84
84
|
self.state = state
|
|
85
85
|
|
|
86
|
-
self.
|
|
87
|
-
if len(self.
|
|
86
|
+
self.node_public_keys = state.get_node_public_keys()
|
|
87
|
+
if len(self.node_public_keys) == 0:
|
|
88
88
|
log(WARNING, "Authentication enabled, but no known public keys configured")
|
|
89
89
|
|
|
90
90
|
private_key = self.state.get_server_private_key()
|
|
@@ -103,9 +103,9 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
|
103
103
|
) -> grpc.RpcMethodHandler:
|
|
104
104
|
"""Flower server interceptor authentication logic.
|
|
105
105
|
|
|
106
|
-
Intercept all unary calls from
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
Intercept all unary calls from nodes and authenticate nodes by validating auth
|
|
107
|
+
metadata sent by the node. Continue RPC call if node is authenticated, else,
|
|
108
|
+
terminate RPC call by setting context to abort.
|
|
109
109
|
"""
|
|
110
110
|
# One of the method handlers in
|
|
111
111
|
# `flwr.server.superlink.fleet.grpc_rere.fleet_server.FleetServicer`
|
|
@@ -119,17 +119,17 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
|
119
119
|
request: Request,
|
|
120
120
|
context: grpc.ServicerContext,
|
|
121
121
|
) -> Response:
|
|
122
|
-
|
|
122
|
+
node_public_key_bytes = base64.urlsafe_b64decode(
|
|
123
123
|
_get_value_from_tuples(
|
|
124
124
|
_PUBLIC_KEY_HEADER, context.invocation_metadata()
|
|
125
125
|
)
|
|
126
126
|
)
|
|
127
|
-
if
|
|
127
|
+
if node_public_key_bytes not in self.node_public_keys:
|
|
128
128
|
context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
|
|
129
129
|
|
|
130
130
|
if isinstance(request, CreateNodeRequest):
|
|
131
131
|
response = self._create_authenticated_node(
|
|
132
|
-
|
|
132
|
+
node_public_key_bytes, request, context
|
|
133
133
|
)
|
|
134
134
|
log(
|
|
135
135
|
INFO,
|
|
@@ -144,13 +144,13 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
|
144
144
|
_AUTH_TOKEN_HEADER, context.invocation_metadata()
|
|
145
145
|
)
|
|
146
146
|
)
|
|
147
|
-
public_key = bytes_to_public_key(
|
|
147
|
+
public_key = bytes_to_public_key(node_public_key_bytes)
|
|
148
148
|
|
|
149
149
|
if not self._verify_hmac(public_key, request, hmac_value):
|
|
150
150
|
context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
|
|
151
151
|
|
|
152
152
|
# Verify node_id
|
|
153
|
-
node_id = self.state.get_node_id(
|
|
153
|
+
node_id = self.state.get_node_id(node_public_key_bytes)
|
|
154
154
|
|
|
155
155
|
if not self._verify_node_id(node_id, request):
|
|
156
156
|
context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
|