flwr-nightly 1.13.0.dev20241104__py3-none-any.whl → 1.13.0.dev20241105__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.

@@ -87,8 +87,25 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
87
87
  return None
88
88
  # Validate run_id
89
89
  if task_ins.run_id not in self.run_ids:
90
- log(ERROR, "`run_id` is invalid")
90
+ log(ERROR, "Invalid run ID for TaskIns: %s", task_ins.run_id)
91
+ return None
92
+ # Validate source node ID
93
+ if task_ins.task.producer.node_id != 0:
94
+ log(
95
+ ERROR,
96
+ "Invalid source node ID for TaskIns: %s",
97
+ task_ins.task.producer.node_id,
98
+ )
91
99
  return None
100
+ # Validate destination node ID
101
+ if not task_ins.task.consumer.anonymous:
102
+ if task_ins.task.consumer.node_id not in self.node_ids:
103
+ log(
104
+ ERROR,
105
+ "Invalid destination node ID for TaskIns: %s",
106
+ task_ins.task.consumer.node_id,
107
+ )
108
+ return None
92
109
 
93
110
  # Create task_id
94
111
  task_id = uuid4()
@@ -271,7 +271,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
271
271
  if any(errors):
272
272
  log(ERROR, errors)
273
273
  return None
274
-
275
274
  # Create task_id
276
275
  task_id = uuid4()
277
276
 
@@ -284,16 +283,36 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
284
283
  data[0], ["run_id", "producer_node_id", "consumer_node_id"]
285
284
  )
286
285
 
286
+ # Validate run_id
287
+ query = "SELECT run_id FROM run WHERE run_id = ?;"
288
+ if not self.query(query, (data[0]["run_id"],)):
289
+ log(ERROR, "Invalid run ID for TaskIns: %s", task_ins.run_id)
290
+ return None
291
+ # Validate source node ID
292
+ if task_ins.task.producer.node_id != 0:
293
+ log(
294
+ ERROR,
295
+ "Invalid source node ID for TaskIns: %s",
296
+ task_ins.task.producer.node_id,
297
+ )
298
+ return None
299
+ # Validate destination node ID
300
+ query = "SELECT node_id FROM node WHERE node_id = ?;"
301
+ if not task_ins.task.consumer.anonymous:
302
+ if not self.query(query, (data[0]["consumer_node_id"],)):
303
+ log(
304
+ ERROR,
305
+ "Invalid destination node ID for TaskIns: %s",
306
+ task_ins.task.consumer.node_id,
307
+ )
308
+ return None
309
+
287
310
  columns = ", ".join([f":{key}" for key in data[0]])
288
311
  query = f"INSERT INTO task_ins VALUES({columns});"
289
312
 
290
313
  # Only invalid run_id can trigger IntegrityError.
291
314
  # This may need to be changed in the future version with more integrity checks.
292
- try:
293
- self.query(query, data)
294
- except sqlite3.IntegrityError:
295
- log(ERROR, "`run` is invalid")
296
- return None
315
+ self.query(query, data)
297
316
 
298
317
  return task_id
299
318
 
@@ -21,7 +21,6 @@ import logging
21
21
  import sys
22
22
  import threading
23
23
  import traceback
24
- from argparse import Namespace
25
24
  from logging import DEBUG, ERROR, INFO, WARNING
26
25
  from pathlib import Path
27
26
  from time import sleep
@@ -35,7 +34,6 @@ from flwr.common.constant import RUN_ID_NUM_BYTES, Status
35
34
  from flwr.common.logger import (
36
35
  set_logger_propagation,
37
36
  update_console_handler,
38
- warn_deprecated_feature,
39
37
  warn_deprecated_feature_with_example,
40
38
  )
41
39
  from flwr.common.typing import Run, RunStatus, UserConfig
@@ -52,47 +50,6 @@ from flwr.simulation.ray_transport.utils import (
52
50
  )
53
51
 
54
52
 
55
- def _check_args_do_not_interfere(args: Namespace) -> bool:
56
- """Ensure decoupling of flags for different ways to start the simulation."""
57
- mode_one_args = ["app", "run_config"]
58
- mode_two_args = ["client_app", "server_app"]
59
-
60
- def _resolve_message(conflict_keys: list[str]) -> str:
61
- return ",".join([f"`--{key}`".replace("_", "-") for key in conflict_keys])
62
-
63
- # When passing `--app`, `--app-dir` is ignored
64
- if args.app and args.app_dir:
65
- log(ERROR, "Either `--app` or `--app-dir` can be set, but not both.")
66
- return False
67
-
68
- if any(getattr(args, key) for key in mode_one_args):
69
- if any(getattr(args, key) for key in mode_two_args):
70
- log(
71
- ERROR,
72
- "Passing any of {%s} alongside with any of {%s}",
73
- _resolve_message(mode_one_args),
74
- _resolve_message(mode_two_args),
75
- )
76
- return False
77
-
78
- if not args.app:
79
- log(ERROR, "You need to pass --app")
80
- return False
81
-
82
- return True
83
-
84
- # Ensure all args are set (required for the non-FAB mode of execution)
85
- if not all(getattr(args, key) for key in mode_two_args):
86
- log(
87
- ERROR,
88
- "Passing all of %s keys are required.",
89
- _resolve_message(mode_two_args),
90
- )
91
- return False
92
-
93
- return True
94
-
95
-
96
53
  def _replace_keys(d: Any, match: str, target: str) -> Any:
97
54
  if isinstance(d, dict):
98
55
  return {
@@ -115,19 +72,6 @@ def run_simulation_from_cli() -> None:
115
72
  event_details={"backend": args.backend, "num-supernodes": args.num_supernodes},
116
73
  )
117
74
 
118
- # Add warnings for deprecated server_app and client_app arguments
119
- if args.server_app:
120
- warn_deprecated_feature(
121
- "The `--server-app` argument is deprecated. "
122
- "Please use the `--app` argument instead."
123
- )
124
-
125
- if args.client_app:
126
- warn_deprecated_feature(
127
- "The `--client-app` argument is deprecated. "
128
- "Use the `--app` argument instead."
129
- )
130
-
131
75
  if args.enable_tf_gpu_growth:
132
76
  warn_deprecated_feature_with_example(
133
77
  "Passing `--enable-tf-gpu-growth` is deprecated.",
@@ -144,60 +88,39 @@ def run_simulation_from_cli() -> None:
144
88
  backend_config_dict = _replace_keys(backend_config_dict, match="-", target="_")
145
89
  log(DEBUG, "backend_config_dict: %s", backend_config_dict)
146
90
 
147
- # We are supporting two modes for the CLI entrypoint:
148
- # 1) Running an app dir containing a `pyproject.toml`
149
- # 2) Running any ClientApp and SeverApp w/o pyproject.toml being present
150
- # For 2), some CLI args are compulsory, but they are not required for 1)
151
- # We first do these checks
152
- args_check_pass = _check_args_do_not_interfere(args)
153
- if not args_check_pass:
154
- sys.exit("Simulation Engine cannot start.")
155
-
156
91
  run_id = (
157
92
  generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
158
93
  if args.run_id is None
159
94
  else args.run_id
160
95
  )
161
- if args.app:
162
- # Mode 1
163
- app_path = Path(args.app)
164
- if not app_path.is_dir():
165
- log(ERROR, "--app is not a directory")
166
- sys.exit("Simulation Engine cannot start.")
167
-
168
- # Load pyproject.toml
169
- config, errors, warnings = load_and_validate(
170
- app_path / "pyproject.toml", check_module=False
171
- )
172
- if errors:
173
- raise ValueError(errors)
174
96
 
175
- if warnings:
176
- log(WARNING, warnings)
97
+ app_path = Path(args.app)
98
+ if not app_path.is_dir():
99
+ log(ERROR, "--app is not a directory")
100
+ sys.exit("Simulation Engine cannot start.")
101
+
102
+ # Load pyproject.toml
103
+ config, errors, warnings = load_and_validate(
104
+ app_path / "pyproject.toml", check_module=False
105
+ )
106
+ if errors:
107
+ raise ValueError(errors)
177
108
 
178
- if config is None:
179
- raise ValueError("Config extracted from FAB's pyproject.toml is not valid")
109
+ if warnings:
110
+ log(WARNING, warnings)
180
111
 
181
- # Get ClientApp and SeverApp components
182
- app_components = config["tool"]["flwr"]["app"]["components"]
183
- client_app_attr = app_components["clientapp"]
184
- server_app_attr = app_components["serverapp"]
112
+ if config is None:
113
+ raise ValueError("Config extracted from FAB's pyproject.toml is not valid")
185
114
 
186
- override_config = parse_config_args(
187
- [args.run_config] if args.run_config else args.run_config
188
- )
189
- fused_config = get_fused_config_from_dir(app_path, override_config)
190
- app_dir = args.app
191
- is_app = True
115
+ # Get ClientApp and SeverApp components
116
+ app_components = config["tool"]["flwr"]["app"]["components"]
117
+ client_app_attr = app_components["clientapp"]
118
+ server_app_attr = app_components["serverapp"]
192
119
 
193
- else:
194
- # Mode 2
195
- client_app_attr = args.client_app
196
- server_app_attr = args.server_app
197
- override_config = {}
198
- fused_config = None
199
- app_dir = args.app_dir
200
- is_app = False
120
+ override_config = parse_config_args(
121
+ [args.run_config] if args.run_config else args.run_config
122
+ )
123
+ fused_config = get_fused_config_from_dir(app_path, override_config)
201
124
 
202
125
  # Create run
203
126
  run = Run(
@@ -214,13 +137,13 @@ def run_simulation_from_cli() -> None:
214
137
  num_supernodes=args.num_supernodes,
215
138
  backend_name=args.backend,
216
139
  backend_config=backend_config_dict,
217
- app_dir=app_dir,
140
+ app_dir=args.app,
218
141
  run=run,
219
142
  enable_tf_gpu_growth=args.enable_tf_gpu_growth,
220
143
  delay_start=args.delay_start,
221
144
  verbose_logging=args.verbose,
222
145
  server_app_run_config=fused_config,
223
- is_app=is_app,
146
+ is_app=True,
224
147
  exit_event=EventType.CLI_FLOWER_SIMULATION_LEAVE,
225
148
  )
226
149
 
@@ -583,20 +506,10 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
583
506
  parser.add_argument(
584
507
  "--app",
585
508
  type=str,
586
- default=None,
509
+ required=True,
587
510
  help="Path to a directory containing a FAB-like structure with a "
588
511
  "pyproject.toml.",
589
512
  )
590
- parser.add_argument(
591
- "--server-app",
592
- help="(DEPRECATED: use --app instead) For example: `server:app` or "
593
- "`project.package.module:wrapper.app`",
594
- )
595
- parser.add_argument(
596
- "--client-app",
597
- help="(DEPRECATED: use --app instead) For example: `client:app` or "
598
- "`project.package.module:wrapper.app`",
599
- )
600
513
  parser.add_argument(
601
514
  "--num-supernodes",
602
515
  type=int,
@@ -645,13 +558,6 @@ def _parse_args_run_simulation() -> argparse.ArgumentParser:
645
558
  help="When unset, only INFO, WARNING and ERROR log messages will be shown. "
646
559
  "If set, DEBUG-level logs will be displayed. ",
647
560
  )
648
- parser.add_argument(
649
- "--app-dir",
650
- default="",
651
- help="Add specified directory to the PYTHONPATH and load"
652
- "ClientApp and ServerApp from there."
653
- " Default: current working directory.",
654
- )
655
561
  parser.add_argument(
656
562
  "--flwr-dir",
657
563
  default=None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241104
3
+ Version: 1.13.0.dev20241105
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -281,10 +281,10 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
281
281
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
282
282
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=VL6e_Jwf4uxA-X1EelxJZMv6Eji-_p2J9D0MdHG10a4,13029
283
283
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
284
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=zsolNnK3LPkk_b00hnA9kSmnQ71hS_BPpc7s7uG_tps,20599
284
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=w89chilI3y7IqFCtvPCqJgXfJHB2Xtp7TPaMPmKgi8I,21262
285
285
  flwr/server/superlink/linkstate/linkstate.py,sha256=-pt8U2cpL42TEiyLHxuLq8zTR1vpXdT9l-BsN8rGnFs,11438
286
286
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
287
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=ZyxfBhvv8kAW55JiyboHOWAND0BWoPJdo2XGPXxuTHc,43198
287
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=Eq9rFjjdcuQk6ZoHpuZvmrzvBpmozEaxl74YkKExWFI,44013
288
288
  flwr/server/superlink/linkstate/utils.py,sha256=ukrMlSv0mNFd0YSpyPDpq_ND90SBkwuKgw3FFux3lqs,6914
289
289
  flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
290
290
  flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
@@ -302,7 +302,7 @@ flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQD
302
302
  flwr/simulation/ray_transport/ray_actor.py,sha256=9-XBguAm5IFqm2ddPFsQtnuuFN6lzqdb00SnCxGUGBo,18996
303
303
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
304
304
  flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
305
- flwr/simulation/run_simulation.py,sha256=3n1nSik8tTC6LCYVZesNkHuXDQ1Ea4unTnNEOC5rdAc,23436
305
+ flwr/simulation/run_simulation.py,sha256=zy1g8RGwJ07N0dKqHtK83r42j2c4tLpmXLqvjTRQL5U,20169
306
306
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
307
307
  flwr/superexec/app.py,sha256=Tt3GonnTwHrMmicwx9XaP-crP78-bf4DUWl-N5cG6zY,1841
308
308
  flwr/superexec/deployment.py,sha256=SVOAfJlCqDmA6TkDCusffjLxhHWoy5_y8mGIPjm1Bo0,6416
@@ -310,8 +310,8 @@ flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2
310
310
  flwr/superexec/exec_servicer.py,sha256=6dUCijBYhrntZeQj82q2kVOUNFu_tsFOwT5HkkLYn9Q,3927
311
311
  flwr/superexec/executor.py,sha256=QA2_hQJxmN3zc75oEkDs-zkWAHesz59jE0P5lem-5VU,3073
312
312
  flwr/superexec/simulation.py,sha256=Ny3MJnNlgzW4K3NbgsgDM0LKKcoCd_q3LqNqb0GhWLI,7640
313
- flwr_nightly-1.13.0.dev20241104.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
314
- flwr_nightly-1.13.0.dev20241104.dist-info/METADATA,sha256=JSHAY5Mt504DEkmxlC912d09dTTDS8gJlZaZfoBA-YM,15618
315
- flwr_nightly-1.13.0.dev20241104.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
316
- flwr_nightly-1.13.0.dev20241104.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
317
- flwr_nightly-1.13.0.dev20241104.dist-info/RECORD,,
313
+ flwr_nightly-1.13.0.dev20241105.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
314
+ flwr_nightly-1.13.0.dev20241105.dist-info/METADATA,sha256=VuYzXzSZHivefkrxGrUBdO3CMWKVjYTmFy0wG3hocR0,15618
315
+ flwr_nightly-1.13.0.dev20241105.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
316
+ flwr_nightly-1.13.0.dev20241105.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
317
+ flwr_nightly-1.13.0.dev20241105.dist-info/RECORD,,