flwr-nightly 1.10.0.dev20240714__py3-none-any.whl → 1.10.0.dev20240716__py3-none-any.whl

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.

Files changed (32) hide show
  1. flwr/cli/build.py +16 -2
  2. flwr/cli/config_utils.py +23 -15
  3. flwr/cli/install.py +1 -1
  4. flwr/cli/new/templates/app/code/server.hf.py.tpl +4 -1
  5. flwr/cli/new/templates/app/code/server.jax.py.tpl +4 -1
  6. flwr/cli/new/templates/app/code/server.mlx.py.tpl +4 -1
  7. flwr/cli/new/templates/app/code/server.numpy.py.tpl +4 -1
  8. flwr/cli/new/templates/app/code/server.pytorch.py.tpl +4 -1
  9. flwr/cli/new/templates/app/code/server.sklearn.py.tpl +4 -1
  10. flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +4 -1
  11. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +9 -12
  12. flwr/cli/new/templates/app/pyproject.hf.toml.tpl +10 -10
  13. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +12 -6
  14. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +10 -10
  15. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +10 -10
  16. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +10 -10
  17. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +10 -10
  18. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +10 -10
  19. flwr/cli/run/run.py +110 -57
  20. flwr/client/app.py +3 -3
  21. flwr/client/node_state.py +17 -3
  22. flwr/client/supernode/app.py +26 -15
  23. flwr/common/config.py +13 -4
  24. flwr/server/run_serverapp.py +1 -1
  25. flwr/server/superlink/fleet/vce/vce_api.py +52 -28
  26. flwr/simulation/run_simulation.py +184 -33
  27. flwr/superexec/simulation.py +157 -0
  28. {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/METADATA +2 -1
  29. {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/RECORD +32 -31
  30. {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/LICENSE +0 -0
  31. {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/WHEEL +0 -0
  32. {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/entry_points.txt +0 -0
@@ -18,45 +18,157 @@ import argparse
18
18
  import asyncio
19
19
  import json
20
20
  import logging
21
+ import sys
21
22
  import threading
22
23
  import traceback
24
+ from argparse import Namespace
23
25
  from logging import DEBUG, ERROR, INFO, WARNING
26
+ from pathlib import Path
24
27
  from time import sleep
25
- from typing import Dict, Optional
28
+ from typing import Dict, List, Optional
26
29
 
30
+ from flwr.cli.config_utils import load_and_validate
27
31
  from flwr.client import ClientApp
28
32
  from flwr.common import EventType, event, log
33
+ from flwr.common.config import get_fused_config_from_dir, parse_config_args
34
+ from flwr.common.constant import RUN_ID_NUM_BYTES
29
35
  from flwr.common.logger import set_logger_propagation, update_console_handler
30
36
  from flwr.common.typing import Run
31
37
  from flwr.server.driver import Driver, InMemoryDriver
32
- from flwr.server.run_serverapp import run
38
+ from flwr.server.run_serverapp import run as run_server_app
33
39
  from flwr.server.server_app import ServerApp
34
40
  from flwr.server.superlink.fleet import vce
35
41
  from flwr.server.superlink.fleet.vce.backend.backend import BackendConfig
36
42
  from flwr.server.superlink.state import StateFactory
43
+ from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
37
44
  from flwr.simulation.ray_transport.utils import (
38
45
  enable_tf_gpu_growth as enable_gpu_growth,
39
46
  )
40
47
 
41
48
 
49
+ def _check_args_do_not_interfere(args: Namespace) -> bool:
50
+ """Ensure decoupling of flags for different ways to start the simulation."""
51
+ mode_one_args = ["app", "run_config"]
52
+ mode_two_args = ["client_app", "server_app"]
53
+
54
+ def _resolve_message(conflict_keys: List[str]) -> str:
55
+ return ",".join([f"`--{key}`".replace("_", "-") for key in conflict_keys])
56
+
57
+ # When passing `--app`, `--app-dir` is ignored
58
+ if args.app and args.app_dir:
59
+ log(ERROR, "Either `--app` or `--app-dir` can be set, but not both.")
60
+ return False
61
+
62
+ if any(getattr(args, key) for key in mode_one_args):
63
+ if any(getattr(args, key) for key in mode_two_args):
64
+ log(
65
+ ERROR,
66
+ "Passing any of {%s} alongside with any of {%s}",
67
+ _resolve_message(mode_one_args),
68
+ _resolve_message(mode_two_args),
69
+ )
70
+ return False
71
+
72
+ if not args.app:
73
+ log(ERROR, "You need to pass --app")
74
+ return False
75
+
76
+ return True
77
+
78
+ # Ensure all args are set (required for the non-FAB mode of execution)
79
+ if not all(getattr(args, key) for key in mode_two_args):
80
+ log(
81
+ ERROR,
82
+ "Passing all of %s keys are required.",
83
+ _resolve_message(mode_two_args),
84
+ )
85
+ return False
86
+
87
+ return True
88
+
89
+
42
90
  # Entry point from CLI
91
+ # pylint: disable=too-many-locals
43
92
  def run_simulation_from_cli() -> None:
44
93
  """Run Simulation Engine from the CLI."""
45
94
  args = _parse_args_run_simulation().parse_args()
46
95
 
96
+ # We are supporting two modes for the CLI entrypoint:
97
+ # 1) Running an app dir containing a `pyproject.toml`
98
+ # 2) Running any ClientApp and SeverApp w/o pyproject.toml being present
99
+ # For 2), some CLI args are compulsory, but they are not required for 1)
100
+ # We first do these checks
101
+ args_check_pass = _check_args_do_not_interfere(args)
102
+ if not args_check_pass:
103
+ sys.exit("Simulation Engine cannot start.")
104
+
105
+ run_id = (
106
+ generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
107
+ if args.run_id is None
108
+ else args.run_id
109
+ )
110
+ if args.app:
111
+ # Mode 1
112
+ app_path = Path(args.app)
113
+ if not app_path.is_dir():
114
+ log(ERROR, "--app is not a directory")
115
+ sys.exit("Simulation Engine cannot start.")
116
+
117
+ # Load pyproject.toml
118
+ config, errors, warnings = load_and_validate(
119
+ app_path / "pyproject.toml", check_module=False
120
+ )
121
+ if errors:
122
+ raise ValueError(errors)
123
+
124
+ if warnings:
125
+ log(WARNING, warnings)
126
+
127
+ if config is None:
128
+ raise ValueError("Config extracted from FAB's pyproject.toml is not valid")
129
+
130
+ # Get ClientApp and SeverApp components
131
+ app_components = config["tool"]["flwr"]["app"]["components"]
132
+ client_app_attr = app_components["clientapp"]
133
+ server_app_attr = app_components["serverapp"]
134
+
135
+ override_config = parse_config_args(args.run_config)
136
+ fused_config = get_fused_config_from_dir(app_path, override_config)
137
+ app_dir = args.app
138
+ is_app = True
139
+
140
+ else:
141
+ # Mode 2
142
+ client_app_attr = args.client_app
143
+ server_app_attr = args.server_app
144
+ override_config = {}
145
+ fused_config = None
146
+ app_dir = args.app_dir
147
+ is_app = False
148
+
149
+ # Create run
150
+ run = Run(
151
+ run_id=run_id,
152
+ fab_id="",
153
+ fab_version="",
154
+ override_config=override_config,
155
+ )
156
+
47
157
  # Load JSON config
48
158
  backend_config_dict = json.loads(args.backend_config)
49
159
 
50
160
  _run_simulation(
51
- server_app_attr=args.server_app,
52
- client_app_attr=args.client_app,
161
+ server_app_attr=server_app_attr,
162
+ client_app_attr=client_app_attr,
53
163
  num_supernodes=args.num_supernodes,
54
164
  backend_name=args.backend,
55
165
  backend_config=backend_config_dict,
56
- app_dir=args.app_dir,
57
- run_id=args.run_id,
166
+ app_dir=app_dir,
167
+ run=run,
58
168
  enable_tf_gpu_growth=args.enable_tf_gpu_growth,
59
169
  verbose_logging=args.verbose,
170
+ server_app_run_config=fused_config,
171
+ is_app=is_app,
60
172
  )
61
173
 
62
174
 
@@ -156,7 +268,7 @@ def run_serverapp_th(
156
268
  enable_gpu_growth()
157
269
 
158
270
  # Run ServerApp
159
- run(
271
+ run_server_app(
160
272
  driver=_driver,
161
273
  server_app_dir=_server_app_dir,
162
274
  server_app_run_config=_server_app_run_config,
@@ -193,28 +305,21 @@ def run_serverapp_th(
193
305
  return serverapp_th
194
306
 
195
307
 
196
- def _override_run_id(state: StateFactory, run_id_to_replace: int, run_id: int) -> None:
197
- """Override the run_id of an existing Run."""
198
- log(DEBUG, "Pre-registering run with id %s", run_id)
199
- # Remove run
200
- run_info: Run = state.state().run_ids.pop(run_id_to_replace) # type: ignore
201
- # Update with new run_id and insert back in state
202
- run_info.run_id = run_id
203
- state.state().run_ids[run_id] = run_info # type: ignore
204
-
205
-
206
308
  # pylint: disable=too-many-locals
207
309
  def _main_loop(
208
310
  num_supernodes: int,
209
311
  backend_name: str,
210
312
  backend_config_stream: str,
211
313
  app_dir: str,
314
+ is_app: bool,
212
315
  enable_tf_gpu_growth: bool,
213
- run_id: Optional[int] = None,
316
+ run: Run,
317
+ flwr_dir: Optional[str] = None,
214
318
  client_app: Optional[ClientApp] = None,
215
319
  client_app_attr: Optional[str] = None,
216
320
  server_app: Optional[ServerApp] = None,
217
321
  server_app_attr: Optional[str] = None,
322
+ server_app_run_config: Optional[Dict[str, str]] = None,
218
323
  ) -> None:
219
324
  """Launch SuperLink with Simulation Engine, then ServerApp on a separate thread."""
220
325
  # Initialize StateFactory
@@ -225,16 +330,15 @@ def _main_loop(
225
330
  server_app_thread_has_exception = threading.Event()
226
331
  serverapp_th = None
227
332
  try:
228
- # Create run (with empty fab_id and fab_version)
229
- run_id_ = state_factory.state().create_run("", "", {})
230
- server_app_run_config: Dict[str, str] = {}
333
+ # Register run
334
+ log(DEBUG, "Pre-registering run with id %s", run.run_id)
335
+ state_factory.state().run_ids[run.run_id] = run # type: ignore
231
336
 
232
- if run_id:
233
- _override_run_id(state_factory, run_id_to_replace=run_id_, run_id=run_id)
234
- run_id_ = run_id
337
+ if server_app_run_config is None:
338
+ server_app_run_config = {}
235
339
 
236
340
  # Initialize Driver
237
- driver = InMemoryDriver(run_id=run_id_, state_factory=state_factory)
341
+ driver = InMemoryDriver(run_id=run.run_id, state_factory=state_factory)
238
342
 
239
343
  # Get and run ServerApp thread
240
344
  serverapp_th = run_serverapp_th(
@@ -257,8 +361,11 @@ def _main_loop(
257
361
  backend_name=backend_name,
258
362
  backend_config_json_stream=backend_config_stream,
259
363
  app_dir=app_dir,
364
+ is_app=is_app,
260
365
  state_factory=state_factory,
261
366
  f_stop=f_stop,
367
+ run=run,
368
+ flwr_dir=flwr_dir,
262
369
  )
263
370
 
264
371
  except Exception as ex:
@@ -288,10 +395,13 @@ def _run_simulation(
288
395
  backend_config: Optional[BackendConfig] = None,
289
396
  client_app_attr: Optional[str] = None,
290
397
  server_app_attr: Optional[str] = None,
398
+ server_app_run_config: Optional[Dict[str, str]] = None,
291
399
  app_dir: str = "",
292
- run_id: Optional[int] = None,
400
+ flwr_dir: Optional[str] = None,
401
+ run: Optional[Run] = None,
293
402
  enable_tf_gpu_growth: bool = False,
294
403
  verbose_logging: bool = False,
404
+ is_app: bool = False,
295
405
  ) -> None:
296
406
  r"""Launch the Simulation Engine.
297
407
 
@@ -320,20 +430,27 @@ def _run_simulation(
320
430
  parameters. Values supported in <value> are those included by
321
431
  `flwr.common.typing.ConfigsRecordValues`.
322
432
 
323
- client_app_attr : str
433
+ client_app_attr : Optional[str]
324
434
  A path to a `ClientApp` module to be loaded: For example: `client:app` or
325
435
  `project.package.module:wrapper.app`."
326
436
 
327
- server_app_attr : str
437
+ server_app_attr : Optional[str]
328
438
  A path to a `ServerApp` module to be loaded: For example: `server:app` or
329
439
  `project.package.module:wrapper.app`."
330
440
 
441
+ server_app_run_config : Optional[Dict[str, str]]
442
+ Config dictionary that parameterizes the run config. It will be made accesible
443
+ to the ServerApp.
444
+
331
445
  app_dir : str
332
446
  Add specified directory to the PYTHONPATH and load `ClientApp` from there.
333
447
  (Default: current working directory.)
334
448
 
335
- run_id : Optional[int]
336
- An integer specifying the ID of the run started when running this function.
449
+ flwr_dir : Optional[str]
450
+ The path containing installed Flower Apps.
451
+
452
+ run : Optional[Run]
453
+ An object carrying details about the run.
337
454
 
338
455
  enable_tf_gpu_growth : bool (default: False)
339
456
  A boolean to indicate whether to enable GPU growth on the main thread. This is
@@ -346,6 +463,11 @@ def _run_simulation(
346
463
  verbose_logging : bool (default: False)
347
464
  When disabled, only INFO, WARNING and ERROR log messages will be shown. If
348
465
  enabled, DEBUG-level logs will be displayed.
466
+
467
+ is_app : bool (default: False)
468
+ A flag that indicates whether the simulation is running an app or not. This is
469
+ needed in order to attempt loading an app's pyproject.toml when nodes register
470
+ a context object.
349
471
  """
350
472
  if backend_config is None:
351
473
  backend_config = {}
@@ -371,17 +493,25 @@ def _run_simulation(
371
493
  # Convert config to original JSON-stream format
372
494
  backend_config_stream = json.dumps(backend_config)
373
495
 
496
+ # If no `Run` object is set, create one
497
+ if run is None:
498
+ run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
499
+ run = Run(run_id=run_id, fab_id="", fab_version="", override_config={})
500
+
374
501
  args = (
375
502
  num_supernodes,
376
503
  backend_name,
377
504
  backend_config_stream,
378
505
  app_dir,
506
+ is_app,
379
507
  enable_tf_gpu_growth,
380
- run_id,
508
+ run,
509
+ flwr_dir,
381
510
  client_app,
382
511
  client_app_attr,
383
512
  server_app,
384
513
  server_app_attr,
514
+ server_app_run_config,
385
515
  )
386
516
  # Detect if there is an Asyncio event loop already running.
387
517
  # If yes, disable logger propagation. In environmnets
@@ -413,12 +543,10 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
413
543
  )
414
544
  parser.add_argument(
415
545
  "--server-app",
416
- required=True,
417
546
  help="For example: `server:app` or `project.package.module:wrapper.app`",
418
547
  )
419
548
  parser.add_argument(
420
549
  "--client-app",
421
- required=True,
422
550
  help="For example: `client:app` or `project.package.module:wrapper.app`",
423
551
  )
424
552
  parser.add_argument(
@@ -427,6 +555,18 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
427
555
  required=True,
428
556
  help="Number of simulated SuperNodes.",
429
557
  )
558
+ parser.add_argument(
559
+ "--app",
560
+ type=str,
561
+ default=None,
562
+ help="Path to a directory containing a FAB-like structure with a "
563
+ "pyproject.toml.",
564
+ )
565
+ parser.add_argument(
566
+ "--run-config",
567
+ default=None,
568
+ help="Override configuration key-value pairs.",
569
+ )
430
570
  parser.add_argument(
431
571
  "--backend",
432
572
  default="ray",
@@ -465,6 +605,17 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
465
605
  "ClientApp and ServerApp from there."
466
606
  " Default: current working directory.",
467
607
  )
608
+ parser.add_argument(
609
+ "--flwr-dir",
610
+ default=None,
611
+ help="""The path containing installed Flower Apps.
612
+ By default, this value is equal to:
613
+
614
+ - `$FLWR_HOME/` if `$FLWR_HOME` is defined
615
+ - `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
616
+ - `$HOME/.flwr/` in all other cases
617
+ """,
618
+ )
468
619
  parser.add_argument(
469
620
  "--run-id",
470
621
  type=int,
@@ -0,0 +1,157 @@
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
+ """Simulation engine executor."""
16
+
17
+
18
+ import subprocess
19
+ import sys
20
+ from logging import ERROR, INFO, WARN
21
+ from typing import Dict, Optional
22
+
23
+ from typing_extensions import override
24
+
25
+ from flwr.cli.config_utils import load_and_validate
26
+ from flwr.cli.install import install_from_fab
27
+ from flwr.common.constant import RUN_ID_NUM_BYTES
28
+ from flwr.common.logger import log
29
+ from flwr.server.superlink.state.utils import generate_rand_int_from_bytes
30
+
31
+ from .executor import Executor, RunTracker
32
+
33
+
34
+ class SimulationEngine(Executor):
35
+ """Simulation engine executor.
36
+
37
+ Parameters
38
+ ----------
39
+ num_supernodes: Opitonal[str] (default: None)
40
+ Total number of nodes to involve in the simulation.
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ num_supernodes: Optional[str] = None,
46
+ ) -> None:
47
+ self.num_supernodes = num_supernodes
48
+
49
+ @override
50
+ def set_config(
51
+ self,
52
+ config: Dict[str, str],
53
+ ) -> None:
54
+ """Set executor config arguments.
55
+
56
+ Parameters
57
+ ----------
58
+ config : Dict[str, str]
59
+ A dictionary for configuration values.
60
+ Supported configuration key/value pairs:
61
+ - "num-supernodes": str
62
+ Number of nodes to register for the simulation.
63
+ """
64
+ if not config:
65
+ return
66
+ if num_supernodes := config.get("num-supernodes"):
67
+ self.num_supernodes = num_supernodes
68
+
69
+ # Validate config
70
+ if self.num_supernodes is None:
71
+ log(
72
+ ERROR,
73
+ "To start a run with the simulation plugin, please specify "
74
+ "the number of SuperNodes. This can be done by using the "
75
+ "`--executor-config` argument when launching the SuperExec.",
76
+ )
77
+ raise ValueError("`num-supernodes` must not be `None`")
78
+
79
+ @override
80
+ def start_run(
81
+ self, fab_file: bytes, override_config: Dict[str, str]
82
+ ) -> Optional[RunTracker]:
83
+ """Start run using the Flower Simulation Engine."""
84
+ try:
85
+ if override_config:
86
+ raise ValueError(
87
+ "Overriding the run config is not yet supported with the "
88
+ "simulation executor.",
89
+ )
90
+
91
+ # Install FAB to flwr dir
92
+ fab_path = install_from_fab(fab_file, None, True)
93
+
94
+ # Install FAB Python package
95
+ subprocess.check_call(
96
+ [sys.executable, "-m", "pip", "install", "--no-deps", str(fab_path)],
97
+ stdout=subprocess.DEVNULL,
98
+ stderr=subprocess.DEVNULL,
99
+ )
100
+
101
+ # Load and validate config
102
+ config, errors, warnings = load_and_validate(fab_path / "pyproject.toml")
103
+ if errors:
104
+ raise ValueError(errors)
105
+
106
+ if warnings:
107
+ log(WARN, warnings)
108
+
109
+ if config is None:
110
+ raise ValueError(
111
+ "Config extracted from FAB's pyproject.toml is not valid"
112
+ )
113
+
114
+ # Get ClientApp and SeverApp components
115
+ flower_components = config["tool"]["flwr"]["app"]["components"]
116
+ clientapp = flower_components["clientapp"]
117
+ serverapp = flower_components["serverapp"]
118
+
119
+ # In Simulation there is no SuperLink, still we create a run_id
120
+ run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
121
+ log(INFO, "Created run %s", str(run_id))
122
+
123
+ # Prepare commnand
124
+ command = [
125
+ "flower-simulation",
126
+ "--client-app",
127
+ f"{clientapp}",
128
+ "--server-app",
129
+ f"{serverapp}",
130
+ "--num-supernodes",
131
+ f"{self.num_supernodes}",
132
+ "--run-id",
133
+ str(run_id),
134
+ ]
135
+
136
+ # Start Simulation
137
+ proc = subprocess.Popen( # pylint: disable=consider-using-with
138
+ command,
139
+ stdout=subprocess.PIPE,
140
+ stderr=subprocess.PIPE,
141
+ text=True,
142
+ )
143
+
144
+ log(INFO, "Started run %s", str(run_id))
145
+
146
+ return RunTracker(
147
+ run_id=run_id,
148
+ proc=proc,
149
+ )
150
+
151
+ # pylint: disable-next=broad-except
152
+ except Exception as e:
153
+ log(ERROR, "Could not start run: %s", str(e))
154
+ return None
155
+
156
+
157
+ executor = SimulationEngine()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.10.0.dev20240714
3
+ Version: 1.10.0.dev20240716
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -43,6 +43,7 @@ Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3
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)
46
+ Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
46
47
  Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
47
48
  Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
48
49
  Project-URL: Documentation, https://flower.ai
@@ -1,10 +1,10 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
3
  flwr/cli/app.py,sha256=FBcSrE35ll88VE11ib67qgsJe2GYDN25UswV9-cYcX8,1267
4
- flwr/cli/build.py,sha256=G0wgNrgxir_H0Qb_YlT2itxETEb-9q_3RQflqIqNXTU,4737
5
- flwr/cli/config_utils.py,sha256=jz7ODmLE62tXHorg73zzB7POMe4WXLUzX8lt-WNfNVM,6488
4
+ flwr/cli/build.py,sha256=5igi2013fLH-TlR6MNpbxNEMaVqdBbts-E-WdY3JPsE,5167
5
+ flwr/cli/config_utils.py,sha256=6g5gxdEKSYVomwG9w8Pfa-RzMWdbV6XchdUpJ5rzDhg,6817
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
- flwr/cli/install.py,sha256=Wz7Hqg2PE9N-w5CnqlH9Zr8mzADN2J7NLcUhgldZLWU,6579
7
+ flwr/cli/install.py,sha256=DY2hWgpSDvGd8-HRVTMXg9dTKo-5COTkAnlE2BE6b60,6592
8
8
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
9
9
  flwr/cli/new/new.py,sha256=vSLxyWOtD33U8mTGeqOhw5OjeDpFStekAVLUH9GJq6k,9432
10
10
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
@@ -29,31 +29,31 @@ flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=kPG4AIXQfNNHZGYC
29
29
  flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=cEq9ZWM3zImJVceNtxHC_bYBLE8OChK0BdjpWs5Wz-0,1881
30
30
  flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl,sha256=Z_JC7-YdjCnnUJPKILwT5Iqc70byJpthbye8RsQp9L0,1548
31
31
  flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl,sha256=cBPpBVN_N7p4T2a3rqChlngmE0dB_jveOLHesNcEHvs,268
32
- flwr/cli/new/templates/app/code/server.hf.py.tpl,sha256=BQmQy7UR8B1mNojUaTNVM4ci1pdKCk1Znw4bH_3nE1c,510
33
- flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=stWCaIZCqdw-RnLtpa7hdz24JaiG65z2OSTB1yz6NdA,427
34
- flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=P1Odp3SYl0CQt5tX4fcrY4nxOBOejOMMerRvbrOq-KA,427
35
- flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=oZ_KBcvv0NRINjCKbwNCnSz7xcquDRQEgSh7yOEWZ5E,429
36
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=wcekFyR4qMc3zfi39_AmSps8ahL_NpIzfvfI5iKj_vE,744
37
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=SmlGeCnpPlfx0x0P3RgO2jPlablovp0ugMDcPDgXVmk,531
38
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=DHTIcUzA0XbtUVWvZ8LYABpzwdubsyxkNk42OiWG7vs,762
32
+ flwr/cli/new/templates/app/code/server.hf.py.tpl,sha256=oYJpB0Y_F6nSgelf7NQ1BWZxxW5E6rBrQVmIQNQUPfc,605
33
+ flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=z9q6AHu_1vMRBVMlnDshPScV6GPTBdwuV49L5ekDVAI,522
34
+ flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=2C4KeLiJMr2fQaXHXdpTf6fpHpeMRv4JWpxQJy_VI20,522
35
+ flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=MYXAJDIDw5mRLSG-B3trJZoC3krPPWpvinYHeiUbAmA,524
36
+ flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=lBNcTJL01x90bjQ2ITv_pMFzzSSd1Pboy-72h7ejRk4,839
37
+ flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=1Zg0SNqLEGryCjhCs9hUNGIVWUQgmxVz4ImE8utH_Ck,626
38
+ flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=IRhPa0JzlmAs8j55h2mp2VeT6tNXoRkmpNL7kBlaK5c,857
39
39
  flwr/cli/new/templates/app/code/task.hf.py.tpl,sha256=B5CrA7L5PSOWnluYoAAL7LCeKvP8t-Rhwt6t2ZTYP3g,2873
40
40
  flwr/cli/new/templates/app/code/task.jax.py.tpl,sha256=u4o3V019EH79szOw2xzVeC5r9xgQiayPi9ZTIopV2TA,1519
41
41
  flwr/cli/new/templates/app/code/task.mlx.py.tpl,sha256=nrfZ1aGOs_ayb70j7XdAmwFYa-rN10d9GIMIKLzctUE,2614
42
42
  flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=TU4uNtJ9wtxeVvoHD3_K89EFWmrIvdECdASzRX-4Uvk,3694
43
43
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=cPOUUS07QbblT9PGFucwu9lY1clRA4-W4DQGA7cpcao,1044
44
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=5kAtRcTvn2-s2i2_WGoDNJQ__ALADQjabX7lQlCNOGA,899
45
- flwr/cli/new/templates/app/pyproject.hf.toml.tpl,sha256=O3-dgH8_knk9uM49IzX06CYC2Ev5xdPuITB40Phvewc,759
46
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=QIhp6_eYYFk9aJd_n-tc_Ar76Se1OP6zSibTbGeHV7w,568
47
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=OJ15G7CmjevBsUCVJ3ixv01VFwL4nkPcKkVGKeVW8ew,668
48
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=VYHSqaZzUS8H4jy1Cr1Plyd2kuoNNWoGD3a8UzbOANI,606
49
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=wxN6I8uvWZ4MErvTbQJTJOTbY4H_fsYCBXmZURJWLGQ,675
50
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=wFeJuhqnBPQtKCBvnE3ySBpxmbeNdxcsq2Eb_RmSDIg,655
51
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=zkxLTQRvujF76sIlzNNGPVU7Y9nVCwNBxAx82AOBaJY,654
44
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=XBcU_XPYt7GecNjeBmD915fZGsF189QMb_IzFl4ATTA,777
45
+ flwr/cli/new/templates/app/pyproject.hf.toml.tpl,sha256=s0Dbgf4Dey7pJRPh6mVg2u1Kpk7Mif1yPyE7hm9-huI,749
46
+ flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=F9xgMke-YE2ufCad_LjdCp6ARkg8wjkPjfxd49bXR3c,643
47
+ flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=0iXZzEByEjcJE2t2Bj2xflHzqsNoUzb9gFEwC5oUheg,658
48
+ flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=_jJPAcAe_tdxea4ckMhCf6cWYM9d_-iuZiQqQ-XZq2o,596
49
+ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=9hCWjxh-EKkhXxv05HiIfqvKAxCUiVF1hpzPd7YCncA,665
50
+ flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=NO2gKJWauwX95Ov3rl71TMAAKu7RPwOrAIQGnn7lwnY,645
51
+ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=vQAKtZnPy-PrB7ct9zuPgddiwsuRe-ifHqlTb0r_Jas,644
52
52
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
53
- flwr/cli/run/run.py,sha256=b_TcqJAGOiF0RDO5f25HCWYYdG54CxSjtsXwcRYN_J8,4973
53
+ flwr/cli/run/run.py,sha256=CIyv2q76SH6238eF_xRwqQua5fZCy_QXRYV0uImvTUM,6903
54
54
  flwr/cli/utils.py,sha256=l65Ul0YsSBPuypk0uorAtEDmLEYiUrzpCXi6zCg9mJ4,4506
55
55
  flwr/client/__init__.py,sha256=wzJZsYJIHf_8-PMzvfbinyzzjgh1UP1vLrAw2_yEbKI,1345
56
- flwr/client/app.py,sha256=5v5EsA1zbViJAp998dCVRXvsyigZ-x3JEIKQ_fLeA48,26102
56
+ flwr/client/app.py,sha256=jobLLjUGV3pkSYpd2wGyzG8e1KZPk2_O47IjTsXnk6Y,26106
57
57
  flwr/client/client.py,sha256=Vp9UkOkoHdNfn6iMYZsj_5m_GICiFfUlKEVaLad-YhM,8183
58
58
  flwr/client/client_app.py,sha256=WcO4r6wrdfaus__3s22D2sYjfcptdgmVujUAYdNE6HU,10393
59
59
  flwr/client/dpfedavg_numpy_client.py,sha256=ylZ-LpBIKmL1HCiS8kq4pkp2QGalc8rYEzDHdRG3VRQ,7435
@@ -77,17 +77,17 @@ flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4R
77
77
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
78
78
  flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=fZTfIELkYS64lpgxQKL66s-QHjCn-159qfLoNoIMJjc,19699
79
79
  flwr/client/mod/utils.py,sha256=UAJXiB0wwVyLkCkpW_i5BXikdBR65p8sNFr7VNHm2nk,1226
80
- flwr/client/node_state.py,sha256=_qgoNJXay25maUmcBwUcSVYpKTiW0RaoiWDSL4oFvJE,2864
80
+ flwr/client/node_state.py,sha256=4WUQv0_bcKKEs5Vk4j7YsHMpoxV8oAUAhBIY4gW--sM,3488
81
81
  flwr/client/node_state_tests.py,sha256=-4fVsn7y-z9NYBuhq-cjepgxgVuPqqQgDOL4SofrdIo,2239
82
82
  flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,10283
83
83
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
84
84
  flwr/client/rest_client/connection.py,sha256=aY_UzrNyE8g-xPAK_POZZZ93mERHTe-pOhNP-uZ8GyU,12147
85
85
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
86
- flwr/client/supernode/app.py,sha256=cg8momLzMnFrDBNJsSRDYrn8zHuJ-4UC3wIHf51aBXQ,15385
86
+ flwr/client/supernode/app.py,sha256=R4lGlRhs4gMwWjdy_RXnAgxstvXj-SQoJhO7Zz8it1U,15606
87
87
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
88
88
  flwr/common/__init__.py,sha256=4cBLNNnNTwHDnL_HCxhU5ILCSZ6fYh3A_aMBtlvHTVw,3721
89
89
  flwr/common/address.py,sha256=wRu1Luezx1PWadwV9OA_KNko01oVvbRnPqfzaDn8QOk,1882
90
- flwr/common/config.py,sha256=7OF4R43st8teFXBWmV92noGEYVe00wT29QMs6od8mlI,4994
90
+ flwr/common/config.py,sha256=SBQjCzJKyDyjn97GCmKW7u1iTgFKZAuRWQ4tAE9fWGA,5280
91
91
  flwr/common/constant.py,sha256=1XxuRezsr9fl3xvQNPR2kyFkwNeG_f5vZayv0PFh0kY,3012
92
92
  flwr/common/context.py,sha256=CQt4uzCDvCIr2WdkrWq0obAz92k2_ucXGrWtBZCxP_M,2256
93
93
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
@@ -187,7 +187,7 @@ flwr/server/driver/driver.py,sha256=NT_yaeit7_kZEIsCEqOWPID1GrVD3ywH4xZ2wtIh5lM,
187
187
  flwr/server/driver/grpc_driver.py,sha256=4Azmzq4RWzcLbOqBBEF-I78krWVWZ6bT0U42S25zMvY,9659
188
188
  flwr/server/driver/inmemory_driver.py,sha256=RcK94_NtjGZ4aZDIscnU7A3Uv1u8jGx29-xcbjQvZTM,6444
189
189
  flwr/server/history.py,sha256=bBOHKyX1eQONIsUx4EUU-UnAk1i0EbEl8ioyMq_UWQ8,5063
190
- flwr/server/run_serverapp.py,sha256=iq62xuSPYndmsYiJRpRkT9cTfQpZ0FgsWLncktUvh98,9486
190
+ flwr/server/run_serverapp.py,sha256=5_Upd-Qp9b_oM49v6RwJxR8ivcTb3Hh_pfhyO0EWAB0,9499
191
191
  flwr/server/server.py,sha256=wsXsxMZ9SQ0B42nBnUlcV83NJPycgrgg5bFwcQ4BYBE,17821
192
192
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
193
193
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -239,7 +239,7 @@ flwr/server/superlink/fleet/vce/__init__.py,sha256=36MHKiefnJeyjwMQzVUK4m06Ojon3
239
239
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=oBIzmnrSSRvH_H0vRGEGWhWzQQwqe3zn6e13RsNwlIY,1466
240
240
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=iG3KSIY7DzNfcxmuLfTs7VdQJnqPCvvn5DFkTWKG5lI,2227
241
241
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=SnjZ1WOcrfMZNgiDdTHcFeXJqrY7UHx8kvO62mqU9S4,7489
242
- flwr/server/superlink/fleet/vce/vce_api.py,sha256=jSMmo3AXN_6XlYyzasu5yZ2jir8_Avj2zD9qtMzun6Q,12055
242
+ flwr/server/superlink/fleet/vce/vce_api.py,sha256=B_xnbaPKWuuovaNnkH21PYNrDKc0gtaWMQu_5kjYW5w,12780
243
243
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
244
244
  flwr/server/superlink/state/in_memory_state.py,sha256=fb-f4RGiqXON0DC7aSEMNuNIjH406BhBYrNNX5Kza2g,13061
245
245
  flwr/server/superlink/state/sqlite_state.py,sha256=dO374mTkvhWQSiwbqwUXVnAYHev-j2mHaX9v8wFmmMA,29044
@@ -262,15 +262,16 @@ flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQD
262
262
  flwr/simulation/ray_transport/ray_actor.py,sha256=3j0HgzjrlYjnzdTRy8aA4Nf6VoUvxi1hGRQkGSU5z6c,19020
263
263
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=4KWWGSnfEBe3aGc0Ln5_1yRcZ52wKmOA7gXJKkMglvM,7302
264
264
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
265
- flwr/simulation/run_simulation.py,sha256=qGP8sHKAzJT9nGeqMw36iCsVXm4ZFMBisCORuTswr-g,17277
265
+ flwr/simulation/run_simulation.py,sha256=8qWEdgxeMtU8N3ZU1eeX6Upi8edOz88CeY7xpo0ZuMs,22173
266
266
  flwr/superexec/__init__.py,sha256=9h94ogLxi6eJ3bUuJYq3E3pApThSabTPiSmPAGlTkHE,800
267
267
  flwr/superexec/app.py,sha256=Zh9I64XfCoghWoT1k2DKDrcVCXIGOpw03v0WKCOg-mg,6402
268
268
  flwr/superexec/deployment.py,sha256=o_FYkB_vamBPjeVpPbqvzr4kBYID26sXVDrLO3Ac4R0,6130
269
269
  flwr/superexec/exec_grpc.py,sha256=vYbZyV89MuvYDH1XzVYHkKmGfOcU6FWh8rTcIJk2TIQ,1910
270
270
  flwr/superexec/exec_servicer.py,sha256=4R1f_9v0vly_bXpIYaXAeV1tO5LAy1AYygGGGNZmlQk,2194
271
271
  flwr/superexec/executor.py,sha256=5ua0AU2cfisyD79dosP-POF3w0FRH2I5Wko_PPKLWqU,2153
272
- flwr_nightly-1.10.0.dev20240714.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
273
- flwr_nightly-1.10.0.dev20240714.dist-info/METADATA,sha256=9aI10DHtz4gZbec9re5g_yizKlPUjDQptMpkYOShtHE,15632
274
- flwr_nightly-1.10.0.dev20240714.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
275
- flwr_nightly-1.10.0.dev20240714.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
276
- flwr_nightly-1.10.0.dev20240714.dist-info/RECORD,,
272
+ flwr/superexec/simulation.py,sha256=_FPxJ36yQNkJlC4jSdvXVinShmRBWS6gi3cZLP3mabQ,5111
273
+ flwr_nightly-1.10.0.dev20240716.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
274
+ flwr_nightly-1.10.0.dev20240716.dist-info/METADATA,sha256=xoYwajHb-KK8B3YvHaDIGAFOLD1VZRtodHu9ruPAt0w,15672
275
+ flwr_nightly-1.10.0.dev20240716.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
276
+ flwr_nightly-1.10.0.dev20240716.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
277
+ flwr_nightly-1.10.0.dev20240716.dist-info/RECORD,,