flwr-nightly 1.9.0.dev20240419__tar.gz → 1.9.0.dev20240422__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.dev20240419 → flwr_nightly-1.9.0.dev20240422}/PKG-INFO +1 -1
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/pyproject.toml +2 -8
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/supernode/app.py +16 -4
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/app.py +2 -2
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/app_utils.py +1 -1
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/driver_client_proxy.py +4 -2
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/driver/__init__.py +2 -1
- flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/driver.py → flwr_nightly-1.9.0.dev20240422/src/py/flwr/server/driver/grpc_driver.py +132 -93
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/run_serverapp.py +4 -4
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/run_simulation.py +2 -2
- flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/grpc_driver.py +0 -129
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/README.md +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/criterion.py +0 -0
- /flwr_nightly-1.9.0.dev20240419/src/py/flwr/server/driver/abc_driver.py → /flwr_nightly-1.9.0.dev20240422/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/simulation/ray_transport/utils.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.dev20240422"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -136,7 +136,7 @@ multi_line_output = 3
|
|
|
136
136
|
include_trailing_comma = true
|
|
137
137
|
force_grid_wrap = 0
|
|
138
138
|
use_parentheses = true
|
|
139
|
-
known_first_party = ["flwr", "
|
|
139
|
+
known_first_party = ["flwr", "flwr_tool"]
|
|
140
140
|
|
|
141
141
|
[tool.black]
|
|
142
142
|
line-length = 88
|
|
@@ -170,12 +170,6 @@ plugins = [
|
|
|
170
170
|
ignore_missing_imports = true
|
|
171
171
|
strict = true
|
|
172
172
|
|
|
173
|
-
[[tool.mypy.overrides]]
|
|
174
|
-
module = [
|
|
175
|
-
"flwr_experimental.*",
|
|
176
|
-
]
|
|
177
|
-
ignore_errors = true
|
|
178
|
-
|
|
179
173
|
[[tool.mypy.overrides]]
|
|
180
174
|
module = [
|
|
181
175
|
"importlib.metadata.*",
|
|
@@ -28,12 +28,11 @@ def run_supernode() -> None:
|
|
|
28
28
|
|
|
29
29
|
event(EventType.RUN_SUPERNODE_ENTER)
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
_ = _parse_args_run_supernode().parse_args()
|
|
32
32
|
|
|
33
33
|
log(
|
|
34
34
|
DEBUG,
|
|
35
|
-
"Flower
|
|
36
|
-
getattr(args, "client-app"),
|
|
35
|
+
"Flower SuperNode starting...",
|
|
37
36
|
)
|
|
38
37
|
|
|
39
38
|
# Graceful shutdown
|
|
@@ -48,7 +47,16 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
|
|
|
48
47
|
description="Start a Flower SuperNode",
|
|
49
48
|
)
|
|
50
49
|
|
|
51
|
-
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"client-app",
|
|
52
|
+
nargs="?",
|
|
53
|
+
default="",
|
|
54
|
+
help="For example: `client:app` or `project.package.module:wrapper.app`. "
|
|
55
|
+
"This is optional and serves as the default ClientApp to be loaded when "
|
|
56
|
+
"the ServerApp does not specify `fab_id` and `fab_version`. "
|
|
57
|
+
"If not provided, defaults to an empty string.",
|
|
58
|
+
)
|
|
59
|
+
_parse_args_common(parser)
|
|
52
60
|
|
|
53
61
|
return parser
|
|
54
62
|
|
|
@@ -59,6 +67,10 @@ def parse_args_run_client_app(parser: argparse.ArgumentParser) -> None:
|
|
|
59
67
|
"client-app",
|
|
60
68
|
help="For example: `client:app` or `project.package.module:wrapper.app`",
|
|
61
69
|
)
|
|
70
|
+
_parse_args_common(parser)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _parse_args_common(parser: argparse.ArgumentParser) -> None:
|
|
62
74
|
parser.add_argument(
|
|
63
75
|
"--insecure",
|
|
64
76
|
action="store_true",
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/server/compat/app.py
RENAMED
|
@@ -29,7 +29,7 @@ from flwr.server.server import Server, init_defaults, run_fl
|
|
|
29
29
|
from flwr.server.server_config import ServerConfig
|
|
30
30
|
from flwr.server.strategy import Strategy
|
|
31
31
|
|
|
32
|
-
from ..driver import Driver
|
|
32
|
+
from ..driver import Driver, GrpcDriver
|
|
33
33
|
from .app_utils import start_update_client_manager_thread
|
|
34
34
|
|
|
35
35
|
DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
|
|
@@ -114,7 +114,7 @@ def start_driver( # pylint: disable=too-many-arguments, too-many-locals
|
|
|
114
114
|
# Create the Driver
|
|
115
115
|
if isinstance(root_certificates, str):
|
|
116
116
|
root_certificates = Path(root_certificates).read_bytes()
|
|
117
|
-
driver =
|
|
117
|
+
driver = GrpcDriver(
|
|
118
118
|
driver_service_address=address, root_certificates=root_certificates
|
|
119
119
|
)
|
|
120
120
|
|
|
@@ -89,7 +89,7 @@ def _update_client_manager(
|
|
|
89
89
|
for node_id in new_nodes:
|
|
90
90
|
client_proxy = DriverClientProxy(
|
|
91
91
|
node_id=node_id,
|
|
92
|
-
driver=driver.
|
|
92
|
+
driver=driver.grpc_driver_helper, # type: ignore
|
|
93
93
|
anonymous=False,
|
|
94
94
|
run_id=driver.run_id, # type: ignore
|
|
95
95
|
)
|
|
@@ -25,7 +25,7 @@ from flwr.common import serde
|
|
|
25
25
|
from flwr.proto import driver_pb2, node_pb2, task_pb2 # pylint: disable=E0611
|
|
26
26
|
from flwr.server.client_proxy import ClientProxy
|
|
27
27
|
|
|
28
|
-
from ..driver.grpc_driver import
|
|
28
|
+
from ..driver.grpc_driver import GrpcDriverHelper
|
|
29
29
|
|
|
30
30
|
SLEEP_TIME = 1
|
|
31
31
|
|
|
@@ -33,7 +33,9 @@ SLEEP_TIME = 1
|
|
|
33
33
|
class DriverClientProxy(ClientProxy):
|
|
34
34
|
"""Flower client proxy which delegates work using the Driver API."""
|
|
35
35
|
|
|
36
|
-
def __init__(
|
|
36
|
+
def __init__(
|
|
37
|
+
self, node_id: int, driver: GrpcDriverHelper, anonymous: bool, run_id: int
|
|
38
|
+
):
|
|
37
39
|
super().__init__(str(node_id))
|
|
38
40
|
self.node_id = node_id
|
|
39
41
|
self.driver = driver
|
|
@@ -12,27 +12,130 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Flower
|
|
15
|
+
"""Flower gRPC Driver."""
|
|
16
16
|
|
|
17
17
|
import time
|
|
18
18
|
import warnings
|
|
19
|
+
from logging import DEBUG, ERROR, WARNING
|
|
19
20
|
from typing import Iterable, List, Optional, Tuple
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
import grpc
|
|
23
|
+
|
|
24
|
+
from flwr.common import DEFAULT_TTL, EventType, Message, Metadata, RecordSet, event
|
|
25
|
+
from flwr.common.grpc import create_channel
|
|
26
|
+
from flwr.common.logger import log
|
|
22
27
|
from flwr.common.serde import message_from_taskres, message_to_taskins
|
|
23
28
|
from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
24
29
|
CreateRunRequest,
|
|
30
|
+
CreateRunResponse,
|
|
25
31
|
GetNodesRequest,
|
|
32
|
+
GetNodesResponse,
|
|
26
33
|
PullTaskResRequest,
|
|
34
|
+
PullTaskResResponse,
|
|
27
35
|
PushTaskInsRequest,
|
|
36
|
+
PushTaskInsResponse,
|
|
28
37
|
)
|
|
38
|
+
from flwr.proto.driver_pb2_grpc import DriverStub # pylint: disable=E0611
|
|
29
39
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
30
40
|
from flwr.proto.task_pb2 import TaskIns # pylint: disable=E0611
|
|
31
41
|
|
|
32
|
-
from .
|
|
42
|
+
from .driver import Driver
|
|
43
|
+
|
|
44
|
+
DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
|
|
45
|
+
|
|
46
|
+
ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
|
|
47
|
+
[Driver] Error: Not connected.
|
|
48
|
+
|
|
49
|
+
Call `connect()` on the `GrpcDriverHelper` instance before calling any of the other
|
|
50
|
+
`GrpcDriverHelper` methods.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class GrpcDriverHelper:
|
|
55
|
+
"""`GrpcDriverHelper` provides access to the gRPC Driver API/service."""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
driver_service_address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
|
|
60
|
+
root_certificates: Optional[bytes] = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
self.driver_service_address = driver_service_address
|
|
63
|
+
self.root_certificates = root_certificates
|
|
64
|
+
self.channel: Optional[grpc.Channel] = None
|
|
65
|
+
self.stub: Optional[DriverStub] = None
|
|
66
|
+
|
|
67
|
+
def connect(self) -> None:
|
|
68
|
+
"""Connect to the Driver API."""
|
|
69
|
+
event(EventType.DRIVER_CONNECT)
|
|
70
|
+
if self.channel is not None or self.stub is not None:
|
|
71
|
+
log(WARNING, "Already connected")
|
|
72
|
+
return
|
|
73
|
+
self.channel = create_channel(
|
|
74
|
+
server_address=self.driver_service_address,
|
|
75
|
+
insecure=(self.root_certificates is None),
|
|
76
|
+
root_certificates=self.root_certificates,
|
|
77
|
+
)
|
|
78
|
+
self.stub = DriverStub(self.channel)
|
|
79
|
+
log(DEBUG, "[Driver] Connected to %s", self.driver_service_address)
|
|
80
|
+
|
|
81
|
+
def disconnect(self) -> None:
|
|
82
|
+
"""Disconnect from the Driver API."""
|
|
83
|
+
event(EventType.DRIVER_DISCONNECT)
|
|
84
|
+
if self.channel is None or self.stub is None:
|
|
85
|
+
log(DEBUG, "Already disconnected")
|
|
86
|
+
return
|
|
87
|
+
channel = self.channel
|
|
88
|
+
self.channel = None
|
|
89
|
+
self.stub = None
|
|
90
|
+
channel.close()
|
|
91
|
+
log(DEBUG, "[Driver] Disconnected")
|
|
92
|
+
|
|
93
|
+
def create_run(self, req: CreateRunRequest) -> CreateRunResponse:
|
|
94
|
+
"""Request for run ID."""
|
|
95
|
+
# Check if channel is open
|
|
96
|
+
if self.stub is None:
|
|
97
|
+
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
98
|
+
raise ConnectionError("`GrpcDriverHelper` instance not connected")
|
|
99
|
+
|
|
100
|
+
# Call Driver API
|
|
101
|
+
res: CreateRunResponse = self.stub.CreateRun(request=req)
|
|
102
|
+
return res
|
|
103
|
+
|
|
104
|
+
def get_nodes(self, req: GetNodesRequest) -> GetNodesResponse:
|
|
105
|
+
"""Get client IDs."""
|
|
106
|
+
# Check if channel is open
|
|
107
|
+
if self.stub is None:
|
|
108
|
+
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
109
|
+
raise ConnectionError("`GrpcDriverHelper` instance not connected")
|
|
110
|
+
|
|
111
|
+
# Call gRPC Driver API
|
|
112
|
+
res: GetNodesResponse = self.stub.GetNodes(request=req)
|
|
113
|
+
return res
|
|
114
|
+
|
|
115
|
+
def push_task_ins(self, req: PushTaskInsRequest) -> PushTaskInsResponse:
|
|
116
|
+
"""Schedule tasks."""
|
|
117
|
+
# Check if channel is open
|
|
118
|
+
if self.stub is None:
|
|
119
|
+
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
120
|
+
raise ConnectionError("`GrpcDriverHelper` instance not connected")
|
|
121
|
+
|
|
122
|
+
# Call gRPC Driver API
|
|
123
|
+
res: PushTaskInsResponse = self.stub.PushTaskIns(request=req)
|
|
124
|
+
return res
|
|
33
125
|
|
|
126
|
+
def pull_task_res(self, req: PullTaskResRequest) -> PullTaskResResponse:
|
|
127
|
+
"""Get task results."""
|
|
128
|
+
# Check if channel is open
|
|
129
|
+
if self.stub is None:
|
|
130
|
+
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
131
|
+
raise ConnectionError("`GrpcDriverHelper` instance not connected")
|
|
34
132
|
|
|
35
|
-
|
|
133
|
+
# Call Driver API
|
|
134
|
+
res: PullTaskResResponse = self.stub.PullTaskRes(request=req)
|
|
135
|
+
return res
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class GrpcDriver(Driver):
|
|
36
139
|
"""`Driver` class provides an interface to the Driver API.
|
|
37
140
|
|
|
38
141
|
Parameters
|
|
@@ -57,22 +160,22 @@ class Driver:
|
|
|
57
160
|
) -> None:
|
|
58
161
|
self.addr = driver_service_address
|
|
59
162
|
self.root_certificates = root_certificates
|
|
60
|
-
self.
|
|
163
|
+
self.grpc_driver_helper: Optional[GrpcDriverHelper] = None
|
|
61
164
|
self.run_id: Optional[int] = None
|
|
62
165
|
self.node = Node(node_id=0, anonymous=True)
|
|
63
166
|
|
|
64
|
-
def
|
|
65
|
-
# Check if the
|
|
66
|
-
if self.
|
|
167
|
+
def _get_grpc_driver_helper_and_run_id(self) -> Tuple[GrpcDriverHelper, int]:
|
|
168
|
+
# Check if the GrpcDriverHelper is initialized
|
|
169
|
+
if self.grpc_driver_helper is None or self.run_id is None:
|
|
67
170
|
# Connect and create run
|
|
68
|
-
self.
|
|
171
|
+
self.grpc_driver_helper = GrpcDriverHelper(
|
|
69
172
|
driver_service_address=self.addr,
|
|
70
173
|
root_certificates=self.root_certificates,
|
|
71
174
|
)
|
|
72
|
-
self.
|
|
73
|
-
res = self.
|
|
175
|
+
self.grpc_driver_helper.connect()
|
|
176
|
+
res = self.grpc_driver_helper.create_run(CreateRunRequest())
|
|
74
177
|
self.run_id = res.run_id
|
|
75
|
-
return self.
|
|
178
|
+
return self.grpc_driver_helper, self.run_id
|
|
76
179
|
|
|
77
180
|
def _check_message(self, message: Message) -> None:
|
|
78
181
|
# Check if the message is valid
|
|
@@ -97,32 +200,8 @@ class Driver:
|
|
|
97
200
|
|
|
98
201
|
This method constructs a new `Message` with given content and metadata.
|
|
99
202
|
The `run_id` and `src_node_id` will be set automatically.
|
|
100
|
-
|
|
101
|
-
Parameters
|
|
102
|
-
----------
|
|
103
|
-
content : RecordSet
|
|
104
|
-
The content for the new message. This holds records that are to be sent
|
|
105
|
-
to the destination node.
|
|
106
|
-
message_type : str
|
|
107
|
-
The type of the message, defining the action to be executed on
|
|
108
|
-
the receiving end.
|
|
109
|
-
dst_node_id : int
|
|
110
|
-
The ID of the destination node to which the message is being sent.
|
|
111
|
-
group_id : str
|
|
112
|
-
The ID of the group to which this message is associated. In some settings,
|
|
113
|
-
this is used as the FL round.
|
|
114
|
-
ttl : Optional[float] (default: None)
|
|
115
|
-
Time-to-live for the round trip of this message, i.e., the time from sending
|
|
116
|
-
this message to receiving a reply. It specifies in seconds the duration for
|
|
117
|
-
which the message and its potential reply are considered valid. If unset,
|
|
118
|
-
the default TTL (i.e., `common.DEFAULT_TTL`) will be used.
|
|
119
|
-
|
|
120
|
-
Returns
|
|
121
|
-
-------
|
|
122
|
-
message : Message
|
|
123
|
-
A new `Message` instance with the specified content and metadata.
|
|
124
203
|
"""
|
|
125
|
-
_, run_id = self.
|
|
204
|
+
_, run_id = self._get_grpc_driver_helper_and_run_id()
|
|
126
205
|
if ttl:
|
|
127
206
|
warnings.warn(
|
|
128
207
|
"A custom TTL was set, but note that the SuperLink does not enforce "
|
|
@@ -146,9 +225,9 @@ class Driver:
|
|
|
146
225
|
|
|
147
226
|
def get_node_ids(self) -> List[int]:
|
|
148
227
|
"""Get node IDs."""
|
|
149
|
-
|
|
150
|
-
# Call
|
|
151
|
-
res =
|
|
228
|
+
grpc_driver_helper, run_id = self._get_grpc_driver_helper_and_run_id()
|
|
229
|
+
# Call GrpcDriverHelper method
|
|
230
|
+
res = grpc_driver_helper.get_nodes(GetNodesRequest(run_id=run_id))
|
|
152
231
|
return [node.node_id for node in res.nodes]
|
|
153
232
|
|
|
154
233
|
def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
|
|
@@ -156,19 +235,8 @@ class Driver:
|
|
|
156
235
|
|
|
157
236
|
This method takes an iterable of messages and sends each message
|
|
158
237
|
to the node specified in `dst_node_id`.
|
|
159
|
-
|
|
160
|
-
Parameters
|
|
161
|
-
----------
|
|
162
|
-
messages : Iterable[Message]
|
|
163
|
-
An iterable of messages to be sent.
|
|
164
|
-
|
|
165
|
-
Returns
|
|
166
|
-
-------
|
|
167
|
-
message_ids : Iterable[str]
|
|
168
|
-
An iterable of IDs for the messages that were sent, which can be used
|
|
169
|
-
to pull replies.
|
|
170
238
|
"""
|
|
171
|
-
|
|
239
|
+
grpc_driver_helper, _ = self._get_grpc_driver_helper_and_run_id()
|
|
172
240
|
# Construct TaskIns
|
|
173
241
|
task_ins_list: List[TaskIns] = []
|
|
174
242
|
for msg in messages:
|
|
@@ -178,27 +246,19 @@ class Driver:
|
|
|
178
246
|
taskins = message_to_taskins(msg)
|
|
179
247
|
# Add to list
|
|
180
248
|
task_ins_list.append(taskins)
|
|
181
|
-
# Call
|
|
182
|
-
res =
|
|
249
|
+
# Call GrpcDriverHelper method
|
|
250
|
+
res = grpc_driver_helper.push_task_ins(
|
|
251
|
+
PushTaskInsRequest(task_ins_list=task_ins_list)
|
|
252
|
+
)
|
|
183
253
|
return list(res.task_ids)
|
|
184
254
|
|
|
185
255
|
def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
|
|
186
256
|
"""Pull messages based on message IDs.
|
|
187
257
|
|
|
188
|
-
This method is used to collect messages from the SuperLink
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
Parameters
|
|
192
|
-
----------
|
|
193
|
-
message_ids : Iterable[str]
|
|
194
|
-
An iterable of message IDs for which reply messages are to be retrieved.
|
|
195
|
-
|
|
196
|
-
Returns
|
|
197
|
-
-------
|
|
198
|
-
messages : Iterable[Message]
|
|
199
|
-
An iterable of messages received.
|
|
258
|
+
This method is used to collect messages from the SuperLink that correspond to a
|
|
259
|
+
set of given message IDs.
|
|
200
260
|
"""
|
|
201
|
-
grpc_driver, _ = self.
|
|
261
|
+
grpc_driver, _ = self._get_grpc_driver_helper_and_run_id()
|
|
202
262
|
# Pull TaskRes
|
|
203
263
|
res = grpc_driver.pull_task_res(
|
|
204
264
|
PullTaskResRequest(node=self.node, task_ids=message_ids)
|
|
@@ -216,29 +276,8 @@ class Driver:
|
|
|
216
276
|
"""Push messages to specified node IDs and pull the reply messages.
|
|
217
277
|
|
|
218
278
|
This method sends a list of messages to their destination node IDs and then
|
|
219
|
-
waits for the replies. It continues to pull replies until either all
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
Parameters
|
|
223
|
-
----------
|
|
224
|
-
messages : Iterable[Message]
|
|
225
|
-
An iterable of messages to be sent.
|
|
226
|
-
timeout : Optional[float] (default: None)
|
|
227
|
-
The timeout duration in seconds. If specified, the method will wait for
|
|
228
|
-
replies for this duration. If `None`, there is no time limit and the method
|
|
229
|
-
will wait until replies for all messages are received.
|
|
230
|
-
|
|
231
|
-
Returns
|
|
232
|
-
-------
|
|
233
|
-
replies : Iterable[Message]
|
|
234
|
-
An iterable of reply messages received from the SuperLink.
|
|
235
|
-
|
|
236
|
-
Notes
|
|
237
|
-
-----
|
|
238
|
-
This method uses `push_messages` to send the messages and `pull_messages`
|
|
239
|
-
to collect the replies. If `timeout` is set, the method may not return
|
|
240
|
-
replies for all sent messages. A message remains valid until its TTL,
|
|
241
|
-
which is not affected by `timeout`.
|
|
279
|
+
waits for the replies. It continues to pull replies until either all replies are
|
|
280
|
+
received or the specified timeout duration is exceeded.
|
|
242
281
|
"""
|
|
243
282
|
# Push messages
|
|
244
283
|
msg_ids = set(self.push_messages(messages))
|
|
@@ -260,8 +299,8 @@ class Driver:
|
|
|
260
299
|
|
|
261
300
|
def close(self) -> None:
|
|
262
301
|
"""Disconnect from the SuperLink if connected."""
|
|
263
|
-
# Check if
|
|
264
|
-
if self.
|
|
302
|
+
# Check if GrpcDriverHelper is initialized
|
|
303
|
+
if self.grpc_driver_helper is None:
|
|
265
304
|
return
|
|
266
305
|
# Disconnect
|
|
267
|
-
self.
|
|
306
|
+
self.grpc_driver_helper.disconnect()
|
|
@@ -25,7 +25,7 @@ from flwr.common import Context, EventType, RecordSet, event
|
|
|
25
25
|
from flwr.common.logger import log, update_console_handler
|
|
26
26
|
from flwr.common.object_ref import load_app
|
|
27
27
|
|
|
28
|
-
from .driver
|
|
28
|
+
from .driver import Driver, GrpcDriver
|
|
29
29
|
from .server_app import LoadServerAppError, ServerApp
|
|
30
30
|
|
|
31
31
|
|
|
@@ -128,13 +128,13 @@ def run_server_app() -> None:
|
|
|
128
128
|
server_app_dir = args.dir
|
|
129
129
|
server_app_attr = getattr(args, "server-app")
|
|
130
130
|
|
|
131
|
-
# Initialize
|
|
132
|
-
driver =
|
|
131
|
+
# Initialize GrpcDriver
|
|
132
|
+
driver = GrpcDriver(
|
|
133
133
|
driver_service_address=args.server,
|
|
134
134
|
root_certificates=root_certificates,
|
|
135
135
|
)
|
|
136
136
|
|
|
137
|
-
# Run the
|
|
137
|
+
# Run the ServerApp with the Driver
|
|
138
138
|
run(driver=driver, server_app_dir=server_app_dir, server_app_attr=server_app_attr)
|
|
139
139
|
|
|
140
140
|
# Clean up
|
|
@@ -29,7 +29,7 @@ import grpc
|
|
|
29
29
|
from flwr.client import ClientApp
|
|
30
30
|
from flwr.common import EventType, event, log
|
|
31
31
|
from flwr.common.typing import ConfigsRecordValues
|
|
32
|
-
from flwr.server.driver
|
|
32
|
+
from flwr.server.driver import Driver, GrpcDriver
|
|
33
33
|
from flwr.server.run_serverapp import run
|
|
34
34
|
from flwr.server.server_app import ServerApp
|
|
35
35
|
from flwr.server.superlink.driver.driver_grpc import run_driver_api_grpc
|
|
@@ -204,7 +204,7 @@ def _main_loop(
|
|
|
204
204
|
serverapp_th = None
|
|
205
205
|
try:
|
|
206
206
|
# Initialize Driver
|
|
207
|
-
driver =
|
|
207
|
+
driver = GrpcDriver(
|
|
208
208
|
driver_service_address=driver_api_address,
|
|
209
209
|
root_certificates=None,
|
|
210
210
|
)
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# Copyright 2023 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 driver service client."""
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
from logging import DEBUG, ERROR, WARNING
|
|
19
|
-
from typing import Optional
|
|
20
|
-
|
|
21
|
-
import grpc
|
|
22
|
-
|
|
23
|
-
from flwr.common import EventType, event
|
|
24
|
-
from flwr.common.grpc import create_channel
|
|
25
|
-
from flwr.common.logger import log
|
|
26
|
-
from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
27
|
-
CreateRunRequest,
|
|
28
|
-
CreateRunResponse,
|
|
29
|
-
GetNodesRequest,
|
|
30
|
-
GetNodesResponse,
|
|
31
|
-
PullTaskResRequest,
|
|
32
|
-
PullTaskResResponse,
|
|
33
|
-
PushTaskInsRequest,
|
|
34
|
-
PushTaskInsResponse,
|
|
35
|
-
)
|
|
36
|
-
from flwr.proto.driver_pb2_grpc import DriverStub # pylint: disable=E0611
|
|
37
|
-
|
|
38
|
-
DEFAULT_SERVER_ADDRESS_DRIVER = "[::]:9091"
|
|
39
|
-
|
|
40
|
-
ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
|
|
41
|
-
[Driver] Error: Not connected.
|
|
42
|
-
|
|
43
|
-
Call `connect()` on the `GrpcDriver` instance before calling any of the other
|
|
44
|
-
`GrpcDriver` methods.
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class GrpcDriver:
|
|
49
|
-
"""`GrpcDriver` provides access to the gRPC Driver API/service."""
|
|
50
|
-
|
|
51
|
-
def __init__(
|
|
52
|
-
self,
|
|
53
|
-
driver_service_address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
|
|
54
|
-
root_certificates: Optional[bytes] = None,
|
|
55
|
-
) -> None:
|
|
56
|
-
self.driver_service_address = driver_service_address
|
|
57
|
-
self.root_certificates = root_certificates
|
|
58
|
-
self.channel: Optional[grpc.Channel] = None
|
|
59
|
-
self.stub: Optional[DriverStub] = None
|
|
60
|
-
|
|
61
|
-
def connect(self) -> None:
|
|
62
|
-
"""Connect to the Driver API."""
|
|
63
|
-
event(EventType.DRIVER_CONNECT)
|
|
64
|
-
if self.channel is not None or self.stub is not None:
|
|
65
|
-
log(WARNING, "Already connected")
|
|
66
|
-
return
|
|
67
|
-
self.channel = create_channel(
|
|
68
|
-
server_address=self.driver_service_address,
|
|
69
|
-
insecure=(self.root_certificates is None),
|
|
70
|
-
root_certificates=self.root_certificates,
|
|
71
|
-
)
|
|
72
|
-
self.stub = DriverStub(self.channel)
|
|
73
|
-
log(DEBUG, "[Driver] Connected to %s", self.driver_service_address)
|
|
74
|
-
|
|
75
|
-
def disconnect(self) -> None:
|
|
76
|
-
"""Disconnect from the Driver API."""
|
|
77
|
-
event(EventType.DRIVER_DISCONNECT)
|
|
78
|
-
if self.channel is None or self.stub is None:
|
|
79
|
-
log(DEBUG, "Already disconnected")
|
|
80
|
-
return
|
|
81
|
-
channel = self.channel
|
|
82
|
-
self.channel = None
|
|
83
|
-
self.stub = None
|
|
84
|
-
channel.close()
|
|
85
|
-
log(DEBUG, "[Driver] Disconnected")
|
|
86
|
-
|
|
87
|
-
def create_run(self, req: CreateRunRequest) -> CreateRunResponse:
|
|
88
|
-
"""Request for run ID."""
|
|
89
|
-
# Check if channel is open
|
|
90
|
-
if self.stub is None:
|
|
91
|
-
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
92
|
-
raise ConnectionError("`GrpcDriver` instance not connected")
|
|
93
|
-
|
|
94
|
-
# Call Driver API
|
|
95
|
-
res: CreateRunResponse = self.stub.CreateRun(request=req)
|
|
96
|
-
return res
|
|
97
|
-
|
|
98
|
-
def get_nodes(self, req: GetNodesRequest) -> GetNodesResponse:
|
|
99
|
-
"""Get client IDs."""
|
|
100
|
-
# Check if channel is open
|
|
101
|
-
if self.stub is None:
|
|
102
|
-
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
103
|
-
raise ConnectionError("`GrpcDriver` instance not connected")
|
|
104
|
-
|
|
105
|
-
# Call gRPC Driver API
|
|
106
|
-
res: GetNodesResponse = self.stub.GetNodes(request=req)
|
|
107
|
-
return res
|
|
108
|
-
|
|
109
|
-
def push_task_ins(self, req: PushTaskInsRequest) -> PushTaskInsResponse:
|
|
110
|
-
"""Schedule tasks."""
|
|
111
|
-
# Check if channel is open
|
|
112
|
-
if self.stub is None:
|
|
113
|
-
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
114
|
-
raise ConnectionError("`GrpcDriver` instance not connected")
|
|
115
|
-
|
|
116
|
-
# Call gRPC Driver API
|
|
117
|
-
res: PushTaskInsResponse = self.stub.PushTaskIns(request=req)
|
|
118
|
-
return res
|
|
119
|
-
|
|
120
|
-
def pull_task_res(self, req: PullTaskResRequest) -> PullTaskResResponse:
|
|
121
|
-
"""Get task results."""
|
|
122
|
-
# Check if channel is open
|
|
123
|
-
if self.stub is None:
|
|
124
|
-
log(ERROR, ERROR_MESSAGE_DRIVER_NOT_CONNECTED)
|
|
125
|
-
raise ConnectionError("`GrpcDriver` instance not connected")
|
|
126
|
-
|
|
127
|
-
# Call Driver API
|
|
128
|
-
res: PullTaskResResponse = self.stub.PullTaskRes(request=req)
|
|
129
|
-
return res
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/config_utils.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/example.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/src/py/flwr/cli/new/__init__.py
RENAMED
|
File without changes
|
{flwr_nightly-1.9.0.dev20240419 → flwr_nightly-1.9.0.dev20240422}/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
|