flwr-nightly 1.9.0.dev20240509__tar.gz → 1.9.0.dev20240531__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.dev20240531}/PKG-INFO +5 -3
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/README.md +3 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/pyproject.toml +3 -3
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/build.py +2 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/config_utils.py +1 -23
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/new.py +2 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +55 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +6 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +28 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +6 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/run.py +20 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/connection.py +5 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/comms_mods.py +4 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/localdp_mod.py +1 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/app.py +41 -23
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/recordset_compat.py +8 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -15
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/app.py +134 -182
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/__init__.py +3 -2
- flwr_nightly-1.9.0.dev20240531/src/py/flwr/server/driver/inmemory_driver.py +181 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server.py +9 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +2 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dp_fixed_clipping.py +2 -4
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_servicer.py +2 -2
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +8 -3
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +1 -1
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/default_workflows.py +67 -22
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/run_simulation.py +2 -31
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/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.dev20240531}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/node_state_tests.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/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.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/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.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/superlink/state/utils.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/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.dev20240531
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -39,7 +39,7 @@ Requires-Dist: numpy (>=1.21.0,<2.0.0)
|
|
|
39
39
|
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
40
40
|
Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
41
41
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
|
42
|
-
Requires-Dist: ray (==2.
|
|
42
|
+
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
|
|
43
43
|
Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
|
|
44
44
|
Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
|
|
45
45
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
|
@@ -201,7 +201,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
201
201
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
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
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
204
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
205
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
206
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
205
207
|
|
|
206
208
|
## Community
|
|
207
209
|
|
|
@@ -150,7 +150,9 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
150
150
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
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
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
153
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
154
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
155
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
154
156
|
|
|
155
157
|
## Community
|
|
156
158
|
|
|
@@ -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.dev20240531"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -74,14 +74,14 @@ typer = { version = "^0.9.0", extras=["all"] }
|
|
|
74
74
|
tomli = "^2.0.1"
|
|
75
75
|
pathspec = "^0.12.1"
|
|
76
76
|
# Optional dependencies (Simulation Engine)
|
|
77
|
-
ray = { version = "==2.
|
|
77
|
+
ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
|
|
78
78
|
# Optional dependencies (REST transport layer)
|
|
79
79
|
requests = { version = "^2.31.0", optional = true }
|
|
80
80
|
starlette = { version = "^0.31.0", optional = true }
|
|
81
81
|
uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
|
|
82
82
|
|
|
83
83
|
[tool.poetry.extras]
|
|
84
|
-
simulation = ["ray"
|
|
84
|
+
simulation = ["ray"]
|
|
85
85
|
rest = ["requests", "starlette", "uvicorn"]
|
|
86
86
|
|
|
87
87
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -24,7 +24,7 @@ import pathspec
|
|
|
24
24
|
import typer
|
|
25
25
|
from typing_extensions import Annotated
|
|
26
26
|
|
|
27
|
-
from .config_utils import
|
|
27
|
+
from .config_utils import load_and_validate
|
|
28
28
|
from .utils import is_valid_project_name
|
|
29
29
|
|
|
30
30
|
|
|
@@ -67,9 +67,7 @@ def build(
|
|
|
67
67
|
)
|
|
68
68
|
raise typer.Exit(code=1)
|
|
69
69
|
|
|
70
|
-
conf, errors, warnings =
|
|
71
|
-
directory / "pyproject.toml"
|
|
72
|
-
)
|
|
70
|
+
conf, errors, warnings = load_and_validate(directory / "pyproject.toml")
|
|
73
71
|
if conf is None:
|
|
74
72
|
typer.secho(
|
|
75
73
|
"Project configuration could not be loaded.\npyproject.toml is invalid:\n"
|
{flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/config_utils.py
RENAMED
|
@@ -22,7 +22,7 @@ import tomli
|
|
|
22
22
|
from flwr.common import object_ref
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def
|
|
25
|
+
def load_and_validate(
|
|
26
26
|
path: Optional[Path] = None,
|
|
27
27
|
) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
|
|
28
28
|
"""Load and validate pyproject.toml as dict.
|
|
@@ -47,14 +47,6 @@ def load_and_validate_with_defaults(
|
|
|
47
47
|
if not is_valid:
|
|
48
48
|
return (None, errors, warnings)
|
|
49
49
|
|
|
50
|
-
# Apply defaults
|
|
51
|
-
defaults = {
|
|
52
|
-
"flower": {
|
|
53
|
-
"engine": {"name": "simulation", "simulation": {"supernode": {"num": 2}}}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
config = apply_defaults(config, defaults)
|
|
57
|
-
|
|
58
50
|
return (config, errors, warnings)
|
|
59
51
|
|
|
60
52
|
|
|
@@ -129,17 +121,3 @@ def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
|
|
|
129
121
|
return False, [reason], []
|
|
130
122
|
|
|
131
123
|
return True, [], []
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def apply_defaults(
|
|
135
|
-
config: Dict[str, Any],
|
|
136
|
-
defaults: Dict[str, Any],
|
|
137
|
-
) -> Dict[str, Any]:
|
|
138
|
-
"""Apply defaults to config."""
|
|
139
|
-
for key in defaults:
|
|
140
|
-
if key in config:
|
|
141
|
-
if isinstance(config[key], dict) and isinstance(defaults[key], dict):
|
|
142
|
-
apply_defaults(config[key], defaults[key])
|
|
143
|
-
else:
|
|
144
|
-
config[key] = defaults[key]
|
|
145
|
-
return config
|
{flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/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"
|
{flwr_nightly-1.9.0.dev20240509 → flwr_nightly-1.9.0.dev20240531}/src/py/flwr/cli/run/run.py
RENAMED
|
@@ -15,18 +15,32 @@
|
|
|
15
15
|
"""Flower command line interface `run` command."""
|
|
16
16
|
|
|
17
17
|
import sys
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from typing import Optional
|
|
18
20
|
|
|
19
21
|
import typer
|
|
22
|
+
from typing_extensions import Annotated
|
|
20
23
|
|
|
21
24
|
from flwr.cli import config_utils
|
|
22
25
|
from flwr.simulation.run_simulation import _run_simulation
|
|
23
26
|
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
class Engine(str, Enum):
|
|
29
|
+
"""Enum defining the engine to run on."""
|
|
30
|
+
|
|
31
|
+
SIMULATION = "simulation"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def run(
|
|
35
|
+
engine: Annotated[
|
|
36
|
+
Optional[Engine],
|
|
37
|
+
typer.Option(case_sensitive=False, help="The ML framework to use"),
|
|
38
|
+
] = None,
|
|
39
|
+
) -> None:
|
|
26
40
|
"""Run Flower project."""
|
|
27
41
|
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
|
28
42
|
|
|
29
|
-
config, errors, warnings = config_utils.
|
|
43
|
+
config, errors, warnings = config_utils.load_and_validate()
|
|
30
44
|
|
|
31
45
|
if config is None:
|
|
32
46
|
typer.secho(
|
|
@@ -49,9 +63,11 @@ def run() -> None:
|
|
|
49
63
|
|
|
50
64
|
server_app_ref = config["flower"]["components"]["serverapp"]
|
|
51
65
|
client_app_ref = config["flower"]["components"]["clientapp"]
|
|
52
|
-
engine = config["flower"]["engine"]["name"]
|
|
53
66
|
|
|
54
|
-
if engine
|
|
67
|
+
if engine is None:
|
|
68
|
+
engine = config["flower"]["engine"]["name"]
|
|
69
|
+
|
|
70
|
+
if engine == Engine.SIMULATION:
|
|
55
71
|
num_supernodes = config["flower"]["engine"]["simulation"]["supernode"]["num"]
|
|
56
72
|
|
|
57
73
|
typer.secho("Starting run... ", fg=typer.colors.BLUE)
|
|
@@ -21,7 +21,7 @@ from contextlib import contextmanager
|
|
|
21
21
|
from copy import copy
|
|
22
22
|
from logging import DEBUG, ERROR
|
|
23
23
|
from pathlib import Path
|
|
24
|
-
from typing import Callable, Iterator, Optional, Sequence, Tuple, Union, cast
|
|
24
|
+
from typing import Callable, Iterator, Optional, Sequence, Tuple, Type, Union, cast
|
|
25
25
|
|
|
26
26
|
import grpc
|
|
27
27
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
@@ -73,6 +73,7 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
|
|
|
73
73
|
authentication_keys: Optional[
|
|
74
74
|
Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
|
75
75
|
] = None,
|
|
76
|
+
adapter_cls: Optional[Type[FleetStub]] = None,
|
|
76
77
|
) -> Iterator[
|
|
77
78
|
Tuple[
|
|
78
79
|
Callable[[], Optional[Message]],
|
|
@@ -133,7 +134,9 @@ def grpc_request_response( # pylint: disable=R0913, R0914, R0915
|
|
|
133
134
|
channel.subscribe(on_channel_state_change)
|
|
134
135
|
|
|
135
136
|
# Shared variables for inner functions
|
|
136
|
-
|
|
137
|
+
if adapter_cls is None:
|
|
138
|
+
adapter_cls = FleetStub
|
|
139
|
+
stub = adapter_cls(channel)
|
|
137
140
|
metadata: Optional[Metadata] = None
|
|
138
141
|
node: Optional[Node] = None
|
|
139
142
|
ping_thread: Optional[threading.Thread] = None
|
|
@@ -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)
|
|
@@ -20,6 +20,7 @@ from logging import DEBUG, INFO, WARN
|
|
|
20
20
|
from pathlib import Path
|
|
21
21
|
from typing import Callable, Optional, Tuple
|
|
22
22
|
|
|
23
|
+
from cryptography.exceptions import UnsupportedAlgorithm
|
|
23
24
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
24
25
|
from cryptography.hazmat.primitives.serialization import (
|
|
25
26
|
load_ssh_private_key,
|
|
@@ -31,9 +32,6 @@ from flwr.common import EventType, event
|
|
|
31
32
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
32
33
|
from flwr.common.logger import log
|
|
33
34
|
from flwr.common.object_ref import load_app, validate
|
|
34
|
-
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
35
|
-
ssh_types_to_elliptic_curve,
|
|
36
|
-
)
|
|
37
35
|
|
|
38
36
|
from ..app import _start_client_internal
|
|
39
37
|
|
|
@@ -242,40 +240,60 @@ def _parse_args_common(parser: argparse.ArgumentParser) -> None:
|
|
|
242
240
|
" Default: current working directory.",
|
|
243
241
|
)
|
|
244
242
|
parser.add_argument(
|
|
245
|
-
"--
|
|
246
|
-
|
|
247
|
-
|
|
243
|
+
"--auth-supernode-private-key",
|
|
244
|
+
type=str,
|
|
245
|
+
help="The SuperNode's private key (as a path str) to enable authentication.",
|
|
246
|
+
)
|
|
247
|
+
parser.add_argument(
|
|
248
|
+
"--auth-supernode-public-key",
|
|
248
249
|
type=str,
|
|
249
|
-
help="
|
|
250
|
-
"key file, and (2) the client's public key file.",
|
|
250
|
+
help="The SuperNode's public key (as a path str) to enable authentication.",
|
|
251
251
|
)
|
|
252
252
|
|
|
253
253
|
|
|
254
254
|
def _try_setup_client_authentication(
|
|
255
255
|
args: argparse.Namespace,
|
|
256
256
|
) -> Optional[Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]]:
|
|
257
|
-
if not args.
|
|
257
|
+
if not args.auth_supernode_private_key and not args.auth_supernode_public_key:
|
|
258
258
|
return None
|
|
259
259
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
260
|
+
if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
|
|
261
|
+
sys.exit(
|
|
262
|
+
"Authentication requires file paths to both "
|
|
263
|
+
"'--auth-supernode-private-key' and '--auth-supernode-public-key'"
|
|
264
|
+
"to be provided (providing only one of them is not sufficient)."
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
ssh_private_key = load_ssh_private_key(
|
|
269
|
+
Path(args.auth_supernode_private_key).read_bytes(),
|
|
270
|
+
None,
|
|
271
|
+
)
|
|
272
|
+
if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
|
|
273
|
+
raise ValueError()
|
|
274
|
+
except (ValueError, UnsupportedAlgorithm):
|
|
275
|
+
sys.exit(
|
|
276
|
+
"Error: Unable to parse the private key file in "
|
|
277
|
+
"'--auth-supernode-private-key'. Authentication requires elliptic "
|
|
278
|
+
"curve private and public key pair. Please ensure that the file "
|
|
279
|
+
"path points to a valid private key file and try again."
|
|
280
|
+
)
|
|
265
281
|
|
|
266
282
|
try:
|
|
267
|
-
|
|
268
|
-
|
|
283
|
+
ssh_public_key = load_ssh_public_key(
|
|
284
|
+
Path(args.auth_supernode_public_key).read_bytes()
|
|
269
285
|
)
|
|
270
|
-
|
|
286
|
+
if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
|
|
287
|
+
raise ValueError()
|
|
288
|
+
except (ValueError, UnsupportedAlgorithm):
|
|
271
289
|
sys.exit(
|
|
272
|
-
"
|
|
273
|
-
"key
|
|
274
|
-
"private key pair. Please
|
|
275
|
-
"
|
|
290
|
+
"Error: Unable to parse the public key file in "
|
|
291
|
+
"'--auth-supernode-public-key'. Authentication requires elliptic "
|
|
292
|
+
"curve private and public key pair. Please ensure that the file "
|
|
293
|
+
"path points to a valid public key file and try again."
|
|
276
294
|
)
|
|
277
295
|
|
|
278
296
|
return (
|
|
279
|
-
|
|
280
|
-
|
|
297
|
+
ssh_private_key,
|
|
298
|
+
ssh_public_key,
|
|
281
299
|
)
|
|
@@ -35,6 +35,8 @@ from .typing import (
|
|
|
35
35
|
Status,
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
+
EMPTY_TENSOR_KEY = "_empty"
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
def parametersrecord_to_parameters(
|
|
40
42
|
record: ParametersRecord, keep_input: bool
|
|
@@ -59,7 +61,8 @@ def parametersrecord_to_parameters(
|
|
|
59
61
|
parameters = Parameters(tensors=[], tensor_type="")
|
|
60
62
|
|
|
61
63
|
for key in list(record.keys()):
|
|
62
|
-
|
|
64
|
+
if key != EMPTY_TENSOR_KEY:
|
|
65
|
+
parameters.tensors.append(record[key].data)
|
|
63
66
|
|
|
64
67
|
if not parameters.tensor_type:
|
|
65
68
|
# Setting from first array in record. Recall the warning in the docstrings
|
|
@@ -103,6 +106,10 @@ def parameters_to_parametersrecord(
|
|
|
103
106
|
data=tensor, dtype="", stype=tensor_type, shape=[]
|
|
104
107
|
)
|
|
105
108
|
|
|
109
|
+
if num_arrays == 0:
|
|
110
|
+
ordered_dict[EMPTY_TENSOR_KEY] = Array(
|
|
111
|
+
data=b"", dtype="", stype=tensor_type, shape=[]
|
|
112
|
+
)
|
|
106
113
|
return ParametersRecord(ordered_dict, keep_input=keep_input)
|
|
107
114
|
|
|
108
115
|
|
|
@@ -117,18 +117,3 @@ def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
|
|
|
117
117
|
return True
|
|
118
118
|
except InvalidSignature:
|
|
119
119
|
return False
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def ssh_types_to_elliptic_curve(
|
|
123
|
-
private_key: serialization.SSHPrivateKeyTypes,
|
|
124
|
-
public_key: serialization.SSHPublicKeyTypes,
|
|
125
|
-
) -> Tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]:
|
|
126
|
-
"""Cast SSH key types to elliptic curve."""
|
|
127
|
-
if isinstance(private_key, ec.EllipticCurvePrivateKey) and isinstance(
|
|
128
|
-
public_key, ec.EllipticCurvePublicKey
|
|
129
|
-
):
|
|
130
|
-
return (private_key, public_key)
|
|
131
|
-
|
|
132
|
-
raise TypeError(
|
|
133
|
-
"The provided key is not an EllipticCurvePrivateKey or EllipticCurvePublicKey"
|
|
134
|
-
)
|