flwr-nightly 1.15.0.dev20250109__tar.gz → 1.15.0.dev20250110__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.
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/PKG-INFO +1 -1
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/pyproject.toml +1 -1
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/app.py +17 -9
- flwr_nightly-1.15.0.dev20250109/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py → flwr_nightly-1.15.0.dev20250110/src/py/flwr/common/grpc.py +51 -121
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/app.py +42 -20
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +1 -1
- flwr_nightly-1.15.0.dev20250110/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +126 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_grpc.py +1 -1
- flwr_nightly-1.15.0.dev20250109/src/py/flwr/common/grpc.py +0 -68
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/LICENSE +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/README.md +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/superexec/simulation.py +0 -0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "flwr-nightly"
|
7
|
-
version = "1.15.0.
|
7
|
+
version = "1.15.0.dev20250110"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/client/app.py
RENAMED
@@ -15,13 +15,14 @@
|
|
15
15
|
"""Flower client app."""
|
16
16
|
|
17
17
|
|
18
|
+
import multiprocessing
|
18
19
|
import signal
|
19
|
-
import subprocess
|
20
20
|
import sys
|
21
21
|
import time
|
22
22
|
from contextlib import AbstractContextManager
|
23
23
|
from dataclasses import dataclass
|
24
24
|
from logging import ERROR, INFO, WARN
|
25
|
+
from os import urandom
|
25
26
|
from pathlib import Path
|
26
27
|
from typing import Callable, Optional, Union, cast
|
27
28
|
|
@@ -33,6 +34,7 @@ from flwr.cli.config_utils import get_fab_metadata
|
|
33
34
|
from flwr.cli.install import install_from_fab
|
34
35
|
from flwr.client.client import Client
|
35
36
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
37
|
+
from flwr.client.clientapp.app import flwr_clientapp
|
36
38
|
from flwr.client.nodestate.nodestate_factory import NodeStateFactory
|
37
39
|
from flwr.client.typing import ClientFnExt
|
38
40
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
|
@@ -53,13 +55,12 @@ from flwr.common.constant import (
|
|
53
55
|
TRANSPORT_TYPES,
|
54
56
|
ErrorCode,
|
55
57
|
)
|
58
|
+
from flwr.common.grpc import generic_create_grpc_server
|
56
59
|
from flwr.common.logger import log, warn_deprecated_feature
|
57
60
|
from flwr.common.message import Error
|
58
61
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
59
62
|
from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
|
60
63
|
from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
61
|
-
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
62
|
-
from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
|
63
64
|
|
64
65
|
from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
|
65
66
|
from .grpc_adapter_client.connection import grpc_adapter
|
@@ -391,6 +392,7 @@ def start_client_internal(
|
|
391
392
|
run_info_store: Optional[DeprecatedRunInfoStore] = None
|
392
393
|
state_factory = NodeStateFactory()
|
393
394
|
state = state_factory.state()
|
395
|
+
mp_spawn_context = multiprocessing.get_context("spawn")
|
394
396
|
|
395
397
|
runs: dict[int, Run] = {}
|
396
398
|
|
@@ -513,7 +515,7 @@ def start_client_internal(
|
|
513
515
|
# Docker container.
|
514
516
|
|
515
517
|
# Generate SuperNode token
|
516
|
-
token
|
518
|
+
token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
|
517
519
|
|
518
520
|
# Mode 1: SuperNode starts ClientApp as subprocess
|
519
521
|
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
@@ -549,12 +551,13 @@ def start_client_internal(
|
|
549
551
|
]
|
550
552
|
command.append("--insecure")
|
551
553
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
check=True,
|
554
|
+
proc = mp_spawn_context.Process(
|
555
|
+
target=_run_flwr_clientapp,
|
556
|
+
args=(command,),
|
557
|
+
daemon=True,
|
557
558
|
)
|
559
|
+
proc.start()
|
560
|
+
proc.join()
|
558
561
|
else:
|
559
562
|
# Wait for output to become available
|
560
563
|
while not clientappio_servicer.has_outputs():
|
@@ -826,6 +829,11 @@ class _AppStateTracker:
|
|
826
829
|
signal.signal(signal.SIGTERM, signal_handler)
|
827
830
|
|
828
831
|
|
832
|
+
def _run_flwr_clientapp(args: list[str]) -> None:
|
833
|
+
sys.argv = args
|
834
|
+
flwr_clientapp()
|
835
|
+
|
836
|
+
|
829
837
|
def run_clientappio_api_grpc(
|
830
838
|
address: str,
|
831
839
|
certificates: Optional[tuple[bytes, bytes, bytes]],
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2022 Flower Labs GmbH. All Rights Reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -12,32 +12,21 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""
|
15
|
+
"""Utility functions for gRPC."""
|
16
16
|
|
17
17
|
|
18
18
|
import concurrent.futures
|
19
19
|
import sys
|
20
20
|
from collections.abc import Sequence
|
21
|
-
from logging import ERROR
|
22
|
-
from typing import Any, Callable, Optional
|
21
|
+
from logging import DEBUG, ERROR
|
22
|
+
from typing import Any, Callable, Optional
|
23
23
|
|
24
24
|
import grpc
|
25
25
|
|
26
|
-
from
|
27
|
-
from
|
28
|
-
|
29
|
-
|
30
|
-
add_FlowerServiceServicer_to_server,
|
31
|
-
)
|
32
|
-
from flwr.server.client_manager import ClientManager
|
33
|
-
from flwr.server.superlink.driver.serverappio_servicer import ServerAppIoServicer
|
34
|
-
from flwr.server.superlink.fleet.grpc_adapter.grpc_adapter_servicer import (
|
35
|
-
GrpcAdapterServicer,
|
36
|
-
)
|
37
|
-
from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
|
38
|
-
FlowerServiceServicer,
|
39
|
-
)
|
40
|
-
from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
26
|
+
from .address import is_port_in_use
|
27
|
+
from .logger import log
|
28
|
+
|
29
|
+
GRPC_MAX_MESSAGE_LENGTH: int = 536_870_912 # == 512 * 1024 * 1024
|
41
30
|
|
42
31
|
INVALID_CERTIFICATES_ERR_MSG = """
|
43
32
|
When setting any of root_certificate, certificate, or private_key,
|
@@ -47,122 +36,63 @@ INVALID_CERTIFICATES_ERR_MSG = """
|
|
47
36
|
AddServicerToServerFn = Callable[..., Any]
|
48
37
|
|
49
38
|
|
50
|
-
def
|
51
|
-
"""Validate certificates tuple."""
|
52
|
-
is_valid = (
|
53
|
-
all(isinstance(certificate, bytes) for certificate in certificates)
|
54
|
-
and len(certificates) == 3
|
55
|
-
)
|
56
|
-
|
57
|
-
if not is_valid:
|
58
|
-
log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
|
59
|
-
|
60
|
-
return is_valid
|
61
|
-
|
62
|
-
|
63
|
-
def start_grpc_server( # pylint: disable=too-many-arguments,R0917
|
64
|
-
client_manager: ClientManager,
|
39
|
+
def create_channel(
|
65
40
|
server_address: str,
|
66
|
-
|
41
|
+
insecure: bool,
|
42
|
+
root_certificates: Optional[bytes] = None,
|
67
43
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
and private_key. Setting only some will make the process exit with code 1.
|
79
|
-
|
80
|
-
Parameters
|
81
|
-
----------
|
82
|
-
client_manager : ClientManager
|
83
|
-
Instance of ClientManager
|
84
|
-
server_address : str
|
85
|
-
Server address in the form of HOST:PORT e.g. "[::]:8080"
|
86
|
-
max_concurrent_workers : int
|
87
|
-
Maximum number of clients the server can process before returning
|
88
|
-
RESOURCE_EXHAUSTED status (default: 1000)
|
89
|
-
max_message_length : int
|
90
|
-
Maximum message length that the server can send or receive.
|
91
|
-
Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
|
92
|
-
keepalive_time_ms : int
|
93
|
-
Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
|
94
|
-
because some cloud providers (for example, Azure) agressively clean up idle
|
95
|
-
TCP connections by terminating them after some time (4 minutes in the case
|
96
|
-
of Azure). Flower does not use application-level keepalive signals and relies
|
97
|
-
on the assumption that the transport layer will fail in cases where the
|
98
|
-
connection is no longer active. `keepalive_time_ms` can be used to customize
|
99
|
-
the keepalive interval for specific environments. The default Flower gRPC
|
100
|
-
keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
|
101
|
-
the long running streaming connection alive in most environments. The actual
|
102
|
-
gRPC default of this setting is 7200000 (2 hours), which results in dropped
|
103
|
-
connections in some cloud environments.
|
104
|
-
|
105
|
-
These settings are related to the issue described here:
|
106
|
-
- https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
|
107
|
-
- https://github.com/grpc/grpc/blob/master/doc/keepalive.md
|
108
|
-
- https://grpc.io/docs/guides/performance/
|
44
|
+
interceptors: Optional[Sequence[grpc.UnaryUnaryClientInterceptor]] = None,
|
45
|
+
) -> grpc.Channel:
|
46
|
+
"""Create a gRPC channel, either secure or insecure."""
|
47
|
+
# Check for conflicting parameters
|
48
|
+
if insecure and root_certificates is not None:
|
49
|
+
raise ValueError(
|
50
|
+
"Invalid configuration: 'root_certificates' should not be provided "
|
51
|
+
"when 'insecure' is set to True. For an insecure connection, omit "
|
52
|
+
"'root_certificates', or set 'insecure' to False for a secure connection."
|
53
|
+
)
|
109
54
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
elements in the following order:
|
55
|
+
# Possible options:
|
56
|
+
# https://github.com/grpc/grpc/blob/v1.43.x/include/grpc/impl/codegen/grpc_types.h
|
57
|
+
channel_options = [
|
58
|
+
("grpc.max_send_message_length", max_message_length),
|
59
|
+
("grpc.max_receive_message_length", max_message_length),
|
60
|
+
]
|
117
61
|
|
118
|
-
|
119
|
-
|
120
|
-
|
62
|
+
if insecure:
|
63
|
+
channel = grpc.insecure_channel(server_address, options=channel_options)
|
64
|
+
log(DEBUG, "Opened insecure gRPC connection (no certificates were passed)")
|
65
|
+
else:
|
66
|
+
try:
|
67
|
+
ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
|
68
|
+
except Exception as e:
|
69
|
+
raise ValueError(f"Failed to create SSL channel credentials: {e}") from e
|
70
|
+
channel = grpc.secure_channel(
|
71
|
+
server_address, ssl_channel_credentials, options=channel_options
|
72
|
+
)
|
73
|
+
log(DEBUG, "Opened secure gRPC connection using certificates")
|
121
74
|
|
122
|
-
|
123
|
-
|
124
|
-
server : grpc.Server
|
125
|
-
An instance of a gRPC server which is already started
|
75
|
+
if interceptors is not None:
|
76
|
+
channel = grpc.intercept_channel(channel, interceptors)
|
126
77
|
|
127
|
-
|
128
|
-
--------
|
129
|
-
Starting a SSL-enabled server.
|
78
|
+
return channel
|
130
79
|
|
131
|
-
>>> from pathlib import Path
|
132
|
-
>>> start_grpc_server(
|
133
|
-
>>> client_manager=ClientManager(),
|
134
|
-
>>> server_address="localhost:8080",
|
135
|
-
>>> certificates=(
|
136
|
-
>>> Path("/crts/root.pem").read_bytes(),
|
137
|
-
>>> Path("/crts/localhost.crt").read_bytes(),
|
138
|
-
>>> Path("/crts/localhost.key").read_bytes(),
|
139
|
-
>>> ),
|
140
|
-
>>> )
|
141
|
-
"""
|
142
|
-
servicer = FlowerServiceServicer(client_manager)
|
143
|
-
add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
|
144
80
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
keepalive_time_ms=keepalive_time_ms,
|
151
|
-
certificates=certificates,
|
81
|
+
def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
|
82
|
+
"""Validate certificates tuple."""
|
83
|
+
is_valid = (
|
84
|
+
all(isinstance(certificate, bytes) for certificate in certificates)
|
85
|
+
and len(certificates) == 3
|
152
86
|
)
|
153
87
|
|
154
|
-
|
88
|
+
if not is_valid:
|
89
|
+
log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
|
155
90
|
|
156
|
-
return
|
91
|
+
return is_valid
|
157
92
|
|
158
93
|
|
159
94
|
def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
|
160
|
-
servicer_and_add_fn:
|
161
|
-
tuple[FleetServicer, AddServicerToServerFn],
|
162
|
-
tuple[GrpcAdapterServicer, AddServicerToServerFn],
|
163
|
-
tuple[FlowerServiceServicer, AddServicerToServerFn],
|
164
|
-
tuple[ServerAppIoServicer, AddServicerToServerFn],
|
165
|
-
],
|
95
|
+
servicer_and_add_fn: tuple[Any, AddServicerToServerFn],
|
166
96
|
server_address: str,
|
167
97
|
max_concurrent_workers: int = 1000,
|
168
98
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
{flwr_nightly-1.15.0.dev20250109 → flwr_nightly-1.15.0.dev20250110}/src/py/flwr/server/app.py
RENAMED
@@ -18,7 +18,8 @@
|
|
18
18
|
import argparse
|
19
19
|
import csv
|
20
20
|
import importlib.util
|
21
|
-
import
|
21
|
+
import multiprocessing
|
22
|
+
import multiprocessing.context
|
22
23
|
import sys
|
23
24
|
import threading
|
24
25
|
from collections.abc import Sequence
|
@@ -59,6 +60,7 @@ from flwr.common.constant import (
|
|
59
60
|
TRANSPORT_TYPE_REST,
|
60
61
|
)
|
61
62
|
from flwr.common.exit_handlers import register_exit_handlers
|
63
|
+
from flwr.common.grpc import generic_create_grpc_server
|
62
64
|
from flwr.common.logger import log, warn_deprecated_feature
|
63
65
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
64
66
|
private_key_to_bytes,
|
@@ -68,6 +70,8 @@ from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
|
|
68
70
|
add_FleetServicer_to_server,
|
69
71
|
)
|
70
72
|
from flwr.proto.grpcadapter_pb2_grpc import add_GrpcAdapterServicer_to_server
|
73
|
+
from flwr.server.serverapp.app import flwr_serverapp
|
74
|
+
from flwr.simulation.app import flwr_simulation
|
71
75
|
from flwr.superexec.app import load_executor
|
72
76
|
from flwr.superexec.exec_grpc import run_exec_api_grpc
|
73
77
|
|
@@ -79,10 +83,7 @@ from .strategy import Strategy
|
|
79
83
|
from .superlink.driver.serverappio_grpc import run_serverappio_api_grpc
|
80
84
|
from .superlink.ffs.ffs_factory import FfsFactory
|
81
85
|
from .superlink.fleet.grpc_adapter.grpc_adapter_servicer import GrpcAdapterServicer
|
82
|
-
from .superlink.fleet.grpc_bidi.grpc_server import
|
83
|
-
generic_create_grpc_server,
|
84
|
-
start_grpc_server,
|
85
|
-
)
|
86
|
+
from .superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
|
86
87
|
from .superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
87
88
|
from .superlink.fleet.grpc_rere.server_interceptor import AuthenticateServerInterceptor
|
88
89
|
from .superlink.linkstate import LinkStateFactory
|
@@ -292,7 +293,7 @@ def run_superlink() -> None:
|
|
292
293
|
# Determine Exec plugin
|
293
294
|
# If simulation is used, don't start ServerAppIo and Fleet APIs
|
294
295
|
sim_exec = executor.__class__.__qualname__ == "SimulationEngine"
|
295
|
-
bckg_threads = []
|
296
|
+
bckg_threads: list[threading.Thread] = []
|
296
297
|
|
297
298
|
if sim_exec:
|
298
299
|
simulationio_server: grpc.Server = run_simulationio_api_grpc(
|
@@ -360,6 +361,7 @@ def run_superlink() -> None:
|
|
360
361
|
ffs_factory,
|
361
362
|
num_workers,
|
362
363
|
),
|
364
|
+
daemon=True,
|
363
365
|
)
|
364
366
|
fleet_thread.start()
|
365
367
|
bckg_threads.append(fleet_thread)
|
@@ -426,6 +428,7 @@ def run_superlink() -> None:
|
|
426
428
|
address,
|
427
429
|
cmd,
|
428
430
|
),
|
431
|
+
daemon=True,
|
429
432
|
)
|
430
433
|
scheduler_th.start()
|
431
434
|
bckg_threads.append(scheduler_th)
|
@@ -434,16 +437,24 @@ def run_superlink() -> None:
|
|
434
437
|
register_exit_handlers(
|
435
438
|
event_type=EventType.RUN_SUPERLINK_LEAVE,
|
436
439
|
grpc_servers=grpc_servers,
|
437
|
-
bckg_threads=bckg_threads,
|
438
440
|
)
|
439
441
|
|
440
|
-
# Block
|
441
|
-
while
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
442
|
+
# Block until a thread exits prematurely
|
443
|
+
while all(thread.is_alive() for thread in bckg_threads):
|
444
|
+
sleep(0.1)
|
445
|
+
|
446
|
+
# Exit if any thread has exited prematurely
|
447
|
+
sys.exit(1)
|
448
|
+
|
449
|
+
|
450
|
+
def _run_flwr_command(args: list[str]) -> None:
|
451
|
+
sys.argv = args
|
452
|
+
if args[0] == "flwr-serverapp":
|
453
|
+
flwr_serverapp()
|
454
|
+
elif args[0] == "flwr-simulation":
|
455
|
+
flwr_simulation()
|
456
|
+
else:
|
457
|
+
raise ValueError(f"Unknown command: {args[0]}")
|
447
458
|
|
448
459
|
|
449
460
|
def _flwr_scheduler(
|
@@ -453,15 +464,18 @@ def _flwr_scheduler(
|
|
453
464
|
cmd: str,
|
454
465
|
) -> None:
|
455
466
|
log(DEBUG, "Started %s scheduler thread.", cmd)
|
456
|
-
|
457
467
|
state = state_factory.state()
|
468
|
+
run_id_to_proc: dict[int, multiprocessing.context.SpawnProcess] = {}
|
469
|
+
|
470
|
+
# Use the "spawn" start method for multiprocessing.
|
471
|
+
mp_spawn_context = multiprocessing.get_context("spawn")
|
458
472
|
|
459
473
|
# Periodically check for a pending run in the LinkState
|
460
474
|
while True:
|
461
|
-
sleep(
|
475
|
+
sleep(0.1)
|
462
476
|
pending_run_id = state.get_pending_run_id()
|
463
477
|
|
464
|
-
if pending_run_id:
|
478
|
+
if pending_run_id and pending_run_id not in run_id_to_proc:
|
465
479
|
|
466
480
|
log(
|
467
481
|
INFO,
|
@@ -478,10 +492,18 @@ def _flwr_scheduler(
|
|
478
492
|
"--insecure",
|
479
493
|
]
|
480
494
|
|
481
|
-
|
482
|
-
command,
|
483
|
-
text=True,
|
495
|
+
proc = mp_spawn_context.Process(
|
496
|
+
target=_run_flwr_command, args=(command,), daemon=True
|
484
497
|
)
|
498
|
+
proc.start()
|
499
|
+
|
500
|
+
# Store the process
|
501
|
+
run_id_to_proc[pending_run_id] = proc
|
502
|
+
|
503
|
+
# Clean up finished processes
|
504
|
+
for run_id, proc in list(run_id_to_proc.items()):
|
505
|
+
if not proc.is_alive():
|
506
|
+
del run_id_to_proc[run_id]
|
485
507
|
|
486
508
|
|
487
509
|
def _format_address(address: str) -> tuple[str, str, int]:
|
@@ -21,6 +21,7 @@ from typing import Optional
|
|
21
21
|
import grpc
|
22
22
|
|
23
23
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
24
|
+
from flwr.common.grpc import generic_create_grpc_server
|
24
25
|
from flwr.common.logger import log
|
25
26
|
from flwr.proto.serverappio_pb2_grpc import ( # pylint: disable=E0611
|
26
27
|
add_ServerAppIoServicer_to_server,
|
@@ -28,7 +29,6 @@ from flwr.proto.serverappio_pb2_grpc import ( # pylint: disable=E0611
|
|
28
29
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
29
30
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
30
31
|
|
31
|
-
from ..fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
32
32
|
from .serverappio_servicer import ServerAppIoServicer
|
33
33
|
|
34
34
|
|
@@ -0,0 +1,126 @@
|
|
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
|
+
"""Implements utility function to create a gRPC server."""
|
16
|
+
|
17
|
+
|
18
|
+
from typing import Optional
|
19
|
+
|
20
|
+
import grpc
|
21
|
+
|
22
|
+
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
23
|
+
from flwr.common.grpc import generic_create_grpc_server
|
24
|
+
from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
|
25
|
+
add_FlowerServiceServicer_to_server,
|
26
|
+
)
|
27
|
+
from flwr.server.client_manager import ClientManager
|
28
|
+
from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
|
29
|
+
FlowerServiceServicer,
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
def start_grpc_server( # pylint: disable=too-many-arguments,R0917
|
34
|
+
client_manager: ClientManager,
|
35
|
+
server_address: str,
|
36
|
+
max_concurrent_workers: int = 1000,
|
37
|
+
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
38
|
+
keepalive_time_ms: int = 210000,
|
39
|
+
certificates: Optional[tuple[bytes, bytes, bytes]] = None,
|
40
|
+
) -> grpc.Server:
|
41
|
+
"""Create and start a gRPC server running FlowerServiceServicer.
|
42
|
+
|
43
|
+
If used in a main function server.wait_for_termination(timeout=None)
|
44
|
+
should be called as otherwise the server will immediately stop.
|
45
|
+
|
46
|
+
**SSL**
|
47
|
+
To enable SSL you have to pass all of root_certificate, certificate,
|
48
|
+
and private_key. Setting only some will make the process exit with code 1.
|
49
|
+
|
50
|
+
Parameters
|
51
|
+
----------
|
52
|
+
client_manager : ClientManager
|
53
|
+
Instance of ClientManager
|
54
|
+
server_address : str
|
55
|
+
Server address in the form of HOST:PORT e.g. "[::]:8080"
|
56
|
+
max_concurrent_workers : int
|
57
|
+
Maximum number of clients the server can process before returning
|
58
|
+
RESOURCE_EXHAUSTED status (default: 1000)
|
59
|
+
max_message_length : int
|
60
|
+
Maximum message length that the server can send or receive.
|
61
|
+
Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
|
62
|
+
keepalive_time_ms : int
|
63
|
+
Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
|
64
|
+
because some cloud providers (for example, Azure) agressively clean up idle
|
65
|
+
TCP connections by terminating them after some time (4 minutes in the case
|
66
|
+
of Azure). Flower does not use application-level keepalive signals and relies
|
67
|
+
on the assumption that the transport layer will fail in cases where the
|
68
|
+
connection is no longer active. `keepalive_time_ms` can be used to customize
|
69
|
+
the keepalive interval for specific environments. The default Flower gRPC
|
70
|
+
keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
|
71
|
+
the long running streaming connection alive in most environments. The actual
|
72
|
+
gRPC default of this setting is 7200000 (2 hours), which results in dropped
|
73
|
+
connections in some cloud environments.
|
74
|
+
|
75
|
+
These settings are related to the issue described here:
|
76
|
+
- https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
|
77
|
+
- https://github.com/grpc/grpc/blob/master/doc/keepalive.md
|
78
|
+
- https://grpc.io/docs/guides/performance/
|
79
|
+
|
80
|
+
Mobile Flower clients may choose to increase this value if their server
|
81
|
+
environment allows long-running idle TCP connections.
|
82
|
+
(default: 210000)
|
83
|
+
certificates : Tuple[bytes, bytes, bytes] (default: None)
|
84
|
+
Tuple containing root certificate, server certificate, and private key to
|
85
|
+
start a secure SSL-enabled server. The tuple is expected to have three bytes
|
86
|
+
elements in the following order:
|
87
|
+
|
88
|
+
* CA certificate.
|
89
|
+
* server certificate.
|
90
|
+
* server private key.
|
91
|
+
|
92
|
+
Returns
|
93
|
+
-------
|
94
|
+
server : grpc.Server
|
95
|
+
An instance of a gRPC server which is already started
|
96
|
+
|
97
|
+
Examples
|
98
|
+
--------
|
99
|
+
Starting a SSL-enabled server.
|
100
|
+
|
101
|
+
>>> from pathlib import Path
|
102
|
+
>>> start_grpc_server(
|
103
|
+
>>> client_manager=ClientManager(),
|
104
|
+
>>> server_address="localhost:8080",
|
105
|
+
>>> certificates=(
|
106
|
+
>>> Path("/crts/root.pem").read_bytes(),
|
107
|
+
>>> Path("/crts/localhost.crt").read_bytes(),
|
108
|
+
>>> Path("/crts/localhost.key").read_bytes(),
|
109
|
+
>>> ),
|
110
|
+
>>> )
|
111
|
+
"""
|
112
|
+
servicer = FlowerServiceServicer(client_manager)
|
113
|
+
add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
|
114
|
+
|
115
|
+
server = generic_create_grpc_server(
|
116
|
+
servicer_and_add_fn=(servicer, add_servicer_to_server_fn),
|
117
|
+
server_address=server_address,
|
118
|
+
max_concurrent_workers=max_concurrent_workers,
|
119
|
+
max_message_length=max_message_length,
|
120
|
+
keepalive_time_ms=keepalive_time_ms,
|
121
|
+
certificates=certificates,
|
122
|
+
)
|
123
|
+
|
124
|
+
server.start()
|
125
|
+
|
126
|
+
return server
|
@@ -21,6 +21,7 @@ from typing import Optional
|
|
21
21
|
import grpc
|
22
22
|
|
23
23
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
24
|
+
from flwr.common.grpc import generic_create_grpc_server
|
24
25
|
from flwr.common.logger import log
|
25
26
|
from flwr.proto.simulationio_pb2_grpc import ( # pylint: disable=E0611
|
26
27
|
add_SimulationIoServicer_to_server,
|
@@ -28,7 +29,6 @@ from flwr.proto.simulationio_pb2_grpc import ( # pylint: disable=E0611
|
|
28
29
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
29
30
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
30
31
|
|
31
|
-
from ..fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
32
32
|
from .simulationio_servicer import SimulationIoServicer
|
33
33
|
|
34
34
|
|
@@ -23,11 +23,11 @@ import grpc
|
|
23
23
|
|
24
24
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
25
25
|
from flwr.common.auth_plugin import ExecAuthPlugin
|
26
|
+
from flwr.common.grpc import generic_create_grpc_server
|
26
27
|
from flwr.common.logger import log
|
27
28
|
from flwr.common.typing import UserConfig
|
28
29
|
from flwr.proto.exec_pb2_grpc import add_ExecServicer_to_server
|
29
30
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
30
|
-
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
31
31
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
32
32
|
from flwr.superexec.exec_user_auth_interceptor import ExecUserAuthInterceptor
|
33
33
|
|