flwr-nightly 1.11.0.dev20240818__tar.gz → 1.11.0.dev20240819__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.dev20240818 → flwr_nightly-1.11.0.dev20240819}/PKG-INFO +2 -2
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/README.md +1 -1
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/pyproject.toml +1 -1
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/install.py +3 -1
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/app.py +55 -31
- flwr_nightly-1.11.0.dev20240819/src/py/flwr/client/clientapp/app.py +233 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/clientappio_servicer.py +23 -19
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/supernode/app.py +20 -6
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2.py +10 -10
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2.pyi +7 -2
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +3 -1
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +8 -2
- flwr_nightly-1.11.0.dev20240818/src/py/flwr/client/clientapp/app.py +0 -186
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/LICENSE +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/superexec/simulation.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.dev20240819
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -212,7 +212,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
212
212
|
Flower is built by a wonderful community of researchers and engineers. [Join Slack](https://flower.ai/join-slack) to meet them, [contributions](#contributing-to-flower) are welcome.
|
|
213
213
|
|
|
214
214
|
<a href="https://github.com/adap/flower/graphs/contributors">
|
|
215
|
-
<img src="https://contrib.rocks/image?repo=adap/flower" />
|
|
215
|
+
<img src="https://contrib.rocks/image?repo=adap/flower&columns=10" />
|
|
216
216
|
</a>
|
|
217
217
|
|
|
218
218
|
## Citation
|
|
@@ -160,7 +160,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
160
160
|
Flower is built by a wonderful community of researchers and engineers. [Join Slack](https://flower.ai/join-slack) to meet them, [contributions](#contributing-to-flower) are welcome.
|
|
161
161
|
|
|
162
162
|
<a href="https://github.com/adap/flower/graphs/contributors">
|
|
163
|
-
<img src="https://contrib.rocks/image?repo=adap/flower" />
|
|
163
|
+
<img src="https://contrib.rocks/image?repo=adap/flower&columns=10" />
|
|
164
164
|
</a>
|
|
165
165
|
|
|
166
166
|
## Citation
|
|
@@ -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.dev20240819"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/cli/install.py
RENAMED
|
@@ -173,7 +173,9 @@ def validate_and_install(
|
|
|
173
173
|
/ project_name
|
|
174
174
|
/ version
|
|
175
175
|
)
|
|
176
|
-
if install_dir.exists()
|
|
176
|
+
if install_dir.exists():
|
|
177
|
+
if skip_prompt:
|
|
178
|
+
return install_dir
|
|
177
179
|
if not typer.confirm(
|
|
178
180
|
typer.style(
|
|
179
181
|
f"\n💬 {project_name} version {version} is already installed, "
|
{flwr_nightly-1.11.0.dev20240818 → flwr_nightly-1.11.0.dev20240819}/src/py/flwr/client/app.py
RENAMED
|
@@ -52,7 +52,7 @@ from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
|
|
52
52
|
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
|
53
53
|
from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
|
|
54
54
|
|
|
55
|
-
from .clientapp.clientappio_servicer import
|
|
55
|
+
from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
|
|
56
56
|
from .grpc_adapter_client.connection import grpc_adapter
|
|
57
57
|
from .grpc_client.connection import grpc_connection
|
|
58
58
|
from .grpc_rere_client.connection import grpc_request_response
|
|
@@ -62,6 +62,9 @@ from .numpy_client import NumPyClient
|
|
|
62
62
|
|
|
63
63
|
ADDRESS_CLIENTAPPIO_API_GRPC_RERE = "0.0.0.0:9094"
|
|
64
64
|
|
|
65
|
+
ISOLATION_MODE_SUBPROCESS = "subprocess"
|
|
66
|
+
ISOLATION_MODE_PROCESS = "process"
|
|
67
|
+
|
|
65
68
|
|
|
66
69
|
def _check_actionable_client(
|
|
67
70
|
client: Optional[Client], client_fn: Optional[ClientFnExt]
|
|
@@ -207,7 +210,7 @@ def start_client_internal(
|
|
|
207
210
|
max_retries: Optional[int] = None,
|
|
208
211
|
max_wait_time: Optional[float] = None,
|
|
209
212
|
flwr_path: Optional[Path] = None,
|
|
210
|
-
|
|
213
|
+
isolation: Optional[str] = None,
|
|
211
214
|
supernode_address: Optional[str] = ADDRESS_CLIENTAPPIO_API_GRPC_RERE,
|
|
212
215
|
) -> None:
|
|
213
216
|
"""Start a Flower client node which connects to a Flower server.
|
|
@@ -256,11 +259,13 @@ def start_client_internal(
|
|
|
256
259
|
If set to None, there is no limit to the total time.
|
|
257
260
|
flwr_path: Optional[Path] (default: None)
|
|
258
261
|
The fully resolved path containing installed Flower Apps.
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
`
|
|
262
|
-
`
|
|
263
|
-
gRPC at the address
|
|
262
|
+
isolation : Optional[str] (default: None)
|
|
263
|
+
Isolation mode for `ClientApp`. Possible values are `subprocess` and
|
|
264
|
+
`process`. Defaults to `None`, which runs the `ClientApp` in the same process
|
|
265
|
+
as the SuperNode. If `subprocess`, the `ClientApp` runs in a subprocess started
|
|
266
|
+
by the SueprNode and communicates using gRPC at the address
|
|
267
|
+
`supernode_address`. If `process`, the `ClientApp` runs in a separate isolated
|
|
268
|
+
process and communicates using gRPC at the address `supernode_address`.
|
|
264
269
|
supernode_address : Optional[str] (default: `ADDRESS_CLIENTAPPIO_API_GRPC_RERE`)
|
|
265
270
|
The SuperNode gRPC server address.
|
|
266
271
|
"""
|
|
@@ -288,9 +293,12 @@ def start_client_internal(
|
|
|
288
293
|
|
|
289
294
|
load_client_app_fn = _load_client_app
|
|
290
295
|
|
|
291
|
-
if
|
|
296
|
+
if isolation:
|
|
292
297
|
if supernode_address is None:
|
|
293
|
-
raise ValueError(
|
|
298
|
+
raise ValueError(
|
|
299
|
+
f"`supernode_address` required when `isolation` is "
|
|
300
|
+
f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
|
|
301
|
+
)
|
|
294
302
|
_clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
|
|
295
303
|
address=supernode_address
|
|
296
304
|
)
|
|
@@ -390,6 +398,7 @@ def start_client_internal(
|
|
|
390
398
|
)
|
|
391
399
|
|
|
392
400
|
app_state_tracker.register_signal_handler()
|
|
401
|
+
# pylint: disable=too-many-nested-blocks
|
|
393
402
|
while not app_state_tracker.interrupt:
|
|
394
403
|
try:
|
|
395
404
|
# Receive
|
|
@@ -431,7 +440,9 @@ def start_client_internal(
|
|
|
431
440
|
run: Run = runs[run_id]
|
|
432
441
|
if get_fab is not None and run.fab_hash:
|
|
433
442
|
fab = get_fab(run.fab_hash)
|
|
434
|
-
|
|
443
|
+
if not isolation:
|
|
444
|
+
# If `ClientApp` runs in the same process, install the FAB
|
|
445
|
+
install_from_fab(fab.content, flwr_path, True)
|
|
435
446
|
fab_id, fab_version = get_fab_metadata(fab.content)
|
|
436
447
|
else:
|
|
437
448
|
fab = None
|
|
@@ -455,39 +466,51 @@ def start_client_internal(
|
|
|
455
466
|
|
|
456
467
|
# Handle app loading and task message
|
|
457
468
|
try:
|
|
458
|
-
if
|
|
469
|
+
if isolation:
|
|
470
|
+
# Two isolation modes:
|
|
471
|
+
# 1. `subprocess`: SuperNode is starting the ClientApp
|
|
472
|
+
# process as a subprocess.
|
|
473
|
+
# 2. `process`: ClientApp process gets started separately
|
|
474
|
+
# (via `flwr-clientapp`), for example, in a separate
|
|
475
|
+
# Docker container.
|
|
476
|
+
|
|
459
477
|
# Generate SuperNode token
|
|
460
478
|
token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
|
|
461
479
|
|
|
480
|
+
# Mode 1: SuperNode starts ClientApp as subprocess
|
|
481
|
+
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
|
482
|
+
|
|
462
483
|
# Share Message and Context with servicer
|
|
463
484
|
clientappio_servicer.set_inputs(
|
|
464
|
-
clientapp_input=
|
|
485
|
+
clientapp_input=ClientAppInputs(
|
|
465
486
|
message=message,
|
|
466
487
|
context=context,
|
|
467
488
|
run=run,
|
|
489
|
+
fab=fab,
|
|
468
490
|
token=token,
|
|
469
491
|
),
|
|
470
|
-
token_returned=
|
|
471
|
-
)
|
|
472
|
-
|
|
473
|
-
# Run `ClientApp` in subprocess
|
|
474
|
-
command = [
|
|
475
|
-
"flwr-clientapp",
|
|
476
|
-
"--supernode",
|
|
477
|
-
supernode_address,
|
|
478
|
-
"--token",
|
|
479
|
-
str(token),
|
|
480
|
-
]
|
|
481
|
-
subprocess.run(
|
|
482
|
-
command,
|
|
483
|
-
stdout=None,
|
|
484
|
-
stderr=None,
|
|
485
|
-
check=True,
|
|
492
|
+
token_returned=start_subprocess,
|
|
486
493
|
)
|
|
487
494
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
495
|
+
if start_subprocess:
|
|
496
|
+
# Start ClientApp subprocess
|
|
497
|
+
command = [
|
|
498
|
+
"flwr-clientapp",
|
|
499
|
+
"--supernode",
|
|
500
|
+
supernode_address,
|
|
501
|
+
"--token",
|
|
502
|
+
str(token),
|
|
503
|
+
]
|
|
504
|
+
subprocess.run(
|
|
505
|
+
command,
|
|
506
|
+
stdout=None,
|
|
507
|
+
stderr=None,
|
|
508
|
+
check=True,
|
|
509
|
+
)
|
|
510
|
+
else:
|
|
511
|
+
# Wait for output to become available
|
|
512
|
+
while not clientappio_servicer.has_outputs():
|
|
513
|
+
time.sleep(0.1)
|
|
491
514
|
|
|
492
515
|
outputs = clientappio_servicer.get_outputs()
|
|
493
516
|
reply_message, context = outputs.message, outputs.context
|
|
@@ -544,6 +567,7 @@ def start_client_internal(
|
|
|
544
567
|
except StopIteration:
|
|
545
568
|
sleep_duration = 0
|
|
546
569
|
break
|
|
570
|
+
# pylint: enable=too-many-nested-blocks
|
|
547
571
|
|
|
548
572
|
# Unregister node
|
|
549
573
|
if delete_node is not None and app_state_tracker.is_connected:
|
|
@@ -0,0 +1,233 @@
|
|
|
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
|
+
"""Flower ClientApp process."""
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import time
|
|
19
|
+
from logging import DEBUG, ERROR, INFO
|
|
20
|
+
from typing import Optional, Tuple
|
|
21
|
+
|
|
22
|
+
import grpc
|
|
23
|
+
|
|
24
|
+
from flwr.cli.install import install_from_fab
|
|
25
|
+
from flwr.client.client_app import ClientApp, LoadClientAppError
|
|
26
|
+
from flwr.common import Context, Message
|
|
27
|
+
from flwr.common.constant import ErrorCode
|
|
28
|
+
from flwr.common.grpc import create_channel
|
|
29
|
+
from flwr.common.logger import log
|
|
30
|
+
from flwr.common.message import Error
|
|
31
|
+
from flwr.common.serde import (
|
|
32
|
+
context_from_proto,
|
|
33
|
+
context_to_proto,
|
|
34
|
+
fab_from_proto,
|
|
35
|
+
message_from_proto,
|
|
36
|
+
message_to_proto,
|
|
37
|
+
run_from_proto,
|
|
38
|
+
)
|
|
39
|
+
from flwr.common.typing import Fab, Run
|
|
40
|
+
|
|
41
|
+
# pylint: disable=E0611
|
|
42
|
+
from flwr.proto.clientappio_pb2 import (
|
|
43
|
+
GetTokenRequest,
|
|
44
|
+
GetTokenResponse,
|
|
45
|
+
PullClientAppInputsRequest,
|
|
46
|
+
PullClientAppInputsResponse,
|
|
47
|
+
PushClientAppOutputsRequest,
|
|
48
|
+
PushClientAppOutputsResponse,
|
|
49
|
+
)
|
|
50
|
+
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
|
51
|
+
|
|
52
|
+
from .utils import get_load_client_app_fn
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def flwr_clientapp() -> None:
|
|
56
|
+
"""Run process-isolated Flower ClientApp."""
|
|
57
|
+
log(INFO, "Starting Flower ClientApp")
|
|
58
|
+
|
|
59
|
+
parser = argparse.ArgumentParser(
|
|
60
|
+
description="Run a Flower ClientApp",
|
|
61
|
+
)
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"--supernode",
|
|
64
|
+
type=str,
|
|
65
|
+
help="Address of SuperNode ClientAppIo gRPC servicer",
|
|
66
|
+
)
|
|
67
|
+
parser.add_argument(
|
|
68
|
+
"--token",
|
|
69
|
+
type=int,
|
|
70
|
+
required=False,
|
|
71
|
+
help="Unique token generated by SuperNode for each ClientApp execution",
|
|
72
|
+
)
|
|
73
|
+
args = parser.parse_args()
|
|
74
|
+
|
|
75
|
+
log(
|
|
76
|
+
DEBUG,
|
|
77
|
+
"Staring isolated `ClientApp` connected to SuperNode ClientAppIo at %s "
|
|
78
|
+
"with token %s",
|
|
79
|
+
args.supernode,
|
|
80
|
+
args.token,
|
|
81
|
+
)
|
|
82
|
+
run_clientapp(supernode=args.supernode, token=args.token)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def on_channel_state_change(channel_connectivity: str) -> None:
|
|
86
|
+
"""Log channel connectivity."""
|
|
87
|
+
log(DEBUG, channel_connectivity)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def run_clientapp( # pylint: disable=R0914
|
|
91
|
+
supernode: str,
|
|
92
|
+
token: Optional[int] = None,
|
|
93
|
+
) -> None:
|
|
94
|
+
"""Run Flower ClientApp process.
|
|
95
|
+
|
|
96
|
+
Parameters
|
|
97
|
+
----------
|
|
98
|
+
supernode : str
|
|
99
|
+
Address of SuperNode
|
|
100
|
+
token : Optional[int] (default: None)
|
|
101
|
+
Unique SuperNode token for ClientApp-SuperNode authentication
|
|
102
|
+
"""
|
|
103
|
+
channel = create_channel(
|
|
104
|
+
server_address=supernode,
|
|
105
|
+
insecure=True,
|
|
106
|
+
)
|
|
107
|
+
channel.subscribe(on_channel_state_change)
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
stub = ClientAppIoStub(channel)
|
|
111
|
+
|
|
112
|
+
only_once = token is not None
|
|
113
|
+
while True:
|
|
114
|
+
# If token is not set, loop until token is received from SuperNode
|
|
115
|
+
while token is None:
|
|
116
|
+
token = get_token(stub)
|
|
117
|
+
time.sleep(1)
|
|
118
|
+
|
|
119
|
+
# Pull Message, Context, Run and (optional) FAB from SuperNode
|
|
120
|
+
message, context, run, fab = pull_message(stub=stub, token=token)
|
|
121
|
+
|
|
122
|
+
# Install FAB, if provided
|
|
123
|
+
if fab:
|
|
124
|
+
log(DEBUG, "Flower ClientApp starts FAB installation.")
|
|
125
|
+
install_from_fab(fab.content, flwr_dir=None, skip_prompt=True)
|
|
126
|
+
|
|
127
|
+
load_client_app_fn = get_load_client_app_fn(
|
|
128
|
+
default_app_ref="",
|
|
129
|
+
app_path=None,
|
|
130
|
+
multi_app=True,
|
|
131
|
+
flwr_dir=None,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
# Load ClientApp
|
|
136
|
+
client_app: ClientApp = load_client_app_fn(run.fab_id, run.fab_version)
|
|
137
|
+
|
|
138
|
+
# Execute ClientApp
|
|
139
|
+
reply_message = client_app(message=message, context=context)
|
|
140
|
+
except Exception as ex: # pylint: disable=broad-exception-caught
|
|
141
|
+
# Don't update/change NodeState
|
|
142
|
+
|
|
143
|
+
e_code = ErrorCode.CLIENT_APP_RAISED_EXCEPTION
|
|
144
|
+
# Ex fmt: "<class 'ZeroDivisionError'>:<'division by zero'>"
|
|
145
|
+
reason = str(type(ex)) + ":<'" + str(ex) + "'>"
|
|
146
|
+
exc_entity = "ClientApp"
|
|
147
|
+
if isinstance(ex, LoadClientAppError):
|
|
148
|
+
reason = (
|
|
149
|
+
"An exception was raised when attempting to load `ClientApp`"
|
|
150
|
+
)
|
|
151
|
+
e_code = ErrorCode.LOAD_CLIENT_APP_EXCEPTION
|
|
152
|
+
|
|
153
|
+
log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
|
|
154
|
+
|
|
155
|
+
# Create error message
|
|
156
|
+
reply_message = message.create_error_reply(
|
|
157
|
+
error=Error(code=e_code, reason=reason)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Push Message and Context to SuperNode
|
|
161
|
+
_ = push_message(
|
|
162
|
+
stub=stub, token=token, message=reply_message, context=context
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# Reset token to `None` to prevent flwr-clientapp from trying to pull the
|
|
166
|
+
# same inputs again
|
|
167
|
+
token = None
|
|
168
|
+
|
|
169
|
+
# Stop the loop if `flwr-clientapp` is expected to process only a single
|
|
170
|
+
# message
|
|
171
|
+
if only_once:
|
|
172
|
+
break
|
|
173
|
+
|
|
174
|
+
except KeyboardInterrupt:
|
|
175
|
+
log(INFO, "Closing connection")
|
|
176
|
+
except grpc.RpcError as e:
|
|
177
|
+
log(ERROR, "GRPC error occurred: %s", str(e))
|
|
178
|
+
finally:
|
|
179
|
+
channel.close()
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def get_token(stub: grpc.Channel) -> Optional[int]:
|
|
183
|
+
"""Get a token from SuperNode."""
|
|
184
|
+
log(DEBUG, "Flower ClientApp process requests token")
|
|
185
|
+
try:
|
|
186
|
+
res: GetTokenResponse = stub.GetToken(GetTokenRequest())
|
|
187
|
+
log(DEBUG, "[GetToken] Received token: %s", res.token)
|
|
188
|
+
return res.token
|
|
189
|
+
except grpc.RpcError as e:
|
|
190
|
+
if e.code() == grpc.StatusCode.FAILED_PRECONDITION: # pylint: disable=no-member
|
|
191
|
+
log(DEBUG, "[GetToken] No token available yet")
|
|
192
|
+
else:
|
|
193
|
+
log(ERROR, "[GetToken] gRPC error occurred: %s", str(e))
|
|
194
|
+
return None
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def pull_message(
|
|
198
|
+
stub: grpc.Channel, token: int
|
|
199
|
+
) -> Tuple[Message, Context, Run, Optional[Fab]]:
|
|
200
|
+
"""Pull message from SuperNode to ClientApp."""
|
|
201
|
+
log(INFO, "Pulling ClientAppInputs for token %s", token)
|
|
202
|
+
try:
|
|
203
|
+
res: PullClientAppInputsResponse = stub.PullClientAppInputs(
|
|
204
|
+
PullClientAppInputsRequest(token=token)
|
|
205
|
+
)
|
|
206
|
+
message = message_from_proto(res.message)
|
|
207
|
+
context = context_from_proto(res.context)
|
|
208
|
+
run = run_from_proto(res.run)
|
|
209
|
+
fab = fab_from_proto(res.fab) if res.fab else None
|
|
210
|
+
return message, context, run, fab
|
|
211
|
+
except grpc.RpcError as e:
|
|
212
|
+
log(ERROR, "[PullClientAppInputs] gRPC error occurred: %s", str(e))
|
|
213
|
+
raise e
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def push_message(
|
|
217
|
+
stub: grpc.Channel, token: int, message: Message, context: Context
|
|
218
|
+
) -> PushClientAppOutputsResponse:
|
|
219
|
+
"""Push message to SuperNode from ClientApp."""
|
|
220
|
+
log(INFO, "Pushing ClientAppOutputs for token %s", token)
|
|
221
|
+
proto_message = message_to_proto(message)
|
|
222
|
+
proto_context = context_to_proto(context)
|
|
223
|
+
|
|
224
|
+
try:
|
|
225
|
+
res: PushClientAppOutputsResponse = stub.PushClientAppOutputs(
|
|
226
|
+
PushClientAppOutputsRequest(
|
|
227
|
+
token=token, message=proto_message, context=proto_context
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
return res
|
|
231
|
+
except grpc.RpcError as e:
|
|
232
|
+
log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
|
|
233
|
+
raise e
|
|
@@ -27,11 +27,12 @@ from flwr.common.serde import (
|
|
|
27
27
|
clientappstatus_to_proto,
|
|
28
28
|
context_from_proto,
|
|
29
29
|
context_to_proto,
|
|
30
|
+
fab_to_proto,
|
|
30
31
|
message_from_proto,
|
|
31
32
|
message_to_proto,
|
|
32
33
|
run_to_proto,
|
|
33
34
|
)
|
|
34
|
-
from flwr.common.typing import Run
|
|
35
|
+
from flwr.common.typing import Fab, Run
|
|
35
36
|
|
|
36
37
|
# pylint: disable=E0611
|
|
37
38
|
from flwr.proto import clientappio_pb2_grpc
|
|
@@ -46,17 +47,18 @@ from flwr.proto.clientappio_pb2 import ( # pylint: disable=E0401
|
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
@dataclass
|
|
49
|
-
class
|
|
50
|
+
class ClientAppInputs:
|
|
50
51
|
"""Specify the inputs to the ClientApp."""
|
|
51
52
|
|
|
52
53
|
message: Message
|
|
53
54
|
context: Context
|
|
54
55
|
run: Run
|
|
56
|
+
fab: Optional[Fab]
|
|
55
57
|
token: int
|
|
56
58
|
|
|
57
59
|
|
|
58
60
|
@dataclass
|
|
59
|
-
class
|
|
61
|
+
class ClientAppOutputs:
|
|
60
62
|
"""Specify the outputs from the ClientApp."""
|
|
61
63
|
|
|
62
64
|
message: Message
|
|
@@ -68,8 +70,8 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
68
70
|
"""ClientAppIo API servicer."""
|
|
69
71
|
|
|
70
72
|
def __init__(self) -> None:
|
|
71
|
-
self.clientapp_input: Optional[
|
|
72
|
-
self.clientapp_output: Optional[
|
|
73
|
+
self.clientapp_input: Optional[ClientAppInputs] = None
|
|
74
|
+
self.clientapp_output: Optional[ClientAppOutputs] = None
|
|
73
75
|
self.token_returned: bool = False
|
|
74
76
|
self.inputs_returned: bool = False
|
|
75
77
|
|
|
@@ -79,13 +81,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
79
81
|
"""Get token."""
|
|
80
82
|
log(DEBUG, "ClientAppIo.GetToken")
|
|
81
83
|
|
|
82
|
-
# Fail if no
|
|
84
|
+
# Fail if no ClientAppInputs are available
|
|
83
85
|
if self.clientapp_input is None:
|
|
84
86
|
context.abort(
|
|
85
87
|
grpc.StatusCode.FAILED_PRECONDITION,
|
|
86
88
|
"No inputs available.",
|
|
87
89
|
)
|
|
88
|
-
clientapp_input = cast(
|
|
90
|
+
clientapp_input = cast(ClientAppInputs, self.clientapp_input)
|
|
89
91
|
|
|
90
92
|
# Fail if token was already returned in a previous call
|
|
91
93
|
if self.token_returned:
|
|
@@ -95,7 +97,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
95
97
|
)
|
|
96
98
|
|
|
97
99
|
# If
|
|
98
|
-
# -
|
|
100
|
+
# - ClientAppInputs is set, and
|
|
99
101
|
# - token hasn't been returned before,
|
|
100
102
|
# return token
|
|
101
103
|
self.token_returned = True
|
|
@@ -107,13 +109,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
107
109
|
"""Pull Message, Context, and Run."""
|
|
108
110
|
log(DEBUG, "ClientAppIo.PullClientAppInputs")
|
|
109
111
|
|
|
110
|
-
# Fail if no
|
|
112
|
+
# Fail if no ClientAppInputs are available
|
|
111
113
|
if self.clientapp_input is None:
|
|
112
114
|
context.abort(
|
|
113
115
|
grpc.StatusCode.FAILED_PRECONDITION,
|
|
114
116
|
"No inputs available.",
|
|
115
117
|
)
|
|
116
|
-
clientapp_input = cast(
|
|
118
|
+
clientapp_input = cast(ClientAppInputs, self.clientapp_input)
|
|
117
119
|
|
|
118
120
|
# Fail if token wasn't returned in a previous call
|
|
119
121
|
if not self.token_returned:
|
|
@@ -136,6 +138,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
136
138
|
message=message_to_proto(clientapp_input.message),
|
|
137
139
|
context=context_to_proto(clientapp_input.context),
|
|
138
140
|
run=run_to_proto(clientapp_input.run),
|
|
141
|
+
fab=fab_to_proto(clientapp_input.fab) if clientapp_input.fab else None,
|
|
139
142
|
)
|
|
140
143
|
|
|
141
144
|
def PushClientAppOutputs(
|
|
@@ -144,13 +147,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
144
147
|
"""Push Message and Context."""
|
|
145
148
|
log(DEBUG, "ClientAppIo.PushClientAppOutputs")
|
|
146
149
|
|
|
147
|
-
# Fail if no
|
|
150
|
+
# Fail if no ClientAppInputs are available
|
|
148
151
|
if not self.clientapp_input:
|
|
149
152
|
context.abort(
|
|
150
153
|
grpc.StatusCode.FAILED_PRECONDITION,
|
|
151
154
|
"No inputs available.",
|
|
152
155
|
)
|
|
153
|
-
clientapp_input = cast(
|
|
156
|
+
clientapp_input = cast(ClientAppInputs, self.clientapp_input)
|
|
154
157
|
|
|
155
158
|
# Fail if token wasn't returned in a previous call
|
|
156
159
|
if not self.token_returned:
|
|
@@ -178,7 +181,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
178
181
|
# Preconditions met
|
|
179
182
|
try:
|
|
180
183
|
# Update Message and Context
|
|
181
|
-
self.clientapp_output =
|
|
184
|
+
self.clientapp_output = ClientAppOutputs(
|
|
182
185
|
message=message_from_proto(request.message),
|
|
183
186
|
context=context_from_proto(request.context),
|
|
184
187
|
)
|
|
@@ -196,13 +199,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
196
199
|
return PushClientAppOutputsResponse(status=proto_status)
|
|
197
200
|
|
|
198
201
|
def set_inputs(
|
|
199
|
-
self, clientapp_input:
|
|
202
|
+
self, clientapp_input: ClientAppInputs, token_returned: bool
|
|
200
203
|
) -> None:
|
|
201
204
|
"""Set ClientApp inputs.
|
|
202
205
|
|
|
203
206
|
Parameters
|
|
204
207
|
----------
|
|
205
|
-
clientapp_input :
|
|
208
|
+
clientapp_input : ClientAppInputs
|
|
206
209
|
The inputs to the ClientApp.
|
|
207
210
|
token_returned : bool
|
|
208
211
|
A boolean indicating if the token has been returned.
|
|
@@ -215,9 +218,10 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
215
218
|
or self.token_returned
|
|
216
219
|
):
|
|
217
220
|
raise ValueError(
|
|
218
|
-
"
|
|
221
|
+
"ClientAppInputs and ClientAppOutputs must not be set before "
|
|
219
222
|
"calling `set_inputs`."
|
|
220
223
|
)
|
|
224
|
+
log(DEBUG, "ClientAppInputs set (token: %s)", clientapp_input.token)
|
|
221
225
|
self.clientapp_input = clientapp_input
|
|
222
226
|
self.token_returned = token_returned
|
|
223
227
|
|
|
@@ -225,13 +229,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
|
225
229
|
"""Check if ClientAppOutputs are available."""
|
|
226
230
|
return self.clientapp_output is not None
|
|
227
231
|
|
|
228
|
-
def get_outputs(self) ->
|
|
232
|
+
def get_outputs(self) -> ClientAppOutputs:
|
|
229
233
|
"""Get ClientApp outputs."""
|
|
230
234
|
if self.clientapp_output is None:
|
|
231
|
-
raise ValueError("
|
|
235
|
+
raise ValueError("ClientAppOutputs not set before calling `get_outputs`.")
|
|
232
236
|
|
|
233
237
|
# Set outputs to a local variable and clear state
|
|
234
|
-
output:
|
|
238
|
+
output: ClientAppOutputs = self.clientapp_output
|
|
235
239
|
self.clientapp_input = None
|
|
236
240
|
self.clientapp_output = None
|
|
237
241
|
self.token_returned = False
|
|
@@ -37,7 +37,11 @@ from flwr.common.constant import (
|
|
|
37
37
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
38
38
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
39
39
|
|
|
40
|
-
from ..app import
|
|
40
|
+
from ..app import (
|
|
41
|
+
ISOLATION_MODE_PROCESS,
|
|
42
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
43
|
+
start_client_internal,
|
|
44
|
+
)
|
|
41
45
|
from ..clientapp.utils import get_load_client_app_fn
|
|
42
46
|
|
|
43
47
|
ADDRESS_FLEET_API_GRPC_RERE = "0.0.0.0:9092"
|
|
@@ -62,6 +66,8 @@ def run_supernode() -> None:
|
|
|
62
66
|
)
|
|
63
67
|
authentication_keys = _try_setup_client_authentication(args)
|
|
64
68
|
|
|
69
|
+
log(DEBUG, "Isolation mode: %s", args.isolation)
|
|
70
|
+
|
|
65
71
|
start_client_internal(
|
|
66
72
|
server_address=args.superlink,
|
|
67
73
|
load_client_app_fn=load_fn,
|
|
@@ -72,7 +78,7 @@ def run_supernode() -> None:
|
|
|
72
78
|
max_retries=args.max_retries,
|
|
73
79
|
max_wait_time=args.max_wait_time,
|
|
74
80
|
node_config=parse_config_args([args.node_config]),
|
|
75
|
-
|
|
81
|
+
isolation=args.isolation,
|
|
76
82
|
supernode_address=args.supernode_address,
|
|
77
83
|
)
|
|
78
84
|
|
|
@@ -199,10 +205,18 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
|
|
|
199
205
|
""",
|
|
200
206
|
)
|
|
201
207
|
parser.add_argument(
|
|
202
|
-
"--
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
208
|
+
"--isolation",
|
|
209
|
+
default=None,
|
|
210
|
+
required=False,
|
|
211
|
+
choices=[
|
|
212
|
+
ISOLATION_MODE_SUBPROCESS,
|
|
213
|
+
ISOLATION_MODE_PROCESS,
|
|
214
|
+
],
|
|
215
|
+
help="Isolation mode when running `ClientApp` (optional, possible values: "
|
|
216
|
+
"`subprocess`, `process`). By default, `ClientApp` runs in the same process "
|
|
217
|
+
"that executes the SuperNode. Use `subprocess` to configure SuperNode to run "
|
|
218
|
+
"`ClientApp` in a subprocess. Use `process` to indicate that a separate "
|
|
219
|
+
"independent process gets created outside of SuperNode.",
|
|
206
220
|
)
|
|
207
221
|
parser.add_argument(
|
|
208
222
|
"--supernode-address",
|