flwr-nightly 1.11.0.dev20240811__tar.gz → 1.11.0.dev20240821__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.dev20240811 → flwr_nightly-1.11.0.dev20240821}/PKG-INFO +2 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/README.md +1 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/pyproject.toml +2 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/config_utils.py +2 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/install.py +3 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/run/run.py +15 -11
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/app.py +134 -15
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/__init__.py +22 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/app.py +233 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/clientappio_servicer.py +244 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/client/clientapp/utils.py +108 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_adapter_client/connection.py +3 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_client/connection.py +3 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/connection.py +15 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/node_state.py +17 -4
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/rest_client/connection.py +21 -3
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/supernode/app.py +37 -97
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/__init__.py +4 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/config.py +31 -10
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/configsrecord.py +49 -15
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/metricsrecord.py +54 -14
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/parametersrecord.py +84 -17
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/recordset.py +80 -8
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/common/record/typeddict.py +75 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/recordset_compat.py +6 -6
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/serde.py +178 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/typing.py +17 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/clientappio_pb2.py +45 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/clientappio_pb2.pyi +132 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/clientappio_pb2_grpc.py +135 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/clientappio_pb2_grpc.pyi +53 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/exec_pb2.py +44 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2.pyi +7 -4
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/message_pb2.py +41 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/message_pb2.pyi +125 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/task_pb2_grpc.py +4 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/task_pb2_grpc.pyi +4 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/app.py +15 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/grpc_driver.py +1 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/run_serverapp.py +18 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server.py +3 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/driver_grpc.py +3 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/driver_servicer.py +32 -4
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/ffs/__init__.py +24 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/ffs/disk_ffs.py +107 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/ffs/ffs.py +79 -0
- flwr_nightly-1.11.0.dev20240821/src/py/flwr/server/superlink/ffs/ffs_factory.py +47 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +12 -4
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +8 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +16 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +5 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +2 -2
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/in_memory_state.py +7 -5
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/sqlite_state.py +17 -7
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/state.py +4 -3
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/default_workflows.py +3 -1
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/run_simulation.py +5 -67
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/app.py +3 -3
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/deployment.py +8 -9
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/exec_servicer.py +1 -1
- flwr_nightly-1.11.0.dev20240811/src/py/flwr/common/record/typeddict.py +0 -113
- flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/exec_pb2.py +0 -43
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/LICENSE +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/node_pb2_grpc.py → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/node_pb2_grpc.pyi → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/node_pb2.pyi +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/recordset_pb2_grpc.py → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/recordset_pb2_grpc.pyi → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/run_pb2_grpc.py → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/run_pb2_grpc.pyi → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/run_pb2.pyi +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/task_pb2_grpc.py → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- /flwr_nightly-1.11.0.dev20240811/src/py/flwr/proto/task_pb2_grpc.pyi → /flwr_nightly-1.11.0.dev20240821/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/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.dev20240821
|
|
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.dev20240821"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -59,6 +59,7 @@ flower-supernode = "flwr.client:run_supernode"
|
|
|
59
59
|
flower-client-app = "flwr.client:run_client_app"
|
|
60
60
|
flower-server-app = "flwr.server:run_server_app"
|
|
61
61
|
flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
|
|
62
|
+
flwr-clientapp = "flwr.client.clientapp:flwr_clientapp"
|
|
62
63
|
|
|
63
64
|
[tool.poetry.dependencies]
|
|
64
65
|
python = "^3.8"
|
{flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/config_utils.py
RENAMED
|
@@ -74,13 +74,13 @@ def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
|
|
|
74
74
|
Returns
|
|
75
75
|
-------
|
|
76
76
|
Tuple[str, str]
|
|
77
|
-
The `
|
|
77
|
+
The `fab_id` and `fab_version` of the given Flower App Bundle.
|
|
78
78
|
"""
|
|
79
79
|
conf = get_fab_config(fab_file)
|
|
80
80
|
|
|
81
81
|
return (
|
|
82
|
-
conf["project"]["version"],
|
|
83
82
|
f"{conf['tool']['flwr']['app']['publisher']}/{conf['project']['name']}",
|
|
83
|
+
conf["project"]["version"],
|
|
84
84
|
)
|
|
85
85
|
|
|
86
86
|
|
{flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/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.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/cli/run/run.py
RENAMED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower command line interface `run` command."""
|
|
16
16
|
|
|
17
|
+
import hashlib
|
|
17
18
|
import subprocess
|
|
18
19
|
import sys
|
|
19
20
|
from logging import DEBUG
|
|
@@ -28,11 +29,17 @@ from flwr.cli.config_utils import load_and_validate
|
|
|
28
29
|
from flwr.common.config import flatten_dict, parse_config_args
|
|
29
30
|
from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
|
|
30
31
|
from flwr.common.logger import log
|
|
31
|
-
from flwr.common.serde import user_config_to_proto
|
|
32
|
+
from flwr.common.serde import fab_to_proto, user_config_to_proto
|
|
33
|
+
from flwr.common.typing import Fab
|
|
32
34
|
from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
|
|
33
35
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
|
34
36
|
|
|
35
37
|
|
|
38
|
+
def on_channel_state_change(channel_connectivity: str) -> None:
|
|
39
|
+
"""Log channel connectivity."""
|
|
40
|
+
log(DEBUG, channel_connectivity)
|
|
41
|
+
|
|
42
|
+
|
|
36
43
|
# pylint: disable-next=too-many-locals
|
|
37
44
|
def run(
|
|
38
45
|
app: Annotated[
|
|
@@ -49,7 +56,8 @@ def run(
|
|
|
49
56
|
"--run-config",
|
|
50
57
|
"-c",
|
|
51
58
|
help="Override configuration key-value pairs, should be of the format:\n\n"
|
|
52
|
-
|
|
59
|
+
'`--run-config \'key1="value1" key2="value2"\' '
|
|
60
|
+
"--run-config 'key3=\"value3\"'`\n\n"
|
|
53
61
|
"Note that `key1`, `key2`, and `key3` in this example need to exist "
|
|
54
62
|
"inside the `pyproject.toml` in order to be properly overriden.",
|
|
55
63
|
),
|
|
@@ -120,10 +128,6 @@ def _run_with_superexec(
|
|
|
120
128
|
config_overrides: Optional[List[str]],
|
|
121
129
|
) -> None:
|
|
122
130
|
|
|
123
|
-
def on_channel_state_change(channel_connectivity: str) -> None:
|
|
124
|
-
"""Log channel connectivity."""
|
|
125
|
-
log(DEBUG, channel_connectivity)
|
|
126
|
-
|
|
127
131
|
insecure_str = federation_config.get("insecure")
|
|
128
132
|
if root_certificates := federation_config.get("root-certificates"):
|
|
129
133
|
root_certificates_bytes = Path(root_certificates).read_bytes()
|
|
@@ -163,12 +167,12 @@ def _run_with_superexec(
|
|
|
163
167
|
stub = ExecStub(channel)
|
|
164
168
|
|
|
165
169
|
fab_path = Path(build(app))
|
|
170
|
+
content = fab_path.read_bytes()
|
|
171
|
+
fab = Fab(hashlib.sha256(content).hexdigest(), content)
|
|
166
172
|
|
|
167
173
|
req = StartRunRequest(
|
|
168
|
-
|
|
169
|
-
override_config=user_config_to_proto(
|
|
170
|
-
parse_config_args(config_overrides, separator=",")
|
|
171
|
-
),
|
|
174
|
+
fab=fab_to_proto(fab),
|
|
175
|
+
override_config=user_config_to_proto(parse_config_args(config_overrides)),
|
|
172
176
|
federation_config=user_config_to_proto(
|
|
173
177
|
flatten_dict(federation_config.get("options"))
|
|
174
178
|
),
|
|
@@ -209,7 +213,7 @@ def _run_without_superexec(
|
|
|
209
213
|
]
|
|
210
214
|
|
|
211
215
|
if config_overrides:
|
|
212
|
-
command.extend(["--run-config", f"{'
|
|
216
|
+
command.extend(["--run-config", f"{' '.join(config_overrides)}"])
|
|
213
217
|
|
|
214
218
|
# Run the simulation
|
|
215
219
|
subprocess.run(
|
{flwr_nightly-1.11.0.dev20240811 → flwr_nightly-1.11.0.dev20240821}/src/py/flwr/client/app.py
RENAMED
|
@@ -15,16 +15,20 @@
|
|
|
15
15
|
"""Flower client app."""
|
|
16
16
|
|
|
17
17
|
import signal
|
|
18
|
+
import subprocess
|
|
18
19
|
import sys
|
|
19
20
|
import time
|
|
20
21
|
from dataclasses import dataclass
|
|
21
22
|
from logging import ERROR, INFO, WARN
|
|
22
23
|
from pathlib import Path
|
|
23
|
-
from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union
|
|
24
|
+
from typing import Callable, ContextManager, Dict, Optional, Tuple, Type, Union, cast
|
|
24
25
|
|
|
26
|
+
import grpc
|
|
25
27
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
26
28
|
from grpc import RpcError
|
|
27
29
|
|
|
30
|
+
from flwr.cli.config_utils import get_fab_metadata
|
|
31
|
+
from flwr.cli.install import install_from_fab
|
|
28
32
|
from flwr.client.client import Client
|
|
29
33
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
|
30
34
|
from flwr.client.typing import ClientFnExt
|
|
@@ -32,6 +36,7 @@ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, ev
|
|
|
32
36
|
from flwr.common.address import parse_address
|
|
33
37
|
from flwr.common.constant import (
|
|
34
38
|
MISSING_EXTRA_REST,
|
|
39
|
+
RUN_ID_NUM_BYTES,
|
|
35
40
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
36
41
|
TRANSPORT_TYPE_GRPC_BIDI,
|
|
37
42
|
TRANSPORT_TYPE_GRPC_RERE,
|
|
@@ -42,8 +47,12 @@ from flwr.common.constant import (
|
|
|
42
47
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
43
48
|
from flwr.common.message import Error
|
|
44
49
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
|
45
|
-
from flwr.common.typing import Run, UserConfig
|
|
50
|
+
from flwr.common.typing import Fab, Run, UserConfig
|
|
51
|
+
from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
|
52
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
|
53
|
+
from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
|
|
46
54
|
|
|
55
|
+
from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
|
|
47
56
|
from .grpc_adapter_client.connection import grpc_adapter
|
|
48
57
|
from .grpc_client.connection import grpc_connection
|
|
49
58
|
from .grpc_rere_client.connection import grpc_request_response
|
|
@@ -51,6 +60,11 @@ from .message_handler.message_handler import handle_control_message
|
|
|
51
60
|
from .node_state import NodeState
|
|
52
61
|
from .numpy_client import NumPyClient
|
|
53
62
|
|
|
63
|
+
ADDRESS_CLIENTAPPIO_API_GRPC_RERE = "0.0.0.0:9094"
|
|
64
|
+
|
|
65
|
+
ISOLATION_MODE_SUBPROCESS = "subprocess"
|
|
66
|
+
ISOLATION_MODE_PROCESS = "process"
|
|
67
|
+
|
|
54
68
|
|
|
55
69
|
def _check_actionable_client(
|
|
56
70
|
client: Optional[Client], client_fn: Optional[ClientFnExt]
|
|
@@ -158,7 +172,7 @@ def start_client(
|
|
|
158
172
|
>>> )
|
|
159
173
|
"""
|
|
160
174
|
event(EventType.START_CLIENT_ENTER)
|
|
161
|
-
|
|
175
|
+
start_client_internal(
|
|
162
176
|
server_address=server_address,
|
|
163
177
|
node_config={},
|
|
164
178
|
load_client_app_fn=None,
|
|
@@ -179,7 +193,7 @@ def start_client(
|
|
|
179
193
|
# pylint: disable=too-many-branches
|
|
180
194
|
# pylint: disable=too-many-locals
|
|
181
195
|
# pylint: disable=too-many-statements
|
|
182
|
-
def
|
|
196
|
+
def start_client_internal(
|
|
183
197
|
*,
|
|
184
198
|
server_address: str,
|
|
185
199
|
node_config: UserConfig,
|
|
@@ -196,6 +210,8 @@ def _start_client_internal(
|
|
|
196
210
|
max_retries: Optional[int] = None,
|
|
197
211
|
max_wait_time: Optional[float] = None,
|
|
198
212
|
flwr_path: Optional[Path] = None,
|
|
213
|
+
isolation: Optional[str] = None,
|
|
214
|
+
supernode_address: Optional[str] = ADDRESS_CLIENTAPPIO_API_GRPC_RERE,
|
|
199
215
|
) -> None:
|
|
200
216
|
"""Start a Flower client node which connects to a Flower server.
|
|
201
217
|
|
|
@@ -243,6 +259,15 @@ def _start_client_internal(
|
|
|
243
259
|
If set to None, there is no limit to the total time.
|
|
244
260
|
flwr_path: Optional[Path] (default: None)
|
|
245
261
|
The fully resolved path containing installed Flower Apps.
|
|
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`.
|
|
269
|
+
supernode_address : Optional[str] (default: `ADDRESS_CLIENTAPPIO_API_GRPC_RERE`)
|
|
270
|
+
The SuperNode gRPC server address.
|
|
246
271
|
"""
|
|
247
272
|
if insecure is None:
|
|
248
273
|
insecure = root_certificates is None
|
|
@@ -268,6 +293,17 @@ def _start_client_internal(
|
|
|
268
293
|
|
|
269
294
|
load_client_app_fn = _load_client_app
|
|
270
295
|
|
|
296
|
+
if isolation:
|
|
297
|
+
if supernode_address is None:
|
|
298
|
+
raise ValueError(
|
|
299
|
+
f"`supernode_address` required when `isolation` is "
|
|
300
|
+
f"{ISOLATION_MODE_SUBPROCESS} or {ISOLATION_MODE_PROCESS}",
|
|
301
|
+
)
|
|
302
|
+
_clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
|
|
303
|
+
address=supernode_address
|
|
304
|
+
)
|
|
305
|
+
supernode_address = cast(str, supernode_address)
|
|
306
|
+
|
|
271
307
|
# At this point, only `load_client_app_fn` should be used
|
|
272
308
|
# Both `client` and `client_fn` must not be used directly
|
|
273
309
|
|
|
@@ -333,7 +369,7 @@ def _start_client_internal(
|
|
|
333
369
|
root_certificates,
|
|
334
370
|
authentication_keys,
|
|
335
371
|
) as conn:
|
|
336
|
-
receive, send, create_node, delete_node, get_run = conn
|
|
372
|
+
receive, send, create_node, delete_node, get_run, get_fab = conn
|
|
337
373
|
|
|
338
374
|
# Register node when connecting the first time
|
|
339
375
|
if node_state is None:
|
|
@@ -362,6 +398,7 @@ def _start_client_internal(
|
|
|
362
398
|
)
|
|
363
399
|
|
|
364
400
|
app_state_tracker.register_signal_handler()
|
|
401
|
+
# pylint: disable=too-many-nested-blocks
|
|
365
402
|
while not app_state_tracker.interrupt:
|
|
366
403
|
try:
|
|
367
404
|
# Receive
|
|
@@ -398,16 +435,31 @@ def _start_client_internal(
|
|
|
398
435
|
runs[run_id] = get_run(run_id)
|
|
399
436
|
# If get_run is None, i.e., in grpc-bidi mode
|
|
400
437
|
else:
|
|
401
|
-
runs[run_id] = Run(run_id, "", "", {})
|
|
438
|
+
runs[run_id] = Run(run_id, "", "", "", {})
|
|
439
|
+
|
|
440
|
+
run: Run = runs[run_id]
|
|
441
|
+
if get_fab is not None and run.fab_hash:
|
|
442
|
+
fab = get_fab(run.fab_hash)
|
|
443
|
+
if not isolation:
|
|
444
|
+
# If `ClientApp` runs in the same process, install the FAB
|
|
445
|
+
install_from_fab(fab.content, flwr_path, True)
|
|
446
|
+
fab_id, fab_version = get_fab_metadata(fab.content)
|
|
447
|
+
else:
|
|
448
|
+
fab = None
|
|
449
|
+
fab_id, fab_version = run.fab_id, run.fab_version
|
|
450
|
+
|
|
451
|
+
run.fab_id, run.fab_version = fab_id, fab_version
|
|
402
452
|
|
|
403
453
|
# Register context for this run
|
|
404
454
|
node_state.register_context(
|
|
405
|
-
run_id=run_id,
|
|
455
|
+
run_id=run_id,
|
|
456
|
+
run=run,
|
|
457
|
+
flwr_path=flwr_path,
|
|
458
|
+
fab=fab,
|
|
406
459
|
)
|
|
407
460
|
|
|
408
461
|
# Retrieve context for this run
|
|
409
462
|
context = node_state.retrieve_context(run_id=run_id)
|
|
410
|
-
|
|
411
463
|
# Create an error reply message that will never be used to prevent
|
|
412
464
|
# the used-before-assignment linting error
|
|
413
465
|
reply_message = message.create_error_reply(
|
|
@@ -416,14 +468,62 @@ def _start_client_internal(
|
|
|
416
468
|
|
|
417
469
|
# Handle app loading and task message
|
|
418
470
|
try:
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
471
|
+
if isolation:
|
|
472
|
+
# Two isolation modes:
|
|
473
|
+
# 1. `subprocess`: SuperNode is starting the ClientApp
|
|
474
|
+
# process as a subprocess.
|
|
475
|
+
# 2. `process`: ClientApp process gets started separately
|
|
476
|
+
# (via `flwr-clientapp`), for example, in a separate
|
|
477
|
+
# Docker container.
|
|
478
|
+
|
|
479
|
+
# Generate SuperNode token
|
|
480
|
+
token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
|
|
481
|
+
|
|
482
|
+
# Mode 1: SuperNode starts ClientApp as subprocess
|
|
483
|
+
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
|
484
|
+
|
|
485
|
+
# Share Message and Context with servicer
|
|
486
|
+
clientappio_servicer.set_inputs(
|
|
487
|
+
clientapp_input=ClientAppInputs(
|
|
488
|
+
message=message,
|
|
489
|
+
context=context,
|
|
490
|
+
run=run,
|
|
491
|
+
fab=fab,
|
|
492
|
+
token=token,
|
|
493
|
+
),
|
|
494
|
+
token_returned=start_subprocess,
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
if start_subprocess:
|
|
498
|
+
# Start ClientApp subprocess
|
|
499
|
+
command = [
|
|
500
|
+
"flwr-clientapp",
|
|
501
|
+
"--supernode",
|
|
502
|
+
supernode_address,
|
|
503
|
+
"--token",
|
|
504
|
+
str(token),
|
|
505
|
+
]
|
|
506
|
+
subprocess.run(
|
|
507
|
+
command,
|
|
508
|
+
stdout=None,
|
|
509
|
+
stderr=None,
|
|
510
|
+
check=True,
|
|
511
|
+
)
|
|
512
|
+
else:
|
|
513
|
+
# Wait for output to become available
|
|
514
|
+
while not clientappio_servicer.has_outputs():
|
|
515
|
+
time.sleep(0.1)
|
|
516
|
+
|
|
517
|
+
outputs = clientappio_servicer.get_outputs()
|
|
518
|
+
reply_message, context = outputs.message, outputs.context
|
|
519
|
+
else:
|
|
520
|
+
# Load ClientApp instance
|
|
521
|
+
client_app: ClientApp = load_client_app_fn(
|
|
522
|
+
fab_id, fab_version
|
|
523
|
+
)
|
|
424
524
|
|
|
425
|
-
|
|
426
|
-
|
|
525
|
+
# Execute ClientApp
|
|
526
|
+
reply_message = client_app(message=message, context=context)
|
|
427
527
|
except Exception as ex: # pylint: disable=broad-exception-caught
|
|
428
528
|
|
|
429
529
|
# Legacy grpc-bidi
|
|
@@ -469,6 +569,7 @@ def _start_client_internal(
|
|
|
469
569
|
except StopIteration:
|
|
470
570
|
sleep_duration = 0
|
|
471
571
|
break
|
|
572
|
+
# pylint: enable=too-many-nested-blocks
|
|
472
573
|
|
|
473
574
|
# Unregister node
|
|
474
575
|
if delete_node is not None and app_state_tracker.is_connected:
|
|
@@ -606,6 +707,7 @@ def _init_connection(transport: Optional[str], server_address: str) -> Tuple[
|
|
|
606
707
|
Optional[Callable[[], Optional[int]]],
|
|
607
708
|
Optional[Callable[[], None]],
|
|
608
709
|
Optional[Callable[[int], Run]],
|
|
710
|
+
Optional[Callable[[str], Fab]],
|
|
609
711
|
]
|
|
610
712
|
],
|
|
611
713
|
],
|
|
@@ -666,3 +768,20 @@ class _AppStateTracker:
|
|
|
666
768
|
|
|
667
769
|
signal.signal(signal.SIGINT, signal_handler)
|
|
668
770
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
def run_clientappio_api_grpc(address: str) -> Tuple[grpc.Server, ClientAppIoServicer]:
|
|
774
|
+
"""Run ClientAppIo API gRPC server."""
|
|
775
|
+
clientappio_servicer: grpc.Server = ClientAppIoServicer()
|
|
776
|
+
clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
|
|
777
|
+
clientappio_grpc_server = generic_create_grpc_server(
|
|
778
|
+
servicer_and_add_fn=(
|
|
779
|
+
clientappio_servicer,
|
|
780
|
+
clientappio_add_servicer_to_server_fn,
|
|
781
|
+
),
|
|
782
|
+
server_address=address,
|
|
783
|
+
max_message_length=GRPC_MAX_MESSAGE_LENGTH,
|
|
784
|
+
)
|
|
785
|
+
log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
|
|
786
|
+
clientappio_grpc_server.start()
|
|
787
|
+
return clientappio_grpc_server, clientappio_servicer
|
|
@@ -0,0 +1,22 @@
|
|
|
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 AppIO service."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from .app import flwr_clientapp as flwr_clientapp
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"flwr_clientapp",
|
|
22
|
+
]
|
|
@@ -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
|