flwr-nightly 1.19.0.dev20250522__py3-none-any.whl → 1.19.0.dev20250523__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/proto/run_pb2.py +19 -27
- flwr/proto/run_pb2.pyi +0 -51
- flwr/proto/serverappio_pb2.py +2 -2
- flwr/proto/serverappio_pb2_grpc.py +0 -34
- flwr/proto/serverappio_pb2_grpc.pyi +0 -13
- flwr/server/superlink/serverappio/serverappio_servicer.py +1 -31
- flwr/{client/supernode → supernode/cli}/__init__.py +3 -5
- flwr/{client/supernode/app.py → supernode/cli/flower_supernode.py} +2 -2
- flwr/{client → supernode}/start_client_internal.py +154 -163
- {flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/METADATA +1 -1
- {flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/RECORD +13 -13
- {flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/entry_points.txt +1 -1
- {flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/WHEEL +0 -0
flwr/proto/run_pb2.py
CHANGED
@@ -18,7 +18,7 @@ from flwr.proto import recorddict_pb2 as flwr_dot_proto_dot_recorddict__pb2
|
|
18
18
|
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
19
19
|
|
20
20
|
|
21
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xce\x02\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x12\x12\n\npending_at\x18\x06 \x01(\t\x12\x13\n\x0bstarting_at\x18\x07 \x01(\t\x12\x12\n\nrunning_at\x18\x08 \x01(\t\x12\x13\n\x0b\x66inished_at\x18\t \x01(\t\x12%\n\x06status\x18\n \x01(\x0b\x32\x15.flwr.proto.RunStatus\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"
|
21
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xce\x02\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x12\x12\n\npending_at\x18\x06 \x01(\t\x12\x13\n\x0bstarting_at\x18\x07 \x01(\t\x12\x12\n\nrunning_at\x18\x08 \x01(\t\x12\x13\n\x0b\x66inished_at\x18\t \x01(\t\x12%\n\x06status\x18\n \x01(\x0b\x32\x15.flwr.proto.RunStatus\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\"-\n\x1bGetFederationOptionsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"T\n\x1cGetFederationOptionsResponse\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x01 \x01(\x0b\x32\x18.flwr.proto.ConfigRecordb\x06proto3')
|
22
22
|
|
23
23
|
_globals = globals()
|
24
24
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -27,8 +27,6 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
27
27
|
DESCRIPTOR._options = None
|
28
28
|
_globals['_RUN_OVERRIDECONFIGENTRY']._options = None
|
29
29
|
_globals['_RUN_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
|
30
|
-
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._options = None
|
31
|
-
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
|
32
30
|
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._options = None
|
33
31
|
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_options = b'8\001'
|
34
32
|
_globals['_RUN']._serialized_start=139
|
@@ -37,28 +35,22 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
37
35
|
_globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=473
|
38
36
|
_globals['_RUNSTATUS']._serialized_start=475
|
39
37
|
_globals['_RUNSTATUS']._serialized_end=539
|
40
|
-
_globals['
|
41
|
-
_globals['
|
42
|
-
_globals['
|
43
|
-
_globals['
|
44
|
-
_globals['
|
45
|
-
_globals['
|
46
|
-
_globals['
|
47
|
-
_globals['
|
48
|
-
_globals['
|
49
|
-
_globals['
|
50
|
-
_globals['
|
51
|
-
_globals['
|
52
|
-
_globals['
|
53
|
-
_globals['
|
54
|
-
_globals['
|
55
|
-
_globals['
|
56
|
-
_globals['
|
57
|
-
_globals['
|
58
|
-
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1216
|
59
|
-
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1291
|
60
|
-
_globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_start=1293
|
61
|
-
_globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_end=1338
|
62
|
-
_globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_start=1340
|
63
|
-
_globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_end=1424
|
38
|
+
_globals['_GETRUNREQUEST']._serialized_start=541
|
39
|
+
_globals['_GETRUNREQUEST']._serialized_end=604
|
40
|
+
_globals['_GETRUNRESPONSE']._serialized_start=606
|
41
|
+
_globals['_GETRUNRESPONSE']._serialized_end=652
|
42
|
+
_globals['_UPDATERUNSTATUSREQUEST']._serialized_start=654
|
43
|
+
_globals['_UPDATERUNSTATUSREQUEST']._serialized_end=737
|
44
|
+
_globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=739
|
45
|
+
_globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=764
|
46
|
+
_globals['_GETRUNSTATUSREQUEST']._serialized_start=766
|
47
|
+
_globals['_GETRUNSTATUSREQUEST']._serialized_end=836
|
48
|
+
_globals['_GETRUNSTATUSRESPONSE']._serialized_start=839
|
49
|
+
_globals['_GETRUNSTATUSRESPONSE']._serialized_end=1016
|
50
|
+
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=941
|
51
|
+
_globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1016
|
52
|
+
_globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_start=1018
|
53
|
+
_globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_end=1063
|
54
|
+
_globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_start=1065
|
55
|
+
_globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_end=1149
|
64
56
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/run_pb2.pyi
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
isort:skip_file
|
4
4
|
"""
|
5
5
|
import builtins
|
6
|
-
import flwr.proto.fab_pb2
|
7
6
|
import flwr.proto.node_pb2
|
8
7
|
import flwr.proto.recorddict_pb2
|
9
8
|
import flwr.proto.transport_pb2
|
@@ -94,56 +93,6 @@ class RunStatus(google.protobuf.message.Message):
|
|
94
93
|
def ClearField(self, field_name: typing_extensions.Literal["details",b"details","status",b"status","sub_status",b"sub_status"]) -> None: ...
|
95
94
|
global___RunStatus = RunStatus
|
96
95
|
|
97
|
-
class CreateRunRequest(google.protobuf.message.Message):
|
98
|
-
"""CreateRun"""
|
99
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
100
|
-
class OverrideConfigEntry(google.protobuf.message.Message):
|
101
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
102
|
-
KEY_FIELD_NUMBER: builtins.int
|
103
|
-
VALUE_FIELD_NUMBER: builtins.int
|
104
|
-
key: typing.Text
|
105
|
-
@property
|
106
|
-
def value(self) -> flwr.proto.transport_pb2.Scalar: ...
|
107
|
-
def __init__(self,
|
108
|
-
*,
|
109
|
-
key: typing.Text = ...,
|
110
|
-
value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
|
111
|
-
) -> None: ...
|
112
|
-
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
113
|
-
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
114
|
-
|
115
|
-
FAB_ID_FIELD_NUMBER: builtins.int
|
116
|
-
FAB_VERSION_FIELD_NUMBER: builtins.int
|
117
|
-
OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
|
118
|
-
FAB_FIELD_NUMBER: builtins.int
|
119
|
-
fab_id: typing.Text
|
120
|
-
fab_version: typing.Text
|
121
|
-
@property
|
122
|
-
def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
|
123
|
-
@property
|
124
|
-
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
125
|
-
def __init__(self,
|
126
|
-
*,
|
127
|
-
fab_id: typing.Text = ...,
|
128
|
-
fab_version: typing.Text = ...,
|
129
|
-
override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
|
130
|
-
fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
|
131
|
-
) -> None: ...
|
132
|
-
def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
|
133
|
-
def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","fab_id",b"fab_id","fab_version",b"fab_version","override_config",b"override_config"]) -> None: ...
|
134
|
-
global___CreateRunRequest = CreateRunRequest
|
135
|
-
|
136
|
-
class CreateRunResponse(google.protobuf.message.Message):
|
137
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
138
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
139
|
-
run_id: builtins.int
|
140
|
-
def __init__(self,
|
141
|
-
*,
|
142
|
-
run_id: builtins.int = ...,
|
143
|
-
) -> None: ...
|
144
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
145
|
-
global___CreateRunResponse = CreateRunResponse
|
146
|
-
|
147
96
|
class GetRunRequest(google.protobuf.message.Message):
|
148
97
|
"""GetRun"""
|
149
98
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
flwr/proto/serverappio_pb2.py
CHANGED
@@ -20,7 +20,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
20
20
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
21
21
|
|
22
22
|
|
23
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"T\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"E\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\
|
23
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"T\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"E\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xe4\x08\n\x0bServerAppIo\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
|
24
24
|
|
25
25
|
_globals = globals()
|
26
26
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -48,5 +48,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
48
48
|
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=787
|
49
49
|
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=817
|
50
50
|
_globals['_SERVERAPPIO']._serialized_start=820
|
51
|
-
_globals['_SERVERAPPIO']._serialized_end=
|
51
|
+
_globals['_SERVERAPPIO']._serialized_end=1944
|
52
52
|
# @@protoc_insertion_point(module_scope)
|
@@ -19,11 +19,6 @@ class ServerAppIoStub(object):
|
|
19
19
|
Args:
|
20
20
|
channel: A grpc.Channel.
|
21
21
|
"""
|
22
|
-
self.CreateRun = channel.unary_unary(
|
23
|
-
'/flwr.proto.ServerAppIo/CreateRun',
|
24
|
-
request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
25
|
-
response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
26
|
-
)
|
27
22
|
self.GetNodes = channel.unary_unary(
|
28
23
|
'/flwr.proto.ServerAppIo/GetNodes',
|
29
24
|
request_serializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.SerializeToString,
|
@@ -94,13 +89,6 @@ class ServerAppIoStub(object):
|
|
94
89
|
class ServerAppIoServicer(object):
|
95
90
|
"""Missing associated documentation comment in .proto file."""
|
96
91
|
|
97
|
-
def CreateRun(self, request, context):
|
98
|
-
"""Request run_id
|
99
|
-
"""
|
100
|
-
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
101
|
-
context.set_details('Method not implemented!')
|
102
|
-
raise NotImplementedError('Method not implemented!')
|
103
|
-
|
104
92
|
def GetNodes(self, request, context):
|
105
93
|
"""Return a set of nodes
|
106
94
|
"""
|
@@ -195,11 +183,6 @@ class ServerAppIoServicer(object):
|
|
195
183
|
|
196
184
|
def add_ServerAppIoServicer_to_server(servicer, server):
|
197
185
|
rpc_method_handlers = {
|
198
|
-
'CreateRun': grpc.unary_unary_rpc_method_handler(
|
199
|
-
servicer.CreateRun,
|
200
|
-
request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
|
201
|
-
response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
|
202
|
-
),
|
203
186
|
'GetNodes': grpc.unary_unary_rpc_method_handler(
|
204
187
|
servicer.GetNodes,
|
205
188
|
request_deserializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.FromString,
|
@@ -275,23 +258,6 @@ def add_ServerAppIoServicer_to_server(servicer, server):
|
|
275
258
|
class ServerAppIo(object):
|
276
259
|
"""Missing associated documentation comment in .proto file."""
|
277
260
|
|
278
|
-
@staticmethod
|
279
|
-
def CreateRun(request,
|
280
|
-
target,
|
281
|
-
options=(),
|
282
|
-
channel_credentials=None,
|
283
|
-
call_credentials=None,
|
284
|
-
insecure=False,
|
285
|
-
compression=None,
|
286
|
-
wait_for_ready=None,
|
287
|
-
timeout=None,
|
288
|
-
metadata=None):
|
289
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/CreateRun',
|
290
|
-
flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
291
|
-
flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
292
|
-
options, channel_credentials,
|
293
|
-
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
294
|
-
|
295
261
|
@staticmethod
|
296
262
|
def GetNodes(request,
|
297
263
|
target,
|
@@ -13,11 +13,6 @@ import grpc
|
|
13
13
|
|
14
14
|
class ServerAppIoStub:
|
15
15
|
def __init__(self, channel: grpc.Channel) -> None: ...
|
16
|
-
CreateRun: grpc.UnaryUnaryMultiCallable[
|
17
|
-
flwr.proto.run_pb2.CreateRunRequest,
|
18
|
-
flwr.proto.run_pb2.CreateRunResponse]
|
19
|
-
"""Request run_id"""
|
20
|
-
|
21
16
|
GetNodes: grpc.UnaryUnaryMultiCallable[
|
22
17
|
flwr.proto.serverappio_pb2.GetNodesRequest,
|
23
18
|
flwr.proto.serverappio_pb2.GetNodesResponse]
|
@@ -85,14 +80,6 @@ class ServerAppIoStub:
|
|
85
80
|
|
86
81
|
|
87
82
|
class ServerAppIoServicer(metaclass=abc.ABCMeta):
|
88
|
-
@abc.abstractmethod
|
89
|
-
def CreateRun(self,
|
90
|
-
request: flwr.proto.run_pb2.CreateRunRequest,
|
91
|
-
context: grpc.ServicerContext,
|
92
|
-
) -> flwr.proto.run_pb2.CreateRunResponse:
|
93
|
-
"""Request run_id"""
|
94
|
-
pass
|
95
|
-
|
96
83
|
@abc.abstractmethod
|
97
84
|
def GetNodes(self,
|
98
85
|
request: flwr.proto.serverappio_pb2.GetNodesRequest,
|
@@ -22,21 +22,19 @@ from uuid import UUID
|
|
22
22
|
|
23
23
|
import grpc
|
24
24
|
|
25
|
-
from flwr.common import
|
25
|
+
from flwr.common import Message
|
26
26
|
from flwr.common.constant import SUPERLINK_NODE_ID, Status
|
27
27
|
from flwr.common.inflatable import check_body_len_consistency
|
28
28
|
from flwr.common.logger import log
|
29
29
|
from flwr.common.serde import (
|
30
30
|
context_from_proto,
|
31
31
|
context_to_proto,
|
32
|
-
fab_from_proto,
|
33
32
|
fab_to_proto,
|
34
33
|
message_from_proto,
|
35
34
|
message_to_proto,
|
36
35
|
run_status_from_proto,
|
37
36
|
run_status_to_proto,
|
38
37
|
run_to_proto,
|
39
|
-
user_config_from_proto,
|
40
38
|
)
|
41
39
|
from flwr.common.typing import Fab, RunStatus
|
42
40
|
from flwr.proto import serverappio_pb2_grpc # pylint: disable=E0611
|
@@ -57,8 +55,6 @@ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
|
|
57
55
|
)
|
58
56
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
59
57
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
60
|
-
CreateRunRequest,
|
61
|
-
CreateRunResponse,
|
62
58
|
GetRunRequest,
|
63
59
|
GetRunResponse,
|
64
60
|
GetRunStatusRequest,
|
@@ -121,32 +117,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
121
117
|
nodes: list[Node] = [Node(node_id=node_id) for node_id in all_ids]
|
122
118
|
return GetNodesResponse(nodes=nodes)
|
123
119
|
|
124
|
-
def CreateRun(
|
125
|
-
self, request: CreateRunRequest, context: grpc.ServicerContext
|
126
|
-
) -> CreateRunResponse:
|
127
|
-
"""Create run ID."""
|
128
|
-
log(DEBUG, "ServerAppIoServicer.CreateRun")
|
129
|
-
state: LinkState = self.state_factory.state()
|
130
|
-
if request.HasField("fab"):
|
131
|
-
fab = fab_from_proto(request.fab)
|
132
|
-
ffs: Ffs = self.ffs_factory.ffs()
|
133
|
-
fab_hash = ffs.put(fab.content, {})
|
134
|
-
_raise_if(
|
135
|
-
validation_error=fab_hash != fab.hash_str,
|
136
|
-
request_name="CreateRun",
|
137
|
-
detail=f"FAB ({fab.hash_str}) hash from request doesn't match contents",
|
138
|
-
)
|
139
|
-
else:
|
140
|
-
fab_hash = ""
|
141
|
-
run_id = state.create_run(
|
142
|
-
request.fab_id,
|
143
|
-
request.fab_version,
|
144
|
-
fab_hash,
|
145
|
-
user_config_from_proto(request.override_config),
|
146
|
-
ConfigRecord(),
|
147
|
-
)
|
148
|
-
return CreateRunResponse(run_id=run_id)
|
149
|
-
|
150
120
|
def PushMessages(
|
151
121
|
self, request: PushInsMessagesRequest, context: grpc.ServicerContext
|
152
122
|
) -> PushInsMessagesResponse:
|
@@ -12,11 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Flower SuperNode."""
|
15
|
+
"""Flower command line interface for SuperNode."""
|
16
16
|
|
17
17
|
|
18
|
-
from .
|
18
|
+
from .flower_supernode import flower_supernode
|
19
19
|
|
20
|
-
__all__ = [
|
21
|
-
"run_supernode",
|
22
|
-
]
|
20
|
+
__all__ = ["flower_supernode"]
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""
|
15
|
+
"""`flower-supernode` command."""
|
16
16
|
|
17
17
|
|
18
18
|
import argparse
|
@@ -46,7 +46,7 @@ from flwr.common.logger import log
|
|
46
46
|
from ..start_client_internal import start_client_internal
|
47
47
|
|
48
48
|
|
49
|
-
def
|
49
|
+
def flower_supernode() -> None:
|
50
50
|
"""Run Flower SuperNode."""
|
51
51
|
args = _parse_args_run_supernode().parse_args()
|
52
52
|
|
@@ -20,8 +20,9 @@ import os
|
|
20
20
|
import sys
|
21
21
|
import threading
|
22
22
|
import time
|
23
|
-
from
|
24
|
-
from
|
23
|
+
from collections.abc import Iterator
|
24
|
+
from contextlib import contextmanager
|
25
|
+
from logging import INFO, WARN
|
25
26
|
from os import urandom
|
26
27
|
from pathlib import Path
|
27
28
|
from typing import Callable, Optional, Union
|
@@ -74,7 +75,6 @@ def start_client_internal(
|
|
74
75
|
*,
|
75
76
|
server_address: str,
|
76
77
|
node_config: UserConfig,
|
77
|
-
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
78
78
|
root_certificates: Optional[Union[bytes, str]] = None,
|
79
79
|
insecure: Optional[bool] = None,
|
80
80
|
transport: str,
|
@@ -97,13 +97,6 @@ def start_client_internal(
|
|
97
97
|
would be `"[::]:8080"`.
|
98
98
|
node_config: UserConfig
|
99
99
|
The configuration of the node.
|
100
|
-
grpc_max_message_length : int (default: 536_870_912, this equals 512MB)
|
101
|
-
The maximum length of gRPC messages that can be exchanged with the
|
102
|
-
Flower server. The default should be sufficient for most models.
|
103
|
-
Users who train very large models might need to increase this
|
104
|
-
value. Note that the Flower server needs to be started with the
|
105
|
-
same value (see `flwr.server.start_server`), otherwise it will not
|
106
|
-
know about the increased limit and block larger messages.
|
107
100
|
root_certificates : Optional[Union[bytes, str]] (default: None)
|
108
101
|
The PEM-encoded root certificates as a byte string or a path string.
|
109
102
|
If provided, a secure connection using the certificates will be
|
@@ -150,49 +143,6 @@ def start_client_internal(
|
|
150
143
|
certificates=None,
|
151
144
|
)
|
152
145
|
|
153
|
-
# Initialize connection context manager
|
154
|
-
connection, address, connection_error_type = _init_connection(
|
155
|
-
transport, server_address
|
156
|
-
)
|
157
|
-
|
158
|
-
def _on_sucess(retry_state: RetryState) -> None:
|
159
|
-
if retry_state.tries > 1:
|
160
|
-
log(
|
161
|
-
INFO,
|
162
|
-
"Connection successful after %.2f seconds and %s tries.",
|
163
|
-
retry_state.elapsed_time,
|
164
|
-
retry_state.tries,
|
165
|
-
)
|
166
|
-
|
167
|
-
def _on_backoff(retry_state: RetryState) -> None:
|
168
|
-
if retry_state.tries == 1:
|
169
|
-
log(WARN, "Connection attempt failed, retrying...")
|
170
|
-
else:
|
171
|
-
log(
|
172
|
-
WARN,
|
173
|
-
"Connection attempt failed, retrying in %.2f seconds",
|
174
|
-
retry_state.actual_wait,
|
175
|
-
)
|
176
|
-
|
177
|
-
retry_invoker = RetryInvoker(
|
178
|
-
wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
|
179
|
-
recoverable_exceptions=connection_error_type,
|
180
|
-
max_tries=max_retries + 1 if max_retries is not None else None,
|
181
|
-
max_time=max_wait_time,
|
182
|
-
on_giveup=lambda retry_state: (
|
183
|
-
log(
|
184
|
-
WARN,
|
185
|
-
"Giving up reconnection after %.2f seconds and %s tries.",
|
186
|
-
retry_state.elapsed_time,
|
187
|
-
retry_state.tries,
|
188
|
-
)
|
189
|
-
if retry_state.tries > 1
|
190
|
-
else None
|
191
|
-
),
|
192
|
-
on_success=_on_sucess,
|
193
|
-
on_backoff=_on_backoff,
|
194
|
-
)
|
195
|
-
|
196
146
|
# DeprecatedRunInfoStore gets initialized when the first connection is established
|
197
147
|
run_info_store: Optional[DeprecatedRunInfoStore] = None
|
198
148
|
state_factory = NodeStateFactory()
|
@@ -203,13 +153,14 @@ def start_client_internal(
|
|
203
153
|
|
204
154
|
while True:
|
205
155
|
sleep_duration: int = 0
|
206
|
-
with
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
156
|
+
with _init_connection(
|
157
|
+
transport=transport,
|
158
|
+
server_address=server_address,
|
159
|
+
insecure=insecure,
|
160
|
+
root_certificates=root_certificates,
|
161
|
+
authentication_keys=authentication_keys,
|
162
|
+
max_retries=max_retries,
|
163
|
+
max_wait_time=max_wait_time,
|
213
164
|
) as conn:
|
214
165
|
receive, send, create_node, delete_node, get_run, get_fab = conn
|
215
166
|
|
@@ -287,88 +238,68 @@ def start_client_internal(
|
|
287
238
|
reply_to=message,
|
288
239
|
)
|
289
240
|
|
290
|
-
#
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
# (via `flwr-clientapp`), for example, in a separate
|
297
|
-
# Docker container.
|
298
|
-
|
299
|
-
# Generate SuperNode token
|
300
|
-
token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
|
301
|
-
|
302
|
-
# Mode 1: SuperNode starts ClientApp as subprocess
|
303
|
-
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
304
|
-
|
305
|
-
# Share Message and Context with servicer
|
306
|
-
clientappio_servicer.set_inputs(
|
307
|
-
clientapp_input=ClientAppInputs(
|
308
|
-
message=message,
|
309
|
-
context=context,
|
310
|
-
run=run,
|
311
|
-
fab=fab,
|
312
|
-
token=token,
|
313
|
-
),
|
314
|
-
token_returned=start_subprocess,
|
315
|
-
)
|
241
|
+
# Two isolation modes:
|
242
|
+
# 1. `subprocess`: SuperNode is starting the ClientApp
|
243
|
+
# process as a subprocess.
|
244
|
+
# 2. `process`: ClientApp process gets started separately
|
245
|
+
# (via `flwr-clientapp`), for example, in a separate
|
246
|
+
# Docker container.
|
316
247
|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
command = [
|
328
|
-
"flwr-clientapp",
|
329
|
-
"--clientappio-api-address",
|
330
|
-
io_address,
|
331
|
-
"--token",
|
332
|
-
str(token),
|
333
|
-
]
|
334
|
-
command.append("--insecure")
|
335
|
-
|
336
|
-
proc = mp_spawn_context.Process(
|
337
|
-
target=_run_flwr_clientapp,
|
338
|
-
args=(command, os.getpid()),
|
339
|
-
daemon=True,
|
340
|
-
)
|
341
|
-
proc.start()
|
342
|
-
proc.join()
|
343
|
-
else:
|
344
|
-
# Wait for output to become available
|
345
|
-
while not clientappio_servicer.has_outputs():
|
346
|
-
time.sleep(0.1)
|
347
|
-
|
348
|
-
outputs = clientappio_servicer.get_outputs()
|
349
|
-
reply_message, context = outputs.message, outputs.context
|
350
|
-
except Exception as ex: # pylint: disable=broad-exception-caught
|
351
|
-
|
352
|
-
# Don't update/change DeprecatedRunInfoStore
|
353
|
-
|
354
|
-
e_code = ErrorCode.CLIENT_APP_RAISED_EXCEPTION
|
355
|
-
# Ex fmt: "<class 'ZeroDivisionError'>:<'division by zero'>"
|
356
|
-
reason = str(type(ex)) + ":<'" + str(ex) + "'>"
|
357
|
-
exc_entity = "ClientApp"
|
358
|
-
|
359
|
-
log(ERROR, "%s raised an exception", exc_entity, exc_info=ex)
|
360
|
-
|
361
|
-
# Create error message
|
362
|
-
reply_message = Message(
|
363
|
-
Error(code=e_code, reason=reason),
|
364
|
-
reply_to=message,
|
365
|
-
)
|
366
|
-
else:
|
367
|
-
# No exception, update node state
|
368
|
-
run_info_store.update_context(
|
369
|
-
run_id=run_id,
|
248
|
+
# Generate SuperNode token
|
249
|
+
token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
|
250
|
+
|
251
|
+
# Mode 1: SuperNode starts ClientApp as subprocess
|
252
|
+
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
253
|
+
|
254
|
+
# Share Message and Context with servicer
|
255
|
+
clientappio_servicer.set_inputs(
|
256
|
+
clientapp_input=ClientAppInputs(
|
257
|
+
message=message,
|
370
258
|
context=context,
|
259
|
+
run=run,
|
260
|
+
fab=fab,
|
261
|
+
token=token,
|
262
|
+
),
|
263
|
+
token_returned=start_subprocess,
|
264
|
+
)
|
265
|
+
|
266
|
+
if start_subprocess:
|
267
|
+
_octet, _colon, _port = clientappio_api_address.rpartition(":")
|
268
|
+
io_address = (
|
269
|
+
f"{CLIENT_OCTET}:{_port}"
|
270
|
+
if _octet == SERVER_OCTET
|
271
|
+
else clientappio_api_address
|
371
272
|
)
|
273
|
+
# Start ClientApp subprocess
|
274
|
+
command = [
|
275
|
+
"flwr-clientapp",
|
276
|
+
"--clientappio-api-address",
|
277
|
+
io_address,
|
278
|
+
"--token",
|
279
|
+
str(token),
|
280
|
+
]
|
281
|
+
command.append("--insecure")
|
282
|
+
|
283
|
+
proc = mp_spawn_context.Process(
|
284
|
+
target=_run_flwr_clientapp,
|
285
|
+
args=(command, os.getpid()),
|
286
|
+
daemon=True,
|
287
|
+
)
|
288
|
+
proc.start()
|
289
|
+
proc.join()
|
290
|
+
else:
|
291
|
+
# Wait for output to become available
|
292
|
+
while not clientappio_servicer.has_outputs():
|
293
|
+
time.sleep(0.1)
|
294
|
+
|
295
|
+
outputs = clientappio_servicer.get_outputs()
|
296
|
+
reply_message, context = outputs.message, outputs.context
|
297
|
+
|
298
|
+
# Update node state
|
299
|
+
run_info_store.update_context(
|
300
|
+
run_id=run_id,
|
301
|
+
context=context,
|
302
|
+
)
|
372
303
|
|
373
304
|
# Send
|
374
305
|
send(reply_message)
|
@@ -402,30 +333,28 @@ def start_client_internal(
|
|
402
333
|
time.sleep(sleep_duration)
|
403
334
|
|
404
335
|
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
],
|
426
|
-
str,
|
427
|
-
type[Exception],
|
336
|
+
@contextmanager
|
337
|
+
def _init_connection( # pylint: disable=too-many-positional-arguments
|
338
|
+
transport: str,
|
339
|
+
server_address: str,
|
340
|
+
insecure: bool,
|
341
|
+
root_certificates: Optional[Union[bytes, str]] = None,
|
342
|
+
authentication_keys: Optional[
|
343
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
344
|
+
] = None,
|
345
|
+
max_retries: Optional[int] = None,
|
346
|
+
max_wait_time: Optional[float] = None,
|
347
|
+
) -> Iterator[
|
348
|
+
tuple[
|
349
|
+
Callable[[], Optional[Message]],
|
350
|
+
Callable[[Message], None],
|
351
|
+
Callable[[], Optional[int]],
|
352
|
+
Callable[[], None],
|
353
|
+
Callable[[int], Run],
|
354
|
+
Callable[[str, int], Fab],
|
355
|
+
]
|
428
356
|
]:
|
357
|
+
"""Establish a connection to the Fleet API server at SuperLink."""
|
429
358
|
# Parse IP address
|
430
359
|
parsed_address = parse_address(server_address)
|
431
360
|
if not parsed_address:
|
@@ -456,7 +385,69 @@ def _init_connection(transport: str, server_address: str) -> tuple[
|
|
456
385
|
f"Unknown transport type: {transport} (possible: {TRANSPORT_TYPES})"
|
457
386
|
)
|
458
387
|
|
459
|
-
|
388
|
+
# Create RetryInvoker
|
389
|
+
retry_invoker = _make_fleet_connection_retry_invoker(
|
390
|
+
max_retries=max_retries,
|
391
|
+
max_wait_time=max_wait_time,
|
392
|
+
connection_error_type=error_type,
|
393
|
+
)
|
394
|
+
|
395
|
+
# Establish connection
|
396
|
+
with connection(
|
397
|
+
address,
|
398
|
+
insecure,
|
399
|
+
retry_invoker,
|
400
|
+
GRPC_MAX_MESSAGE_LENGTH,
|
401
|
+
root_certificates,
|
402
|
+
authentication_keys,
|
403
|
+
) as conn:
|
404
|
+
yield conn
|
405
|
+
|
406
|
+
|
407
|
+
def _make_fleet_connection_retry_invoker(
|
408
|
+
max_retries: Optional[int] = None,
|
409
|
+
max_wait_time: Optional[float] = None,
|
410
|
+
connection_error_type: type[Exception] = RpcError,
|
411
|
+
) -> RetryInvoker:
|
412
|
+
"""Create a retry invoker for fleet connection."""
|
413
|
+
|
414
|
+
def _on_success(retry_state: RetryState) -> None:
|
415
|
+
if retry_state.tries > 1:
|
416
|
+
log(
|
417
|
+
INFO,
|
418
|
+
"Connection successful after %.2f seconds and %s tries.",
|
419
|
+
retry_state.elapsed_time,
|
420
|
+
retry_state.tries,
|
421
|
+
)
|
422
|
+
|
423
|
+
def _on_backoff(retry_state: RetryState) -> None:
|
424
|
+
if retry_state.tries == 1:
|
425
|
+
log(WARN, "Connection attempt failed, retrying...")
|
426
|
+
else:
|
427
|
+
log(
|
428
|
+
WARN,
|
429
|
+
"Connection attempt failed, retrying in %.2f seconds",
|
430
|
+
retry_state.actual_wait,
|
431
|
+
)
|
432
|
+
|
433
|
+
return RetryInvoker(
|
434
|
+
wait_gen_factory=lambda: exponential(max_delay=MAX_RETRY_DELAY),
|
435
|
+
recoverable_exceptions=connection_error_type,
|
436
|
+
max_tries=max_retries + 1 if max_retries is not None else None,
|
437
|
+
max_time=max_wait_time,
|
438
|
+
on_giveup=lambda retry_state: (
|
439
|
+
log(
|
440
|
+
WARN,
|
441
|
+
"Giving up reconnection after %.2f seconds and %s tries.",
|
442
|
+
retry_state.elapsed_time,
|
443
|
+
retry_state.tries,
|
444
|
+
)
|
445
|
+
if retry_state.tries > 1
|
446
|
+
else None
|
447
|
+
),
|
448
|
+
on_success=_on_success,
|
449
|
+
on_backoff=_on_backoff,
|
450
|
+
)
|
460
451
|
|
461
452
|
|
462
453
|
def _run_flwr_clientapp(args: list[str], main_pid: int) -> None:
|
{flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.19.0.
|
3
|
+
Version: 1.19.0.dev20250523
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
{flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/RECORD
RENAMED
@@ -102,9 +102,6 @@ flwr/client/numpy_client.py,sha256=Qq6ghsIAop2slKqAfgiI5NiHJ4LIxGmrik3Ror4_XVc,9
|
|
102
102
|
flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
|
103
103
|
flwr/client/rest_client/connection.py,sha256=6yBh2Eeso0XLtinAs2kOHkSnge7C-co_a_QfBaAEudU,12766
|
104
104
|
flwr/client/run_info_store.py,sha256=MaJ3UQ-07hWtK67wnWu0zR29jrk0fsfgJX506dvEOfE,4042
|
105
|
-
flwr/client/start_client_internal.py,sha256=-FOBQE65a-ZsuTUiW8WcZoBZt9q_b3ee-JK5-H8ivME,19850
|
106
|
-
flwr/client/supernode/__init__.py,sha256=i3gFbV5ie_FGyRMpzOvqtZAi0Z0ChIEJ7I2Kr0ym0PM,793
|
107
|
-
flwr/client/supernode/app.py,sha256=an-aT2zZEL5Mv7StgE1el0-fgIvKSQIuihJubRUuzyo,8753
|
108
105
|
flwr/client/typing.py,sha256=Jw3rawDzI_-ZDcRmEQcs5gZModY7oeQlEeltYsdOhlU,1048
|
109
106
|
flwr/clientapp/__init__.py,sha256=zGW4z49Ojzoi1hDiRC7kyhLjijUilc6fqHhtM_ATRVA,719
|
110
107
|
flwr/common/__init__.py,sha256=5GCLVk399Az_rTJHNticRlL0Sl_oPw_j5_LuFKfX7-M,4171
|
@@ -210,14 +207,14 @@ flwr/proto/recorddict_pb2.py,sha256=G_ArzgRfHVXJTqtIZ6lYN8rZsCcj6p_1KokGUjajtMY,
|
|
210
207
|
flwr/proto/recorddict_pb2.pyi,sha256=M9dVj5o7sw91pnIBWVl76Ka82sDUiwm-rnv_iV9Omhc,15286
|
211
208
|
flwr/proto/recorddict_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
212
209
|
flwr/proto/recorddict_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
213
|
-
flwr/proto/run_pb2.py,sha256=
|
214
|
-
flwr/proto/run_pb2.pyi,sha256=
|
210
|
+
flwr/proto/run_pb2.py,sha256=SWpc2yDTprm7DaabMQne43q_7_NWQN3I66y-d_PpcGg,4727
|
211
|
+
flwr/proto/run_pb2.pyi,sha256=g87sUXdUA3cPmlYG03EoUisVIxOtWft3OR6nznzXeDo,9416
|
215
212
|
flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
216
213
|
flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
217
|
-
flwr/proto/serverappio_pb2.py,sha256=
|
214
|
+
flwr/proto/serverappio_pb2.py,sha256=JvIoTp15o7og5saAuAPPEHS2-qoxOI4y1t6pD78GBf4,5236
|
218
215
|
flwr/proto/serverappio_pb2.pyi,sha256=8Q81UXbBCArSXnma6-rXUE_vKneCowZjY4W4JmLaH0c,6450
|
219
|
-
flwr/proto/serverappio_pb2_grpc.py,sha256=
|
220
|
-
flwr/proto/serverappio_pb2_grpc.pyi,sha256=
|
216
|
+
flwr/proto/serverappio_pb2_grpc.py,sha256=An5cPfO_1-MjvP8FaVymRfAFpes_pASDLUoxonZ1vrs,22602
|
217
|
+
flwr/proto/serverappio_pb2_grpc.pyi,sha256=GI6b8aH2H7yPnqeE7q9lF6RUMtohuucYYxTjtHXzLsA,6204
|
221
218
|
flwr/proto/simulationio_pb2.py,sha256=sAJX72z-IttVGxyU3PFnG8AFuA-pV7itvBoxz-hOudE,3342
|
222
219
|
flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
|
223
220
|
flwr/proto/simulationio_pb2_grpc.py,sha256=HuGbhOwV_A5GTbvmd5XTm6lSm9fWUgKcxq9OKhgmBT0,12999
|
@@ -307,7 +304,7 @@ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=z3VABMX_WtAioWJ2aUOsx
|
|
307
304
|
flwr/server/superlink/linkstate/utils.py,sha256=AJs9jTAEK7JnjF2AODXnOfy0pKAKpe6oUWPCanAP57s,15382
|
308
305
|
flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
|
309
306
|
flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=6-FUUt0GiLcBPljj8bBrUNeAITUoDQOLzaMihKo52hg,2326
|
310
|
-
flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=
|
307
|
+
flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=chSj2hzaYn4q5X9owxWEquLEIK4fEmk3oeG3copgCgI,13980
|
311
308
|
flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
|
312
309
|
flwr/server/superlink/simulation/simulationio_grpc.py,sha256=0l0F-UjYEk6W7HZmI28PbJQLFxSi_vBHRkdchgdaSMQ,2224
|
313
310
|
flwr/server/superlink/simulation/simulationio_servicer.py,sha256=aJezU8RSJswcmWm7Eoy0BqsU13jrcfuFwX3ljm-cORM,7719
|
@@ -348,11 +345,14 @@ flwr/superexec/executor.py,sha256=M5ucqSE53jfRtuCNf59WFLqQvA1Mln4741TySeZE7qQ,31
|
|
348
345
|
flwr/superexec/simulation.py,sha256=j6YwUvBN7EQ09ID7MYOCVZ70PGbuyBy8f9bXU0EszEM,4088
|
349
346
|
flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
|
350
347
|
flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
|
348
|
+
flwr/supernode/cli/__init__.py,sha256=usct6KqEN3NFrwAA6K1RUDRJbUs0lia8o8FFF5Sxnc4,815
|
349
|
+
flwr/supernode/cli/flower_supernode.py,sha256=pr16i1xWDzxxB5lcRTaSd4DVQvVOC3G0zwLliS9jSZ0,8766
|
351
350
|
flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
|
352
351
|
flwr/supernode/nodestate/in_memory_nodestate.py,sha256=brV7TMMzS93tXk6ntpoYjtPK5qiSF3XD2W-uUdUVucc,1270
|
353
352
|
flwr/supernode/nodestate/nodestate.py,sha256=-LAjZOnS7VyHC05ll3b31cYDjwAt6l4WmYt7duVLRKk,1024
|
354
353
|
flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
|
355
|
-
|
356
|
-
flwr_nightly-1.19.0.
|
357
|
-
flwr_nightly-1.19.0.
|
358
|
-
flwr_nightly-1.19.0.
|
354
|
+
flwr/supernode/start_client_internal.py,sha256=4z9qtwT7ZwNwahpX1SRfuaoYw1HCICPFUvjPBLHgsA0,18806
|
355
|
+
flwr_nightly-1.19.0.dev20250523.dist-info/METADATA,sha256=9-WhjxFCBkKSfaVdbgEMccDDHsMsc7yc6YOxyPGARiQ,15910
|
356
|
+
flwr_nightly-1.19.0.dev20250523.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
357
|
+
flwr_nightly-1.19.0.dev20250523.dist-info/entry_points.txt,sha256=08k99PaHg3Wr6W49rFXYtjmgcfIdpFLNeu6O0bXDYnU,370
|
358
|
+
flwr_nightly-1.19.0.dev20250523.dist-info/RECORD,,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
[console_scripts]
|
2
2
|
flower-simulation=flwr.simulation.run_simulation:run_simulation_from_cli
|
3
3
|
flower-superlink=flwr.server.app:run_superlink
|
4
|
-
flower-supernode=flwr.
|
4
|
+
flower-supernode=flwr.supernode.cli:flower_supernode
|
5
5
|
flwr=flwr.cli.app:app
|
6
6
|
flwr-clientapp=flwr.client.clientapp:flwr_clientapp
|
7
7
|
flwr-serverapp=flwr.server.serverapp:flwr_serverapp
|
{flwr_nightly-1.19.0.dev20250522.dist-info → flwr_nightly-1.19.0.dev20250523.dist-info}/WHEEL
RENAMED
File without changes
|