flwr-nightly 1.9.0.dev20240509__tar.gz → 1.9.0.dev20240520__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.dev20240509 → flwr_nightly-1.9.0.dev20240520}/PKG-INFO +2 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/README.md +1 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/pyproject.toml +1 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/new.py +2 -0
- flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +55 -0
- flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -0
- flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
- flwr_nightly-1.9.0.dev20240520/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +28 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/comms_mods.py +4 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/localdp_mod.py +1 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/__init__.py +3 -2
- flwr_nightly-1.9.0.dev20240520/src/py/flwr/server/driver/inmemory_driver.py +181 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server.py +9 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +2 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dp_fixed_clipping.py +2 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_servicer.py +2 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +8 -3
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +1 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/default_workflows.py +67 -22
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/run_simulation.py +2 -31
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.9.0.
|
|
3
|
+
Version: 1.9.0.dev20240520
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -202,6 +202,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
202
202
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
203
203
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
204
204
|
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
|
|
205
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
205
206
|
|
|
206
207
|
## Community
|
|
207
208
|
|
|
@@ -151,6 +151,7 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
151
151
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
152
152
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
153
153
|
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplna-meier-fitter)
|
|
154
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
154
155
|
|
|
155
156
|
## Community
|
|
156
157
|
|
|
@@ -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.dev20240520"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/cli/new/new.py
RENAMED
|
@@ -37,6 +37,7 @@ class MlFramework(str, Enum):
|
|
|
37
37
|
NUMPY = "NumPy"
|
|
38
38
|
PYTORCH = "PyTorch"
|
|
39
39
|
TENSORFLOW = "TensorFlow"
|
|
40
|
+
JAX = "JAX"
|
|
40
41
|
HUGGINGFACE = "HF"
|
|
41
42
|
MLX = "MLX"
|
|
42
43
|
SKLEARN = "sklearn"
|
|
@@ -155,6 +156,7 @@ def new(
|
|
|
155
156
|
# Depending on the framework, generate task.py file
|
|
156
157
|
frameworks_with_tasks = [
|
|
157
158
|
MlFramework.PYTORCH.value.lower(),
|
|
159
|
+
MlFramework.JAX.value.lower(),
|
|
158
160
|
MlFramework.HUGGINGFACE.value.lower(),
|
|
159
161
|
MlFramework.MLX.value.lower(),
|
|
160
162
|
MlFramework.TENSORFLOW.value.lower(),
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""$project_name: A Flower / JAX app."""
|
|
2
|
+
|
|
3
|
+
import jax
|
|
4
|
+
from flwr.client import NumPyClient, ClientApp
|
|
5
|
+
|
|
6
|
+
from $import_name.task import (
|
|
7
|
+
evaluation,
|
|
8
|
+
get_params,
|
|
9
|
+
load_data,
|
|
10
|
+
load_model,
|
|
11
|
+
loss_fn,
|
|
12
|
+
set_params,
|
|
13
|
+
train,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Define Flower Client and client_fn
|
|
18
|
+
class FlowerClient(NumPyClient):
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.train_x, self.train_y, self.test_x, self.test_y = load_data()
|
|
21
|
+
self.grad_fn = jax.grad(loss_fn)
|
|
22
|
+
model_shape = self.train_x.shape[1:]
|
|
23
|
+
|
|
24
|
+
self.params = load_model(model_shape)
|
|
25
|
+
|
|
26
|
+
def get_parameters(self, config):
|
|
27
|
+
return get_params(self.params)
|
|
28
|
+
|
|
29
|
+
def set_parameters(self, parameters):
|
|
30
|
+
set_params(self.params, parameters)
|
|
31
|
+
|
|
32
|
+
def fit(self, parameters, config):
|
|
33
|
+
self.set_parameters(parameters)
|
|
34
|
+
self.params, loss, num_examples = train(
|
|
35
|
+
self.params, self.grad_fn, self.train_x, self.train_y
|
|
36
|
+
)
|
|
37
|
+
parameters = self.get_parameters(config={})
|
|
38
|
+
return parameters, num_examples, {"loss": float(loss)}
|
|
39
|
+
|
|
40
|
+
def evaluate(self, parameters, config):
|
|
41
|
+
self.set_parameters(parameters)
|
|
42
|
+
loss, num_examples = evaluation(
|
|
43
|
+
self.params, self.grad_fn, self.test_x, self.test_y
|
|
44
|
+
)
|
|
45
|
+
return float(loss), num_examples, {"loss": float(loss)}
|
|
46
|
+
|
|
47
|
+
def client_fn(cid):
|
|
48
|
+
# Return Client instance
|
|
49
|
+
return FlowerClient().to_client()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Flower ClientApp
|
|
53
|
+
app = ClientApp(
|
|
54
|
+
client_fn,
|
|
55
|
+
)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""$project_name: A Flower / JAX app."""
|
|
2
|
+
|
|
3
|
+
import flwr as fl
|
|
4
|
+
|
|
5
|
+
# Configure the strategy
|
|
6
|
+
strategy = fl.server.strategy.FedAvg()
|
|
7
|
+
|
|
8
|
+
# Flower ServerApp
|
|
9
|
+
app = fl.server.ServerApp(
|
|
10
|
+
config=fl.server.ServerConfig(num_rounds=3),
|
|
11
|
+
strategy=strategy,
|
|
12
|
+
)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""$project_name: A Flower / JAX app."""
|
|
2
|
+
|
|
3
|
+
import jax
|
|
4
|
+
import jax.numpy as jnp
|
|
5
|
+
from sklearn.datasets import make_regression
|
|
6
|
+
from sklearn.model_selection import train_test_split
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
key = jax.random.PRNGKey(0)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def load_data():
|
|
13
|
+
# Load dataset
|
|
14
|
+
X, y = make_regression(n_features=3, random_state=0)
|
|
15
|
+
X, X_test, y, y_test = train_test_split(X, y)
|
|
16
|
+
return X, y, X_test, y_test
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def load_model(model_shape):
|
|
20
|
+
# Extract model parameters
|
|
21
|
+
params = {"b": jax.random.uniform(key), "w": jax.random.uniform(key, model_shape)}
|
|
22
|
+
return params
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def loss_fn(params, X, y):
|
|
26
|
+
# Return MSE as loss
|
|
27
|
+
err = jnp.dot(X, params["w"]) + params["b"] - y
|
|
28
|
+
return jnp.mean(jnp.square(err))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def train(params, grad_fn, X, y):
|
|
32
|
+
loss = 1_000_000
|
|
33
|
+
num_examples = X.shape[0]
|
|
34
|
+
for epochs in range(50):
|
|
35
|
+
grads = grad_fn(params, X, y)
|
|
36
|
+
params = jax.tree.map(lambda p, g: p - 0.05 * g, params, grads)
|
|
37
|
+
loss = loss_fn(params, X, y)
|
|
38
|
+
return params, loss, num_examples
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def evaluation(params, grad_fn, X_test, y_test):
|
|
42
|
+
num_examples = X_test.shape[0]
|
|
43
|
+
err_test = loss_fn(params, X_test, y_test)
|
|
44
|
+
loss_test = jnp.mean(jnp.square(err_test))
|
|
45
|
+
return loss_test, num_examples
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_params(params):
|
|
49
|
+
parameters = []
|
|
50
|
+
for _, val in params.items():
|
|
51
|
+
parameters.append(np.array(val))
|
|
52
|
+
return parameters
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def set_params(local_params, global_params):
|
|
56
|
+
for key, value in list(zip(local_params.keys(), global_params)):
|
|
57
|
+
local_params[key] = value
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "$package_name"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = ""
|
|
9
|
+
authors = [
|
|
10
|
+
{ name = "The Flower Authors", email = "hello@flower.ai" },
|
|
11
|
+
]
|
|
12
|
+
license = {text = "Apache License (2.0)"}
|
|
13
|
+
dependencies = [
|
|
14
|
+
"flwr[simulation]>=1.8.0,<2.0",
|
|
15
|
+
"jax==0.4.26",
|
|
16
|
+
"jaxlib==0.4.26",
|
|
17
|
+
"scikit-learn==1.4.2",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[tool.hatch.build.targets.wheel]
|
|
21
|
+
packages = ["."]
|
|
22
|
+
|
|
23
|
+
[flower]
|
|
24
|
+
publisher = "$username"
|
|
25
|
+
|
|
26
|
+
[flower.components]
|
|
27
|
+
serverapp = "$import_name.server:app"
|
|
28
|
+
clientapp = "$import_name.client:app"
|
|
@@ -29,7 +29,7 @@ def message_size_mod(
|
|
|
29
29
|
) -> Message:
|
|
30
30
|
"""Message size mod.
|
|
31
31
|
|
|
32
|
-
This mod logs the size in
|
|
32
|
+
This mod logs the size in bytes of the message being transmited.
|
|
33
33
|
"""
|
|
34
34
|
message_size_in_bytes = 0
|
|
35
35
|
|
|
@@ -42,7 +42,7 @@ def message_size_mod(
|
|
|
42
42
|
for m_record in msg.content.metrics_records.values():
|
|
43
43
|
message_size_in_bytes += m_record.count_bytes()
|
|
44
44
|
|
|
45
|
-
log(INFO, "Message size: %i
|
|
45
|
+
log(INFO, "Message size: %i bytes", message_size_in_bytes)
|
|
46
46
|
|
|
47
47
|
return call_next(msg, ctxt)
|
|
48
48
|
|
|
@@ -53,7 +53,7 @@ def parameters_size_mod(
|
|
|
53
53
|
"""Parameters size mod.
|
|
54
54
|
|
|
55
55
|
This mod logs the number of parameters transmitted in the message as well as their
|
|
56
|
-
size in
|
|
56
|
+
size in bytes.
|
|
57
57
|
"""
|
|
58
58
|
model_size_stats = {}
|
|
59
59
|
parameters_size_in_bytes = 0
|
|
@@ -74,6 +74,6 @@ def parameters_size_mod(
|
|
|
74
74
|
if model_size_stats:
|
|
75
75
|
log(INFO, model_size_stats)
|
|
76
76
|
|
|
77
|
-
log(INFO, "Total parameters
|
|
77
|
+
log(INFO, "Total parameters transmitted: %i bytes", parameters_size_in_bytes)
|
|
78
78
|
|
|
79
79
|
return call_next(msg, ctxt)
|
|
@@ -16,10 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from .driver import Driver
|
|
19
|
-
from .grpc_driver import GrpcDriver
|
|
19
|
+
from .grpc_driver import GrpcDriver
|
|
20
|
+
from .inmemory_driver import InMemoryDriver
|
|
20
21
|
|
|
21
22
|
__all__ = [
|
|
22
23
|
"Driver",
|
|
23
24
|
"GrpcDriver",
|
|
24
|
-
"
|
|
25
|
+
"InMemoryDriver",
|
|
25
26
|
]
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Flower in-memory Driver."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import time
|
|
19
|
+
import warnings
|
|
20
|
+
from typing import Iterable, List, Optional
|
|
21
|
+
from uuid import UUID
|
|
22
|
+
|
|
23
|
+
from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
|
|
24
|
+
from flwr.common.serde import message_from_taskres, message_to_taskins
|
|
25
|
+
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
26
|
+
from flwr.server.superlink.state import StateFactory
|
|
27
|
+
|
|
28
|
+
from .driver import Driver
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class InMemoryDriver(Driver):
|
|
32
|
+
"""`InMemoryDriver` class provides an interface to the Driver API.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
state_factory : StateFactory
|
|
37
|
+
A StateFactory embedding a state that this driver can interface with.
|
|
38
|
+
fab_id : str (default: None)
|
|
39
|
+
The identifier of the FAB used in the run.
|
|
40
|
+
fab_version : str (default: None)
|
|
41
|
+
The version of the FAB used in the run.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
state_factory: StateFactory,
|
|
47
|
+
fab_id: Optional[str] = None,
|
|
48
|
+
fab_version: Optional[str] = None,
|
|
49
|
+
) -> None:
|
|
50
|
+
self.run_id: Optional[int] = None
|
|
51
|
+
self.fab_id = fab_id if fab_id is not None else ""
|
|
52
|
+
self.fab_version = fab_version if fab_version is not None else ""
|
|
53
|
+
self.node = Node(node_id=0, anonymous=True)
|
|
54
|
+
self.state = state_factory.state()
|
|
55
|
+
|
|
56
|
+
def _check_message(self, message: Message) -> None:
|
|
57
|
+
# Check if the message is valid
|
|
58
|
+
if not (
|
|
59
|
+
message.metadata.run_id == self.run_id
|
|
60
|
+
and message.metadata.src_node_id == self.node.node_id
|
|
61
|
+
and message.metadata.message_id == ""
|
|
62
|
+
and message.metadata.reply_to_message == ""
|
|
63
|
+
and message.metadata.ttl > 0
|
|
64
|
+
):
|
|
65
|
+
raise ValueError(f"Invalid message: {message}")
|
|
66
|
+
|
|
67
|
+
def _get_run_id(self) -> int:
|
|
68
|
+
"""Return run_id.
|
|
69
|
+
|
|
70
|
+
If unset, create a new run.
|
|
71
|
+
"""
|
|
72
|
+
if self.run_id is None:
|
|
73
|
+
self.run_id = self.state.create_run(
|
|
74
|
+
fab_id=self.fab_id, fab_version=self.fab_version
|
|
75
|
+
)
|
|
76
|
+
return self.run_id
|
|
77
|
+
|
|
78
|
+
def create_message( # pylint: disable=too-many-arguments
|
|
79
|
+
self,
|
|
80
|
+
content: RecordSet,
|
|
81
|
+
message_type: str,
|
|
82
|
+
dst_node_id: int,
|
|
83
|
+
group_id: str,
|
|
84
|
+
ttl: Optional[float] = None,
|
|
85
|
+
) -> Message:
|
|
86
|
+
"""Create a new message with specified parameters.
|
|
87
|
+
|
|
88
|
+
This method constructs a new `Message` with given content and metadata.
|
|
89
|
+
The `run_id` and `src_node_id` will be set automatically.
|
|
90
|
+
"""
|
|
91
|
+
run_id = self._get_run_id()
|
|
92
|
+
if ttl:
|
|
93
|
+
warnings.warn(
|
|
94
|
+
"A custom TTL was set, but note that the SuperLink does not enforce "
|
|
95
|
+
"the TTL yet. The SuperLink will start enforcing the TTL in a future "
|
|
96
|
+
"version of Flower.",
|
|
97
|
+
stacklevel=2,
|
|
98
|
+
)
|
|
99
|
+
ttl_ = DEFAULT_TTL if ttl is None else ttl
|
|
100
|
+
|
|
101
|
+
metadata = Metadata(
|
|
102
|
+
run_id=run_id,
|
|
103
|
+
message_id="", # Will be set by the server
|
|
104
|
+
src_node_id=self.node.node_id,
|
|
105
|
+
dst_node_id=dst_node_id,
|
|
106
|
+
reply_to_message="",
|
|
107
|
+
group_id=group_id,
|
|
108
|
+
ttl=ttl_,
|
|
109
|
+
message_type=message_type,
|
|
110
|
+
)
|
|
111
|
+
return Message(metadata=metadata, content=content)
|
|
112
|
+
|
|
113
|
+
def get_node_ids(self) -> List[int]:
|
|
114
|
+
"""Get node IDs."""
|
|
115
|
+
run_id = self._get_run_id()
|
|
116
|
+
return list(self.state.get_nodes(run_id))
|
|
117
|
+
|
|
118
|
+
def push_messages(self, messages: Iterable[Message]) -> Iterable[str]:
|
|
119
|
+
"""Push messages to specified node IDs.
|
|
120
|
+
|
|
121
|
+
This method takes an iterable of messages and sends each message
|
|
122
|
+
to the node specified in `dst_node_id`.
|
|
123
|
+
"""
|
|
124
|
+
task_ids: List[str] = []
|
|
125
|
+
for msg in messages:
|
|
126
|
+
# Check message
|
|
127
|
+
self._check_message(msg)
|
|
128
|
+
# Convert Message to TaskIns
|
|
129
|
+
taskins = message_to_taskins(msg)
|
|
130
|
+
# Store in state
|
|
131
|
+
taskins.task.pushed_at = time.time()
|
|
132
|
+
task_id = self.state.store_task_ins(taskins)
|
|
133
|
+
if task_id:
|
|
134
|
+
task_ids.append(str(task_id))
|
|
135
|
+
|
|
136
|
+
return task_ids
|
|
137
|
+
|
|
138
|
+
def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
|
|
139
|
+
"""Pull messages based on message IDs.
|
|
140
|
+
|
|
141
|
+
This method is used to collect messages from the SuperLink that correspond to a
|
|
142
|
+
set of given message IDs.
|
|
143
|
+
"""
|
|
144
|
+
msg_ids = {UUID(msg_id) for msg_id in message_ids}
|
|
145
|
+
# Pull TaskRes
|
|
146
|
+
task_res_list = self.state.get_task_res(task_ids=msg_ids, limit=len(msg_ids))
|
|
147
|
+
# Delete tasks in state
|
|
148
|
+
self.state.delete_tasks(msg_ids)
|
|
149
|
+
# Convert TaskRes to Message
|
|
150
|
+
msgs = [message_from_taskres(taskres) for taskres in task_res_list]
|
|
151
|
+
return msgs
|
|
152
|
+
|
|
153
|
+
def send_and_receive(
|
|
154
|
+
self,
|
|
155
|
+
messages: Iterable[Message],
|
|
156
|
+
*,
|
|
157
|
+
timeout: Optional[float] = None,
|
|
158
|
+
) -> Iterable[Message]:
|
|
159
|
+
"""Push messages to specified node IDs and pull the reply messages.
|
|
160
|
+
|
|
161
|
+
This method sends a list of messages to their destination node IDs and then
|
|
162
|
+
waits for the replies. It continues to pull replies until either all replies are
|
|
163
|
+
received or the specified timeout duration is exceeded.
|
|
164
|
+
"""
|
|
165
|
+
# Push messages
|
|
166
|
+
msg_ids = set(self.push_messages(messages))
|
|
167
|
+
|
|
168
|
+
# Pull messages
|
|
169
|
+
end_time = time.time() + (timeout if timeout is not None else 0.0)
|
|
170
|
+
ret: List[Message] = []
|
|
171
|
+
while timeout is None or time.time() < end_time:
|
|
172
|
+
res_msgs = self.pull_messages(msg_ids)
|
|
173
|
+
ret.extend(res_msgs)
|
|
174
|
+
msg_ids.difference_update(
|
|
175
|
+
{msg.metadata.reply_to_message for msg in res_msgs}
|
|
176
|
+
)
|
|
177
|
+
if len(msg_ids) == 0:
|
|
178
|
+
break
|
|
179
|
+
# Sleep
|
|
180
|
+
time.sleep(3)
|
|
181
|
+
return ret
|
{flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240520}/src/py/flwr/server/server.py
RENAMED
|
@@ -282,7 +282,14 @@ class Server:
|
|
|
282
282
|
get_parameters_res = random_client.get_parameters(
|
|
283
283
|
ins=ins, timeout=timeout, group_id=server_round
|
|
284
284
|
)
|
|
285
|
-
|
|
285
|
+
if get_parameters_res.status.code == Code.OK:
|
|
286
|
+
log(INFO, "Received initial parameters from one random client")
|
|
287
|
+
else:
|
|
288
|
+
log(
|
|
289
|
+
WARN,
|
|
290
|
+
"Failed to receive initial parameters from the client."
|
|
291
|
+
" Empty initial parameters will be used.",
|
|
292
|
+
)
|
|
286
293
|
return get_parameters_res.parameters
|
|
287
294
|
|
|
288
295
|
|
|
@@ -486,7 +493,7 @@ def run_fl(
|
|
|
486
493
|
|
|
487
494
|
log(INFO, "")
|
|
488
495
|
log(INFO, "[SUMMARY]")
|
|
489
|
-
log(INFO, "Run finished %s
|
|
496
|
+
log(INFO, "Run finished %s round(s) in %.2fs", config.num_rounds, elapsed_time)
|
|
490
497
|
for line in io.StringIO(str(hist)):
|
|
491
498
|
log(INFO, "\t%s", line.strip("\n"))
|
|
492
499
|
log(INFO, "")
|
|
@@ -234,8 +234,7 @@ class DifferentialPrivacyServerSideAdaptiveClipping(Strategy):
|
|
|
234
234
|
)
|
|
235
235
|
log(
|
|
236
236
|
INFO,
|
|
237
|
-
"aggregate_fit: central DP noise with "
|
|
238
|
-
"standard deviation: %.4f added to parameters.",
|
|
237
|
+
"aggregate_fit: central DP noise with %.4f stdev added",
|
|
239
238
|
compute_stdv(
|
|
240
239
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
241
240
|
),
|
|
@@ -425,8 +424,7 @@ class DifferentialPrivacyClientSideAdaptiveClipping(Strategy):
|
|
|
425
424
|
)
|
|
426
425
|
log(
|
|
427
426
|
INFO,
|
|
428
|
-
"aggregate_fit: central DP noise with "
|
|
429
|
-
"standard deviation: %.4f added to parameters.",
|
|
427
|
+
"aggregate_fit: central DP noise with %.4f stdev added",
|
|
430
428
|
compute_stdv(
|
|
431
429
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
432
430
|
),
|
|
@@ -180,8 +180,7 @@ class DifferentialPrivacyServerSideFixedClipping(Strategy):
|
|
|
180
180
|
|
|
181
181
|
log(
|
|
182
182
|
INFO,
|
|
183
|
-
"aggregate_fit: central DP noise with "
|
|
184
|
-
"standard deviation: %.4f added to parameters.",
|
|
183
|
+
"aggregate_fit: central DP noise with %.4f stdev added",
|
|
185
184
|
compute_stdv(
|
|
186
185
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
187
186
|
),
|
|
@@ -338,8 +337,7 @@ class DifferentialPrivacyClientSideFixedClipping(Strategy):
|
|
|
338
337
|
)
|
|
339
338
|
log(
|
|
340
339
|
INFO,
|
|
341
|
-
"aggregate_fit: central DP noise with "
|
|
342
|
-
"standard deviation: %.4f added to parameters.",
|
|
340
|
+
"aggregate_fit: central DP noise with %.4f stdev added",
|
|
343
341
|
compute_stdv(
|
|
344
342
|
self.noise_multiplier, self.clipping_norm, self.num_sampled_clients
|
|
345
343
|
),
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import time
|
|
19
|
-
from logging import DEBUG
|
|
19
|
+
from logging import DEBUG
|
|
20
20
|
from typing import List, Optional, Set
|
|
21
21
|
from uuid import UUID
|
|
22
22
|
|
|
@@ -62,7 +62,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
62
62
|
self, request: CreateRunRequest, context: grpc.ServicerContext
|
|
63
63
|
) -> CreateRunResponse:
|
|
64
64
|
"""Create run ID."""
|
|
65
|
-
log(
|
|
65
|
+
log(DEBUG, "DriverServicer.CreateRun")
|
|
66
66
|
state: State = self.state_factory.state()
|
|
67
67
|
run_id = state.create_run(request.fab_id, request.fab_version)
|
|
68
68
|
return CreateRunResponse(run_id=run_id)
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"""Ray backend for the Fleet API using the Simulation Engine."""
|
|
16
16
|
|
|
17
17
|
import pathlib
|
|
18
|
-
from logging import DEBUG, ERROR,
|
|
18
|
+
from logging import DEBUG, ERROR, WARNING
|
|
19
19
|
from typing import Callable, Dict, List, Tuple, Union
|
|
20
20
|
|
|
21
21
|
import ray
|
|
@@ -45,7 +45,7 @@ class RayBackend(Backend):
|
|
|
45
45
|
work_dir: str,
|
|
46
46
|
) -> None:
|
|
47
47
|
"""Prepare RayBackend by initialising Ray and creating the ActorPool."""
|
|
48
|
-
log(
|
|
48
|
+
log(DEBUG, "Initialising: %s", self.__class__.__name__)
|
|
49
49
|
log(DEBUG, "Backend config: %s", backend_config)
|
|
50
50
|
|
|
51
51
|
if not pathlib.Path(work_dir).exists():
|
|
@@ -55,7 +55,12 @@ class RayBackend(Backend):
|
|
|
55
55
|
runtime_env = (
|
|
56
56
|
self._configure_runtime_env(work_dir=work_dir) if work_dir else None
|
|
57
57
|
)
|
|
58
|
-
|
|
58
|
+
|
|
59
|
+
if backend_config.get("mute_logging", False):
|
|
60
|
+
init_ray(
|
|
61
|
+
logging_level=WARNING, log_to_driver=False, runtime_env=runtime_env
|
|
62
|
+
)
|
|
63
|
+
elif backend_config.get("silent", False):
|
|
59
64
|
init_ray(logging_level=WARNING, log_to_driver=True, runtime_env=runtime_env)
|
|
60
65
|
else:
|
|
61
66
|
init_ray(runtime_env=runtime_env)
|
|
@@ -46,7 +46,7 @@ def _register_nodes(
|
|
|
46
46
|
for i in range(num_nodes):
|
|
47
47
|
node_id = state.create_node(ping_interval=PING_MAX_INTERVAL)
|
|
48
48
|
nodes_mapping[node_id] = i
|
|
49
|
-
log(
|
|
49
|
+
log(DEBUG, "Registered %i nodes", len(nodes_mapping))
|
|
50
50
|
return nodes_mapping
|
|
51
51
|
|
|
52
52
|
|