flwr-nightly 1.9.0.dev20240606__tar.gz → 1.9.0.dev20240608__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.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/PKG-INFO +1 -1
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/pyproject.toml +1 -1
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/__init__.py +1 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/app.py +45 -20
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/__init__.py +1 -1
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/supernode/app.py +29 -5
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/app.py +83 -73
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/run_serverapp.py +29 -5
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/README.md +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/simulation/run_simulation.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.9.0.
|
|
7
|
+
version = "1.9.0.dev20240608"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower client app."""
|
|
16
16
|
|
|
17
|
+
import signal
|
|
17
18
|
import sys
|
|
18
19
|
import time
|
|
20
|
+
from dataclasses import dataclass
|
|
19
21
|
from logging import DEBUG, ERROR, INFO, WARN
|
|
20
22
|
from typing import Callable, ContextManager, Optional, Tuple, Type, Union
|
|
21
23
|
|
|
@@ -37,7 +39,7 @@ from flwr.common.constant import (
|
|
|
37
39
|
)
|
|
38
40
|
from flwr.common.logger import log, warn_deprecated_feature
|
|
39
41
|
from flwr.common.message import Error
|
|
40
|
-
from flwr.common.retry_invoker import RetryInvoker, exponential
|
|
42
|
+
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
|
41
43
|
|
|
42
44
|
from .grpc_client.connection import grpc_connection
|
|
43
45
|
from .grpc_rere_client.connection import grpc_request_response
|
|
@@ -263,6 +265,29 @@ def _start_client_internal(
|
|
|
263
265
|
transport, server_address
|
|
264
266
|
)
|
|
265
267
|
|
|
268
|
+
run_tracker = _RunTracker()
|
|
269
|
+
|
|
270
|
+
def _on_sucess(retry_state: RetryState) -> None:
|
|
271
|
+
if retry_state.tries > 1:
|
|
272
|
+
log(
|
|
273
|
+
INFO,
|
|
274
|
+
"Connection successful after %.2f seconds and %s tries.",
|
|
275
|
+
retry_state.elapsed_time,
|
|
276
|
+
retry_state.tries,
|
|
277
|
+
)
|
|
278
|
+
if run_tracker.create_node:
|
|
279
|
+
run_tracker.create_node()
|
|
280
|
+
|
|
281
|
+
def _on_backoff(retry_state: RetryState) -> None:
|
|
282
|
+
if retry_state.tries == 1:
|
|
283
|
+
log(WARN, "Connection attempt failed, retrying...")
|
|
284
|
+
else:
|
|
285
|
+
log(
|
|
286
|
+
DEBUG,
|
|
287
|
+
"Connection attempt failed, retrying in %.2f seconds",
|
|
288
|
+
retry_state.actual_wait,
|
|
289
|
+
)
|
|
290
|
+
|
|
266
291
|
retry_invoker = RetryInvoker(
|
|
267
292
|
wait_gen_factory=exponential,
|
|
268
293
|
recoverable_exceptions=connection_error_type,
|
|
@@ -278,25 +303,8 @@ def _start_client_internal(
|
|
|
278
303
|
if retry_state.tries > 1
|
|
279
304
|
else None
|
|
280
305
|
),
|
|
281
|
-
on_success=
|
|
282
|
-
|
|
283
|
-
INFO,
|
|
284
|
-
"Connection successful after %.2f seconds and %s tries.",
|
|
285
|
-
retry_state.elapsed_time,
|
|
286
|
-
retry_state.tries,
|
|
287
|
-
)
|
|
288
|
-
if retry_state.tries > 1
|
|
289
|
-
else None
|
|
290
|
-
),
|
|
291
|
-
on_backoff=lambda retry_state: (
|
|
292
|
-
log(WARN, "Connection attempt failed, retrying...")
|
|
293
|
-
if retry_state.tries == 1
|
|
294
|
-
else log(
|
|
295
|
-
DEBUG,
|
|
296
|
-
"Connection attempt failed, retrying in %.2f seconds",
|
|
297
|
-
retry_state.actual_wait,
|
|
298
|
-
)
|
|
299
|
-
),
|
|
306
|
+
on_success=_on_sucess,
|
|
307
|
+
on_backoff=_on_backoff,
|
|
300
308
|
)
|
|
301
309
|
|
|
302
310
|
node_state = NodeState()
|
|
@@ -579,3 +587,20 @@ def _init_connection(transport: Optional[str], server_address: str) -> Tuple[
|
|
|
579
587
|
)
|
|
580
588
|
|
|
581
589
|
return connection, address, error_type
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
@dataclass
|
|
593
|
+
class _RunTracker:
|
|
594
|
+
create_node: Optional[Callable[[], None]] = None
|
|
595
|
+
interrupt: bool = False
|
|
596
|
+
|
|
597
|
+
def register_signal_handler(self) -> None:
|
|
598
|
+
"""Register handlers for exit signals."""
|
|
599
|
+
|
|
600
|
+
def signal_handler(sig, frame): # type: ignore
|
|
601
|
+
# pylint: disable=unused-argument
|
|
602
|
+
self.interrupt = True
|
|
603
|
+
raise StopIteration from None
|
|
604
|
+
|
|
605
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
606
|
+
signal.signal(signal.SIGTERM, signal_handler)
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/client/mod/__init__.py
RENAMED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Mods."""
|
|
15
|
+
"""Flower Built-in Mods."""
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from .centraldp_mods import adaptiveclipping_mod, fixedclipping_mod
|
|
@@ -30,11 +30,13 @@ from cryptography.hazmat.primitives.serialization import (
|
|
|
30
30
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
|
31
31
|
from flwr.common import EventType, event
|
|
32
32
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
33
|
-
from flwr.common.logger import log
|
|
33
|
+
from flwr.common.logger import log, warn_deprecated_feature
|
|
34
34
|
from flwr.common.object_ref import load_app, validate
|
|
35
35
|
|
|
36
36
|
from ..app import _start_client_internal
|
|
37
37
|
|
|
38
|
+
ADDRESS_FLEET_API_GRPC_RERE = "0.0.0.0:9092"
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
def run_supernode() -> None:
|
|
40
42
|
"""Run Flower SuperNode."""
|
|
@@ -63,6 +65,23 @@ def run_client_app() -> None:
|
|
|
63
65
|
|
|
64
66
|
args = _parse_args_run_client_app().parse_args()
|
|
65
67
|
|
|
68
|
+
if args.server != ADDRESS_FLEET_API_GRPC_RERE:
|
|
69
|
+
warn = "Passing flag --server is deprecated. Use --superlink instead."
|
|
70
|
+
warn_deprecated_feature(warn)
|
|
71
|
+
|
|
72
|
+
if args.superlink != ADDRESS_FLEET_API_GRPC_RERE:
|
|
73
|
+
# if `--superlink` also passed, then
|
|
74
|
+
# warn user that this argument overrides what was passed with `--server`
|
|
75
|
+
log(
|
|
76
|
+
WARN,
|
|
77
|
+
"Both `--server` and `--superlink` were passed. "
|
|
78
|
+
"`--server` will be ignored. Connecting to the Superlink Fleet API "
|
|
79
|
+
"at %s.",
|
|
80
|
+
args.superlink,
|
|
81
|
+
)
|
|
82
|
+
else:
|
|
83
|
+
args.superlink = args.server
|
|
84
|
+
|
|
66
85
|
root_certificates = _get_certificates(args)
|
|
67
86
|
log(
|
|
68
87
|
DEBUG,
|
|
@@ -73,7 +92,7 @@ def run_client_app() -> None:
|
|
|
73
92
|
authentication_keys = _try_setup_client_authentication(args)
|
|
74
93
|
|
|
75
94
|
_start_client_internal(
|
|
76
|
-
server_address=args.
|
|
95
|
+
server_address=args.superlink,
|
|
77
96
|
load_client_app_fn=load_fn,
|
|
78
97
|
transport="rest" if args.rest else "grpc-rere",
|
|
79
98
|
root_certificates=root_certificates,
|
|
@@ -100,7 +119,7 @@ def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
|
|
|
100
119
|
WARN,
|
|
101
120
|
"Option `--insecure` was set. "
|
|
102
121
|
"Starting insecure HTTP client connected to %s.",
|
|
103
|
-
args.
|
|
122
|
+
args.superlink,
|
|
104
123
|
)
|
|
105
124
|
root_certificates = None
|
|
106
125
|
else:
|
|
@@ -114,7 +133,7 @@ def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
|
|
|
114
133
|
DEBUG,
|
|
115
134
|
"Starting secure HTTPS client connected to %s "
|
|
116
135
|
"with the following certificates: %s.",
|
|
117
|
-
args.
|
|
136
|
+
args.superlink,
|
|
118
137
|
cert_path,
|
|
119
138
|
)
|
|
120
139
|
return root_certificates
|
|
@@ -213,9 +232,14 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
213
232
|
)
|
|
214
233
|
parser.add_argument(
|
|
215
234
|
"--server",
|
|
216
|
-
default=
|
|
235
|
+
default=ADDRESS_FLEET_API_GRPC_RERE,
|
|
217
236
|
help="Server address",
|
|
218
237
|
)
|
|
238
|
+
parser.add_argument(
|
|
239
|
+
"--superlink",
|
|
240
|
+
default=ADDRESS_FLEET_API_GRPC_RERE,
|
|
241
|
+
help="SuperLink Fleet API (gRPC-rere) address (IPv4, IPv6, or a domain name)",
|
|
242
|
+
)
|
|
219
243
|
parser.add_argument(
|
|
220
244
|
"--max-retries",
|
|
221
245
|
type=int,
|
|
@@ -230,6 +230,7 @@ def run_driver_api() -> None:
|
|
|
230
230
|
grpc_server.wait_for_termination()
|
|
231
231
|
|
|
232
232
|
|
|
233
|
+
# pylint: disable=too-many-locals
|
|
233
234
|
def run_fleet_api() -> None:
|
|
234
235
|
"""Run Flower server (Fleet API)."""
|
|
235
236
|
log(INFO, "Starting Flower server (Fleet API)")
|
|
@@ -248,6 +249,25 @@ def run_fleet_api() -> None:
|
|
|
248
249
|
grpc_servers = []
|
|
249
250
|
bckg_threads = []
|
|
250
251
|
|
|
252
|
+
address_arg = args.fleet_api_address
|
|
253
|
+
parsed_address = parse_address(address_arg)
|
|
254
|
+
if not parsed_address:
|
|
255
|
+
sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
|
|
256
|
+
host, port, is_v6 = parsed_address
|
|
257
|
+
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
258
|
+
|
|
259
|
+
num_workers = args.fleet_api_num_workers
|
|
260
|
+
if num_workers != 1:
|
|
261
|
+
log(
|
|
262
|
+
WARN,
|
|
263
|
+
"The Fleet API currently supports only 1 worker. "
|
|
264
|
+
"You have specified %d workers. "
|
|
265
|
+
"Support for multiple workers will be added in future releases. "
|
|
266
|
+
"Proceeding with a single worker.",
|
|
267
|
+
args.fleet_api_num_workers,
|
|
268
|
+
)
|
|
269
|
+
num_workers = 1
|
|
270
|
+
|
|
251
271
|
# Start Fleet API
|
|
252
272
|
if args.fleet_api_type == TRANSPORT_TYPE_REST:
|
|
253
273
|
if (
|
|
@@ -256,20 +276,19 @@ def run_fleet_api() -> None:
|
|
|
256
276
|
and importlib.util.find_spec("uvicorn")
|
|
257
277
|
) is None:
|
|
258
278
|
sys.exit(MISSING_EXTRA_REST)
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
host, port, _ = parsed_address
|
|
279
|
+
|
|
280
|
+
_, ssl_certfile, ssl_keyfile = (
|
|
281
|
+
certificates if certificates is not None else (None, None, None)
|
|
282
|
+
)
|
|
264
283
|
fleet_thread = threading.Thread(
|
|
265
284
|
target=_run_fleet_api_rest,
|
|
266
285
|
args=(
|
|
267
286
|
host,
|
|
268
287
|
port,
|
|
269
|
-
|
|
270
|
-
|
|
288
|
+
ssl_keyfile,
|
|
289
|
+
ssl_certfile,
|
|
271
290
|
state_factory,
|
|
272
|
-
|
|
291
|
+
num_workers,
|
|
273
292
|
),
|
|
274
293
|
)
|
|
275
294
|
fleet_thread.start()
|
|
@@ -314,11 +333,15 @@ def run_superlink() -> None:
|
|
|
314
333
|
args = _parse_args_run_superlink().parse_args()
|
|
315
334
|
|
|
316
335
|
# Parse IP address
|
|
317
|
-
|
|
318
|
-
if not
|
|
336
|
+
parsed_driver_address = parse_address(args.driver_api_address)
|
|
337
|
+
if not parsed_driver_address:
|
|
319
338
|
sys.exit(f"Driver IP address ({args.driver_api_address}) cannot be parsed.")
|
|
320
|
-
|
|
321
|
-
|
|
339
|
+
driver_host, driver_port, driver_is_v6 = parsed_driver_address
|
|
340
|
+
driver_address = (
|
|
341
|
+
f"[{driver_host}]:{driver_port}"
|
|
342
|
+
if driver_is_v6
|
|
343
|
+
else f"{driver_host}:{driver_port}"
|
|
344
|
+
)
|
|
322
345
|
|
|
323
346
|
# Obtain certificates
|
|
324
347
|
certificates = _try_obtain_certificates(args)
|
|
@@ -328,13 +351,38 @@ def run_superlink() -> None:
|
|
|
328
351
|
|
|
329
352
|
# Start Driver API
|
|
330
353
|
driver_server: grpc.Server = run_driver_api_grpc(
|
|
331
|
-
address=
|
|
354
|
+
address=driver_address,
|
|
332
355
|
state_factory=state_factory,
|
|
333
356
|
certificates=certificates,
|
|
334
357
|
)
|
|
335
358
|
|
|
336
359
|
grpc_servers = [driver_server]
|
|
337
360
|
bckg_threads = []
|
|
361
|
+
if not args.fleet_api_address:
|
|
362
|
+
args.fleet_api_address = (
|
|
363
|
+
ADDRESS_FLEET_API_GRPC_RERE
|
|
364
|
+
if args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE
|
|
365
|
+
else ADDRESS_FLEET_API_REST
|
|
366
|
+
)
|
|
367
|
+
parsed_fleet_address = parse_address(args.fleet_api_address)
|
|
368
|
+
if not parsed_fleet_address:
|
|
369
|
+
sys.exit(f"Fleet IP address ({args.fleet_api_address}) cannot be parsed.")
|
|
370
|
+
fleet_host, fleet_port, fleet_is_v6 = parsed_fleet_address
|
|
371
|
+
fleet_address = (
|
|
372
|
+
f"[{fleet_host}]:{fleet_port}" if fleet_is_v6 else f"{fleet_host}:{fleet_port}"
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
num_workers = args.fleet_api_num_workers
|
|
376
|
+
if num_workers != 1:
|
|
377
|
+
log(
|
|
378
|
+
WARN,
|
|
379
|
+
"The Fleet API currently supports only 1 worker. "
|
|
380
|
+
"You have specified %d workers. "
|
|
381
|
+
"Support for multiple workers will be added in future releases. "
|
|
382
|
+
"Proceeding with a single worker.",
|
|
383
|
+
args.fleet_api_num_workers,
|
|
384
|
+
)
|
|
385
|
+
num_workers = 1
|
|
338
386
|
|
|
339
387
|
# Start Fleet API
|
|
340
388
|
if args.fleet_api_type == TRANSPORT_TYPE_REST:
|
|
@@ -344,35 +392,25 @@ def run_superlink() -> None:
|
|
|
344
392
|
and importlib.util.find_spec("uvicorn")
|
|
345
393
|
) is None:
|
|
346
394
|
sys.exit(MISSING_EXTRA_REST)
|
|
347
|
-
|
|
348
|
-
parsed_address = parse_address(address_arg)
|
|
395
|
+
|
|
349
396
|
_, ssl_certfile, ssl_keyfile = (
|
|
350
397
|
certificates if certificates is not None else (None, None, None)
|
|
351
398
|
)
|
|
352
|
-
|
|
353
|
-
sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
|
|
354
|
-
host, port, _ = parsed_address
|
|
399
|
+
|
|
355
400
|
fleet_thread = threading.Thread(
|
|
356
401
|
target=_run_fleet_api_rest,
|
|
357
402
|
args=(
|
|
358
|
-
|
|
359
|
-
|
|
403
|
+
fleet_host,
|
|
404
|
+
fleet_port,
|
|
360
405
|
ssl_keyfile,
|
|
361
406
|
ssl_certfile,
|
|
362
407
|
state_factory,
|
|
363
|
-
|
|
408
|
+
num_workers,
|
|
364
409
|
),
|
|
365
410
|
)
|
|
366
411
|
fleet_thread.start()
|
|
367
412
|
bckg_threads.append(fleet_thread)
|
|
368
413
|
elif args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE:
|
|
369
|
-
address_arg = args.grpc_rere_fleet_api_address
|
|
370
|
-
parsed_address = parse_address(address_arg)
|
|
371
|
-
if not parsed_address:
|
|
372
|
-
sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
|
|
373
|
-
host, port, is_v6 = parsed_address
|
|
374
|
-
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
375
|
-
|
|
376
414
|
maybe_keys = _try_setup_client_authentication(args, certificates)
|
|
377
415
|
interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None
|
|
378
416
|
if maybe_keys is not None:
|
|
@@ -395,7 +433,7 @@ def run_superlink() -> None:
|
|
|
395
433
|
interceptors = [AuthenticateServerInterceptor(state)]
|
|
396
434
|
|
|
397
435
|
fleet_server = _run_fleet_api_grpc_rere(
|
|
398
|
-
address=
|
|
436
|
+
address=fleet_address,
|
|
399
437
|
state_factory=state_factory,
|
|
400
438
|
certificates=certificates,
|
|
401
439
|
interceptors=interceptors,
|
|
@@ -596,7 +634,7 @@ def _run_fleet_api_rest(
|
|
|
596
634
|
ssl_keyfile: Optional[str],
|
|
597
635
|
ssl_certfile: Optional[str],
|
|
598
636
|
state_factory: StateFactory,
|
|
599
|
-
|
|
637
|
+
num_workers: int,
|
|
600
638
|
) -> None:
|
|
601
639
|
"""Run Driver API (REST-based)."""
|
|
602
640
|
try:
|
|
@@ -605,12 +643,7 @@ def _run_fleet_api_rest(
|
|
|
605
643
|
from flwr.server.superlink.fleet.rest_rere.rest_api import app as fast_api_app
|
|
606
644
|
except ModuleNotFoundError:
|
|
607
645
|
sys.exit(MISSING_EXTRA_REST)
|
|
608
|
-
|
|
609
|
-
raise ValueError(
|
|
610
|
-
f"The supported number of workers for the Fleet API (REST server) is "
|
|
611
|
-
f"1. Instead given {workers}. The functionality of >1 workers will be "
|
|
612
|
-
f"added in the future releases."
|
|
613
|
-
)
|
|
646
|
+
|
|
614
647
|
log(INFO, "Starting Flower REST server")
|
|
615
648
|
|
|
616
649
|
# See: https://www.starlette.io/applications/#accessing-the-app-instance
|
|
@@ -624,7 +657,7 @@ def _run_fleet_api_rest(
|
|
|
624
657
|
access_log=True,
|
|
625
658
|
ssl_keyfile=ssl_keyfile,
|
|
626
659
|
ssl_certfile=ssl_certfile,
|
|
627
|
-
workers=
|
|
660
|
+
workers=num_workers,
|
|
628
661
|
)
|
|
629
662
|
|
|
630
663
|
|
|
@@ -732,50 +765,27 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
732
765
|
def _add_args_driver_api(parser: argparse.ArgumentParser) -> None:
|
|
733
766
|
parser.add_argument(
|
|
734
767
|
"--driver-api-address",
|
|
735
|
-
help="Driver API (gRPC) server address (IPv4, IPv6, or a domain name)",
|
|
768
|
+
help="Driver API (gRPC) server address (IPv4, IPv6, or a domain name).",
|
|
736
769
|
default=ADDRESS_DRIVER_API,
|
|
737
770
|
)
|
|
738
771
|
|
|
739
772
|
|
|
740
773
|
def _add_args_fleet_api(parser: argparse.ArgumentParser) -> None:
|
|
741
774
|
# Fleet API transport layer type
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
"--grpc-rere",
|
|
745
|
-
action="store_const",
|
|
746
|
-
dest="fleet_api_type",
|
|
747
|
-
const=TRANSPORT_TYPE_GRPC_RERE,
|
|
775
|
+
parser.add_argument(
|
|
776
|
+
"--fleet-api-type",
|
|
748
777
|
default=TRANSPORT_TYPE_GRPC_RERE,
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
"--rest",
|
|
753
|
-
action="store_const",
|
|
754
|
-
dest="fleet_api_type",
|
|
755
|
-
const=TRANSPORT_TYPE_REST,
|
|
756
|
-
help="Start a Fleet API server (REST, experimental)",
|
|
757
|
-
)
|
|
758
|
-
|
|
759
|
-
# Fleet API gRPC-rere options
|
|
760
|
-
grpc_rere_group = parser.add_argument_group(
|
|
761
|
-
"Fleet API (gRPC-rere) server options", ""
|
|
762
|
-
)
|
|
763
|
-
grpc_rere_group.add_argument(
|
|
764
|
-
"--grpc-rere-fleet-api-address",
|
|
765
|
-
help="Fleet API (gRPC-rere) server address (IPv4, IPv6, or a domain name)",
|
|
766
|
-
default=ADDRESS_FLEET_API_GRPC_RERE,
|
|
778
|
+
type=str,
|
|
779
|
+
choices=[TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_REST],
|
|
780
|
+
help="Start a gRPC-rere or REST (experimental) Fleet API server.",
|
|
767
781
|
)
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
rest_group.add_argument(
|
|
772
|
-
"--rest-fleet-api-address",
|
|
773
|
-
help="Fleet API (REST) server address (IPv4, IPv6, or a domain name)",
|
|
774
|
-
default=ADDRESS_FLEET_API_REST,
|
|
782
|
+
parser.add_argument(
|
|
783
|
+
"--fleet-api-address",
|
|
784
|
+
help="Fleet API server address (IPv4, IPv6, or a domain name).",
|
|
775
785
|
)
|
|
776
|
-
|
|
777
|
-
"--
|
|
778
|
-
help="Set the number of concurrent workers for the Fleet API REST server.",
|
|
779
|
-
type=int,
|
|
786
|
+
parser.add_argument(
|
|
787
|
+
"--fleet-api-num-workers",
|
|
780
788
|
default=1,
|
|
789
|
+
type=int,
|
|
790
|
+
help="Set the number of concurrent workers for the Fleet API server.",
|
|
781
791
|
)
|
|
@@ -22,12 +22,14 @@ from pathlib import Path
|
|
|
22
22
|
from typing import Optional
|
|
23
23
|
|
|
24
24
|
from flwr.common import Context, EventType, RecordSet, event
|
|
25
|
-
from flwr.common.logger import log, update_console_handler
|
|
25
|
+
from flwr.common.logger import log, update_console_handler, warn_deprecated_feature
|
|
26
26
|
from flwr.common.object_ref import load_app
|
|
27
27
|
|
|
28
28
|
from .driver import Driver, GrpcDriver
|
|
29
29
|
from .server_app import LoadServerAppError, ServerApp
|
|
30
30
|
|
|
31
|
+
ADDRESS_DRIVER_API = "0.0.0.0:9091"
|
|
32
|
+
|
|
31
33
|
|
|
32
34
|
def run(
|
|
33
35
|
driver: Driver,
|
|
@@ -76,6 +78,23 @@ def run_server_app() -> None:
|
|
|
76
78
|
|
|
77
79
|
args = _parse_args_run_server_app().parse_args()
|
|
78
80
|
|
|
81
|
+
if args.server != ADDRESS_DRIVER_API:
|
|
82
|
+
warn = "Passing flag --server is deprecated. Use --superlink instead."
|
|
83
|
+
warn_deprecated_feature(warn)
|
|
84
|
+
|
|
85
|
+
if args.superlink != ADDRESS_DRIVER_API:
|
|
86
|
+
# if `--superlink` also passed, then
|
|
87
|
+
# warn user that this argument overrides what was passed with `--server`
|
|
88
|
+
log(
|
|
89
|
+
WARN,
|
|
90
|
+
"Both `--server` and `--superlink` were passed. "
|
|
91
|
+
"`--server` will be ignored. Connecting to the Superlink Driver API "
|
|
92
|
+
"at %s.",
|
|
93
|
+
args.superlink,
|
|
94
|
+
)
|
|
95
|
+
else:
|
|
96
|
+
args.superlink = args.server
|
|
97
|
+
|
|
79
98
|
update_console_handler(
|
|
80
99
|
level=DEBUG if args.verbose else INFO,
|
|
81
100
|
timestamps=args.verbose,
|
|
@@ -95,7 +114,7 @@ def run_server_app() -> None:
|
|
|
95
114
|
WARN,
|
|
96
115
|
"Option `--insecure` was set. "
|
|
97
116
|
"Starting insecure HTTP client connected to %s.",
|
|
98
|
-
args.
|
|
117
|
+
args.superlink,
|
|
99
118
|
)
|
|
100
119
|
root_certificates = None
|
|
101
120
|
else:
|
|
@@ -109,7 +128,7 @@ def run_server_app() -> None:
|
|
|
109
128
|
DEBUG,
|
|
110
129
|
"Starting secure HTTPS client connected to %s "
|
|
111
130
|
"with the following certificates: %s.",
|
|
112
|
-
args.
|
|
131
|
+
args.superlink,
|
|
113
132
|
cert_path,
|
|
114
133
|
)
|
|
115
134
|
|
|
@@ -130,7 +149,7 @@ def run_server_app() -> None:
|
|
|
130
149
|
|
|
131
150
|
# Initialize GrpcDriver
|
|
132
151
|
driver = GrpcDriver(
|
|
133
|
-
driver_service_address=args.
|
|
152
|
+
driver_service_address=args.superlink,
|
|
134
153
|
root_certificates=root_certificates,
|
|
135
154
|
fab_id=args.fab_id,
|
|
136
155
|
fab_version=args.fab_version,
|
|
@@ -175,9 +194,14 @@ def _parse_args_run_server_app() -> argparse.ArgumentParser:
|
|
|
175
194
|
)
|
|
176
195
|
parser.add_argument(
|
|
177
196
|
"--server",
|
|
178
|
-
default=
|
|
197
|
+
default=ADDRESS_DRIVER_API,
|
|
179
198
|
help="Server address",
|
|
180
199
|
)
|
|
200
|
+
parser.add_argument(
|
|
201
|
+
"--superlink",
|
|
202
|
+
default=ADDRESS_DRIVER_API,
|
|
203
|
+
help="SuperLink Driver API (gRPC-rere) address (IPv4, IPv6, or a domain name)",
|
|
204
|
+
)
|
|
181
205
|
parser.add_argument(
|
|
182
206
|
"--dir",
|
|
183
207
|
default="",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/config_utils.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/example.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/__init__.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240606 → flwr_nightly-1.9.0.dev20240608}/src/py/flwr/cli/new/new.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|