flwr-nightly 1.11.0.dev20240822__tar.gz → 1.11.0.dev20240823__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.dev20240823}/PKG-INFO +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/pyproject.toml +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/build.py +1 -1
- flwr_nightly-1.11.0.dev20240823/src/py/flwr/cli/new/templates/app/README.md.tpl +20 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/run/run.py +10 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/client.py +22 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/numpy_client.py +22 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/rest_client/connection.py +1 -1
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/address.py +43 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/app.py +6 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/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.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +5 -0
- flwr_nightly-1.11.0.dev20240823/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +184 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +1 -2
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +13 -4
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -6
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/run_simulation.py +48 -17
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/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.dev20240823}/LICENSE +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/README.md +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/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.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/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.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240822 → flwr_nightly-1.11.0.dev20240823}/src/py/flwr/superexec/executor.py +0 -0
|
@@ -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.dev20240823"
|
|
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.dev20240823}/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.dev20240823}/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.dev20240823}/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.dev20240823}/src/py/flwr/server/app.py
RENAMED
|
@@ -271,6 +271,7 @@ 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
|
)
|
|
@@ -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)
|
|
@@ -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",
|
|
@@ -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
|
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Experimental REST API server."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import sys
|
|
21
|
+
from typing import Awaitable, Callable, TypeVar
|
|
22
|
+
|
|
23
|
+
from google.protobuf.message import Message as GrpcMessage
|
|
24
|
+
|
|
25
|
+
from flwr.common.constant import MISSING_EXTRA_REST
|
|
26
|
+
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
27
|
+
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
28
|
+
CreateNodeRequest,
|
|
29
|
+
CreateNodeResponse,
|
|
30
|
+
DeleteNodeRequest,
|
|
31
|
+
DeleteNodeResponse,
|
|
32
|
+
PingRequest,
|
|
33
|
+
PingResponse,
|
|
34
|
+
PullTaskInsRequest,
|
|
35
|
+
PullTaskInsResponse,
|
|
36
|
+
PushTaskResRequest,
|
|
37
|
+
PushTaskResResponse,
|
|
38
|
+
)
|
|
39
|
+
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
|
40
|
+
from flwr.server.superlink.ffs.ffs import Ffs
|
|
41
|
+
from flwr.server.superlink.fleet.message_handler import message_handler
|
|
42
|
+
from flwr.server.superlink.state import State
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
from starlette.applications import Starlette
|
|
46
|
+
from starlette.datastructures import Headers
|
|
47
|
+
from starlette.exceptions import HTTPException
|
|
48
|
+
from starlette.requests import Request
|
|
49
|
+
from starlette.responses import Response
|
|
50
|
+
from starlette.routing import Route
|
|
51
|
+
except ModuleNotFoundError:
|
|
52
|
+
sys.exit(MISSING_EXTRA_REST)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
GrpcRequest = TypeVar("GrpcRequest", bound=GrpcMessage)
|
|
56
|
+
GrpcResponse = TypeVar("GrpcResponse", bound=GrpcMessage)
|
|
57
|
+
|
|
58
|
+
GrpcAsyncFunction = Callable[[GrpcRequest], Awaitable[GrpcResponse]]
|
|
59
|
+
RestEndPoint = Callable[[Request], Awaitable[Response]]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def rest_request_response(
|
|
63
|
+
grpc_request_type: type[GrpcRequest],
|
|
64
|
+
) -> Callable[[GrpcAsyncFunction[GrpcRequest, GrpcResponse]], RestEndPoint]:
|
|
65
|
+
"""Convert an async gRPC-based function into a RESTful HTTP endpoint."""
|
|
66
|
+
|
|
67
|
+
def decorator(func: GrpcAsyncFunction[GrpcRequest, GrpcResponse]) -> RestEndPoint:
|
|
68
|
+
async def wrapper(request: Request) -> Response:
|
|
69
|
+
_check_headers(request.headers)
|
|
70
|
+
|
|
71
|
+
# Get the request body as raw bytes
|
|
72
|
+
grpc_req_bytes: bytes = await request.body()
|
|
73
|
+
|
|
74
|
+
# Deserialize ProtoBuf
|
|
75
|
+
grpc_req = grpc_request_type.FromString(grpc_req_bytes)
|
|
76
|
+
grpc_res = await func(grpc_req)
|
|
77
|
+
return Response(
|
|
78
|
+
status_code=200,
|
|
79
|
+
content=grpc_res.SerializeToString(),
|
|
80
|
+
headers={"Content-Type": "application/protobuf"},
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
return wrapper
|
|
84
|
+
|
|
85
|
+
return decorator
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@rest_request_response(CreateNodeRequest)
|
|
89
|
+
async def create_node(request: CreateNodeRequest) -> CreateNodeResponse:
|
|
90
|
+
"""Create Node."""
|
|
91
|
+
# Get state from app
|
|
92
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
93
|
+
|
|
94
|
+
# Handle message
|
|
95
|
+
return message_handler.create_node(request=request, state=state)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@rest_request_response(DeleteNodeRequest)
|
|
99
|
+
async def delete_node(request: DeleteNodeRequest) -> DeleteNodeResponse:
|
|
100
|
+
"""Delete Node Id."""
|
|
101
|
+
# Get state from app
|
|
102
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
103
|
+
|
|
104
|
+
# Handle message
|
|
105
|
+
return message_handler.delete_node(request=request, state=state)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@rest_request_response(PullTaskInsRequest)
|
|
109
|
+
async def pull_task_ins(request: PullTaskInsRequest) -> PullTaskInsResponse:
|
|
110
|
+
"""Pull TaskIns."""
|
|
111
|
+
# Get state from app
|
|
112
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
113
|
+
|
|
114
|
+
# Handle message
|
|
115
|
+
return message_handler.pull_task_ins(request=request, state=state)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# Check if token is needed here
|
|
119
|
+
@rest_request_response(PushTaskResRequest)
|
|
120
|
+
async def push_task_res(request: PushTaskResRequest) -> PushTaskResResponse:
|
|
121
|
+
"""Push TaskRes."""
|
|
122
|
+
# Get state from app
|
|
123
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
124
|
+
|
|
125
|
+
# Handle message
|
|
126
|
+
return message_handler.push_task_res(request=request, state=state)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@rest_request_response(PingRequest)
|
|
130
|
+
async def ping(request: PingRequest) -> PingResponse:
|
|
131
|
+
"""Ping."""
|
|
132
|
+
# Get state from app
|
|
133
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
134
|
+
|
|
135
|
+
# Handle message
|
|
136
|
+
return message_handler.ping(request=request, state=state)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@rest_request_response(GetRunRequest)
|
|
140
|
+
async def get_run(request: GetRunRequest) -> GetRunResponse:
|
|
141
|
+
"""GetRun."""
|
|
142
|
+
# Get state from app
|
|
143
|
+
state: State = app.state.STATE_FACTORY.state()
|
|
144
|
+
|
|
145
|
+
# Handle message
|
|
146
|
+
return message_handler.get_run(request=request, state=state)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@rest_request_response(GetFabRequest)
|
|
150
|
+
async def get_fab(request: GetFabRequest) -> GetFabResponse:
|
|
151
|
+
"""GetRun."""
|
|
152
|
+
# Get ffs from app
|
|
153
|
+
ffs: Ffs = app.state.FFS_FACTORY.state()
|
|
154
|
+
|
|
155
|
+
# Handle message
|
|
156
|
+
return message_handler.get_fab(request=request, ffs=ffs)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
routes = [
|
|
160
|
+
Route("/api/v0/fleet/create-node", create_node, methods=["POST"]),
|
|
161
|
+
Route("/api/v0/fleet/delete-node", delete_node, methods=["POST"]),
|
|
162
|
+
Route("/api/v0/fleet/pull-task-ins", pull_task_ins, methods=["POST"]),
|
|
163
|
+
Route("/api/v0/fleet/push-task-res", push_task_res, methods=["POST"]),
|
|
164
|
+
Route("/api/v0/fleet/ping", ping, methods=["POST"]),
|
|
165
|
+
Route("/api/v0/fleet/get-run", get_run, methods=["POST"]),
|
|
166
|
+
Route("/api/v0/fleet/get-fab", get_fab, methods=["POST"]),
|
|
167
|
+
]
|
|
168
|
+
|
|
169
|
+
app: Starlette = Starlette(
|
|
170
|
+
debug=False,
|
|
171
|
+
routes=routes,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _check_headers(headers: Headers) -> None:
|
|
176
|
+
"""Check if expected headers are set."""
|
|
177
|
+
if "content-type" not in headers:
|
|
178
|
+
raise HTTPException(status_code=400, detail="Missing header `Content-Type`")
|
|
179
|
+
if headers["content-type"] != "application/protobuf":
|
|
180
|
+
raise HTTPException(status_code=400, detail="Unsupported `Content-Type`")
|
|
181
|
+
if "accept" not in headers:
|
|
182
|
+
raise HTTPException(status_code=400, detail="Missing header `Accept`")
|
|
183
|
+
if headers["accept"] != "application/protobuf":
|
|
184
|
+
raise HTTPException(status_code=400, detail="Unsupported `Accept`")
|
|
@@ -33,7 +33,7 @@ class Backend(ABC):
|
|
|
33
33
|
"""Construct a backend."""
|
|
34
34
|
|
|
35
35
|
@abstractmethod
|
|
36
|
-
def build(self) -> None:
|
|
36
|
+
def build(self, app_fn: Callable[[], ClientApp]) -> None:
|
|
37
37
|
"""Build backend.
|
|
38
38
|
|
|
39
39
|
Different components need to be in place before workers in a backend are ready
|
|
@@ -60,7 +60,6 @@ class Backend(ABC):
|
|
|
60
60
|
@abstractmethod
|
|
61
61
|
def process_message(
|
|
62
62
|
self,
|
|
63
|
-
app: Callable[[], ClientApp],
|
|
64
63
|
message: Message,
|
|
65
64
|
context: Context,
|
|
66
65
|
) -> Tuple[Message, Context]:
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import sys
|
|
18
18
|
from logging import DEBUG, ERROR
|
|
19
|
-
from typing import Callable, Dict, Tuple, Union
|
|
19
|
+
from typing import Callable, Dict, Optional, Tuple, Union
|
|
20
20
|
|
|
21
21
|
import ray
|
|
22
22
|
|
|
@@ -63,6 +63,8 @@ class RayBackend(Backend):
|
|
|
63
63
|
actor_kwargs=actor_kwargs,
|
|
64
64
|
)
|
|
65
65
|
|
|
66
|
+
self.app_fn: Optional[Callable[[], ClientApp]] = None
|
|
67
|
+
|
|
66
68
|
def _validate_client_resources(self, config: BackendConfig) -> ClientResourcesDict:
|
|
67
69
|
client_resources_config = config.get(self.client_resources_key)
|
|
68
70
|
client_resources: ClientResourcesDict = {}
|
|
@@ -126,14 +128,15 @@ class RayBackend(Backend):
|
|
|
126
128
|
"""Report whether the pool has idle actors."""
|
|
127
129
|
return self.pool.is_actor_available()
|
|
128
130
|
|
|
129
|
-
def build(self) -> None:
|
|
131
|
+
def build(self, app_fn: Callable[[], ClientApp]) -> None:
|
|
130
132
|
"""Build pool of Ray actors that this backend will submit jobs to."""
|
|
131
133
|
self.pool.add_actors_to_pool(self.pool.actors_capacity)
|
|
134
|
+
# Set ClientApp callable that ray actors will use
|
|
135
|
+
self.app_fn = app_fn
|
|
132
136
|
log(DEBUG, "Constructed ActorPool with: %i actors", self.pool.num_actors)
|
|
133
137
|
|
|
134
138
|
def process_message(
|
|
135
139
|
self,
|
|
136
|
-
app: Callable[[], ClientApp],
|
|
137
140
|
message: Message,
|
|
138
141
|
context: Context,
|
|
139
142
|
) -> Tuple[Message, Context]:
|
|
@@ -143,11 +146,17 @@ class RayBackend(Backend):
|
|
|
143
146
|
"""
|
|
144
147
|
partition_id = context.node_config[PARTITION_ID_KEY]
|
|
145
148
|
|
|
149
|
+
if self.app_fn is None:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
"Unspecified function to load a `ClientApp`. "
|
|
152
|
+
"Call the backend's `build()` method before processing messages."
|
|
153
|
+
)
|
|
154
|
+
|
|
146
155
|
try:
|
|
147
156
|
# Submit a task to the pool
|
|
148
157
|
future = self.pool.submit(
|
|
149
158
|
lambda a, a_fn, mssg, cid, state: a.run.remote(a_fn, mssg, cid, state),
|
|
150
|
-
(
|
|
159
|
+
(self.app_fn, message, str(partition_id), context),
|
|
151
160
|
)
|
|
152
161
|
|
|
153
162
|
# Fetch result
|
|
@@ -87,7 +87,6 @@ def _register_node_states(
|
|
|
87
87
|
|
|
88
88
|
# pylint: disable=too-many-arguments,too-many-locals
|
|
89
89
|
def worker(
|
|
90
|
-
app_fn: Callable[[], ClientApp],
|
|
91
90
|
taskins_queue: "Queue[TaskIns]",
|
|
92
91
|
taskres_queue: "Queue[TaskRes]",
|
|
93
92
|
node_states: Dict[int, NodeState],
|
|
@@ -110,9 +109,7 @@ def worker(
|
|
|
110
109
|
message = message_from_taskins(task_ins)
|
|
111
110
|
|
|
112
111
|
# Let backend process message
|
|
113
|
-
out_mssg, updated_context = backend.process_message(
|
|
114
|
-
app_fn, message, context
|
|
115
|
-
)
|
|
112
|
+
out_mssg, updated_context = backend.process_message(message, context)
|
|
116
113
|
|
|
117
114
|
# Update Context
|
|
118
115
|
node_states[node_id].update_context(
|
|
@@ -193,7 +190,7 @@ def run_api(
|
|
|
193
190
|
backend = backend_fn()
|
|
194
191
|
|
|
195
192
|
# Build backend
|
|
196
|
-
backend.build()
|
|
193
|
+
backend.build(app_fn)
|
|
197
194
|
|
|
198
195
|
# Add workers (they submit Messages to Backend)
|
|
199
196
|
state = state_factory.state()
|
|
@@ -223,7 +220,6 @@ def run_api(
|
|
|
223
220
|
_ = [
|
|
224
221
|
executor.submit(
|
|
225
222
|
worker,
|
|
226
|
-
app_fn,
|
|
227
223
|
taskins_queue,
|
|
228
224
|
taskres_queue,
|
|
229
225
|
node_states,
|
|
@@ -35,6 +35,7 @@ class SecAggWorkflow(SecAggPlusWorkflow):
|
|
|
35
35
|
contributions to compute the weighted average of model parameters.
|
|
36
36
|
|
|
37
37
|
The protocol involves four main stages:
|
|
38
|
+
|
|
38
39
|
- 'setup': Send SecAgg configuration to clients and collect their public keys.
|
|
39
40
|
- 'share keys': Broadcast public keys among clients and collect encrypted secret
|
|
40
41
|
key shares.
|
|
@@ -99,6 +99,7 @@ class SecAggPlusWorkflow:
|
|
|
99
99
|
contributions to compute the weighted average of model parameters.
|
|
100
100
|
|
|
101
101
|
The protocol involves four main stages:
|
|
102
|
+
|
|
102
103
|
- 'setup': Send SecAgg+ configuration to clients and collect their public keys.
|
|
103
104
|
- 'share keys': Broadcast public keys among clients and collect encrypted secret
|
|
104
105
|
key shares.
|