flwr-nightly 1.13.0.dev20241025__py3-none-any.whl → 1.13.0.dev20241028__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/server/app.py +10 -8
- flwr/server/serverapp/app.py +76 -13
- flwr/server/superlink/driver/driver_servicer.py +7 -1
- {flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/METADATA +1 -1
- {flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/RECORD +8 -8
- {flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/entry_points.txt +0 -0
flwr/server/app.py
CHANGED
|
@@ -50,7 +50,6 @@ from flwr.common.constant import (
|
|
|
50
50
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
|
51
51
|
TRANSPORT_TYPE_GRPC_RERE,
|
|
52
52
|
TRANSPORT_TYPE_REST,
|
|
53
|
-
Status,
|
|
54
53
|
)
|
|
55
54
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
56
55
|
from flwr.common.logger import log
|
|
@@ -58,7 +57,6 @@ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
|
58
57
|
private_key_to_bytes,
|
|
59
58
|
public_key_to_bytes,
|
|
60
59
|
)
|
|
61
|
-
from flwr.common.typing import RunStatus
|
|
62
60
|
from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
|
|
63
61
|
add_FleetServicer_to_server,
|
|
64
62
|
)
|
|
@@ -345,7 +343,7 @@ def run_superlink() -> None:
|
|
|
345
343
|
# Scheduler thread
|
|
346
344
|
scheduler_th = threading.Thread(
|
|
347
345
|
target=_flwr_serverapp_scheduler,
|
|
348
|
-
args=(state_factory, args.driver_api_address),
|
|
346
|
+
args=(state_factory, args.driver_api_address, args.ssl_ca_certfile),
|
|
349
347
|
)
|
|
350
348
|
scheduler_th.start()
|
|
351
349
|
bckg_threads.append(scheduler_th)
|
|
@@ -367,7 +365,9 @@ def run_superlink() -> None:
|
|
|
367
365
|
|
|
368
366
|
|
|
369
367
|
def _flwr_serverapp_scheduler(
|
|
370
|
-
state_factory: LinkStateFactory,
|
|
368
|
+
state_factory: LinkStateFactory,
|
|
369
|
+
driver_api_address: str,
|
|
370
|
+
ssl_ca_certfile: Optional[str],
|
|
371
371
|
) -> None:
|
|
372
372
|
log(DEBUG, "Started flwr-serverapp scheduler thread.")
|
|
373
373
|
|
|
@@ -380,10 +380,6 @@ def _flwr_serverapp_scheduler(
|
|
|
380
380
|
|
|
381
381
|
if pending_run_id:
|
|
382
382
|
|
|
383
|
-
# Set run as starting
|
|
384
|
-
state.update_run_status(
|
|
385
|
-
run_id=pending_run_id, new_status=RunStatus(Status.STARTING, "", "")
|
|
386
|
-
)
|
|
387
383
|
log(
|
|
388
384
|
INFO,
|
|
389
385
|
"Launching `flwr-serverapp` subprocess with run-id %d. "
|
|
@@ -399,6 +395,12 @@ def _flwr_serverapp_scheduler(
|
|
|
399
395
|
"--run-id",
|
|
400
396
|
str(pending_run_id),
|
|
401
397
|
]
|
|
398
|
+
if ssl_ca_certfile:
|
|
399
|
+
command.append("--root-certificates")
|
|
400
|
+
command.append(ssl_ca_certfile)
|
|
401
|
+
else:
|
|
402
|
+
command.append("--insecure")
|
|
403
|
+
|
|
402
404
|
subprocess.run(
|
|
403
405
|
command,
|
|
404
406
|
stdout=None,
|
flwr/server/serverapp/app.py
CHANGED
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
"""Flower ServerApp process."""
|
|
16
16
|
|
|
17
17
|
import argparse
|
|
18
|
-
|
|
18
|
+
import sys
|
|
19
|
+
from logging import DEBUG, INFO, WARN
|
|
20
|
+
from os.path import isfile
|
|
21
|
+
from pathlib import Path
|
|
19
22
|
from typing import Optional
|
|
20
23
|
|
|
21
24
|
from flwr.common.logger import log
|
|
@@ -41,8 +44,35 @@ def flwr_serverapp() -> None:
|
|
|
41
44
|
help="Id of the Run this process should start. If not supplied, this "
|
|
42
45
|
"function will request a pending run to the LinkState.",
|
|
43
46
|
)
|
|
47
|
+
parser.add_argument(
|
|
48
|
+
"--flwr-dir",
|
|
49
|
+
default=None,
|
|
50
|
+
help="""The path containing installed Flower Apps.
|
|
51
|
+
By default, this value is equal to:
|
|
52
|
+
|
|
53
|
+
- `$FLWR_HOME/` if `$FLWR_HOME` is defined
|
|
54
|
+
- `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
|
|
55
|
+
- `$HOME/.flwr/` in all other cases
|
|
56
|
+
""",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--insecure",
|
|
60
|
+
action="store_true",
|
|
61
|
+
help="Run the server without HTTPS, regardless of whether certificate "
|
|
62
|
+
"paths are provided. By default, the server runs with HTTPS enabled. "
|
|
63
|
+
"Use this flag only if you understand the risks.",
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"--root-certificates",
|
|
67
|
+
metavar="ROOT_CERT",
|
|
68
|
+
type=str,
|
|
69
|
+
help="Specifies the path to the PEM-encoded root certificate file for "
|
|
70
|
+
"establishing secure HTTPS connections.",
|
|
71
|
+
)
|
|
44
72
|
args = parser.parse_args()
|
|
45
73
|
|
|
74
|
+
certificates = _try_obtain_certificates(args)
|
|
75
|
+
|
|
46
76
|
log(
|
|
47
77
|
DEBUG,
|
|
48
78
|
"Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s "
|
|
@@ -50,29 +80,62 @@ def flwr_serverapp() -> None:
|
|
|
50
80
|
args.superlink,
|
|
51
81
|
args.run_id,
|
|
52
82
|
)
|
|
53
|
-
run_serverapp(
|
|
83
|
+
run_serverapp(
|
|
84
|
+
superlink=args.superlink,
|
|
85
|
+
run_id=args.run_id,
|
|
86
|
+
flwr_dir_=args.flwr_dir,
|
|
87
|
+
certificates=certificates,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _try_obtain_certificates(
|
|
92
|
+
args: argparse.Namespace,
|
|
93
|
+
) -> Optional[bytes]:
|
|
94
|
+
|
|
95
|
+
if args.insecure:
|
|
96
|
+
if args.root_certificates is not None:
|
|
97
|
+
sys.exit(
|
|
98
|
+
"Conflicting options: The '--insecure' flag disables HTTPS, "
|
|
99
|
+
"but '--root-certificates' was also specified. Please remove "
|
|
100
|
+
"the '--root-certificates' option when running in insecure mode, "
|
|
101
|
+
"or omit '--insecure' to use HTTPS."
|
|
102
|
+
)
|
|
103
|
+
log(
|
|
104
|
+
WARN,
|
|
105
|
+
"Option `--insecure` was set. Starting insecure HTTP channel to %s.",
|
|
106
|
+
args.superlink,
|
|
107
|
+
)
|
|
108
|
+
root_certificates = None
|
|
109
|
+
else:
|
|
110
|
+
# Load the certificates if provided, or load the system certificates
|
|
111
|
+
if not isfile(args.root_certificates):
|
|
112
|
+
sys.exit("Path argument `--root-certificates` does not point to a file.")
|
|
113
|
+
root_certificates = Path(args.root_certificates).read_bytes()
|
|
114
|
+
log(
|
|
115
|
+
DEBUG,
|
|
116
|
+
"Starting secure HTTPS channel to %s "
|
|
117
|
+
"with the following certificates: %s.",
|
|
118
|
+
args.superlink,
|
|
119
|
+
args.root_certificates,
|
|
120
|
+
)
|
|
121
|
+
return root_certificates
|
|
54
122
|
|
|
55
123
|
|
|
56
124
|
def run_serverapp( # pylint: disable=R0914
|
|
57
125
|
superlink: str,
|
|
58
126
|
run_id: Optional[int] = None,
|
|
127
|
+
flwr_dir_: Optional[str] = None,
|
|
128
|
+
certificates: Optional[bytes] = None,
|
|
59
129
|
) -> None:
|
|
60
|
-
"""Run Flower ServerApp process.
|
|
61
|
-
|
|
62
|
-
Parameters
|
|
63
|
-
----------
|
|
64
|
-
superlink : str
|
|
65
|
-
Address of SuperLink
|
|
66
|
-
run_id : Optional[int] (default: None)
|
|
67
|
-
Unique identifier of a Run registered at the LinkState. If not supplied,
|
|
68
|
-
this function will request a pending run to the LinkState.
|
|
69
|
-
"""
|
|
130
|
+
"""Run Flower ServerApp process."""
|
|
70
131
|
_ = GrpcDriver(
|
|
71
132
|
run_id=run_id if run_id else 0,
|
|
72
133
|
driver_service_address=superlink,
|
|
73
|
-
root_certificates=
|
|
134
|
+
root_certificates=certificates,
|
|
74
135
|
)
|
|
75
136
|
|
|
137
|
+
log(INFO, "%s", flwr_dir_)
|
|
138
|
+
|
|
76
139
|
# Then, GetServerInputs
|
|
77
140
|
|
|
78
141
|
# Then, run ServerApp
|
|
@@ -22,6 +22,7 @@ from typing import Optional
|
|
|
22
22
|
from uuid import UUID
|
|
23
23
|
|
|
24
24
|
import grpc
|
|
25
|
+
from google.protobuf.message import Message as GrpcMessage
|
|
25
26
|
|
|
26
27
|
from flwr.common.constant import Status
|
|
27
28
|
from flwr.common.logger import log
|
|
@@ -212,7 +213,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
212
213
|
# Lock access to LinkState, preventing obtaining the same pending run_id
|
|
213
214
|
with self.lock:
|
|
214
215
|
# If run_id is provided, use it, otherwise use the pending run_id
|
|
215
|
-
if request
|
|
216
|
+
if _has_field(request, "run_id"):
|
|
216
217
|
run_id: Optional[int] = request.run_id
|
|
217
218
|
else:
|
|
218
219
|
run_id = state.get_pending_run_id()
|
|
@@ -256,3 +257,8 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
256
257
|
def _raise_if(validation_error: bool, detail: str) -> None:
|
|
257
258
|
if validation_error:
|
|
258
259
|
raise ValueError(f"Malformed PushTaskInsRequest: {detail}")
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _has_field(message: GrpcMessage, field_name: str) -> bool:
|
|
263
|
+
"""Check if a certain field is set for the message, including scalar fields."""
|
|
264
|
+
return field_name in {fld.name for fld, _ in message.ListFields()}
|
{flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/RECORD
RENAMED
|
@@ -199,7 +199,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
|
|
|
199
199
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
|
200
200
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
201
201
|
flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
|
|
202
|
-
flwr/server/app.py,sha256=
|
|
202
|
+
flwr/server/app.py,sha256=7mV0p6Ej7GHyAnSyTOaaPJC2UuXpXfgNLuoDvLemsRM,28353
|
|
203
203
|
flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
|
|
204
204
|
flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
|
|
205
205
|
flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
|
|
@@ -218,7 +218,7 @@ flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
|
|
|
218
218
|
flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
|
|
219
219
|
flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
|
|
220
220
|
flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
|
|
221
|
-
flwr/server/serverapp/app.py,sha256=
|
|
221
|
+
flwr/server/serverapp/app.py,sha256=4c_aoB8v8qIr5_IQCg4PocCSiTt7Nsf0wYPNwUymUuo,4485
|
|
222
222
|
flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
|
|
223
223
|
flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
|
|
224
224
|
flwr/server/strategy/aggregate.py,sha256=iFZ8lp7PV_a2m9kywV-FK0iM33ofxavOs5TIaEQY8nU,13961
|
|
@@ -247,7 +247,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
|
|
|
247
247
|
flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
|
|
248
248
|
flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
|
|
249
249
|
flwr/server/superlink/driver/driver_grpc.py,sha256=melAgaV37Y0B9bZe5bRWQOobItZZ9DIzlcbVE8B01wo,2060
|
|
250
|
-
flwr/server/superlink/driver/driver_servicer.py,sha256=
|
|
250
|
+
flwr/server/superlink/driver/driver_servicer.py,sha256=JDkUcj1HDtjyxupsXDKw9BErJcngb-V87VLKQw3gMjI,9672
|
|
251
251
|
flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
|
|
252
252
|
flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
|
|
253
253
|
flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
|
|
@@ -302,8 +302,8 @@ flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2
|
|
|
302
302
|
flwr/superexec/exec_servicer.py,sha256=9MdFODQkLK_942XwaqwwIi1OP0Tiv3Mh7smj4mbreBE,5124
|
|
303
303
|
flwr/superexec/executor.py,sha256=125FvdpjT_awBCREm_YkLMg0YgToarVg7Y3wPt5tXQA,3126
|
|
304
304
|
flwr/superexec/simulation.py,sha256=PGADPXcfFVOss4uwPvFq_6vrIlkxezHppnBPAYWUBuU,7739
|
|
305
|
-
flwr_nightly-1.13.0.
|
|
306
|
-
flwr_nightly-1.13.0.
|
|
307
|
-
flwr_nightly-1.13.0.
|
|
308
|
-
flwr_nightly-1.13.0.
|
|
309
|
-
flwr_nightly-1.13.0.
|
|
305
|
+
flwr_nightly-1.13.0.dev20241028.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
306
|
+
flwr_nightly-1.13.0.dev20241028.dist-info/METADATA,sha256=WXI84xjpiOMmUBA16dNB8_CIZybwX9HBfTFdisf91Dw,15618
|
|
307
|
+
flwr_nightly-1.13.0.dev20241028.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
308
|
+
flwr_nightly-1.13.0.dev20241028.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
|
|
309
|
+
flwr_nightly-1.13.0.dev20241028.dist-info/RECORD,,
|
{flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/LICENSE
RENAMED
|
File without changes
|
{flwr_nightly-1.13.0.dev20241025.dist-info → flwr_nightly-1.13.0.dev20241028.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|