flwr-nightly 1.20.0.dev20250712__py3-none-any.whl → 1.20.0.dev20250714__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/common/inflatable_utils.py +14 -7
- flwr/proto/appio_pb2.py +51 -0
- flwr/proto/appio_pb2.pyi +167 -0
- flwr/proto/appio_pb2_grpc.py +4 -0
- flwr/proto/appio_pb2_grpc.pyi +4 -0
- flwr/proto/clientappio_pb2.py +19 -11
- flwr/proto/clientappio_pb2.pyi +50 -12
- flwr/proto/clientappio_pb2_grpc.py +68 -0
- flwr/proto/clientappio_pb2_grpc.pyi +26 -0
- flwr/proto/serverappio_pb2.py +8 -31
- flwr/proto/serverappio_pb2.pyi +0 -152
- flwr/proto/serverappio_pb2_grpc.py +39 -38
- flwr/proto/serverappio_pb2_grpc.pyi +21 -20
- flwr/server/grid/grpc_grid.py +10 -8
- flwr/server/serverapp/app.py +9 -11
- flwr/server/superlink/serverappio/serverappio_servicer.py +27 -25
- flwr/server/superlink/utils.py +2 -2
- flwr/supernode/runtime/run_clientapp.py +14 -4
- flwr/supernode/servicer/clientappio/clientappio_servicer.py +48 -5
- flwr/supernode/start_client_internal.py +14 -0
- {flwr_nightly-1.20.0.dev20250712.dist-info → flwr_nightly-1.20.0.dev20250714.dist-info}/METADATA +1 -1
- {flwr_nightly-1.20.0.dev20250712.dist-info → flwr_nightly-1.20.0.dev20250714.dist-info}/RECORD +24 -20
- {flwr_nightly-1.20.0.dev20250712.dist-info → flwr_nightly-1.20.0.dev20250714.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.20.0.dev20250712.dist-info → flwr_nightly-1.20.0.dev20250714.dist-info}/entry_points.txt +0 -0
flwr/proto/serverappio_pb2.pyi
CHANGED
@@ -3,10 +3,7 @@
|
|
3
3
|
isort:skip_file
|
4
4
|
"""
|
5
5
|
import builtins
|
6
|
-
import flwr.proto.fab_pb2
|
7
|
-
import flwr.proto.message_pb2
|
8
6
|
import flwr.proto.node_pb2
|
9
|
-
import flwr.proto.run_pb2
|
10
7
|
import google.protobuf.descriptor
|
11
8
|
import google.protobuf.internal.containers
|
12
9
|
import google.protobuf.message
|
@@ -38,152 +35,3 @@ class GetNodesResponse(google.protobuf.message.Message):
|
|
38
35
|
) -> None: ...
|
39
36
|
def ClearField(self, field_name: typing_extensions.Literal["nodes",b"nodes"]) -> None: ...
|
40
37
|
global___GetNodesResponse = GetNodesResponse
|
41
|
-
|
42
|
-
class PushInsMessagesRequest(google.protobuf.message.Message):
|
43
|
-
"""PushMessages messages"""
|
44
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
45
|
-
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
46
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
47
|
-
MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
|
48
|
-
@property
|
49
|
-
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
50
|
-
run_id: builtins.int
|
51
|
-
@property
|
52
|
-
def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
|
53
|
-
def __init__(self,
|
54
|
-
*,
|
55
|
-
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
56
|
-
run_id: builtins.int = ...,
|
57
|
-
message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
|
58
|
-
) -> None: ...
|
59
|
-
def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list","run_id",b"run_id"]) -> None: ...
|
60
|
-
global___PushInsMessagesRequest = PushInsMessagesRequest
|
61
|
-
|
62
|
-
class PushInsMessagesResponse(google.protobuf.message.Message):
|
63
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
64
|
-
class ObjectsToPushEntry(google.protobuf.message.Message):
|
65
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
66
|
-
KEY_FIELD_NUMBER: builtins.int
|
67
|
-
VALUE_FIELD_NUMBER: builtins.int
|
68
|
-
key: typing.Text
|
69
|
-
@property
|
70
|
-
def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
|
71
|
-
def __init__(self,
|
72
|
-
*,
|
73
|
-
key: typing.Text = ...,
|
74
|
-
value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
|
75
|
-
) -> None: ...
|
76
|
-
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
77
|
-
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
78
|
-
|
79
|
-
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
80
|
-
OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
|
81
|
-
@property
|
82
|
-
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
83
|
-
@property
|
84
|
-
def objects_to_push(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
|
85
|
-
def __init__(self,
|
86
|
-
*,
|
87
|
-
message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
88
|
-
objects_to_push: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
|
89
|
-
) -> None: ...
|
90
|
-
def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","objects_to_push",b"objects_to_push"]) -> None: ...
|
91
|
-
global___PushInsMessagesResponse = PushInsMessagesResponse
|
92
|
-
|
93
|
-
class PullResMessagesRequest(google.protobuf.message.Message):
|
94
|
-
"""PullMessages messages"""
|
95
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
96
|
-
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
97
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
98
|
-
@property
|
99
|
-
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
100
|
-
run_id: builtins.int
|
101
|
-
def __init__(self,
|
102
|
-
*,
|
103
|
-
message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
104
|
-
run_id: builtins.int = ...,
|
105
|
-
) -> None: ...
|
106
|
-
def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","run_id",b"run_id"]) -> None: ...
|
107
|
-
global___PullResMessagesRequest = PullResMessagesRequest
|
108
|
-
|
109
|
-
class PullResMessagesResponse(google.protobuf.message.Message):
|
110
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
111
|
-
class ObjectsToPullEntry(google.protobuf.message.Message):
|
112
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
113
|
-
KEY_FIELD_NUMBER: builtins.int
|
114
|
-
VALUE_FIELD_NUMBER: builtins.int
|
115
|
-
key: typing.Text
|
116
|
-
@property
|
117
|
-
def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
|
118
|
-
def __init__(self,
|
119
|
-
*,
|
120
|
-
key: typing.Text = ...,
|
121
|
-
value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
|
122
|
-
) -> None: ...
|
123
|
-
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
124
|
-
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
125
|
-
|
126
|
-
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
127
|
-
OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
|
128
|
-
@property
|
129
|
-
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
130
|
-
@property
|
131
|
-
def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
|
132
|
-
def __init__(self,
|
133
|
-
*,
|
134
|
-
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
135
|
-
objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
|
136
|
-
) -> None: ...
|
137
|
-
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull"]) -> None: ...
|
138
|
-
global___PullResMessagesResponse = PullResMessagesResponse
|
139
|
-
|
140
|
-
class PullServerAppInputsRequest(google.protobuf.message.Message):
|
141
|
-
"""PullServerAppInputs messages"""
|
142
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
143
|
-
def __init__(self,
|
144
|
-
) -> None: ...
|
145
|
-
global___PullServerAppInputsRequest = PullServerAppInputsRequest
|
146
|
-
|
147
|
-
class PullServerAppInputsResponse(google.protobuf.message.Message):
|
148
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
149
|
-
CONTEXT_FIELD_NUMBER: builtins.int
|
150
|
-
RUN_FIELD_NUMBER: builtins.int
|
151
|
-
FAB_FIELD_NUMBER: builtins.int
|
152
|
-
@property
|
153
|
-
def context(self) -> flwr.proto.message_pb2.Context: ...
|
154
|
-
@property
|
155
|
-
def run(self) -> flwr.proto.run_pb2.Run: ...
|
156
|
-
@property
|
157
|
-
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
158
|
-
def __init__(self,
|
159
|
-
*,
|
160
|
-
context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
|
161
|
-
run: typing.Optional[flwr.proto.run_pb2.Run] = ...,
|
162
|
-
fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
|
163
|
-
) -> None: ...
|
164
|
-
def HasField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> builtins.bool: ...
|
165
|
-
def ClearField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> None: ...
|
166
|
-
global___PullServerAppInputsResponse = PullServerAppInputsResponse
|
167
|
-
|
168
|
-
class PushServerAppOutputsRequest(google.protobuf.message.Message):
|
169
|
-
"""PushServerAppOutputs messages"""
|
170
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
171
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
172
|
-
CONTEXT_FIELD_NUMBER: builtins.int
|
173
|
-
run_id: builtins.int
|
174
|
-
@property
|
175
|
-
def context(self) -> flwr.proto.message_pb2.Context: ...
|
176
|
-
def __init__(self,
|
177
|
-
*,
|
178
|
-
run_id: builtins.int = ...,
|
179
|
-
context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
|
180
|
-
) -> None: ...
|
181
|
-
def HasField(self, field_name: typing_extensions.Literal["context",b"context"]) -> builtins.bool: ...
|
182
|
-
def ClearField(self, field_name: typing_extensions.Literal["context",b"context","run_id",b"run_id"]) -> None: ...
|
183
|
-
global___PushServerAppOutputsRequest = PushServerAppOutputsRequest
|
184
|
-
|
185
|
-
class PushServerAppOutputsResponse(google.protobuf.message.Message):
|
186
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
187
|
-
def __init__(self,
|
188
|
-
) -> None: ...
|
189
|
-
global___PushServerAppOutputsResponse = PushServerAppOutputsResponse
|
@@ -2,6 +2,7 @@
|
|
2
2
|
"""Client and server classes corresponding to protobuf-defined services."""
|
3
3
|
import grpc
|
4
4
|
|
5
|
+
from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
|
5
6
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
6
7
|
from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
|
7
8
|
from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
|
@@ -26,13 +27,13 @@ class ServerAppIoStub(object):
|
|
26
27
|
)
|
27
28
|
self.PushMessages = channel.unary_unary(
|
28
29
|
'/flwr.proto.ServerAppIo/PushMessages',
|
29
|
-
request_serializer=
|
30
|
-
response_deserializer=
|
30
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.PushAppMessagesRequest.SerializeToString,
|
31
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppMessagesResponse.FromString,
|
31
32
|
)
|
32
33
|
self.PullMessages = channel.unary_unary(
|
33
34
|
'/flwr.proto.ServerAppIo/PullMessages',
|
34
|
-
request_serializer=
|
35
|
-
response_deserializer=
|
35
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.PullAppMessagesRequest.SerializeToString,
|
36
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppMessagesResponse.FromString,
|
36
37
|
)
|
37
38
|
self.GetRun = channel.unary_unary(
|
38
39
|
'/flwr.proto.ServerAppIo/GetRun',
|
@@ -44,15 +45,15 @@ class ServerAppIoStub(object):
|
|
44
45
|
request_serializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.SerializeToString,
|
45
46
|
response_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.FromString,
|
46
47
|
)
|
47
|
-
self.
|
48
|
-
'/flwr.proto.ServerAppIo/
|
49
|
-
request_serializer=
|
50
|
-
response_deserializer=
|
48
|
+
self.PullAppInputs = channel.unary_unary(
|
49
|
+
'/flwr.proto.ServerAppIo/PullAppInputs',
|
50
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
|
51
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
|
51
52
|
)
|
52
|
-
self.
|
53
|
-
'/flwr.proto.ServerAppIo/
|
54
|
-
request_serializer=
|
55
|
-
response_deserializer=
|
53
|
+
self.PushAppOutputs = channel.unary_unary(
|
54
|
+
'/flwr.proto.ServerAppIo/PushAppOutputs',
|
55
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
|
56
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
|
56
57
|
)
|
57
58
|
self.UpdateRunStatus = channel.unary_unary(
|
58
59
|
'/flwr.proto.ServerAppIo/UpdateRunStatus',
|
@@ -129,14 +130,14 @@ class ServerAppIoServicer(object):
|
|
129
130
|
context.set_details('Method not implemented!')
|
130
131
|
raise NotImplementedError('Method not implemented!')
|
131
132
|
|
132
|
-
def
|
133
|
+
def PullAppInputs(self, request, context):
|
133
134
|
"""Pull ServerApp inputs
|
134
135
|
"""
|
135
136
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
136
137
|
context.set_details('Method not implemented!')
|
137
138
|
raise NotImplementedError('Method not implemented!')
|
138
139
|
|
139
|
-
def
|
140
|
+
def PushAppOutputs(self, request, context):
|
140
141
|
"""Push ServerApp outputs
|
141
142
|
"""
|
142
143
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
@@ -202,13 +203,13 @@ def add_ServerAppIoServicer_to_server(servicer, server):
|
|
202
203
|
),
|
203
204
|
'PushMessages': grpc.unary_unary_rpc_method_handler(
|
204
205
|
servicer.PushMessages,
|
205
|
-
request_deserializer=
|
206
|
-
response_serializer=
|
206
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppMessagesRequest.FromString,
|
207
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.PushAppMessagesResponse.SerializeToString,
|
207
208
|
),
|
208
209
|
'PullMessages': grpc.unary_unary_rpc_method_handler(
|
209
210
|
servicer.PullMessages,
|
210
|
-
request_deserializer=
|
211
|
-
response_serializer=
|
211
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppMessagesRequest.FromString,
|
212
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.PullAppMessagesResponse.SerializeToString,
|
212
213
|
),
|
213
214
|
'GetRun': grpc.unary_unary_rpc_method_handler(
|
214
215
|
servicer.GetRun,
|
@@ -220,15 +221,15 @@ def add_ServerAppIoServicer_to_server(servicer, server):
|
|
220
221
|
request_deserializer=flwr_dot_proto_dot_fab__pb2.GetFabRequest.FromString,
|
221
222
|
response_serializer=flwr_dot_proto_dot_fab__pb2.GetFabResponse.SerializeToString,
|
222
223
|
),
|
223
|
-
'
|
224
|
-
servicer.
|
225
|
-
request_deserializer=
|
226
|
-
response_serializer=
|
224
|
+
'PullAppInputs': grpc.unary_unary_rpc_method_handler(
|
225
|
+
servicer.PullAppInputs,
|
226
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.FromString,
|
227
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.SerializeToString,
|
227
228
|
),
|
228
|
-
'
|
229
|
-
servicer.
|
230
|
-
request_deserializer=
|
231
|
-
response_serializer=
|
229
|
+
'PushAppOutputs': grpc.unary_unary_rpc_method_handler(
|
230
|
+
servicer.PushAppOutputs,
|
231
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.FromString,
|
232
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.SerializeToString,
|
232
233
|
),
|
233
234
|
'UpdateRunStatus': grpc.unary_unary_rpc_method_handler(
|
234
235
|
servicer.UpdateRunStatus,
|
@@ -304,8 +305,8 @@ class ServerAppIo(object):
|
|
304
305
|
timeout=None,
|
305
306
|
metadata=None):
|
306
307
|
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PushMessages',
|
307
|
-
|
308
|
-
|
308
|
+
flwr_dot_proto_dot_appio__pb2.PushAppMessagesRequest.SerializeToString,
|
309
|
+
flwr_dot_proto_dot_appio__pb2.PushAppMessagesResponse.FromString,
|
309
310
|
options, channel_credentials,
|
310
311
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
311
312
|
|
@@ -321,8 +322,8 @@ class ServerAppIo(object):
|
|
321
322
|
timeout=None,
|
322
323
|
metadata=None):
|
323
324
|
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PullMessages',
|
324
|
-
|
325
|
-
|
325
|
+
flwr_dot_proto_dot_appio__pb2.PullAppMessagesRequest.SerializeToString,
|
326
|
+
flwr_dot_proto_dot_appio__pb2.PullAppMessagesResponse.FromString,
|
326
327
|
options, channel_credentials,
|
327
328
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
328
329
|
|
@@ -361,7 +362,7 @@ class ServerAppIo(object):
|
|
361
362
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
362
363
|
|
363
364
|
@staticmethod
|
364
|
-
def
|
365
|
+
def PullAppInputs(request,
|
365
366
|
target,
|
366
367
|
options=(),
|
367
368
|
channel_credentials=None,
|
@@ -371,14 +372,14 @@ class ServerAppIo(object):
|
|
371
372
|
wait_for_ready=None,
|
372
373
|
timeout=None,
|
373
374
|
metadata=None):
|
374
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/
|
375
|
-
|
376
|
-
|
375
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PullAppInputs',
|
376
|
+
flwr_dot_proto_dot_appio__pb2.PullAppInputsRequest.SerializeToString,
|
377
|
+
flwr_dot_proto_dot_appio__pb2.PullAppInputsResponse.FromString,
|
377
378
|
options, channel_credentials,
|
378
379
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
379
380
|
|
380
381
|
@staticmethod
|
381
|
-
def
|
382
|
+
def PushAppOutputs(request,
|
382
383
|
target,
|
383
384
|
options=(),
|
384
385
|
channel_credentials=None,
|
@@ -388,9 +389,9 @@ class ServerAppIo(object):
|
|
388
389
|
wait_for_ready=None,
|
389
390
|
timeout=None,
|
390
391
|
metadata=None):
|
391
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/
|
392
|
-
|
393
|
-
|
392
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PushAppOutputs',
|
393
|
+
flwr_dot_proto_dot_appio__pb2.PushAppOutputsRequest.SerializeToString,
|
394
|
+
flwr_dot_proto_dot_appio__pb2.PushAppOutputsResponse.FromString,
|
394
395
|
options, channel_credentials,
|
395
396
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
396
397
|
|
@@ -3,6 +3,7 @@
|
|
3
3
|
isort:skip_file
|
4
4
|
"""
|
5
5
|
import abc
|
6
|
+
import flwr.proto.appio_pb2
|
6
7
|
import flwr.proto.fab_pb2
|
7
8
|
import flwr.proto.heartbeat_pb2
|
8
9
|
import flwr.proto.log_pb2
|
@@ -19,13 +20,13 @@ class ServerAppIoStub:
|
|
19
20
|
"""Return a set of nodes"""
|
20
21
|
|
21
22
|
PushMessages: grpc.UnaryUnaryMultiCallable[
|
22
|
-
flwr.proto.
|
23
|
-
flwr.proto.
|
23
|
+
flwr.proto.appio_pb2.PushAppMessagesRequest,
|
24
|
+
flwr.proto.appio_pb2.PushAppMessagesResponse]
|
24
25
|
"""Create one or more messages"""
|
25
26
|
|
26
27
|
PullMessages: grpc.UnaryUnaryMultiCallable[
|
27
|
-
flwr.proto.
|
28
|
-
flwr.proto.
|
28
|
+
flwr.proto.appio_pb2.PullAppMessagesRequest,
|
29
|
+
flwr.proto.appio_pb2.PullAppMessagesResponse]
|
29
30
|
"""Get message results"""
|
30
31
|
|
31
32
|
GetRun: grpc.UnaryUnaryMultiCallable[
|
@@ -38,14 +39,14 @@ class ServerAppIoStub:
|
|
38
39
|
flwr.proto.fab_pb2.GetFabResponse]
|
39
40
|
"""Get FAB"""
|
40
41
|
|
41
|
-
|
42
|
-
flwr.proto.
|
43
|
-
flwr.proto.
|
42
|
+
PullAppInputs: grpc.UnaryUnaryMultiCallable[
|
43
|
+
flwr.proto.appio_pb2.PullAppInputsRequest,
|
44
|
+
flwr.proto.appio_pb2.PullAppInputsResponse]
|
44
45
|
"""Pull ServerApp inputs"""
|
45
46
|
|
46
|
-
|
47
|
-
flwr.proto.
|
48
|
-
flwr.proto.
|
47
|
+
PushAppOutputs: grpc.UnaryUnaryMultiCallable[
|
48
|
+
flwr.proto.appio_pb2.PushAppOutputsRequest,
|
49
|
+
flwr.proto.appio_pb2.PushAppOutputsResponse]
|
49
50
|
"""Push ServerApp outputs"""
|
50
51
|
|
51
52
|
UpdateRunStatus: grpc.UnaryUnaryMultiCallable[
|
@@ -95,17 +96,17 @@ class ServerAppIoServicer(metaclass=abc.ABCMeta):
|
|
95
96
|
|
96
97
|
@abc.abstractmethod
|
97
98
|
def PushMessages(self,
|
98
|
-
request: flwr.proto.
|
99
|
+
request: flwr.proto.appio_pb2.PushAppMessagesRequest,
|
99
100
|
context: grpc.ServicerContext,
|
100
|
-
) -> flwr.proto.
|
101
|
+
) -> flwr.proto.appio_pb2.PushAppMessagesResponse:
|
101
102
|
"""Create one or more messages"""
|
102
103
|
pass
|
103
104
|
|
104
105
|
@abc.abstractmethod
|
105
106
|
def PullMessages(self,
|
106
|
-
request: flwr.proto.
|
107
|
+
request: flwr.proto.appio_pb2.PullAppMessagesRequest,
|
107
108
|
context: grpc.ServicerContext,
|
108
|
-
) -> flwr.proto.
|
109
|
+
) -> flwr.proto.appio_pb2.PullAppMessagesResponse:
|
109
110
|
"""Get message results"""
|
110
111
|
pass
|
111
112
|
|
@@ -126,18 +127,18 @@ class ServerAppIoServicer(metaclass=abc.ABCMeta):
|
|
126
127
|
pass
|
127
128
|
|
128
129
|
@abc.abstractmethod
|
129
|
-
def
|
130
|
-
request: flwr.proto.
|
130
|
+
def PullAppInputs(self,
|
131
|
+
request: flwr.proto.appio_pb2.PullAppInputsRequest,
|
131
132
|
context: grpc.ServicerContext,
|
132
|
-
) -> flwr.proto.
|
133
|
+
) -> flwr.proto.appio_pb2.PullAppInputsResponse:
|
133
134
|
"""Pull ServerApp inputs"""
|
134
135
|
pass
|
135
136
|
|
136
137
|
@abc.abstractmethod
|
137
|
-
def
|
138
|
-
request: flwr.proto.
|
138
|
+
def PushAppOutputs(self,
|
139
|
+
request: flwr.proto.appio_pb2.PushAppOutputsRequest,
|
139
140
|
context: grpc.ServicerContext,
|
140
|
-
) -> flwr.proto.
|
141
|
+
) -> flwr.proto.appio_pb2.PushAppOutputsResponse:
|
141
142
|
"""Push ServerApp outputs"""
|
142
143
|
pass
|
143
144
|
|
flwr/server/grid/grpc_grid.py
CHANGED
@@ -47,6 +47,12 @@ from flwr.common.message import remove_content_from_message
|
|
47
47
|
from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
|
48
48
|
from flwr.common.serde import message_to_proto, run_from_proto
|
49
49
|
from flwr.common.typing import Run
|
50
|
+
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
51
|
+
PullAppMessagesRequest,
|
52
|
+
PullAppMessagesResponse,
|
53
|
+
PushAppMessagesRequest,
|
54
|
+
PushAppMessagesResponse,
|
55
|
+
)
|
50
56
|
from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
51
57
|
ConfirmMessageReceivedRequest,
|
52
58
|
)
|
@@ -55,10 +61,6 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
|
|
55
61
|
from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
|
56
62
|
GetNodesRequest,
|
57
63
|
GetNodesResponse,
|
58
|
-
PullResMessagesRequest,
|
59
|
-
PullResMessagesResponse,
|
60
|
-
PushInsMessagesRequest,
|
61
|
-
PushInsMessagesResponse,
|
62
64
|
)
|
63
65
|
from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
|
64
66
|
|
@@ -223,8 +225,8 @@ class GrpcGrid(Grid):
|
|
223
225
|
object_tree = get_object_tree(message)
|
224
226
|
|
225
227
|
# Call GrpcServerAppIoStub method
|
226
|
-
res:
|
227
|
-
|
228
|
+
res: PushAppMessagesResponse = self._stub.PushMessages(
|
229
|
+
PushAppMessagesRequest(
|
228
230
|
messages_list=[message_to_proto(remove_content_from_message(message))],
|
229
231
|
run_id=run_id,
|
230
232
|
message_object_trees=[object_tree],
|
@@ -294,8 +296,8 @@ class GrpcGrid(Grid):
|
|
294
296
|
run_id = cast(Run, self._run).run_id
|
295
297
|
try:
|
296
298
|
# Pull Messages
|
297
|
-
res:
|
298
|
-
|
299
|
+
res: PullAppMessagesResponse = self._stub.PullMessages(
|
300
|
+
PullAppMessagesRequest(
|
299
301
|
message_ids=message_ids,
|
300
302
|
run_id=run_id,
|
301
303
|
)
|
flwr/server/serverapp/app.py
CHANGED
@@ -55,12 +55,12 @@ from flwr.common.serde import (
|
|
55
55
|
)
|
56
56
|
from flwr.common.telemetry import EventType, event
|
57
57
|
from flwr.common.typing import RunNotRunningException, RunStatus
|
58
|
-
from flwr.proto.
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
PushServerAppOutputsRequest,
|
58
|
+
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
59
|
+
PullAppInputsRequest,
|
60
|
+
PullAppInputsResponse,
|
61
|
+
PushAppOutputsRequest,
|
63
62
|
)
|
63
|
+
from flwr.proto.run_pb2 import UpdateRunStatusRequest # pylint: disable=E0611
|
64
64
|
from flwr.server.grid.grpc_grid import GrpcGrid
|
65
65
|
from flwr.server.run_serverapp import run as run_
|
66
66
|
|
@@ -125,9 +125,9 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
|
|
125
125
|
)
|
126
126
|
|
127
127
|
# Pull ServerAppInputs from LinkState
|
128
|
-
req =
|
128
|
+
req = PullAppInputsRequest()
|
129
129
|
log(DEBUG, "[flwr-serverapp] Pull ServerAppInputs")
|
130
|
-
res:
|
130
|
+
res: PullAppInputsResponse = grid._stub.PullAppInputs(req)
|
131
131
|
if not res.HasField("run"):
|
132
132
|
sleep(3)
|
133
133
|
run_status = None
|
@@ -207,10 +207,8 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
|
|
207
207
|
# Send resulting context
|
208
208
|
context_proto = context_to_proto(updated_context)
|
209
209
|
log(DEBUG, "[flwr-serverapp] Will push ServerAppOutputs")
|
210
|
-
out_req =
|
211
|
-
|
212
|
-
)
|
213
|
-
_ = grid._stub.PushServerAppOutputs(out_req)
|
210
|
+
out_req = PushAppOutputsRequest(run_id=run.run_id, context=context_proto)
|
211
|
+
_ = grid._stub.PushAppOutputs(out_req)
|
214
212
|
|
215
213
|
run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
|
216
214
|
except RunNotRunningException:
|
@@ -42,6 +42,16 @@ from flwr.common.serde import (
|
|
42
42
|
)
|
43
43
|
from flwr.common.typing import Fab, RunStatus
|
44
44
|
from flwr.proto import serverappio_pb2_grpc # pylint: disable=E0611
|
45
|
+
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
46
|
+
PullAppInputsRequest,
|
47
|
+
PullAppInputsResponse,
|
48
|
+
PullAppMessagesRequest,
|
49
|
+
PullAppMessagesResponse,
|
50
|
+
PushAppMessagesRequest,
|
51
|
+
PushAppMessagesResponse,
|
52
|
+
PushAppOutputsRequest,
|
53
|
+
PushAppOutputsResponse,
|
54
|
+
)
|
45
55
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
46
56
|
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
47
57
|
SendAppHeartbeatRequest,
|
@@ -72,14 +82,6 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
72
82
|
from flwr.proto.serverappio_pb2 import ( # pylint: disable=E0611
|
73
83
|
GetNodesRequest,
|
74
84
|
GetNodesResponse,
|
75
|
-
PullResMessagesRequest,
|
76
|
-
PullResMessagesResponse,
|
77
|
-
PullServerAppInputsRequest,
|
78
|
-
PullServerAppInputsResponse,
|
79
|
-
PushInsMessagesRequest,
|
80
|
-
PushInsMessagesResponse,
|
81
|
-
PushServerAppOutputsRequest,
|
82
|
-
PushServerAppOutputsResponse,
|
83
85
|
)
|
84
86
|
from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
|
85
87
|
from flwr.server.superlink.utils import abort_if
|
@@ -128,8 +130,8 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
128
130
|
return GetNodesResponse(nodes=nodes)
|
129
131
|
|
130
132
|
def PushMessages(
|
131
|
-
self, request:
|
132
|
-
) ->
|
133
|
+
self, request: PushAppMessagesRequest, context: grpc.ServicerContext
|
134
|
+
) -> PushAppMessagesResponse:
|
133
135
|
"""Push a set of Messages."""
|
134
136
|
log(DEBUG, "ServerAppIoServicer.PushMessages")
|
135
137
|
|
@@ -173,7 +175,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
173
175
|
# Store Message object to descendants mapping and preregister objects
|
174
176
|
objects_to_push = store_mapping_and_register_objects(store, request=request)
|
175
177
|
|
176
|
-
return
|
178
|
+
return PushAppMessagesResponse(
|
177
179
|
message_ids=[
|
178
180
|
str(message_id) if message_id else "" for message_id in message_ids
|
179
181
|
],
|
@@ -181,8 +183,8 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
181
183
|
)
|
182
184
|
|
183
185
|
def PullMessages( # pylint: disable=R0914
|
184
|
-
self, request:
|
185
|
-
) ->
|
186
|
+
self, request: PullAppMessagesRequest, context: grpc.ServicerContext
|
187
|
+
) -> PullAppMessagesResponse:
|
186
188
|
"""Pull a set of Messages."""
|
187
189
|
log(DEBUG, "ServerAppIoServicer.PullMessages")
|
188
190
|
|
@@ -253,7 +255,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
253
255
|
# Delete message ins from state
|
254
256
|
state.delete_messages(message_ins_ids={msg_object_id})
|
255
257
|
|
256
|
-
return
|
258
|
+
return PullAppMessagesResponse(
|
257
259
|
messages_list=messages_list, objects_to_pull=objects_to_pull
|
258
260
|
)
|
259
261
|
|
@@ -287,11 +289,11 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
287
289
|
|
288
290
|
raise ValueError(f"Found no FAB with hash: {request.hash_str}")
|
289
291
|
|
290
|
-
def
|
291
|
-
self, request:
|
292
|
-
) ->
|
292
|
+
def PullAppInputs(
|
293
|
+
self, request: PullAppInputsRequest, context: grpc.ServicerContext
|
294
|
+
) -> PullAppInputsResponse:
|
293
295
|
"""Pull ServerApp process inputs."""
|
294
|
-
log(DEBUG, "ServerAppIoServicer.
|
296
|
+
log(DEBUG, "ServerAppIoServicer.PullAppInputs")
|
295
297
|
# Init access to LinkState
|
296
298
|
state = self.state_factory.state()
|
297
299
|
|
@@ -301,7 +303,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
301
303
|
run_id = state.get_pending_run_id()
|
302
304
|
# If there's no pending run, return an empty response
|
303
305
|
if run_id is None:
|
304
|
-
return
|
306
|
+
return PullAppInputsResponse()
|
305
307
|
|
306
308
|
# Init access to Ffs
|
307
309
|
ffs = self.ffs_factory.ffs()
|
@@ -317,7 +319,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
317
319
|
# Update run status to STARTING
|
318
320
|
if state.update_run_status(run_id, RunStatus(Status.STARTING, "", "")):
|
319
321
|
log(INFO, "Starting run %d", run_id)
|
320
|
-
return
|
322
|
+
return PullAppInputsResponse(
|
321
323
|
context=context_to_proto(serverapp_ctxt),
|
322
324
|
run=run_to_proto(run),
|
323
325
|
fab=fab_to_proto(fab),
|
@@ -327,11 +329,11 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
327
329
|
# or if the status cannot be updated to STARTING
|
328
330
|
raise RuntimeError(f"Failed to start run {run_id}")
|
329
331
|
|
330
|
-
def
|
331
|
-
self, request:
|
332
|
-
) ->
|
332
|
+
def PushAppOutputs(
|
333
|
+
self, request: PushAppOutputsRequest, context: grpc.ServicerContext
|
334
|
+
) -> PushAppOutputsResponse:
|
333
335
|
"""Push ServerApp process outputs."""
|
334
|
-
log(DEBUG, "ServerAppIoServicer.
|
336
|
+
log(DEBUG, "ServerAppIoServicer.PushAppOutputs")
|
335
337
|
|
336
338
|
# Init state and store
|
337
339
|
state = self.state_factory.state()
|
@@ -347,7 +349,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
347
349
|
)
|
348
350
|
|
349
351
|
state.set_serverapp_context(request.run_id, context_from_proto(request.context))
|
350
|
-
return
|
352
|
+
return PushAppOutputsResponse()
|
351
353
|
|
352
354
|
def UpdateRunStatus(
|
353
355
|
self, request: UpdateRunStatusRequest, context: grpc.ServicerContext
|