flwr-nightly 1.10.0.dev20240713__py3-none-any.whl → 1.10.0.dev20240715__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 (34) hide show
  1. flwr/cli/build.py +1 -1
  2. flwr/cli/config_utils.py +15 -15
  3. flwr/cli/install.py +1 -1
  4. flwr/cli/new/templates/app/code/server.hf.py.tpl +13 -11
  5. flwr/cli/new/templates/app/code/server.jax.py.tpl +12 -8
  6. flwr/cli/new/templates/app/code/server.mlx.py.tpl +8 -7
  7. flwr/cli/new/templates/app/code/server.numpy.py.tpl +12 -8
  8. flwr/cli/new/templates/app/code/server.pytorch.py.tpl +13 -14
  9. flwr/cli/new/templates/app/code/server.sklearn.py.tpl +13 -10
  10. flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +13 -13
  11. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +6 -12
  12. flwr/cli/new/templates/app/pyproject.hf.toml.tpl +6 -9
  13. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +8 -5
  14. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +6 -9
  15. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +6 -9
  16. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +6 -9
  17. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +6 -9
  18. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +6 -9
  19. flwr/cli/run/run.py +98 -57
  20. flwr/client/supernode/app.py +25 -14
  21. flwr/common/config.py +1 -1
  22. flwr/server/run_serverapp.py +1 -1
  23. flwr/server/superlink/fleet/vce/vce_api.py +45 -28
  24. flwr/simulation/run_simulation.py +42 -25
  25. flwr/superexec/app.py +11 -5
  26. flwr/superexec/deployment.py +85 -21
  27. flwr/superexec/exec_grpc.py +5 -2
  28. flwr/superexec/executor.py +18 -1
  29. flwr/superexec/simulation.py +157 -0
  30. {flwr_nightly-1.10.0.dev20240713.dist-info → flwr_nightly-1.10.0.dev20240715.dist-info}/METADATA +1 -1
  31. {flwr_nightly-1.10.0.dev20240713.dist-info → flwr_nightly-1.10.0.dev20240715.dist-info}/RECORD +34 -33
  32. {flwr_nightly-1.10.0.dev20240713.dist-info → flwr_nightly-1.10.0.dev20240715.dist-info}/LICENSE +0 -0
  33. {flwr_nightly-1.10.0.dev20240713.dist-info → flwr_nightly-1.10.0.dev20240715.dist-info}/WHEEL +0 -0
  34. {flwr_nightly-1.10.0.dev20240713.dist-info → flwr_nightly-1.10.0.dev20240715.dist-info}/entry_points.txt +0 -0
@@ -17,6 +17,7 @@
17
17
  import subprocess
18
18
  import sys
19
19
  from logging import ERROR, INFO
20
+ from pathlib import Path
20
21
  from typing import Dict, Optional
21
22
 
22
23
  from typing_extensions import override
@@ -33,25 +34,73 @@ from .executor import Executor, RunTracker
33
34
 
34
35
 
35
36
  class DeploymentEngine(Executor):
36
- """Deployment engine executor."""
37
+ """Deployment engine executor.
38
+
39
+ Parameters
40
+ ----------
41
+ superlink: str (default: "0.0.0.0:9091")
42
+ Address of the SuperLink to connect to.
43
+ root_certificates: Optional[str] (default: None)
44
+ Specifies the path to the PEM-encoded root certificate file for
45
+ establishing secure HTTPS connections.
46
+ flwr_dir: Optional[str] (default: None)
47
+ The path containing installed Flower Apps.
48
+ """
37
49
 
38
50
  def __init__(
39
51
  self,
40
- address: str = DEFAULT_SERVER_ADDRESS_DRIVER,
41
- root_certificates: Optional[bytes] = None,
52
+ superlink: str = DEFAULT_SERVER_ADDRESS_DRIVER,
53
+ root_certificates: Optional[str] = None,
54
+ flwr_dir: Optional[str] = None,
42
55
  ) -> None:
43
- self.address = address
44
- self.root_certificates = root_certificates
56
+ self.superlink = superlink
57
+ if root_certificates is None:
58
+ self.root_certificates = None
59
+ self.root_certificates_bytes = None
60
+ else:
61
+ self.root_certificates = root_certificates
62
+ self.root_certificates_bytes = Path(root_certificates).read_bytes()
63
+ self.flwr_dir = flwr_dir
45
64
  self.stub: Optional[DriverStub] = None
46
65
 
66
+ @override
67
+ def set_config(
68
+ self,
69
+ config: Dict[str, str],
70
+ ) -> None:
71
+ """Set executor config arguments.
72
+
73
+ Parameters
74
+ ----------
75
+ config : Dict[str, str]
76
+ A dictionary for configuration values.
77
+ Supported configuration key/value pairs:
78
+ - "superlink": str
79
+ The address of the SuperLink Driver API.
80
+ - "root-certificates": str
81
+ The path to the root certificates.
82
+ - "flwr-dir": str
83
+ The path to the Flower directory.
84
+ """
85
+ if not config:
86
+ return
87
+ if superlink_address := config.get("superlink"):
88
+ self.superlink = superlink_address
89
+ if root_certificates := config.get("root-certificates"):
90
+ self.root_certificates = root_certificates
91
+ self.root_certificates_bytes = Path(root_certificates).read_bytes()
92
+ if flwr_dir := config.get("flwr-dir"):
93
+ self.flwr_dir = flwr_dir
94
+
47
95
  def _connect(self) -> None:
48
- if self.stub is None:
49
- channel = create_channel(
50
- server_address=self.address,
51
- insecure=(self.root_certificates is None),
52
- root_certificates=self.root_certificates,
53
- )
54
- self.stub = DriverStub(channel)
96
+ if self.stub is not None:
97
+ return
98
+ channel = create_channel(
99
+ server_address=self.superlink,
100
+ insecure=(self.root_certificates_bytes is None),
101
+ root_certificates=self.root_certificates_bytes,
102
+ )
103
+ self.stub = DriverStub(channel)
55
104
 
56
105
  def _create_run(
57
106
  self,
@@ -74,7 +123,9 @@ class DeploymentEngine(Executor):
74
123
 
75
124
  @override
76
125
  def start_run(
77
- self, fab_file: bytes, override_config: Dict[str, str]
126
+ self,
127
+ fab_file: bytes,
128
+ override_config: Dict[str, str],
78
129
  ) -> Optional[RunTracker]:
79
130
  """Start run using the Flower Deployment Engine."""
80
131
  try:
@@ -84,7 +135,7 @@ class DeploymentEngine(Executor):
84
135
 
85
136
  # Install FAB Python package
86
137
  subprocess.check_call(
87
- [sys.executable, "-m", "pip", "install", str(fab_path)],
138
+ [sys.executable, "-m", "pip", "install", "--no-deps", str(fab_path)],
88
139
  stdout=subprocess.DEVNULL,
89
140
  stderr=subprocess.DEVNULL,
90
141
  )
@@ -93,14 +144,27 @@ class DeploymentEngine(Executor):
93
144
  run_id: int = self._create_run(fab_id, fab_version, override_config)
94
145
  log(INFO, "Created run %s", str(run_id))
95
146
 
96
- # Start ServerApp
147
+ command = [
148
+ "flower-server-app",
149
+ "--run-id",
150
+ str(run_id),
151
+ "--superlink",
152
+ str(self.superlink),
153
+ ]
154
+
155
+ if self.flwr_dir:
156
+ command.append("--flwr-dir")
157
+ command.append(self.flwr_dir)
158
+
159
+ if self.root_certificates is None:
160
+ command.append("--insecure")
161
+ else:
162
+ command.append("--root-certificates")
163
+ command.append(self.root_certificates)
164
+
165
+ # Execute the command
97
166
  proc = subprocess.Popen( # pylint: disable=consider-using-with
98
- [
99
- "flower-server-app",
100
- "--run-id",
101
- str(run_id),
102
- "--insecure",
103
- ],
167
+ command,
104
168
  stdout=subprocess.PIPE,
105
169
  stderr=subprocess.PIPE,
106
170
  text=True,
@@ -15,7 +15,7 @@
15
15
  """SuperExec gRPC API."""
16
16
 
17
17
  from logging import INFO
18
- from typing import Optional, Tuple
18
+ from typing import Dict, Optional, Tuple
19
19
 
20
20
  import grpc
21
21
 
@@ -32,8 +32,11 @@ def run_superexec_api_grpc(
32
32
  address: str,
33
33
  executor: Executor,
34
34
  certificates: Optional[Tuple[bytes, bytes, bytes]],
35
+ config: Dict[str, str],
35
36
  ) -> grpc.Server:
36
37
  """Run SuperExec API (gRPC, request-response)."""
38
+ executor.set_config(config)
39
+
37
40
  exec_servicer: grpc.Server = ExecServicer(
38
41
  executor=executor,
39
42
  )
@@ -45,7 +48,7 @@ def run_superexec_api_grpc(
45
48
  certificates=certificates,
46
49
  )
47
50
 
48
- log(INFO, "Flower ECE: Starting SuperExec API (gRPC-rere) on %s", address)
51
+ log(INFO, "Starting Flower SuperExec gRPC server on %s", address)
49
52
  superexec_grpc_server.start()
50
53
 
51
54
  return superexec_grpc_server
@@ -31,9 +31,24 @@ class RunTracker:
31
31
  class Executor(ABC):
32
32
  """Execute and monitor a Flower run."""
33
33
 
34
+ @abstractmethod
35
+ def set_config(
36
+ self,
37
+ config: Dict[str, str],
38
+ ) -> None:
39
+ """Register provided config as class attributes.
40
+
41
+ Parameters
42
+ ----------
43
+ config : Optional[Dict[str, str]]
44
+ A dictionary for configuration values.
45
+ """
46
+
34
47
  @abstractmethod
35
48
  def start_run(
36
- self, fab_file: bytes, override_config: Dict[str, str]
49
+ self,
50
+ fab_file: bytes,
51
+ override_config: Dict[str, str],
37
52
  ) -> Optional[RunTracker]:
38
53
  """Start a run using the given Flower FAB ID and version.
39
54
 
@@ -44,6 +59,8 @@ class Executor(ABC):
44
59
  ----------
45
60
  fab_file : bytes
46
61
  The Flower App Bundle file bytes.
62
+ override_config: Dict[str, str]
63
+ The config overrides dict sent by the user (using `flwr run`).
47
64
 
48
65
  Returns
49
66
  -------
@@ -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"]["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.dev20240713
3
+ Version: 1.10.0.dev20240715
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -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=otFX_fKyMKFDQun9ku7VLK5S5vfmrCFmxxkvgKTa9QQ,4743
5
+ flwr/cli/config_utils.py,sha256=bLkKx4irCvjMX2NU81Oax6OWJUPkjQqHefK_HqD9NgA,6587
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=ve2Bimhxq-p7dXsWkzoGuto3uVcA356DeKCMlgHIL9k,6585
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,28 +29,28 @@ 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=Mld452y3SUkejlFzac5hpCjT7_mbA0ZEEMJIUyHtSTI,338
33
- flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=YTi-wroUpjRDY_AZqnoN5X-n3U5V7laL6UJgqFLEbKE,246
34
- flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=Cqk3PvM0e7hzohXPqD5hG_cthXoxCfc30bpEThqMy7M,272
35
- flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=fRxrDXV7pB1aDhQUXMBmrCsC1zp0uKwsBxZBx1JzbHA,248
36
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=ltdsnFSvFGPcycVmRL4ITlr-TV0CmmXcperZe7Vamow,593
37
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=cLzOpQzGIUzEazuFsjBpXAQUNPy6in6zR33SCqhix6o,341
38
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=gsNrWCKTU77_65_gw9nlp1LSQojgP5QQIWILvqdjx2s,579
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
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=7BojTJ1ePuRTANNcNBqLY7jgehvbRRawXJFiQhExYWk,742
45
+ flwr/cli/new/templates/app/pyproject.hf.toml.tpl,sha256=NSXJ9qxjjuumg84bX8y7spoKaVHm9DUjofYBGbCBPDc,714
46
+ flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=iIdKwB_FEA2oVtL8uSOj43uredcbRpEzy-rnEzCv-UM,606
47
+ flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=rq1mERo0-PFJHbIX7tv0B_uzhvnbrqXKkC7j93aGvjE,623
48
+ flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=C6XuAL9eJzp0SiDGOEQJQvW4qyrzEmiJRCwOKxq8xq4,561
49
+ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=ApZ8sHILExQE20pVjA03_dI_wO-oHtg_C8qXVHzFU3g,630
50
+ flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=5-dv9fD-omZA9Y4qXX1_Hcaei_Lh5-p4jdTKvWafU7M,610
51
+ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=md9I4C86ZRF7p50hZhF5bw0Aax7vu_bvEldoaAkU5Uk,609
52
52
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
53
- flwr/cli/run/run.py,sha256=eFYZwHOw9pHo_jxtS-UQIf7LVIOiNwjnJdaykcZQz5Q,4969
53
+ flwr/cli/run/run.py,sha256=PW_b1EprTB5NZyx0hAWWPFtpGR9tM7WJ9tlmDahU8J4,6818
54
54
  flwr/cli/utils.py,sha256=l65Ul0YsSBPuypk0uorAtEDmLEYiUrzpCXi6zCg9mJ4,4506
55
55
  flwr/client/__init__.py,sha256=wzJZsYJIHf_8-PMzvfbinyzzjgh1UP1vLrAw2_yEbKI,1345
56
56
  flwr/client/app.py,sha256=5v5EsA1zbViJAp998dCVRXvsyigZ-x3JEIKQ_fLeA48,26102
@@ -83,11 +83,11 @@ flwr/client/numpy_client.py,sha256=u76GWAdHmJM88Agm2EgLQSvO8Jnk225mJTk-_TmPjFE,1
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=LMJiuodmTUOAQ9MEbl4V2HjwBVJquJ9lZI38RGBh15Q,15598
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=W8EEfey1IHytkdXII3fTExc3uFxNm_Ysf35inG3cTkg,5000
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=PkQy67LRxKr1dqH--VUOLtrgLw8JVFVNNr0hFqiINh0,9492
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=GVPxAgFR-K-hfWOphsZo-PFGmkLze4eytrLaE6TV6l8,12632
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=wjN1spmdEmNZn06LDiuih1k3HHFKkHCKPbq-DieKw3A,17742
266
266
  flwr/superexec/__init__.py,sha256=9h94ogLxi6eJ3bUuJYq3E3pApThSabTPiSmPAGlTkHE,800
267
- flwr/superexec/app.py,sha256=1ZGSErFo3AQeIQOARKM1DN99fCuH451PeM1bDasBjRQ,6157
268
- flwr/superexec/deployment.py,sha256=xv5iQWuaMeeL0XE5KMLWq3gRU4lvsGu1-_oPIXi5x9E,3955
269
- flwr/superexec/exec_grpc.py,sha256=u-rztpOleqSGqgvNE-ZLw1HchNsBHU1-eB3m52GZ0pQ,1852
267
+ flwr/superexec/app.py,sha256=Zh9I64XfCoghWoT1k2DKDrcVCXIGOpw03v0WKCOg-mg,6402
268
+ flwr/superexec/deployment.py,sha256=o_FYkB_vamBPjeVpPbqvzr4kBYID26sXVDrLO3Ac4R0,6130
269
+ flwr/superexec/exec_grpc.py,sha256=vYbZyV89MuvYDH1XzVYHkKmGfOcU6FWh8rTcIJk2TIQ,1910
270
270
  flwr/superexec/exec_servicer.py,sha256=4R1f_9v0vly_bXpIYaXAeV1tO5LAy1AYygGGGNZmlQk,2194
271
- flwr/superexec/executor.py,sha256=TMQMMf-vv0htlv6v-eEBI67J1WL3Yz7dp_Fm1lgMEyU,1718
272
- flwr_nightly-1.10.0.dev20240713.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
273
- flwr_nightly-1.10.0.dev20240713.dist-info/METADATA,sha256=jmUv-NLDPXbUdEGIEy5HZ94y-UfQzpFziq6s4bj7PEE,15632
274
- flwr_nightly-1.10.0.dev20240713.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
275
- flwr_nightly-1.10.0.dev20240713.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
276
- flwr_nightly-1.10.0.dev20240713.dist-info/RECORD,,
271
+ flwr/superexec/executor.py,sha256=5ua0AU2cfisyD79dosP-POF3w0FRH2I5Wko_PPKLWqU,2153
272
+ flwr/superexec/simulation.py,sha256=flYwBU9lL3WV2jfGgp6bCjRNRlxmZ-ajkEHXab6HSug,5104
273
+ flwr_nightly-1.10.0.dev20240715.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
274
+ flwr_nightly-1.10.0.dev20240715.dist-info/METADATA,sha256=23pOsDu0OCNNq2lJKcXgdhg__CcotuXHOKOYTO9js04,15632
275
+ flwr_nightly-1.10.0.dev20240715.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
276
+ flwr_nightly-1.10.0.dev20240715.dist-info/entry_points.txt,sha256=7qBQcA-bDGDxnJmLd9FYqglFQubjCNqyg9M8a-lukps,336
277
+ flwr_nightly-1.10.0.dev20240715.dist-info/RECORD,,