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.

Files changed (42) hide show
  1. flwr/cli/app.py +2 -0
  2. flwr/cli/build.py +4 -15
  3. flwr/cli/config_utils.py +64 -7
  4. flwr/cli/install.py +211 -0
  5. flwr/cli/utils.py +14 -0
  6. flwr/client/app.py +18 -10
  7. flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  8. flwr/client/grpc_rere_client/connection.py +1 -2
  9. flwr/client/rest_client/connection.py +1 -2
  10. flwr/client/supernode/app.py +141 -38
  11. flwr/common/config.py +28 -0
  12. flwr/common/constant.py +2 -0
  13. flwr/common/object_ref.py +13 -9
  14. flwr/common/telemetry.py +4 -0
  15. flwr/proto/driver_pb2.py +20 -19
  16. flwr/proto/driver_pb2_grpc.py +35 -0
  17. flwr/proto/driver_pb2_grpc.pyi +14 -0
  18. flwr/proto/exec_pb2.py +30 -0
  19. flwr/proto/exec_pb2.pyi +32 -0
  20. flwr/proto/exec_pb2_grpc.py +67 -0
  21. flwr/proto/exec_pb2_grpc.pyi +27 -0
  22. flwr/proto/fleet_pb2.py +28 -33
  23. flwr/proto/fleet_pb2.pyi +0 -42
  24. flwr/proto/fleet_pb2_grpc.py +7 -6
  25. flwr/proto/fleet_pb2_grpc.pyi +5 -4
  26. flwr/proto/run_pb2.py +30 -0
  27. flwr/proto/run_pb2.pyi +52 -0
  28. flwr/proto/run_pb2_grpc.py +4 -0
  29. flwr/proto/run_pb2_grpc.pyi +4 -0
  30. flwr/server/__init__.py +0 -4
  31. flwr/server/app.py +16 -186
  32. flwr/server/superlink/driver/driver_servicer.py +7 -0
  33. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -2
  34. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -2
  35. flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
  36. flwr/server/superlink/fleet/rest_rere/rest_api.py +1 -1
  37. flwr/superexec/__init__.py +19 -0
  38. {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/METADATA +1 -1
  39. {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/RECORD +42 -31
  40. {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/entry_points.txt +1 -2
  41. {flwr_nightly-1.10.0.dev20240611.dist-info → flwr_nightly-1.10.0.dev20240613.dist-info}/LICENSE +0 -0
  42. {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\":\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.Run\"\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
+ 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=84
29
- _globals['_CREATENODEREQUEST']._serialized_end=126
30
- _globals['_CREATENODERESPONSE']._serialized_start=128
31
- _globals['_CREATENODERESPONSE']._serialized_end=180
32
- _globals['_DELETENODEREQUEST']._serialized_start=182
33
- _globals['_DELETENODEREQUEST']._serialized_end=233
34
- _globals['_DELETENODERESPONSE']._serialized_start=235
35
- _globals['_DELETENODERESPONSE']._serialized_end=255
36
- _globals['_PINGREQUEST']._serialized_start=257
37
- _globals['_PINGREQUEST']._serialized_end=325
38
- _globals['_PINGRESPONSE']._serialized_start=327
39
- _globals['_PINGRESPONSE']._serialized_end=358
40
- _globals['_PULLTASKINSREQUEST']._serialized_start=360
41
- _globals['_PULLTASKINSREQUEST']._serialized_end=430
42
- _globals['_PULLTASKINSRESPONSE']._serialized_start=432
43
- _globals['_PULLTASKINSRESPONSE']._serialized_end=539
44
- _globals['_PUSHTASKRESREQUEST']._serialized_start=541
45
- _globals['_PUSHTASKRESREQUEST']._serialized_end=605
46
- _globals['_PUSHTASKRESRESPONSE']._serialized_start=608
47
- _globals['_PUSHTASKRESRESPONSE']._serialized_end=782
48
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=736
49
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=782
50
- _globals['_RUN']._serialized_start=784
51
- _globals['_RUN']._serialized_end=842
52
- _globals['_GETRUNREQUEST']._serialized_start=844
53
- _globals['_GETRUNREQUEST']._serialized_end=875
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
@@ -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=flwr_dot_proto_dot_fleet__pb2.GetRunRequest.SerializeToString,
45
- response_deserializer=flwr_dot_proto_dot_fleet__pb2.GetRunResponse.FromString,
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=flwr_dot_proto_dot_fleet__pb2.GetRunRequest.FromString,
125
- response_serializer=flwr_dot_proto_dot_fleet__pb2.GetRunResponse.SerializeToString,
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
- flwr_dot_proto_dot_fleet__pb2.GetRunRequest.SerializeToString,
235
- flwr_dot_proto_dot_fleet__pb2.GetRunResponse.FromString,
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)
@@ -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.fleet_pb2.GetRunRequest,
41
- flwr.proto.fleet_pb2.GetRunResponse]
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.fleet_pb2.GetRunRequest,
88
+ request: flwr.proto.run_pb2.GetRunRequest,
88
89
  context: grpc.ServicerContext,
89
- ) -> flwr.proto.fleet_pb2.GetRunResponse: ...
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
@@ -0,0 +1,4 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
@@ -0,0 +1,4 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
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, warn_deprecated_feature
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
- parsed_driver_address = parse_address(args.driver_api_address)
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
- parsed_fleet_address = parse_address(args.fleet_api_address)
368
- if not parsed_fleet_address:
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
- fleet_host,
404
- fleet_port,
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