flwr-nightly 1.11.0.dev20240823__py3-none-any.whl → 1.12.0.dev20240906__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 (48) hide show
  1. flwr/cli/app.py +0 -2
  2. flwr/cli/new/new.py +24 -10
  3. flwr/cli/new/templates/app/LICENSE.tpl +202 -0
  4. flwr/cli/new/templates/app/README.baseline.md.tpl +127 -0
  5. flwr/cli/new/templates/app/README.flowertune.md.tpl +16 -6
  6. flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +1 -0
  7. flwr/cli/new/templates/app/code/client.baseline.py.tpl +58 -0
  8. flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +36 -0
  9. flwr/cli/new/templates/app/code/flwr_tune/{client.py.tpl → client_app.py.tpl} +50 -40
  10. flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +32 -2
  11. flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -3
  12. flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +95 -0
  13. flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +83 -0
  14. flwr/cli/new/templates/app/code/model.baseline.py.tpl +80 -0
  15. flwr/cli/new/templates/app/code/server.baseline.py.tpl +46 -0
  16. flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +1 -0
  17. flwr/cli/new/templates/app/code/utils.baseline.py.tpl +1 -0
  18. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +138 -0
  19. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +34 -7
  20. flwr/cli/run/run.py +2 -2
  21. flwr/client/__init__.py +0 -4
  22. flwr/client/grpc_rere_client/client_interceptor.py +13 -4
  23. flwr/client/supernode/app.py +3 -1
  24. flwr/common/config.py +14 -11
  25. flwr/common/telemetry.py +36 -30
  26. flwr/server/__init__.py +0 -4
  27. flwr/server/app.py +13 -13
  28. flwr/server/compat/app.py +0 -5
  29. flwr/server/driver/grpc_driver.py +1 -3
  30. flwr/server/run_serverapp.py +15 -1
  31. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +19 -8
  32. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +11 -11
  33. flwr/server/superlink/state/in_memory_state.py +15 -15
  34. flwr/server/superlink/state/sqlite_state.py +10 -10
  35. flwr/server/superlink/state/state.py +8 -8
  36. flwr/simulation/run_simulation.py +23 -6
  37. flwr/superexec/__init__.py +0 -6
  38. flwr/superexec/app.py +3 -1
  39. {flwr_nightly-1.11.0.dev20240823.dist-info → flwr_nightly-1.12.0.dev20240906.dist-info}/METADATA +3 -3
  40. {flwr_nightly-1.11.0.dev20240823.dist-info → flwr_nightly-1.12.0.dev20240906.dist-info}/RECORD +43 -35
  41. flwr_nightly-1.12.0.dev20240906.dist-info/entry_points.txt +10 -0
  42. flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +0 -89
  43. flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +0 -34
  44. flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +0 -48
  45. flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +0 -11
  46. flwr_nightly-1.11.0.dev20240823.dist-info/entry_points.txt +0 -10
  47. {flwr_nightly-1.11.0.dev20240823.dist-info → flwr_nightly-1.12.0.dev20240906.dist-info}/LICENSE +0 -0
  48. {flwr_nightly-1.11.0.dev20240823.dist-info → flwr_nightly-1.12.0.dev20240906.dist-info}/WHEEL +0 -0
@@ -45,7 +45,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
45
45
  self.task_ins_store: Dict[UUID, TaskIns] = {}
46
46
  self.task_res_store: Dict[UUID, TaskRes] = {}
47
47
 
48
- self.client_public_keys: Set[bytes] = set()
48
+ self.node_public_keys: Set[bytes] = set()
49
49
  self.server_public_key: Optional[bytes] = None
50
50
  self.server_private_key: Optional[bytes] = None
51
51
 
@@ -237,7 +237,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
237
237
  return node_id
238
238
 
239
239
  def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
240
- """Delete a client node."""
240
+ """Delete a node."""
241
241
  with self.lock:
242
242
  if node_id not in self.node_ids:
243
243
  raise ValueError(f"Node {node_id} not found")
@@ -254,7 +254,7 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
254
254
  del self.node_ids[node_id]
255
255
 
256
256
  def get_nodes(self, run_id: int) -> Set[int]:
257
- """Return all available client nodes.
257
+ """Return all available nodes.
258
258
 
259
259
  Constraints
260
260
  -----------
@@ -271,9 +271,9 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
271
271
  if online_until > current_time
272
272
  }
273
273
 
274
- def get_node_id(self, client_public_key: bytes) -> Optional[int]:
275
- """Retrieve stored `node_id` filtered by `client_public_keys`."""
276
- return self.public_key_to_node_id.get(client_public_key)
274
+ def get_node_id(self, node_public_key: bytes) -> Optional[int]:
275
+ """Retrieve stored `node_id` filtered by `node_public_keys`."""
276
+ return self.public_key_to_node_id.get(node_public_key)
277
277
 
278
278
  def create_run(
279
279
  self,
@@ -318,19 +318,19 @@ class InMemoryState(State): # pylint: disable=R0902,R0904
318
318
  """Retrieve `server_public_key` in urlsafe bytes."""
319
319
  return self.server_public_key
320
320
 
321
- def store_client_public_keys(self, public_keys: Set[bytes]) -> None:
322
- """Store a set of `client_public_keys` in state."""
321
+ def store_node_public_keys(self, public_keys: Set[bytes]) -> None:
322
+ """Store a set of `node_public_keys` in state."""
323
323
  with self.lock:
324
- self.client_public_keys = public_keys
324
+ self.node_public_keys = public_keys
325
325
 
326
- def store_client_public_key(self, public_key: bytes) -> None:
327
- """Store a `client_public_key` in state."""
326
+ def store_node_public_key(self, public_key: bytes) -> None:
327
+ """Store a `node_public_key` in state."""
328
328
  with self.lock:
329
- self.client_public_keys.add(public_key)
329
+ self.node_public_keys.add(public_key)
330
330
 
331
- def get_client_public_keys(self) -> Set[bytes]:
332
- """Retrieve all currently stored `client_public_keys` as a set."""
333
- return self.client_public_keys
331
+ def get_node_public_keys(self) -> Set[bytes]:
332
+ """Retrieve all currently stored `node_public_keys` as a set."""
333
+ return self.node_public_keys
334
334
 
335
335
  def get_run(self, run_id: int) -> Optional[Run]:
336
336
  """Retrieve information about the run with the specified `run_id`."""
@@ -569,7 +569,7 @@ class SqliteState(State): # pylint: disable=R0904
569
569
  return node_id
570
570
 
571
571
  def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
572
- """Delete a client node."""
572
+ """Delete a node."""
573
573
  query = "DELETE FROM node WHERE node_id = ?"
574
574
  params = (node_id,)
575
575
 
@@ -607,10 +607,10 @@ class SqliteState(State): # pylint: disable=R0904
607
607
  result: Set[int] = {row["node_id"] for row in rows}
608
608
  return result
609
609
 
610
- def get_node_id(self, client_public_key: bytes) -> Optional[int]:
611
- """Retrieve stored `node_id` filtered by `client_public_keys`."""
610
+ def get_node_id(self, node_public_key: bytes) -> Optional[int]:
611
+ """Retrieve stored `node_id` filtered by `node_public_keys`."""
612
612
  query = "SELECT node_id FROM node WHERE public_key = :public_key;"
613
- row = self.query(query, {"public_key": client_public_key})
613
+ row = self.query(query, {"public_key": node_public_key})
614
614
  if len(row) > 0:
615
615
  node_id: int = row[0]["node_id"]
616
616
  return node_id
@@ -684,19 +684,19 @@ class SqliteState(State): # pylint: disable=R0904
684
684
  public_key = None
685
685
  return public_key
686
686
 
687
- def store_client_public_keys(self, public_keys: Set[bytes]) -> None:
688
- """Store a set of `client_public_keys` in state."""
687
+ def store_node_public_keys(self, public_keys: Set[bytes]) -> None:
688
+ """Store a set of `node_public_keys` in state."""
689
689
  query = "INSERT INTO public_key (public_key) VALUES (?)"
690
690
  data = [(key,) for key in public_keys]
691
691
  self.query(query, data)
692
692
 
693
- def store_client_public_key(self, public_key: bytes) -> None:
694
- """Store a `client_public_key` in state."""
693
+ def store_node_public_key(self, public_key: bytes) -> None:
694
+ """Store a `node_public_key` in state."""
695
695
  query = "INSERT INTO public_key (public_key) VALUES (:public_key)"
696
696
  self.query(query, {"public_key": public_key})
697
697
 
698
- def get_client_public_keys(self) -> Set[bytes]:
699
- """Retrieve all currently stored `client_public_keys` as a set."""
698
+ def get_node_public_keys(self) -> Set[bytes]:
699
+ """Retrieve all currently stored `node_public_keys` as a set."""
700
700
  query = "SELECT public_key FROM public_key"
701
701
  rows = self.query(query)
702
702
  result: Set[bytes] = {row["public_key"] for row in rows}
@@ -153,8 +153,8 @@ class State(abc.ABC): # pylint: disable=R0904
153
153
  """
154
154
 
155
155
  @abc.abstractmethod
156
- def get_node_id(self, client_public_key: bytes) -> Optional[int]:
157
- """Retrieve stored `node_id` filtered by `client_public_keys`."""
156
+ def get_node_id(self, node_public_key: bytes) -> Optional[int]:
157
+ """Retrieve stored `node_id` filtered by `node_public_keys`."""
158
158
 
159
159
  @abc.abstractmethod
160
160
  def create_run(
@@ -199,16 +199,16 @@ class State(abc.ABC): # pylint: disable=R0904
199
199
  """Retrieve `server_public_key` in urlsafe bytes."""
200
200
 
201
201
  @abc.abstractmethod
202
- def store_client_public_keys(self, public_keys: Set[bytes]) -> None:
203
- """Store a set of `client_public_keys` in state."""
202
+ def store_node_public_keys(self, public_keys: Set[bytes]) -> None:
203
+ """Store a set of `node_public_keys` in state."""
204
204
 
205
205
  @abc.abstractmethod
206
- def store_client_public_key(self, public_key: bytes) -> None:
207
- """Store a `client_public_key` in state."""
206
+ def store_node_public_key(self, public_key: bytes) -> None:
207
+ """Store a `node_public_key` in state."""
208
208
 
209
209
  @abc.abstractmethod
210
- def get_client_public_keys(self) -> Set[bytes]:
211
- """Retrieve all currently stored `client_public_keys` as a set."""
210
+ def get_node_public_keys(self) -> Set[bytes]:
211
+ """Retrieve all currently stored `node_public_keys` as a set."""
212
212
 
213
213
  @abc.abstractmethod
214
214
  def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
@@ -109,6 +109,11 @@ def run_simulation_from_cli() -> None:
109
109
  """Run Simulation Engine from the CLI."""
110
110
  args = _parse_args_run_simulation().parse_args()
111
111
 
112
+ event(
113
+ EventType.CLI_FLOWER_SIMULATION_ENTER,
114
+ event_details={"backend": args.backend, "num-supernodes": args.num_supernodes},
115
+ )
116
+
112
117
  # Add warnings for deprecated server_app and client_app arguments
113
118
  if args.server_app:
114
119
  warn_deprecated_feature(
@@ -177,7 +182,9 @@ def run_simulation_from_cli() -> None:
177
182
  client_app_attr = app_components["clientapp"]
178
183
  server_app_attr = app_components["serverapp"]
179
184
 
180
- override_config = parse_config_args([args.run_config])
185
+ override_config = parse_config_args(
186
+ [args.run_config] if args.run_config else args.run_config
187
+ )
181
188
  fused_config = get_fused_config_from_dir(app_path, override_config)
182
189
  app_dir = args.app
183
190
  is_app = True
@@ -212,6 +219,7 @@ def run_simulation_from_cli() -> None:
212
219
  verbose_logging=args.verbose,
213
220
  server_app_run_config=fused_config,
214
221
  is_app=is_app,
222
+ exit_event=EventType.CLI_FLOWER_SIMULATION_LEAVE,
215
223
  )
216
224
 
217
225
 
@@ -265,6 +273,11 @@ def run_simulation(
265
273
  When disabled, only INFO, WARNING and ERROR log messages will be shown. If
266
274
  enabled, DEBUG-level logs will be displayed.
267
275
  """
276
+ event(
277
+ EventType.PYTHON_API_RUN_SIMULATION_ENTER,
278
+ event_details={"backend": backend_name, "num-supernodes": num_supernodes},
279
+ )
280
+
268
281
  if enable_tf_gpu_growth:
269
282
  warn_deprecated_feature_with_example(
270
283
  "Passing `enable_tf_gpu_growth=True` is deprecated.",
@@ -282,6 +295,7 @@ def run_simulation(
282
295
  backend_config=backend_config,
283
296
  enable_tf_gpu_growth=enable_tf_gpu_growth,
284
297
  verbose_logging=verbose_logging,
298
+ exit_event=EventType.PYTHON_API_RUN_SIMULATION_LEAVE,
285
299
  )
286
300
 
287
301
 
@@ -365,6 +379,7 @@ def _main_loop(
365
379
  is_app: bool,
366
380
  enable_tf_gpu_growth: bool,
367
381
  run: Run,
382
+ exit_event: EventType,
368
383
  flwr_dir: Optional[str] = None,
369
384
  client_app: Optional[ClientApp] = None,
370
385
  client_app_attr: Optional[str] = None,
@@ -372,7 +387,7 @@ def _main_loop(
372
387
  server_app_attr: Optional[str] = None,
373
388
  server_app_run_config: Optional[UserConfig] = None,
374
389
  ) -> None:
375
- """Launch SuperLink with Simulation Engine, then ServerApp on a separate thread."""
390
+ """Start ServerApp on a separate thread, then launch Simulation Engine."""
376
391
  # Initialize StateFactory
377
392
  state_factory = StateFactory(":flwr-in-memory-state:")
378
393
 
@@ -380,6 +395,7 @@ def _main_loop(
380
395
  # A Threading event to indicate if an exception was raised in the ServerApp thread
381
396
  server_app_thread_has_exception = threading.Event()
382
397
  serverapp_th = None
398
+ success = True
383
399
  try:
384
400
  # Register run
385
401
  log(DEBUG, "Pre-registering run with id %s", run.run_id)
@@ -403,8 +419,7 @@ def _main_loop(
403
419
  enable_tf_gpu_growth=enable_tf_gpu_growth,
404
420
  )
405
421
 
406
- # SuperLink with Simulation Engine
407
- event(EventType.RUN_SUPERLINK_ENTER)
422
+ # Start Simulation Engine
408
423
  vce.start_vce(
409
424
  num_supernodes=num_supernodes,
410
425
  client_app_attr=client_app_attr,
@@ -422,13 +437,13 @@ def _main_loop(
422
437
  except Exception as ex:
423
438
  log(ERROR, "An exception occurred !! %s", ex)
424
439
  log(ERROR, traceback.format_exc())
440
+ success = False
425
441
  raise RuntimeError("An error was encountered. Ending simulation.") from ex
426
442
 
427
443
  finally:
428
444
  # Trigger stop event
429
445
  f_stop.set()
430
-
431
- event(EventType.RUN_SUPERLINK_LEAVE)
446
+ event(exit_event, event_details={"success": success})
432
447
  if serverapp_th:
433
448
  serverapp_th.join()
434
449
  if server_app_thread_has_exception.is_set():
@@ -440,6 +455,7 @@ def _main_loop(
440
455
  # pylint: disable=too-many-arguments,too-many-locals
441
456
  def _run_simulation(
442
457
  num_supernodes: int,
458
+ exit_event: EventType,
443
459
  client_app: Optional[ClientApp] = None,
444
460
  server_app: Optional[ServerApp] = None,
445
461
  backend_name: str = "ray",
@@ -506,6 +522,7 @@ def _run_simulation(
506
522
  is_app,
507
523
  enable_tf_gpu_growth,
508
524
  run,
525
+ exit_event,
509
526
  flwr_dir,
510
527
  client_app,
511
528
  client_app_attr,
@@ -13,9 +13,3 @@
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
15
  """Flower SuperExec service."""
16
-
17
- from .app import run_superexec as run_superexec
18
-
19
- __all__ = [
20
- "run_superexec",
21
- ]
flwr/superexec/app.py CHANGED
@@ -56,7 +56,9 @@ def run_superexec() -> None:
56
56
  address=address,
57
57
  executor=_load_executor(args),
58
58
  certificates=certificates,
59
- config=parse_config_args([args.executor_config]),
59
+ config=parse_config_args(
60
+ [args.executor_config] if args.executor_config else args.executor_config
61
+ ),
60
62
  )
61
63
 
62
64
  grpc_servers = [superexec_server]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.11.0.dev20240823
3
+ Version: 1.12.0.dev20240906
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -195,8 +195,8 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
195
195
  - [PyTorch: From Centralized to Federated](https://github.com/adap/flower/tree/main/examples/pytorch-from-centralized-to-federated)
196
196
  - [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
197
197
  - [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
198
- - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
199
- - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit-finetune)
198
+ - [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/flowertune-llm)
199
+ - [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/flowertune-vit)
200
200
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
201
201
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
202
202
  - Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
@@ -1,19 +1,23 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
- flwr/cli/app.py,sha256=FBcSrE35ll88VE11ib67qgsJe2GYDN25UswV9-cYcX8,1267
3
+ flwr/cli/app.py,sha256=v66W3QJ226JUy9y51hRwftX53R3oEKl3oOl1Xx-IwgU,1215
4
4
  flwr/cli/build.py,sha256=YrzjnwP1A1WQnyPuxtGy4kylcPoj0lexaF99ST872VQ,5174
5
5
  flwr/cli/config_utils.py,sha256=mDGXbcIxG14UpkUplILBYUkSk5M1LeTzZYDGNx-pFpU,7540
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
7
  flwr/cli/install.py,sha256=tUncrbZYRbC9QEcWSeTER16plPEoU-ERP0-nMgWiSPo,7094
8
8
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
9
- flwr/cli/new/new.py,sha256=VNb31-NLedm-_OK_D0aed0QxHO-tVlXjnf9UWVhC_Jk,9612
9
+ flwr/cli/new/new.py,sha256=uRC1nr22JomszfBAzQ3w4fiKrq31nxlMFquYGpPVei0,10074
10
10
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
11
11
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
12
- flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=PqzkGm0g6Zy-vZK9_0EO3f_U6g1r69lGc4UL8kds5Q8,2696
12
+ flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
13
+ flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=4dg2aBS-NIleVyDlxsG8m65Af6LIJ-pZA5ICjGFU5XA,9641
14
+ flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=lxr_RCGfiDy8QGcMVdjXsUXWM_gLf6cY7UQanGL_FFQ,3304
13
15
  flwr/cli/new/templates/app/README.md.tpl,sha256=t7w4YFZEcJOxAnuJmNPw5-fDdIJu7PfLd8gFJDiBwwo,436
14
16
  flwr/cli/new/templates/app/__init__.py,sha256=DU7QMY7IhMQyuwm_tja66xU0KXTWQFqzfTqwg-_NJdE,729
17
+ flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
15
18
  flwr/cli/new/templates/app/code/__init__.py,sha256=EM6vfvgAILKPaPn7H1wMV1Wi01WyZCP_Eg6NxD6oWg8,736
16
19
  flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=J0Gn74E7khpLyKJVNqOPu7ev93vkcu1PZugsbxtABMw,52
20
+ flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=1htktXX3jXX05r0vuG_afjS1sXGtuONW9EpiQ7vSBes,1901
17
21
  flwr/cli/new/templates/app/code/client.huggingface.py.tpl,sha256=62wtB4k1yrDApiG-rvGlOYFuiwAVk8kqJFmyY_v8HLo,1803
18
22
  flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=c2LDew2V8BUybZJiz1FeB3Kq4ey0Q2s0S5qNPUTNmI4,1490
19
23
  flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=gxipt57ldc741qwRqSWtsLQH05JODKdGMTtvoXiBzDA,2906
@@ -21,14 +25,15 @@ flwr/cli/new/templates/app/code/client.numpy.py.tpl,sha256=DMUXvQd2dr-wEn0ZrYJQh
21
25
  flwr/cli/new/templates/app/code/client.pytorch.py.tpl,sha256=WczaR5avJUhfw2Grn2KEC4tDJ4voIYG-2pAy-7i2cT8,1685
22
26
  flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=xW9cuKhybk5S8IeDZhbeb0DNegDIJGEYrzMKsxgc2GE,2978
23
27
  flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=u3KKf7hC9xGqOIUJXYCHJ_jiIu3aVbsC8pxVxm4yN6I,1759
28
+ flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
24
29
  flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=JgNgBtKdm1jKM9625WxappCAVUGtYAmcjKSsXJ1u3ZQ,748
25
- flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl,sha256=LOtmEYYayMCpF4rJRdo059n5w_cZRmzyuEkCN2qpTyQ,2826
26
- flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl,sha256=3s41XYHRvmcLhyA60tZyGCNK2wxo2shl6mwmPfZANlA,4155
27
- flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl,sha256=aPjrwFU020tPkJmOjzSUjb9dSi2bhs4ZTMEyd0uRlCA,867
28
- flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=kPG4AIXQfNNHZGYC3amet3ttI23N72N6jjoDkp_wYIA,2028
29
- flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=cEq9ZWM3zImJVceNtxHC_bYBLE8OChK0BdjpWs5Wz-0,1881
30
- flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl,sha256=tz4hgAGV6pn5cOFW10ELRNRsUzLBSssHxrH_gSs_jtk,1552
31
- flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl,sha256=cBPpBVN_N7p4T2a3rqChlngmE0dB_jveOLHesNcEHvs,268
30
+ flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=DbotzaXzLDwplVBkJLOe5Lt5b6Yutwv9rJ69oVwyrvU,4397
31
+ flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=iAujo8WubDGrz0gg_6zl-TUvkIbNRJM-VJmwKJ9tGY8,3051
32
+ flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=UCLEKUpXarkz9tMFtDrxmLv6QuKe5zCimTuoopQedUM,1717
33
+ flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=yMVcbfGkTPV9AV16bVdi5fTX1a6jmtszTUrvLXSosio,3305
34
+ flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=BhiqRg9w1MGuU5h2_vrLhRc0oHItYzE69qX_JI411k8,2754
35
+ flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=cSz6-IWsnMl7s04DW4URINiIppCIberrtE8NqK6Qz48,2571
36
+ flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=outx7lDXsWS8QXKWOGOiDno6eE8WL7LBD51ZkAuC3WU,1570
32
37
  flwr/cli/new/templates/app/code/server.huggingface.py.tpl,sha256=etpjLvGu6pVXzYQBKZp4tTbD3zm461qFo24NliKo74U,591
33
38
  flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=pIdUH-LgWRAGWQYLlivMNf8XnDSNDe2cCuRjlxbRzys,529
34
39
  flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=RqiZ0k468SOlm9dcPr-fvA8xcWv4zwDCbJfBwL7P9Us,529
@@ -36,12 +41,15 @@ flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=RqiZ0k468SOlm9dcPr-fv
36
41
  flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=DW5c8vzXCvFeIE8YIWBhoGnSdv8Ka_e5wd3F6B3xvp8,916
37
42
  flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=25Ae3kDqjDdBl8LwkDwye69nevd02Pk_e7F3SQKLdyk,624
38
43
  flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=xMhQ7AumowgLkgUilgjVK7IbpRhPjslhVJU-vID6NY8,856
44
+ flwr/cli/new/templates/app/code/strategy.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
39
45
  flwr/cli/new/templates/app/code/task.huggingface.py.tpl,sha256=G_LOeGErw-6WZAyuT01mXqR6s_BUrQYErXf_nHLujo4,3153
40
46
  flwr/cli/new/templates/app/code/task.jax.py.tpl,sha256=F05eg149c9icRyVNdfcLyZvAXROQ7QhfifoGw_U1dsg,1530
41
47
  flwr/cli/new/templates/app/code/task.mlx.py.tpl,sha256=jWtCULLRr_9bCIJvoTLMx037-SDl_LF8udtA1UGoXDk,2946
42
48
  flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NgbPix74X1t3ybaGjqdls30vF1i5oY3L7EQExhWhN74,3812
43
49
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
44
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=chTKewidM-st9Uk5o95tGOqJ5FSa1L2R0UdSW2wTr0c,789
50
+ flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
51
+ flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=4gi90W9_B1kj6rYkpvVJxhNX9Yctsv9OH6CzXP-dcE4,2666
52
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=pogRZLrwSfN_XH4NxDdMkhMh1O_7DP90VOoP-cP0HvI,1827
45
53
  flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=nD0rRUyr_Cj0TaSH8PsiaMhCwu_BuOVX4oqWfFSvOcE,765
46
54
  flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Tq6jeGcoOKzMwWWYxMVnzMcipLURHLiW69iYlD1ywMg,659
47
55
  flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=SHwYAA2qgIlOAU3Sb9BKSZcZ7O9biACg27MHexXUtDw,741
@@ -50,9 +58,9 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=vIO1ArukTC76ogYLNmJ
50
58
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=jk_5teoyOVM9QdBea8J-nk10S6TKw81QZiiKB54ATF0,654
51
59
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=bRIvPCPvTTI4Eo5b61Rmw8WdDw3sjcohciTXgULN5l8,702
52
60
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
53
- flwr/cli/run/run.py,sha256=8JziIz-NITpCVcGj1OgOdyjxa80SyifV0a_jElXaCU0,7987
61
+ flwr/cli/run/run.py,sha256=RI6MgLBNYxmacjQg8XMAQ7VKxbV0DkRyJTfe4GsDFuw,7979
54
62
  flwr/cli/utils.py,sha256=l65Ul0YsSBPuypk0uorAtEDmLEYiUrzpCXi6zCg9mJ4,4506
55
- flwr/client/__init__.py,sha256=wzJZsYJIHf_8-PMzvfbinyzzjgh1UP1vLrAw2_yEbKI,1345
63
+ flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
56
64
  flwr/client/app.py,sha256=o_2bhmlBeZATtWnAPZhL-Q1Ly0QZxc9ou4i7t0HKumE,31956
57
65
  flwr/client/client.py,sha256=gy6WVlMUFAp8oevN4xpQPX30vPOIYGVqdbuFlTWkyG4,9080
58
66
  flwr/client/client_app.py,sha256=WcO4r6wrdfaus__3s22D2sYjfcptdgmVujUAYdNE6HU,10393
@@ -66,7 +74,7 @@ flwr/client/grpc_adapter_client/connection.py,sha256=aOlCYasl8f2CrfcN-WrVEmvjAZF
66
74
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
67
75
  flwr/client/grpc_client/connection.py,sha256=czhRm23fwTgjN24Vf5nyNQ3hcb5Fo_5k-o9yZnelQCs,9362
68
76
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
69
- flwr/client/grpc_rere_client/client_interceptor.py,sha256=sYPEznuQPdy2BPDlvM9FK0ZRRucb4NfwUee1Z_mN82E,4954
77
+ flwr/client/grpc_rere_client/client_interceptor.py,sha256=wRMgrxt_IN1MNsaJdNscfMZD7jExJOL2g8yV5mC_RBc,5238
70
78
  flwr/client/grpc_rere_client/connection.py,sha256=aiIWW9fVgJZNeZ9SjUAx5ax-3825JrjYc5E5l7XvzyM,10913
71
79
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=Pw7Toi4wCUIEdBMyv4yKirjgW6814gFhhAmsTYmV4IM,5005
72
80
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
@@ -87,11 +95,11 @@ flwr/client/numpy_client.py,sha256=9rpj5OLmeeDQVzopR1My6A2VS3nkBFw6cmNcMMPYGlQ,1
87
95
  flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
88
96
  flwr/client/rest_client/connection.py,sha256=21YNE6K6JfyZtwIftx1MGOkM78J9wb4EGGOyLS8ej0E,12767
89
97
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
90
- flwr/client/supernode/app.py,sha256=MOYvLX3VkrslsMQ7V0YdY0GovjXOGsgabYXrvRvHUWc,11856
98
+ flwr/client/supernode/app.py,sha256=6dWrpgMDmbWt-GFzWcANGsDdpGuCS5fb4j7dEDeVvX4,11920
91
99
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
92
100
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
93
101
  flwr/common/address.py,sha256=1zvmVIAyYP6JbGkMnXuROzkYJ7aSKbJM754lC_kbh1M,3024
94
- flwr/common/config.py,sha256=GN-eKrCuyypLMFgr1kO2d-mwiNNphaFt30UlfbaKJFk,7435
102
+ flwr/common/config.py,sha256=TBw2sI0ZgZ3l3JrjfrcnD1mnMJbaHi_i8w68YXEgPUk,7586
95
103
  flwr/common/constant.py,sha256=1XxuRezsr9fl3xvQNPR2kyFkwNeG_f5vZayv0PFh0kY,3012
96
104
  flwr/common/context.py,sha256=5Bd9RCrhLkYZOVR7vr97OVhzVBHQkS1fUsYiIKTwpxU,2239
97
105
  flwr/common/date.py,sha256=OcQuwpb2HxcblTqYm6H223ufop5UZw5N_fzalbpOVzY,891
@@ -123,7 +131,7 @@ flwr/common/secure_aggregation/quantization.py,sha256=1obYr9qneaI8r-A0F_pghrPNG9
123
131
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
124
132
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=3VssKgYF7HQIkSpROnEUoYWVt47p12PE_Rj4nYqqg04,3221
125
133
  flwr/common/serde.py,sha256=SIKZa-TNCSWVtqx8L3aUkylN6gxK-IwXlgoukiYwYyc,29209
126
- flwr/common/telemetry.py,sha256=nSjJHDitPhzB2qUl6LeSMT9Zld5lIk9uW98RpxQwiZw,8366
134
+ flwr/common/telemetry.py,sha256=CZeBHqaH_W-H7yo-9LE-gV7ju5gJTXZztw4tJlFZqz8,8916
127
135
  flwr/common/typing.py,sha256=rGabiSkjFvGIHwmhDqtuu-LBvz7LVSj1vyMlNtA7VA0,5004
128
136
  flwr/common/version.py,sha256=W1ntylR04xkCP6zeSet6sRtBn7P1cje2lOqBJgYBjJY,1349
129
137
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
@@ -184,22 +192,22 @@ flwr/proto/transport_pb2.pyi,sha256=CZvJRWTU3QWFWLXNFtyLSrSKFatIyMcy-ohzLbQ-G9c,
184
192
  flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
185
193
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
186
194
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
- flwr/server/__init__.py,sha256=BxzPhvouvWFGi7CFpI5b4EeVR9XDqbK7Ndqg24EL_Rw,1679
188
- flwr/server/app.py,sha256=EsP0yl0khbEVIf0FOZuEDNZ1V3IEK9hwQ7q5TkBpO1w,24458
195
+ flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
196
+ flwr/server/app.py,sha256=QFnqrN1aeNTN-hmHt2YcqZNncAq89Qr2mlZtwITRIc4,24430
189
197
  flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
190
198
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
191
199
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
192
- flwr/server/compat/app.py,sha256=u0elxfiLjGouCMQIy5KnCpeCHdc3s0qvojUm8unInIs,3421
200
+ flwr/server/compat/app.py,sha256=5vkHHm_h-4cMthvWD1GJo1ZW3eihytjGgvsgfXUK9gA,3298
193
201
  flwr/server/compat/app_utils.py,sha256=B9pec7LnYACzowXKZTZNu3SNS-fSaHfefwvRyAQa4Nc,3456
194
202
  flwr/server/compat/driver_client_proxy.py,sha256=BxTDo7i89VAG2tuF4x7zogSVn2bXPMr0H2H0lERzW9c,5444
195
203
  flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
196
204
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
197
205
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
198
206
  flwr/server/driver/driver.py,sha256=NT_yaeit7_kZEIsCEqOWPID1GrVD3ywH4xZ2wtIh5lM,5217
199
- flwr/server/driver/grpc_driver.py,sha256=EbnOtrTR4cmu2ZhmPqKEmOHAhNQD1fd0hAd_xN1MePQ,9749
207
+ flwr/server/driver/grpc_driver.py,sha256=qrCF0hi2AlKF_8R5N_W5aKoAxd80lN1xbdLTUVtpSO0,9648
200
208
  flwr/server/driver/inmemory_driver.py,sha256=RcK94_NtjGZ4aZDIscnU7A3Uv1u8jGx29-xcbjQvZTM,6444
201
209
  flwr/server/history.py,sha256=bBOHKyX1eQONIsUx4EUU-UnAk1i0EbEl8ioyMq_UWQ8,5063
202
- flwr/server/run_serverapp.py,sha256=Lb3n-YEsZ86ZzI9vbhLytr4uiVngZ1LgHhnDtYxn42k,9633
210
+ flwr/server/run_serverapp.py,sha256=Xw42zqNXmKGy3Fz5QjYOUS1MH7ULy2u9nad4QA8hh74,10479
203
211
  flwr/server/server.py,sha256=PsJeh7ROKMoeLpIVrmbKoQUvdz-iqb54E4HZJanRUmM,17912
204
212
  flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
205
213
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
@@ -245,8 +253,8 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=hh7ykcLMA_ymmD72eWFM
245
253
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4EjOXH5birmAnMoCBJcP7jpHYCnHZPk,4887
246
254
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=DIXCYfPwm5paWq6hccReW0tB7-dTfq4vvMZ7CsiuYf4,12292
247
255
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
248
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=9vZPmdNuRcXsCJQUv9hrzQvdvUJO4-gvxxCHJJTFvGE,4047
249
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=DsHj6XaE0pBSWLYFsUYE44NPqx6IWWTJ9sqbh3GpmvY,7961
256
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=bgoLQEhahVHjdlRDk_58zyKFeMOziiPUXSbYMhOxybY,4757
257
+ flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=paUSrLADNsMdN0anHdbEeGDvI_SMWjAkFSiP3SA-hx8,7933
250
258
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
251
259
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=9qDDPwj3txHPo2dNaWQiO3UpGno5Zm9IMhJXnAPZbqg,4439
252
260
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
@@ -257,9 +265,9 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=YugFH_XYclqmq07er5ne1D
257
265
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=GkeaSe7uXg2iIgKiZNTCwM3TAwYEzuJnr9mA8-vg4hM,6793
258
266
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=lTQ2WycKK4-w22EPoJJz1qn73j9ZTwBlNz2cla2Zv0Q,12653
259
267
  flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
260
- flwr/server/superlink/state/in_memory_state.py,sha256=XMcT5WvKPOrFOuKcByr5BRFacX4aR2n9bRkABUuPg-M,13206
261
- flwr/server/superlink/state/sqlite_state.py,sha256=N8eOLZUveJOzdzL31-hXRYOMqV_-w75S1InyDenaDWU,29420
262
- flwr/server/superlink/state/state.py,sha256=peHACUjhUF4gfZ5icMsBGjQNa6A6rvku9a_mziRJW40,8154
268
+ flwr/server/superlink/state/in_memory_state.py,sha256=eNXOVt3HhJOYxkbYRNWEudCaNrYj2B7tOU9xgKbM2Ag,13166
269
+ flwr/server/superlink/state/sqlite_state.py,sha256=Mxb1QLFca9xFtnKgeu1XCe2kFzKGWmpnI-eRMa6-QSE,29395
270
+ flwr/server/superlink/state/state.py,sha256=0DPFJcIGJMMYh3fIGGKSjDswl_HxL57tVYMYdB3TJxI,8138
263
271
  flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
264
272
  flwr/server/superlink/state/utils.py,sha256=155ngcaSePy7nD8X4LHgpuVok6fcH5_CPNRiFAbLWDA,2407
265
273
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
@@ -278,16 +286,16 @@ flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQD
278
286
  flwr/simulation/ray_transport/ray_actor.py,sha256=3j0HgzjrlYjnzdTRy8aA4Nf6VoUvxi1hGRQkGSU5z6c,19020
279
287
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=0abIsU0VBk9rNJZOKHIyzYGy3ZnWBgqYocX_oct1EP0,7307
280
288
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
281
- flwr/simulation/run_simulation.py,sha256=EeioiueoxuBompr04ETUSJp4nNuigamiUEObjVAZHV4,21722
282
- flwr/superexec/__init__.py,sha256=9h94ogLxi6eJ3bUuJYq3E3pApThSabTPiSmPAGlTkHE,800
283
- flwr/superexec/app.py,sha256=KQuAnyTs2RQMGeIOrJjR3fJ70HsIEF3LQRKazOy27OA,6489
289
+ flwr/simulation/run_simulation.py,sha256=TjkgoSh_FGiFmyJ9g45S-uh4nh16scm4GDo-5J8k2gI,22279
290
+ flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
291
+ flwr/superexec/app.py,sha256=gH25dr7FL9IWODSOtP0-r59iuOKDeSXLLPxpEAL50BM,6561
284
292
  flwr/superexec/deployment.py,sha256=1qhztkcZDjaSbicligbXGqn49gbpN271rTlEVAnNuWw,6283
285
293
  flwr/superexec/exec_grpc.py,sha256=PhqGoZEpTMxSQmUSV8Wgtzb1Za_pHJ-adZqo5RYnDyE,1942
286
294
  flwr/superexec/exec_servicer.py,sha256=jl0aKVjm0PLQABcTL5c3jdSIzb0Z6hpVOtrAn4Ob7ts,2323
287
295
  flwr/superexec/executor.py,sha256=k_adivto6R2U82DADOHNvdtobehBYreRek1gOEBIQnQ,2318
288
296
  flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
289
- flwr_nightly-1.11.0.dev20240823.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
290
- flwr_nightly-1.11.0.dev20240823.dist-info/METADATA,sha256=2Hw-dqtTUCGXfpbCipRr3eOUgknQguj_2hV1CBjG7wA,15701
291
- flwr_nightly-1.11.0.dev20240823.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
292
- flwr_nightly-1.11.0.dev20240823.dist-info/entry_points.txt,sha256=3cDQVJEBRCSLzJrVYAgjXpoCjuQ74I3A9NZ61DOHdVo,388
293
- flwr_nightly-1.11.0.dev20240823.dist-info/RECORD,,
297
+ flwr_nightly-1.12.0.dev20240906.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
298
+ flwr_nightly-1.12.0.dev20240906.dist-info/METADATA,sha256=RfiJcTSp6n6SwM0xjGoYSbkR1mHFqc-G6obT8A7gE8M,15703
299
+ flwr_nightly-1.12.0.dev20240906.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
300
+ flwr_nightly-1.12.0.dev20240906.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
301
+ flwr_nightly-1.12.0.dev20240906.dist-info/RECORD,,
@@ -0,0 +1,10 @@
1
+ [console_scripts]
2
+ flower-client-app=flwr.client.supernode:run_client_app
3
+ flower-server-app=flwr.server.run_serverapp:run_server_app
4
+ flower-simulation=flwr.simulation.run_simulation:run_simulation_from_cli
5
+ flower-superexec=flwr.superexec.app:run_superexec
6
+ flower-superlink=flwr.server.app:run_superlink
7
+ flower-supernode=flwr.client.supernode.app:run_supernode
8
+ flwr=flwr.cli.app:app
9
+ flwr-clientapp=flwr.client.clientapp:flwr_clientapp
10
+
@@ -1,89 +0,0 @@
1
- """$project_name: A Flower / FlowerTune app."""
2
-
3
- import os
4
- import warnings
5
- from datetime import datetime
6
-
7
- from flwr_datasets import FederatedDataset
8
- from hydra import compose, initialize
9
- from hydra.utils import instantiate
10
-
11
- from flwr.client import ClientApp
12
- from flwr.common import Context, ndarrays_to_parameters
13
- from flwr.server import ServerApp, ServerAppComponents, ServerConfig
14
-
15
- from $import_name.client_app import gen_client_fn, get_parameters
16
- from $import_name.dataset import get_tokenizer_and_data_collator_and_propt_formatting
17
- from $import_name.models import get_model
18
- from $import_name.server_app import fit_weighted_average, get_evaluate_fn, get_on_fit_config
19
-
20
- # Avoid warnings
21
- warnings.filterwarnings("ignore", category=UserWarning)
22
- os.environ["TOKENIZERS_PARALLELISM"] = "true"
23
- os.environ["RAY_DISABLE_DOCKER_CPU_WARNING"] = "1"
24
-
25
- # Initialise regular config
26
- with initialize(config_path="conf", version_base="1.1"):
27
- cfg = compose(config_name="config")
28
-
29
- # Initialise static config
30
- with initialize(config_path="conf", version_base="1.1"):
31
- cfg_static = compose(config_name="static_config")
32
-
33
- cfg.train.num_rounds = cfg_static.num_rounds
34
-
35
- # Create output directory given current timestamp
36
- current_time = datetime.now()
37
- folder_name = current_time.strftime("%Y-%m-%d_%H-%M-%S")
38
- save_path = os.path.join(os.getcwd(), f"results/{folder_name}")
39
- os.makedirs(save_path, exist_ok=True)
40
-
41
- # Partition dataset and get dataloaders
42
- partitioner = instantiate(cfg_static.partitioner)
43
- fds = FederatedDataset(
44
- dataset=cfg_static.dataset.name, partitioners={"train": partitioner}
45
- )
46
- (
47
- tokenizer,
48
- data_collator,
49
- formatting_prompts_func,
50
- ) = get_tokenizer_and_data_collator_and_propt_formatting(cfg.model.name)
51
-
52
- # ClientApp for Flower Next
53
- client = ClientApp(
54
- client_fn=gen_client_fn(
55
- fds,
56
- tokenizer,
57
- formatting_prompts_func,
58
- data_collator,
59
- cfg.model,
60
- cfg.train,
61
- save_path,
62
- ),
63
- )
64
-
65
- # Get initial model weights
66
- init_model = get_model(cfg.model)
67
- init_model_parameters = get_parameters(init_model)
68
- init_model_parameters = ndarrays_to_parameters(init_model_parameters)
69
-
70
- def server_fn(context: Context):
71
- # Instantiate strategy according to config. Here we pass other arguments
72
- # that are only defined at runtime.
73
- strategy = instantiate(
74
- cfg.strategy,
75
- on_fit_config_fn=get_on_fit_config(),
76
- fit_metrics_aggregation_fn=fit_weighted_average,
77
- initial_parameters=init_model_parameters,
78
- evaluate_fn=get_evaluate_fn(
79
- cfg.model, cfg.train.save_every_round, cfg_static.num_rounds, save_path
80
- ),
81
- )
82
-
83
- config = ServerConfig(num_rounds=cfg_static.num_rounds)
84
-
85
- return ServerAppComponents(strategy=strategy, config=config)
86
-
87
-
88
- # ServerApp for Flower Next
89
- server = ServerApp(server_fn=server_fn)
@@ -1,34 +0,0 @@
1
- # Federated Instruction Tuning
2
- ---
3
- model:
4
- name: "mistralai/Mistral-7B-v0.3"
5
- quantization: 4 # 8 or 4 if you want to do quantization with BitsAndBytes
6
- gradient_checkpointing: True
7
- lora:
8
- peft_lora_r: 32
9
- peft_lora_alpha: 64
10
-
11
- train:
12
- num_rounds: null
13
- save_every_round: 5
14
- learning_rate_max: 5e-5
15
- learning_rate_min: 1e-6
16
- seq_length: 512
17
- training_arguments:
18
- output_dir: null # to be set by hydra
19
- learning_rate: null # to be set by the client
20
- per_device_train_batch_size: 16
21
- gradient_accumulation_steps: 1
22
- logging_steps: 10
23
- num_train_epochs: 3
24
- max_steps: 10
25
- report_to: null
26
- save_steps: 1000
27
- save_total_limit: 10
28
- gradient_checkpointing: True
29
- lr_scheduler_type: "constant"
30
-
31
- strategy:
32
- _target_: flwr.server.strategy.FedAvg
33
- fraction_fit: $fraction_fit
34
- fraction_evaluate: 0.0 # no client evaluation