flwr-nightly 1.17.0.dev20250316__py3-none-any.whl → 1.17.0.dev20250317__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.
- flwr/client/client_app.py +1 -3
- flwr/server/driver/grpc_driver.py +64 -29
- flwr/server/server_app.py +1 -7
- {flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/METADATA +2 -2
- {flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/RECORD +8 -8
- {flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/entry_points.txt +0 -0
flwr/client/client_app.py
CHANGED
@@ -27,7 +27,7 @@ from flwr.client.message_handler.message_handler import (
|
|
27
27
|
from flwr.client.mod.utils import make_ffn
|
28
28
|
from flwr.client.typing import ClientFnExt, Mod
|
29
29
|
from flwr.common import Context, Message, MessageType
|
30
|
-
from flwr.common.logger import warn_deprecated_feature
|
30
|
+
from flwr.common.logger import warn_deprecated_feature
|
31
31
|
from flwr.common.message import validate_message_type
|
32
32
|
|
33
33
|
from .typing import ClientAppCallable
|
@@ -356,7 +356,6 @@ class ClientApp:
|
|
356
356
|
lifespan_fn: Callable[[Context], Iterator[None]]
|
357
357
|
) -> Callable[[Context], Iterator[None]]:
|
358
358
|
"""Register the lifespan fn with the ServerApp object."""
|
359
|
-
warn_preview_feature("ClientApp-register-lifespan-function")
|
360
359
|
|
361
360
|
@contextmanager
|
362
361
|
def decorated_lifespan(context: Context) -> Iterator[None]:
|
@@ -405,7 +404,6 @@ def _get_decorator(
|
|
405
404
|
raise _registration_error(category)
|
406
405
|
|
407
406
|
def decorator(fn: ClientAppCallable) -> ClientAppCallable:
|
408
|
-
warn_preview_feature(f"ClientApp-register-{category}-function")
|
409
407
|
|
410
408
|
# Check if the name is a valid Python identifier
|
411
409
|
if not action.isidentifier():
|
@@ -18,7 +18,7 @@
|
|
18
18
|
import time
|
19
19
|
import warnings
|
20
20
|
from collections.abc import Iterable
|
21
|
-
from logging import DEBUG, WARNING
|
21
|
+
from logging import DEBUG, ERROR, WARNING
|
22
22
|
from typing import Optional, cast
|
23
23
|
|
24
24
|
import grpc
|
@@ -48,11 +48,32 @@ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E
|
|
48
48
|
|
49
49
|
from .driver import Driver
|
50
50
|
|
51
|
-
|
52
|
-
[flwr-serverapp] Error: Not connected.
|
51
|
+
ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED = """
|
53
52
|
|
54
|
-
|
55
|
-
|
53
|
+
[Driver.push_messages] gRPC error occurred:
|
54
|
+
|
55
|
+
The 2GB gRPC limit has been reached. Consider reducing the number of messages pushed
|
56
|
+
at once, or push messages individually, for example:
|
57
|
+
|
58
|
+
> msgs = [msg1, msg2, msg3]
|
59
|
+
> msg_ids = []
|
60
|
+
> for msg in msgs:
|
61
|
+
> msg_id = driver.push_messages([msg])
|
62
|
+
> msg_ids.extend(msg_id)
|
63
|
+
"""
|
64
|
+
|
65
|
+
ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED = """
|
66
|
+
|
67
|
+
[Driver.pull_messages] gRPC error occurred:
|
68
|
+
|
69
|
+
The 2GB gRPC limit has been reached. Consider reducing the number of messages pulled
|
70
|
+
at once, or pull messages individually, for example:
|
71
|
+
|
72
|
+
> msgs_ids = [msg_id1, msg_id2, msg_id3]
|
73
|
+
> msgs = []
|
74
|
+
> for msg_id in msg_ids:
|
75
|
+
> msg = driver.pull_messages([msg_id])
|
76
|
+
> msgs.extend(msg)
|
56
77
|
"""
|
57
78
|
|
58
79
|
|
@@ -206,22 +227,30 @@ class GrpcDriver(Driver):
|
|
206
227
|
msg_proto = message_to_proto(msg)
|
207
228
|
# Add to list
|
208
229
|
message_proto_list.append(msg_proto)
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
list(message_proto_list)
|
217
|
-
):
|
218
|
-
log(
|
219
|
-
WARNING,
|
220
|
-
"Not all messages could be pushed to the SuperLink. The returned "
|
221
|
-
"list has `None` for those messages (the order is preserved as passed "
|
222
|
-
"to `push_messages`). This could be due to a malformed message.",
|
230
|
+
|
231
|
+
try:
|
232
|
+
# Call GrpcDriverStub method
|
233
|
+
res: PushInsMessagesResponse = self._stub.PushMessages(
|
234
|
+
PushInsMessagesRequest(
|
235
|
+
messages_list=message_proto_list, run_id=cast(Run, self._run).run_id
|
236
|
+
)
|
223
237
|
)
|
224
|
-
|
238
|
+
if len([msg_id for msg_id in res.message_ids if msg_id]) != len(
|
239
|
+
message_proto_list
|
240
|
+
):
|
241
|
+
log(
|
242
|
+
WARNING,
|
243
|
+
"Not all messages could be pushed to the SuperLink. The returned "
|
244
|
+
"list has `None` for those messages (the order is preserved as "
|
245
|
+
"passed to `push_messages`). This could be due to a malformed "
|
246
|
+
"message.",
|
247
|
+
)
|
248
|
+
return list(res.message_ids)
|
249
|
+
except grpc.RpcError as e:
|
250
|
+
if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
|
251
|
+
log(ERROR, ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED)
|
252
|
+
return []
|
253
|
+
raise
|
225
254
|
|
226
255
|
def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
|
227
256
|
"""Pull messages based on message IDs.
|
@@ -229,16 +258,22 @@ class GrpcDriver(Driver):
|
|
229
258
|
This method is used to collect messages from the SuperLink that correspond to a
|
230
259
|
set of given message IDs.
|
231
260
|
"""
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
261
|
+
try:
|
262
|
+
# Pull Messages
|
263
|
+
res: PullResMessagesResponse = self._stub.PullMessages(
|
264
|
+
PullResMessagesRequest(
|
265
|
+
message_ids=message_ids,
|
266
|
+
run_id=cast(Run, self._run).run_id,
|
267
|
+
)
|
237
268
|
)
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
269
|
+
# Convert Message from Protobuf representation
|
270
|
+
msgs = [message_from_proto(msg_proto) for msg_proto in res.messages_list]
|
271
|
+
return msgs
|
272
|
+
except grpc.RpcError as e:
|
273
|
+
if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
|
274
|
+
log(ERROR, ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED)
|
275
|
+
return []
|
276
|
+
raise
|
242
277
|
|
243
278
|
def send_and_receive(
|
244
279
|
self,
|
flwr/server/server_app.py
CHANGED
@@ -20,10 +20,7 @@ from contextlib import contextmanager
|
|
20
20
|
from typing import Callable, Optional
|
21
21
|
|
22
22
|
from flwr.common import Context
|
23
|
-
from flwr.common.logger import
|
24
|
-
warn_deprecated_feature_with_example,
|
25
|
-
warn_preview_feature,
|
26
|
-
)
|
23
|
+
from flwr.common.logger import warn_deprecated_feature_with_example
|
27
24
|
from flwr.server.strategy import Strategy
|
28
25
|
|
29
26
|
from .client_manager import ClientManager
|
@@ -176,8 +173,6 @@ class ServerApp: # pylint: disable=too-many-instance-attributes
|
|
176
173
|
""",
|
177
174
|
)
|
178
175
|
|
179
|
-
warn_preview_feature("ServerApp-register-main-function")
|
180
|
-
|
181
176
|
# Register provided function with the ServerApp object
|
182
177
|
self._main = main_fn
|
183
178
|
|
@@ -215,7 +210,6 @@ class ServerApp: # pylint: disable=too-many-instance-attributes
|
|
215
210
|
lifespan_fn: Callable[[Context], Iterator[None]]
|
216
211
|
) -> Callable[[Context], Iterator[None]]:
|
217
212
|
"""Register the lifespan fn with the ServerApp object."""
|
218
|
-
warn_preview_feature("ServerApp-register-lifespan-function")
|
219
213
|
|
220
214
|
@contextmanager
|
221
215
|
def decorated_lifespan(context: Context) -> Iterator[None]:
|
{flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.17.0.
|
3
|
+
Version: 1.17.0.dev20250317
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
Home-page: https://flower.ai
|
6
6
|
License: Apache-2.0
|
@@ -63,7 +63,7 @@ Description-Content-Type: text/markdown
|
|
63
63
|
<a href="https://flower.ai/">Website</a> |
|
64
64
|
<a href="https://flower.ai/blog">Blog</a> |
|
65
65
|
<a href="https://flower.ai/docs/">Docs</a> |
|
66
|
-
<a href="https://flower.ai/
|
66
|
+
<a href="https://flower.ai/events/flower-ai-summit-2025">Summit</a> |
|
67
67
|
<a href="https://flower.ai/join-slack">Slack</a>
|
68
68
|
<br /><br />
|
69
69
|
</p>
|
{flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/RECORD
RENAMED
@@ -74,7 +74,7 @@ flwr/cli/utils.py,sha256=D9XcpxzwkGPNdwX16o0kI-sYnRDMlWYyKNIpz6npRhQ,11236
|
|
74
74
|
flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
|
75
75
|
flwr/client/app.py,sha256=tNnef5wGVfqMiiGiWzAuULyy1QpvCKukiRmNi_a2cQc,34261
|
76
76
|
flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
|
77
|
-
flwr/client/client_app.py,sha256=
|
77
|
+
flwr/client/client_app.py,sha256=iuQSO-iwRjWzpeWOjeYKmvfIpBxoGnIAU2TgsmqLpyo,17145
|
78
78
|
flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
|
79
79
|
flwr/client/clientapp/app.py,sha256=B3GrIMP8BMvltYf4n4xbtlRR1jEPT5-F93KnBCPuPJM,9069
|
80
80
|
flwr/client/clientapp/clientappio_servicer.py,sha256=5L6bjw_j3Mnx9kRFwYwxDNABKurBO5q1jZOWE_X11wQ,8522
|
@@ -225,13 +225,13 @@ flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_Od
|
|
225
225
|
flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
|
226
226
|
flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
|
227
227
|
flwr/server/driver/driver.py,sha256=X072eFWl8Kx-aZbahTkpAc1wwoojr8A4uO2yozwwSbE,5705
|
228
|
-
flwr/server/driver/grpc_driver.py,sha256=
|
228
|
+
flwr/server/driver/grpc_driver.py,sha256=rbSqFhT2ULLQhgIeX24Yt1wZje4bzV4EUoOmbIuVYro,11507
|
229
229
|
flwr/server/driver/inmemory_driver.py,sha256=p6p9RykDfoty94izzD4i11Xp7A8t1KUaHpbKbbVZAdU,6407
|
230
230
|
flwr/server/fleet_event_log_interceptor.py,sha256=AkL7Y5d3xm2vRhL3ahmEVVoOvAP7PA7dRgB-je4v-Ys,3774
|
231
231
|
flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
|
232
232
|
flwr/server/run_serverapp.py,sha256=tyAYB5UEiUd63VG4XiYBUUiivh77SpIol1cGS4xtYdk,2077
|
233
233
|
flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
|
234
|
-
flwr/server/server_app.py,sha256=
|
234
|
+
flwr/server/server_app.py,sha256=y6v1WEE7fkJbO9VNGafznm3QfUM3ifpdBcgauKmB4hU,8857
|
235
235
|
flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
|
236
236
|
flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
|
237
237
|
flwr/server/serverapp/app.py,sha256=5nFRYYzC2vh0l1fKJofBfKwFam93In4b80wvH9eFfQ8,8651
|
@@ -326,8 +326,8 @@ flwr/superexec/exec_servicer.py,sha256=4UpzJqPUHkBG2PZNe2lrX7XFVDOL6yw_HcoBHxuXE
|
|
326
326
|
flwr/superexec/exec_user_auth_interceptor.py,sha256=2kXjjJcrZyff893QTFLQD6zxC4pdVwtN4Rc66jHptfE,4440
|
327
327
|
flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
|
328
328
|
flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
|
329
|
-
flwr_nightly-1.17.0.
|
330
|
-
flwr_nightly-1.17.0.
|
331
|
-
flwr_nightly-1.17.0.
|
332
|
-
flwr_nightly-1.17.0.
|
333
|
-
flwr_nightly-1.17.0.
|
329
|
+
flwr_nightly-1.17.0.dev20250317.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
330
|
+
flwr_nightly-1.17.0.dev20250317.dist-info/METADATA,sha256=BK-20xmip40rp16IosnE5QCL4tnXqfYn0Td2M8Crka8,15878
|
331
|
+
flwr_nightly-1.17.0.dev20250317.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
332
|
+
flwr_nightly-1.17.0.dev20250317.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
|
333
|
+
flwr_nightly-1.17.0.dev20250317.dist-info/RECORD,,
|
{flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/LICENSE
RENAMED
File without changes
|
{flwr_nightly-1.17.0.dev20250316.dist-info → flwr_nightly-1.17.0.dev20250317.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|