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.
- flwr/cli/build.py +16 -2
- flwr/cli/config_utils.py +23 -15
- flwr/cli/install.py +1 -1
- flwr/cli/new/templates/app/code/server.hf.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.jax.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.mlx.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.numpy.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl +4 -1
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +4 -1
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +9 -12
- flwr/cli/new/templates/app/pyproject.hf.toml.tpl +10 -10
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl +12 -6
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +10 -10
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +10 -10
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +10 -10
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +10 -10
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +10 -10
- flwr/cli/run/run.py +110 -57
- flwr/client/app.py +3 -3
- flwr/client/node_state.py +17 -3
- flwr/client/supernode/app.py +26 -15
- flwr/common/config.py +13 -4
- flwr/server/run_serverapp.py +1 -1
- flwr/server/superlink/fleet/vce/vce_api.py +52 -28
- flwr/simulation/run_simulation.py +184 -33
- flwr/superexec/simulation.py +157 -0
- {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/METADATA +2 -1
- {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/RECORD +32 -31
- {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/WHEEL +0 -0
- {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=
|
|
52
|
-
client_app_attr=
|
|
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=
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
229
|
-
|
|
230
|
-
|
|
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
|
|
233
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
-
|
|
336
|
-
|
|
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
|
-
|
|
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()
|
{flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.10.0.
|
|
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
|
{flwr_nightly-1.10.0.dev20240714.dist-info → flwr_nightly-1.10.0.dev20240716.dist-info}/RECORD
RENAMED
|
@@ -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=
|
|
5
|
-
flwr/cli/config_utils.py,sha256=
|
|
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=
|
|
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=
|
|
33
|
-
flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=
|
|
34
|
-
flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=
|
|
35
|
-
flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=
|
|
36
|
-
flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=
|
|
37
|
-
flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=
|
|
38
|
-
flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=
|
|
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=
|
|
45
|
-
flwr/cli/new/templates/app/pyproject.hf.toml.tpl,sha256=
|
|
46
|
-
flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=
|
|
47
|
-
flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=
|
|
48
|
-
flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=
|
|
49
|
-
flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=
|
|
50
|
-
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=
|
|
51
|
-
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
|
|
273
|
-
flwr_nightly-1.10.0.
|
|
274
|
-
flwr_nightly-1.10.0.
|
|
275
|
-
flwr_nightly-1.10.0.
|
|
276
|
-
flwr_nightly-1.10.0.
|
|
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,,
|