flwr-nightly 1.10.0.dev20240611__py3-none-any.whl → 1.10.0.dev20240613__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/cli/app.py +2 -0
- flwr/cli/build.py +4 -15
- flwr/cli/config_utils.py +64 -7
- flwr/cli/install.py +211 -0
- flwr/cli/utils.py +14 -0
- flwr/client/app.py +18 -10
- flwr/client/grpc_rere_client/client_interceptor.py +1 -1
- flwr/client/grpc_rere_client/connection.py +1 -2
- flwr/client/rest_client/connection.py +1 -2
- flwr/client/supernode/app.py +141 -38
- flwr/common/config.py +28 -0
- flwr/common/constant.py +2 -0
- flwr/common/object_ref.py +13 -9
- flwr/common/telemetry.py +4 -0
- flwr/proto/driver_pb2.py +20 -19
- flwr/proto/driver_pb2_grpc.py +35 -0
- flwr/proto/driver_pb2_grpc.pyi +14 -0
- flwr/proto/exec_pb2.py +30 -0
- flwr/proto/exec_pb2.pyi +32 -0
- flwr/proto/exec_pb2_grpc.py +67 -0
- flwr/proto/exec_pb2_grpc.pyi +27 -0
- flwr/proto/fleet_pb2.py +28 -33
- flwr/proto/fleet_pb2.pyi +0 -42
- flwr/proto/fleet_pb2_grpc.py +7 -6
- flwr/proto/fleet_pb2_grpc.pyi +5 -4
- flwr/proto/run_pb2.py +30 -0
- flwr/proto/run_pb2.pyi +52 -0
- flwr/proto/run_pb2_grpc.py +4 -0
- flwr/proto/run_pb2_grpc.pyi +4 -0
- flwr/server/__init__.py +0 -4
- flwr/server/app.py +16 -186
- flwr/server/superlink/driver/driver_servicer.py +7 -0
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -2
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -2
- flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
- flwr/server/superlink/fleet/rest_rere/rest_api.py +1 -1
- flwr/superexec/__init__.py +19 -0
- {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/METADATA +1 -1
- {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/RECORD +42 -31
- {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/entry_points.txt +1 -2
- {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/WHEEL +0 -0
flwr/proto/fleet_pb2.py
CHANGED
|
@@ -14,9 +14,10 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
|
16
16
|
from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
|
|
17
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"@\n\x12PushTaskResRequest\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"
|
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"@\n\x12PushTaskResRequest\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xc9\x03\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x62\x06proto3')
|
|
20
21
|
|
|
21
22
|
_globals = globals()
|
|
22
23
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -25,36 +26,30 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
25
26
|
DESCRIPTOR._options = None
|
|
26
27
|
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._options = None
|
|
27
28
|
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
|
|
28
|
-
_globals['_CREATENODEREQUEST']._serialized_start=
|
|
29
|
-
_globals['_CREATENODEREQUEST']._serialized_end=
|
|
30
|
-
_globals['_CREATENODERESPONSE']._serialized_start=
|
|
31
|
-
_globals['_CREATENODERESPONSE']._serialized_end=
|
|
32
|
-
_globals['_DELETENODEREQUEST']._serialized_start=
|
|
33
|
-
_globals['_DELETENODEREQUEST']._serialized_end=
|
|
34
|
-
_globals['_DELETENODERESPONSE']._serialized_start=
|
|
35
|
-
_globals['_DELETENODERESPONSE']._serialized_end=
|
|
36
|
-
_globals['_PINGREQUEST']._serialized_start=
|
|
37
|
-
_globals['_PINGREQUEST']._serialized_end=
|
|
38
|
-
_globals['_PINGRESPONSE']._serialized_start=
|
|
39
|
-
_globals['_PINGRESPONSE']._serialized_end=
|
|
40
|
-
_globals['_PULLTASKINSREQUEST']._serialized_start=
|
|
41
|
-
_globals['_PULLTASKINSREQUEST']._serialized_end=
|
|
42
|
-
_globals['_PULLTASKINSRESPONSE']._serialized_start=
|
|
43
|
-
_globals['_PULLTASKINSRESPONSE']._serialized_end=
|
|
44
|
-
_globals['_PUSHTASKRESREQUEST']._serialized_start=
|
|
45
|
-
_globals['_PUSHTASKRESREQUEST']._serialized_end=
|
|
46
|
-
_globals['_PUSHTASKRESRESPONSE']._serialized_start=
|
|
47
|
-
_globals['_PUSHTASKRESRESPONSE']._serialized_end=
|
|
48
|
-
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=
|
|
49
|
-
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=
|
|
50
|
-
_globals['
|
|
51
|
-
_globals['
|
|
52
|
-
_globals['
|
|
53
|
-
_globals['
|
|
54
|
-
_globals['_GETRUNRESPONSE']._serialized_start=877
|
|
55
|
-
_globals['_GETRUNRESPONSE']._serialized_end=923
|
|
56
|
-
_globals['_RECONNECT']._serialized_start=925
|
|
57
|
-
_globals['_RECONNECT']._serialized_end=955
|
|
58
|
-
_globals['_FLEET']._serialized_start=958
|
|
59
|
-
_globals['_FLEET']._serialized_end=1415
|
|
29
|
+
_globals['_CREATENODEREQUEST']._serialized_start=106
|
|
30
|
+
_globals['_CREATENODEREQUEST']._serialized_end=148
|
|
31
|
+
_globals['_CREATENODERESPONSE']._serialized_start=150
|
|
32
|
+
_globals['_CREATENODERESPONSE']._serialized_end=202
|
|
33
|
+
_globals['_DELETENODEREQUEST']._serialized_start=204
|
|
34
|
+
_globals['_DELETENODEREQUEST']._serialized_end=255
|
|
35
|
+
_globals['_DELETENODERESPONSE']._serialized_start=257
|
|
36
|
+
_globals['_DELETENODERESPONSE']._serialized_end=277
|
|
37
|
+
_globals['_PINGREQUEST']._serialized_start=279
|
|
38
|
+
_globals['_PINGREQUEST']._serialized_end=347
|
|
39
|
+
_globals['_PINGRESPONSE']._serialized_start=349
|
|
40
|
+
_globals['_PINGRESPONSE']._serialized_end=380
|
|
41
|
+
_globals['_PULLTASKINSREQUEST']._serialized_start=382
|
|
42
|
+
_globals['_PULLTASKINSREQUEST']._serialized_end=452
|
|
43
|
+
_globals['_PULLTASKINSRESPONSE']._serialized_start=454
|
|
44
|
+
_globals['_PULLTASKINSRESPONSE']._serialized_end=561
|
|
45
|
+
_globals['_PUSHTASKRESREQUEST']._serialized_start=563
|
|
46
|
+
_globals['_PUSHTASKRESREQUEST']._serialized_end=627
|
|
47
|
+
_globals['_PUSHTASKRESRESPONSE']._serialized_start=630
|
|
48
|
+
_globals['_PUSHTASKRESRESPONSE']._serialized_end=804
|
|
49
|
+
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=758
|
|
50
|
+
_globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=804
|
|
51
|
+
_globals['_RECONNECT']._serialized_start=806
|
|
52
|
+
_globals['_RECONNECT']._serialized_end=836
|
|
53
|
+
_globals['_FLEET']._serialized_start=839
|
|
54
|
+
_globals['_FLEET']._serialized_end=1296
|
|
60
55
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/fleet_pb2.pyi
CHANGED
|
@@ -164,48 +164,6 @@ class PushTaskResResponse(google.protobuf.message.Message):
|
|
|
164
164
|
def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
|
|
165
165
|
global___PushTaskResResponse = PushTaskResResponse
|
|
166
166
|
|
|
167
|
-
class Run(google.protobuf.message.Message):
|
|
168
|
-
"""GetRun messages"""
|
|
169
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
170
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
|
171
|
-
FAB_ID_FIELD_NUMBER: builtins.int
|
|
172
|
-
FAB_VERSION_FIELD_NUMBER: builtins.int
|
|
173
|
-
run_id: builtins.int
|
|
174
|
-
fab_id: typing.Text
|
|
175
|
-
fab_version: typing.Text
|
|
176
|
-
def __init__(self,
|
|
177
|
-
*,
|
|
178
|
-
run_id: builtins.int = ...,
|
|
179
|
-
fab_id: typing.Text = ...,
|
|
180
|
-
fab_version: typing.Text = ...,
|
|
181
|
-
) -> None: ...
|
|
182
|
-
def ClearField(self, field_name: typing_extensions.Literal["fab_id",b"fab_id","fab_version",b"fab_version","run_id",b"run_id"]) -> None: ...
|
|
183
|
-
global___Run = Run
|
|
184
|
-
|
|
185
|
-
class GetRunRequest(google.protobuf.message.Message):
|
|
186
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
187
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
|
188
|
-
run_id: builtins.int
|
|
189
|
-
def __init__(self,
|
|
190
|
-
*,
|
|
191
|
-
run_id: builtins.int = ...,
|
|
192
|
-
) -> None: ...
|
|
193
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
194
|
-
global___GetRunRequest = GetRunRequest
|
|
195
|
-
|
|
196
|
-
class GetRunResponse(google.protobuf.message.Message):
|
|
197
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
198
|
-
RUN_FIELD_NUMBER: builtins.int
|
|
199
|
-
@property
|
|
200
|
-
def run(self) -> global___Run: ...
|
|
201
|
-
def __init__(self,
|
|
202
|
-
*,
|
|
203
|
-
run: typing.Optional[global___Run] = ...,
|
|
204
|
-
) -> None: ...
|
|
205
|
-
def HasField(self, field_name: typing_extensions.Literal["run",b"run"]) -> builtins.bool: ...
|
|
206
|
-
def ClearField(self, field_name: typing_extensions.Literal["run",b"run"]) -> None: ...
|
|
207
|
-
global___GetRunResponse = GetRunResponse
|
|
208
|
-
|
|
209
167
|
class Reconnect(google.protobuf.message.Message):
|
|
210
168
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
211
169
|
RECONNECT_FIELD_NUMBER: builtins.int
|
flwr/proto/fleet_pb2_grpc.py
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import grpc
|
|
4
4
|
|
|
5
5
|
from flwr.proto import fleet_pb2 as flwr_dot_proto_dot_fleet__pb2
|
|
6
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class FleetStub(object):
|
|
@@ -41,8 +42,8 @@ class FleetStub(object):
|
|
|
41
42
|
)
|
|
42
43
|
self.GetRun = channel.unary_unary(
|
|
43
44
|
'/flwr.proto.Fleet/GetRun',
|
|
44
|
-
request_serializer=
|
|
45
|
-
response_deserializer=
|
|
45
|
+
request_serializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.SerializeToString,
|
|
46
|
+
response_deserializer=flwr_dot_proto_dot_run__pb2.GetRunResponse.FromString,
|
|
46
47
|
)
|
|
47
48
|
|
|
48
49
|
|
|
@@ -121,8 +122,8 @@ def add_FleetServicer_to_server(servicer, server):
|
|
|
121
122
|
),
|
|
122
123
|
'GetRun': grpc.unary_unary_rpc_method_handler(
|
|
123
124
|
servicer.GetRun,
|
|
124
|
-
request_deserializer=
|
|
125
|
-
response_serializer=
|
|
125
|
+
request_deserializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.FromString,
|
|
126
|
+
response_serializer=flwr_dot_proto_dot_run__pb2.GetRunResponse.SerializeToString,
|
|
126
127
|
),
|
|
127
128
|
}
|
|
128
129
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
@@ -231,7 +232,7 @@ class Fleet(object):
|
|
|
231
232
|
timeout=None,
|
|
232
233
|
metadata=None):
|
|
233
234
|
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/GetRun',
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
flwr_dot_proto_dot_run__pb2.GetRunRequest.SerializeToString,
|
|
236
|
+
flwr_dot_proto_dot_run__pb2.GetRunResponse.FromString,
|
|
236
237
|
options, channel_credentials,
|
|
237
238
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
flwr/proto/fleet_pb2_grpc.pyi
CHANGED
|
@@ -4,6 +4,7 @@ isort:skip_file
|
|
|
4
4
|
"""
|
|
5
5
|
import abc
|
|
6
6
|
import flwr.proto.fleet_pb2
|
|
7
|
+
import flwr.proto.run_pb2
|
|
7
8
|
import grpc
|
|
8
9
|
|
|
9
10
|
class FleetStub:
|
|
@@ -37,8 +38,8 @@ class FleetStub:
|
|
|
37
38
|
"""
|
|
38
39
|
|
|
39
40
|
GetRun: grpc.UnaryUnaryMultiCallable[
|
|
40
|
-
flwr.proto.
|
|
41
|
-
flwr.proto.
|
|
41
|
+
flwr.proto.run_pb2.GetRunRequest,
|
|
42
|
+
flwr.proto.run_pb2.GetRunResponse]
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
class FleetServicer(metaclass=abc.ABCMeta):
|
|
@@ -84,9 +85,9 @@ class FleetServicer(metaclass=abc.ABCMeta):
|
|
|
84
85
|
|
|
85
86
|
@abc.abstractmethod
|
|
86
87
|
def GetRun(self,
|
|
87
|
-
request: flwr.proto.
|
|
88
|
+
request: flwr.proto.run_pb2.GetRunRequest,
|
|
88
89
|
context: grpc.ServicerContext,
|
|
89
|
-
) -> flwr.proto.
|
|
90
|
+
) -> flwr.proto.run_pb2.GetRunResponse: ...
|
|
90
91
|
|
|
91
92
|
|
|
92
93
|
def add_FleetServicer_to_server(servicer: FleetServicer, server: grpc.Server) -> None: ...
|
flwr/proto/run_pb2.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: flwr/proto/run.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.0
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\":\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\"\x1f\n\rGetRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x12\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Runb\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.run_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_RUN']._serialized_start=36
|
|
25
|
+
_globals['_RUN']._serialized_end=94
|
|
26
|
+
_globals['_GETRUNREQUEST']._serialized_start=96
|
|
27
|
+
_globals['_GETRUNREQUEST']._serialized_end=127
|
|
28
|
+
_globals['_GETRUNRESPONSE']._serialized_start=129
|
|
29
|
+
_globals['_GETRUNRESPONSE']._serialized_end=175
|
|
30
|
+
# @@protoc_insertion_point(module_scope)
|
flwr/proto/run_pb2.pyi
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import builtins
|
|
6
|
+
import google.protobuf.descriptor
|
|
7
|
+
import google.protobuf.message
|
|
8
|
+
import typing
|
|
9
|
+
import typing_extensions
|
|
10
|
+
|
|
11
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
12
|
+
|
|
13
|
+
class Run(google.protobuf.message.Message):
|
|
14
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
15
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
|
16
|
+
FAB_ID_FIELD_NUMBER: builtins.int
|
|
17
|
+
FAB_VERSION_FIELD_NUMBER: builtins.int
|
|
18
|
+
run_id: builtins.int
|
|
19
|
+
fab_id: typing.Text
|
|
20
|
+
fab_version: typing.Text
|
|
21
|
+
def __init__(self,
|
|
22
|
+
*,
|
|
23
|
+
run_id: builtins.int = ...,
|
|
24
|
+
fab_id: typing.Text = ...,
|
|
25
|
+
fab_version: typing.Text = ...,
|
|
26
|
+
) -> None: ...
|
|
27
|
+
def ClearField(self, field_name: typing_extensions.Literal["fab_id",b"fab_id","fab_version",b"fab_version","run_id",b"run_id"]) -> None: ...
|
|
28
|
+
global___Run = Run
|
|
29
|
+
|
|
30
|
+
class GetRunRequest(google.protobuf.message.Message):
|
|
31
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
32
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
|
33
|
+
run_id: builtins.int
|
|
34
|
+
def __init__(self,
|
|
35
|
+
*,
|
|
36
|
+
run_id: builtins.int = ...,
|
|
37
|
+
) -> None: ...
|
|
38
|
+
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
39
|
+
global___GetRunRequest = GetRunRequest
|
|
40
|
+
|
|
41
|
+
class GetRunResponse(google.protobuf.message.Message):
|
|
42
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
43
|
+
RUN_FIELD_NUMBER: builtins.int
|
|
44
|
+
@property
|
|
45
|
+
def run(self) -> global___Run: ...
|
|
46
|
+
def __init__(self,
|
|
47
|
+
*,
|
|
48
|
+
run: typing.Optional[global___Run] = ...,
|
|
49
|
+
) -> None: ...
|
|
50
|
+
def HasField(self, field_name: typing_extensions.Literal["run",b"run"]) -> builtins.bool: ...
|
|
51
|
+
def ClearField(self, field_name: typing_extensions.Literal["run",b"run"]) -> None: ...
|
|
52
|
+
global___GetRunResponse = GetRunResponse
|
flwr/server/__init__.py
CHANGED
|
@@ -17,8 +17,6 @@
|
|
|
17
17
|
|
|
18
18
|
from . import strategy
|
|
19
19
|
from . import workflow as workflow
|
|
20
|
-
from .app import run_driver_api as run_driver_api
|
|
21
|
-
from .app import run_fleet_api as run_fleet_api
|
|
22
20
|
from .app import run_superlink as run_superlink
|
|
23
21
|
from .app import start_server as start_server
|
|
24
22
|
from .client_manager import ClientManager as ClientManager
|
|
@@ -36,8 +34,6 @@ __all__ = [
|
|
|
36
34
|
"Driver",
|
|
37
35
|
"History",
|
|
38
36
|
"LegacyContext",
|
|
39
|
-
"run_driver_api",
|
|
40
|
-
"run_fleet_api",
|
|
41
37
|
"run_server_app",
|
|
42
38
|
"run_superlink",
|
|
43
39
|
"Server",
|
flwr/server/app.py
CHANGED
|
@@ -40,7 +40,7 @@ from flwr.common.constant import (
|
|
|
40
40
|
TRANSPORT_TYPE_REST,
|
|
41
41
|
)
|
|
42
42
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
43
|
-
from flwr.common.logger import log
|
|
43
|
+
from flwr.common.logger import log
|
|
44
44
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
45
45
|
private_key_to_bytes,
|
|
46
46
|
public_key_to_bytes,
|
|
@@ -190,139 +190,6 @@ def start_server( # pylint: disable=too-many-arguments,too-many-locals
|
|
|
190
190
|
return hist
|
|
191
191
|
|
|
192
192
|
|
|
193
|
-
def run_driver_api() -> None:
|
|
194
|
-
"""Run Flower server (Driver API)."""
|
|
195
|
-
log(INFO, "Starting Flower server (Driver API)")
|
|
196
|
-
# Running `flower-driver-api` is deprecated
|
|
197
|
-
warn_deprecated_feature("flower-driver-api")
|
|
198
|
-
log(WARN, "Use `flower-superlink` instead")
|
|
199
|
-
event(EventType.RUN_DRIVER_API_ENTER)
|
|
200
|
-
args = _parse_args_run_driver_api().parse_args()
|
|
201
|
-
|
|
202
|
-
# Parse IP address
|
|
203
|
-
parsed_address = parse_address(args.driver_api_address)
|
|
204
|
-
if not parsed_address:
|
|
205
|
-
sys.exit(f"Driver IP address ({args.driver_api_address}) cannot be parsed.")
|
|
206
|
-
host, port, is_v6 = parsed_address
|
|
207
|
-
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
208
|
-
|
|
209
|
-
# Obtain certificates
|
|
210
|
-
certificates = _try_obtain_certificates(args)
|
|
211
|
-
|
|
212
|
-
# Initialize StateFactory
|
|
213
|
-
state_factory = StateFactory(args.database)
|
|
214
|
-
|
|
215
|
-
# Start server
|
|
216
|
-
grpc_server: grpc.Server = run_driver_api_grpc(
|
|
217
|
-
address=address,
|
|
218
|
-
state_factory=state_factory,
|
|
219
|
-
certificates=certificates,
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Graceful shutdown
|
|
223
|
-
register_exit_handlers(
|
|
224
|
-
event_type=EventType.RUN_DRIVER_API_LEAVE,
|
|
225
|
-
grpc_servers=[grpc_server],
|
|
226
|
-
bckg_threads=[],
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
# Block
|
|
230
|
-
grpc_server.wait_for_termination()
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
# pylint: disable=too-many-locals
|
|
234
|
-
def run_fleet_api() -> None:
|
|
235
|
-
"""Run Flower server (Fleet API)."""
|
|
236
|
-
log(INFO, "Starting Flower server (Fleet API)")
|
|
237
|
-
# Running `flower-fleet-api` is deprecated
|
|
238
|
-
warn_deprecated_feature("flower-fleet-api")
|
|
239
|
-
log(WARN, "Use `flower-superlink` instead")
|
|
240
|
-
event(EventType.RUN_FLEET_API_ENTER)
|
|
241
|
-
args = _parse_args_run_fleet_api().parse_args()
|
|
242
|
-
|
|
243
|
-
# Obtain certificates
|
|
244
|
-
certificates = _try_obtain_certificates(args)
|
|
245
|
-
|
|
246
|
-
# Initialize StateFactory
|
|
247
|
-
state_factory = StateFactory(args.database)
|
|
248
|
-
|
|
249
|
-
grpc_servers = []
|
|
250
|
-
bckg_threads = []
|
|
251
|
-
|
|
252
|
-
address_arg = args.fleet_api_address
|
|
253
|
-
parsed_address = parse_address(address_arg)
|
|
254
|
-
if not parsed_address:
|
|
255
|
-
sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
|
|
256
|
-
host, port, is_v6 = parsed_address
|
|
257
|
-
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
258
|
-
|
|
259
|
-
num_workers = args.fleet_api_num_workers
|
|
260
|
-
if num_workers != 1:
|
|
261
|
-
log(
|
|
262
|
-
WARN,
|
|
263
|
-
"The Fleet API currently supports only 1 worker. "
|
|
264
|
-
"You have specified %d workers. "
|
|
265
|
-
"Support for multiple workers will be added in future releases. "
|
|
266
|
-
"Proceeding with a single worker.",
|
|
267
|
-
args.fleet_api_num_workers,
|
|
268
|
-
)
|
|
269
|
-
num_workers = 1
|
|
270
|
-
|
|
271
|
-
# Start Fleet API
|
|
272
|
-
if args.fleet_api_type == TRANSPORT_TYPE_REST:
|
|
273
|
-
if (
|
|
274
|
-
importlib.util.find_spec("requests")
|
|
275
|
-
and importlib.util.find_spec("starlette")
|
|
276
|
-
and importlib.util.find_spec("uvicorn")
|
|
277
|
-
) is None:
|
|
278
|
-
sys.exit(MISSING_EXTRA_REST)
|
|
279
|
-
|
|
280
|
-
_, ssl_certfile, ssl_keyfile = (
|
|
281
|
-
certificates if certificates is not None else (None, None, None)
|
|
282
|
-
)
|
|
283
|
-
fleet_thread = threading.Thread(
|
|
284
|
-
target=_run_fleet_api_rest,
|
|
285
|
-
args=(
|
|
286
|
-
host,
|
|
287
|
-
port,
|
|
288
|
-
ssl_keyfile,
|
|
289
|
-
ssl_certfile,
|
|
290
|
-
state_factory,
|
|
291
|
-
num_workers,
|
|
292
|
-
),
|
|
293
|
-
)
|
|
294
|
-
fleet_thread.start()
|
|
295
|
-
bckg_threads.append(fleet_thread)
|
|
296
|
-
elif args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE:
|
|
297
|
-
address_arg = args.grpc_rere_fleet_api_address
|
|
298
|
-
parsed_address = parse_address(address_arg)
|
|
299
|
-
if not parsed_address:
|
|
300
|
-
sys.exit(f"Fleet IP address ({address_arg}) cannot be parsed.")
|
|
301
|
-
host, port, is_v6 = parsed_address
|
|
302
|
-
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
303
|
-
fleet_server = _run_fleet_api_grpc_rere(
|
|
304
|
-
address=address,
|
|
305
|
-
state_factory=state_factory,
|
|
306
|
-
certificates=certificates,
|
|
307
|
-
)
|
|
308
|
-
grpc_servers.append(fleet_server)
|
|
309
|
-
else:
|
|
310
|
-
raise ValueError(f"Unknown fleet_api_type: {args.fleet_api_type}")
|
|
311
|
-
|
|
312
|
-
# Graceful shutdown
|
|
313
|
-
register_exit_handlers(
|
|
314
|
-
event_type=EventType.RUN_FLEET_API_LEAVE,
|
|
315
|
-
grpc_servers=grpc_servers,
|
|
316
|
-
bckg_threads=bckg_threads,
|
|
317
|
-
)
|
|
318
|
-
|
|
319
|
-
# Block
|
|
320
|
-
if len(grpc_servers) > 0:
|
|
321
|
-
grpc_servers[0].wait_for_termination()
|
|
322
|
-
elif len(bckg_threads) > 0:
|
|
323
|
-
bckg_threads[0].join()
|
|
324
|
-
|
|
325
|
-
|
|
326
193
|
# pylint: disable=too-many-branches, too-many-locals, too-many-statements
|
|
327
194
|
def run_superlink() -> None:
|
|
328
195
|
"""Run Flower SuperLink (Driver API and Fleet API)."""
|
|
@@ -333,15 +200,7 @@ def run_superlink() -> None:
|
|
|
333
200
|
args = _parse_args_run_superlink().parse_args()
|
|
334
201
|
|
|
335
202
|
# Parse IP address
|
|
336
|
-
|
|
337
|
-
if not parsed_driver_address:
|
|
338
|
-
sys.exit(f"Driver IP address ({args.driver_api_address}) cannot be parsed.")
|
|
339
|
-
driver_host, driver_port, driver_is_v6 = parsed_driver_address
|
|
340
|
-
driver_address = (
|
|
341
|
-
f"[{driver_host}]:{driver_port}"
|
|
342
|
-
if driver_is_v6
|
|
343
|
-
else f"{driver_host}:{driver_port}"
|
|
344
|
-
)
|
|
203
|
+
driver_address, _, _ = _format_address(args.driver_api_address)
|
|
345
204
|
|
|
346
205
|
# Obtain certificates
|
|
347
206
|
certificates = _try_obtain_certificates(args)
|
|
@@ -364,13 +223,8 @@ def run_superlink() -> None:
|
|
|
364
223
|
if args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE
|
|
365
224
|
else ADDRESS_FLEET_API_REST
|
|
366
225
|
)
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
sys.exit(f"Fleet IP address ({args.fleet_api_address}) cannot be parsed.")
|
|
370
|
-
fleet_host, fleet_port, fleet_is_v6 = parsed_fleet_address
|
|
371
|
-
fleet_address = (
|
|
372
|
-
f"[{fleet_host}]:{fleet_port}" if fleet_is_v6 else f"{fleet_host}:{fleet_port}"
|
|
373
|
-
)
|
|
226
|
+
|
|
227
|
+
fleet_address, host, port = _format_address(args.fleet_api_address)
|
|
374
228
|
|
|
375
229
|
num_workers = args.fleet_api_num_workers
|
|
376
230
|
if num_workers != 1:
|
|
@@ -400,8 +254,8 @@ def run_superlink() -> None:
|
|
|
400
254
|
fleet_thread = threading.Thread(
|
|
401
255
|
target=_run_fleet_api_rest,
|
|
402
256
|
args=(
|
|
403
|
-
|
|
404
|
-
|
|
257
|
+
host,
|
|
258
|
+
port,
|
|
405
259
|
ssl_keyfile,
|
|
406
260
|
ssl_certfile,
|
|
407
261
|
state_factory,
|
|
@@ -458,6 +312,16 @@ def run_superlink() -> None:
|
|
|
458
312
|
driver_server.wait_for_termination(timeout=1)
|
|
459
313
|
|
|
460
314
|
|
|
315
|
+
def _format_address(address: str) -> Tuple[str, str, int]:
|
|
316
|
+
parsed_address = parse_address(address)
|
|
317
|
+
if not parsed_address:
|
|
318
|
+
sys.exit(
|
|
319
|
+
f"Address ({address}) cannot be parsed (expected: URL or IPv4 or IPv6)."
|
|
320
|
+
)
|
|
321
|
+
host, port, is_v6 = parsed_address
|
|
322
|
+
return (f"[{host}]:{port}" if is_v6 else f"{host}:{port}", host, port)
|
|
323
|
+
|
|
324
|
+
|
|
461
325
|
def _try_setup_client_authentication(
|
|
462
326
|
args: argparse.Namespace,
|
|
463
327
|
certificates: Optional[Tuple[bytes, bytes, bytes]],
|
|
@@ -661,40 +525,6 @@ def _run_fleet_api_rest(
|
|
|
661
525
|
)
|
|
662
526
|
|
|
663
527
|
|
|
664
|
-
def _parse_args_run_driver_api() -> argparse.ArgumentParser:
|
|
665
|
-
"""Parse command line arguments for Driver API."""
|
|
666
|
-
parser = argparse.ArgumentParser(
|
|
667
|
-
description="Start a Flower Driver API server. "
|
|
668
|
-
"This server will be responsible for "
|
|
669
|
-
"receiving TaskIns from the Driver script and "
|
|
670
|
-
"sending them to the Fleet API. Once the client nodes "
|
|
671
|
-
"are done, they will send the TaskRes back to this Driver API server (through"
|
|
672
|
-
" the Fleet API) which will then send them back to the Driver script.",
|
|
673
|
-
)
|
|
674
|
-
|
|
675
|
-
_add_args_common(parser=parser)
|
|
676
|
-
_add_args_driver_api(parser=parser)
|
|
677
|
-
|
|
678
|
-
return parser
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
def _parse_args_run_fleet_api() -> argparse.ArgumentParser:
|
|
682
|
-
"""Parse command line arguments for Fleet API."""
|
|
683
|
-
parser = argparse.ArgumentParser(
|
|
684
|
-
description="Start a Flower Fleet API server."
|
|
685
|
-
"This server will be responsible for "
|
|
686
|
-
"sending TaskIns (received from the Driver API) to the client nodes "
|
|
687
|
-
"and of receiving TaskRes sent back from those same client nodes once "
|
|
688
|
-
"they are done. Then, this Fleet API server can send those "
|
|
689
|
-
"TaskRes back to the Driver API.",
|
|
690
|
-
)
|
|
691
|
-
|
|
692
|
-
_add_args_common(parser=parser)
|
|
693
|
-
_add_args_fleet_api(parser=parser)
|
|
694
|
-
|
|
695
|
-
return parser
|
|
696
|
-
|
|
697
|
-
|
|
698
528
|
def _parse_args_run_superlink() -> argparse.ArgumentParser:
|
|
699
529
|
"""Parse command line arguments for both Driver API and Fleet API."""
|
|
700
530
|
parser = argparse.ArgumentParser(
|
|
@@ -35,6 +35,7 @@ from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
|
35
35
|
PushTaskInsResponse,
|
|
36
36
|
)
|
|
37
37
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
38
|
+
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
|
38
39
|
from flwr.proto.task_pb2 import TaskRes # pylint: disable=E0611
|
|
39
40
|
from flwr.server.superlink.state import State, StateFactory
|
|
40
41
|
from flwr.server.utils.validator import validate_task_ins_or_res
|
|
@@ -129,6 +130,12 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
|
|
|
129
130
|
context.set_code(grpc.StatusCode.OK)
|
|
130
131
|
return PullTaskResResponse(task_res_list=task_res_list)
|
|
131
132
|
|
|
133
|
+
def GetRun(
|
|
134
|
+
self, request: GetRunRequest, context: grpc.ServicerContext
|
|
135
|
+
) -> GetRunResponse:
|
|
136
|
+
"""Get run information."""
|
|
137
|
+
raise NotImplementedError
|
|
138
|
+
|
|
132
139
|
|
|
133
140
|
def _raise_if(validation_error: bool, detail: str) -> None:
|
|
134
141
|
if validation_error:
|
|
@@ -26,8 +26,6 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
26
26
|
CreateNodeResponse,
|
|
27
27
|
DeleteNodeRequest,
|
|
28
28
|
DeleteNodeResponse,
|
|
29
|
-
GetRunRequest,
|
|
30
|
-
GetRunResponse,
|
|
31
29
|
PingRequest,
|
|
32
30
|
PingResponse,
|
|
33
31
|
PullTaskInsRequest,
|
|
@@ -35,6 +33,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
35
33
|
PushTaskResRequest,
|
|
36
34
|
PushTaskResResponse,
|
|
37
35
|
)
|
|
36
|
+
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
|
38
37
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
|
39
38
|
from flwr.server.superlink.state import StateFactory
|
|
40
39
|
|
|
@@ -34,8 +34,6 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
34
34
|
CreateNodeResponse,
|
|
35
35
|
DeleteNodeRequest,
|
|
36
36
|
DeleteNodeResponse,
|
|
37
|
-
GetRunRequest,
|
|
38
|
-
GetRunResponse,
|
|
39
37
|
PingRequest,
|
|
40
38
|
PingResponse,
|
|
41
39
|
PullTaskInsRequest,
|
|
@@ -44,6 +42,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
44
42
|
PushTaskResResponse,
|
|
45
43
|
)
|
|
46
44
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
45
|
+
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
|
47
46
|
from flwr.server.superlink.state import State
|
|
48
47
|
|
|
49
48
|
_PUBLIC_KEY_HEADER = "public-key"
|
|
@@ -24,8 +24,6 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
24
24
|
CreateNodeResponse,
|
|
25
25
|
DeleteNodeRequest,
|
|
26
26
|
DeleteNodeResponse,
|
|
27
|
-
GetRunRequest,
|
|
28
|
-
GetRunResponse,
|
|
29
27
|
PingRequest,
|
|
30
28
|
PingResponse,
|
|
31
29
|
PullTaskInsRequest,
|
|
@@ -33,9 +31,13 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
33
31
|
PushTaskResRequest,
|
|
34
32
|
PushTaskResResponse,
|
|
35
33
|
Reconnect,
|
|
36
|
-
Run,
|
|
37
34
|
)
|
|
38
35
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
36
|
+
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
37
|
+
GetRunRequest,
|
|
38
|
+
GetRunResponse,
|
|
39
|
+
Run,
|
|
40
|
+
)
|
|
39
41
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
|
40
42
|
from flwr.server.superlink.state import State
|
|
41
43
|
|
|
@@ -21,11 +21,11 @@ from flwr.common.constant import MISSING_EXTRA_REST
|
|
|
21
21
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
22
22
|
CreateNodeRequest,
|
|
23
23
|
DeleteNodeRequest,
|
|
24
|
-
GetRunRequest,
|
|
25
24
|
PingRequest,
|
|
26
25
|
PullTaskInsRequest,
|
|
27
26
|
PushTaskResRequest,
|
|
28
27
|
)
|
|
28
|
+
from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
|
|
29
29
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
|
30
30
|
from flwr.server.superlink.state import State
|
|
31
31
|
|