flwr-nightly 1.13.0.dev20241106__py3-none-any.whl → 1.13.0.dev20241108__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/run/run.py +16 -5
- flwr/client/app.py +10 -6
- flwr/client/nodestate/__init__.py +25 -0
- flwr/client/nodestate/in_memory_nodestate.py +38 -0
- flwr/client/nodestate/nodestate.py +30 -0
- flwr/client/nodestate/nodestate_factory.py +37 -0
- flwr/common/config.py +10 -0
- flwr/common/constant.py +0 -1
- flwr/common/object_ref.py +47 -16
- flwr/common/typing.py +1 -1
- flwr/proto/exec_pb2.py +14 -17
- flwr/proto/exec_pb2.pyi +6 -20
- flwr/proto/run_pb2.py +32 -27
- flwr/proto/run_pb2.pyi +26 -0
- flwr/proto/simulationio_pb2.py +2 -2
- flwr/proto/simulationio_pb2_grpc.py +34 -0
- flwr/proto/simulationio_pb2_grpc.pyi +13 -0
- flwr/server/driver/driver.py +1 -1
- flwr/server/driver/grpc_driver.py +2 -6
- flwr/server/driver/inmemory_driver.py +1 -3
- flwr/server/run_serverapp.py +2 -2
- flwr/server/serverapp/app.py +1 -1
- flwr/server/strategy/aggregate.py +4 -4
- flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -16
- flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -15
- flwr/server/superlink/linkstate/utils.py +2 -33
- flwr/server/superlink/simulation/simulationio_servicer.py +22 -1
- flwr/simulation/run_simulation.py +1 -1
- flwr/superexec/deployment.py +1 -1
- flwr/superexec/exec_servicer.py +2 -2
- flwr/superexec/executor.py +4 -3
- flwr/superexec/simulation.py +8 -8
- {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/METADATA +3 -3
- {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/RECORD +37 -33
- {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/entry_points.txt +0 -0
|
@@ -36,6 +36,11 @@ class SimulationIoStub(object):
|
|
|
36
36
|
request_serializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.SerializeToString,
|
|
37
37
|
response_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
|
|
38
38
|
)
|
|
39
|
+
self.GetFederationOptions = channel.unary_unary(
|
|
40
|
+
'/flwr.proto.SimulationIo/GetFederationOptions',
|
|
41
|
+
request_serializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.SerializeToString,
|
|
42
|
+
response_deserializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.FromString,
|
|
43
|
+
)
|
|
39
44
|
|
|
40
45
|
|
|
41
46
|
class SimulationIoServicer(object):
|
|
@@ -69,6 +74,13 @@ class SimulationIoServicer(object):
|
|
|
69
74
|
context.set_details('Method not implemented!')
|
|
70
75
|
raise NotImplementedError('Method not implemented!')
|
|
71
76
|
|
|
77
|
+
def GetFederationOptions(self, request, context):
|
|
78
|
+
"""Get Federation Options
|
|
79
|
+
"""
|
|
80
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
81
|
+
context.set_details('Method not implemented!')
|
|
82
|
+
raise NotImplementedError('Method not implemented!')
|
|
83
|
+
|
|
72
84
|
|
|
73
85
|
def add_SimulationIoServicer_to_server(servicer, server):
|
|
74
86
|
rpc_method_handlers = {
|
|
@@ -92,6 +104,11 @@ def add_SimulationIoServicer_to_server(servicer, server):
|
|
|
92
104
|
request_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.FromString,
|
|
93
105
|
response_serializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.SerializeToString,
|
|
94
106
|
),
|
|
107
|
+
'GetFederationOptions': grpc.unary_unary_rpc_method_handler(
|
|
108
|
+
servicer.GetFederationOptions,
|
|
109
|
+
request_deserializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.FromString,
|
|
110
|
+
response_serializer=flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.SerializeToString,
|
|
111
|
+
),
|
|
95
112
|
}
|
|
96
113
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
97
114
|
'flwr.proto.SimulationIo', rpc_method_handlers)
|
|
@@ -169,3 +186,20 @@ class SimulationIo(object):
|
|
|
169
186
|
flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
|
|
170
187
|
options, channel_credentials,
|
|
171
188
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
189
|
+
|
|
190
|
+
@staticmethod
|
|
191
|
+
def GetFederationOptions(request,
|
|
192
|
+
target,
|
|
193
|
+
options=(),
|
|
194
|
+
channel_credentials=None,
|
|
195
|
+
call_credentials=None,
|
|
196
|
+
insecure=False,
|
|
197
|
+
compression=None,
|
|
198
|
+
wait_for_ready=None,
|
|
199
|
+
timeout=None,
|
|
200
|
+
metadata=None):
|
|
201
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/GetFederationOptions',
|
|
202
|
+
flwr_dot_proto_dot_run__pb2.GetFederationOptionsRequest.SerializeToString,
|
|
203
|
+
flwr_dot_proto_dot_run__pb2.GetFederationOptionsResponse.FromString,
|
|
204
|
+
options, channel_credentials,
|
|
205
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@@ -30,6 +30,11 @@ class SimulationIoStub:
|
|
|
30
30
|
flwr.proto.log_pb2.PushLogsResponse]
|
|
31
31
|
"""Push ServerApp logs"""
|
|
32
32
|
|
|
33
|
+
GetFederationOptions: grpc.UnaryUnaryMultiCallable[
|
|
34
|
+
flwr.proto.run_pb2.GetFederationOptionsRequest,
|
|
35
|
+
flwr.proto.run_pb2.GetFederationOptionsResponse]
|
|
36
|
+
"""Get Federation Options"""
|
|
37
|
+
|
|
33
38
|
|
|
34
39
|
class SimulationIoServicer(metaclass=abc.ABCMeta):
|
|
35
40
|
@abc.abstractmethod
|
|
@@ -64,5 +69,13 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
|
|
|
64
69
|
"""Push ServerApp logs"""
|
|
65
70
|
pass
|
|
66
71
|
|
|
72
|
+
@abc.abstractmethod
|
|
73
|
+
def GetFederationOptions(self,
|
|
74
|
+
request: flwr.proto.run_pb2.GetFederationOptionsRequest,
|
|
75
|
+
context: grpc.ServicerContext,
|
|
76
|
+
) -> flwr.proto.run_pb2.GetFederationOptionsResponse:
|
|
77
|
+
"""Get Federation Options"""
|
|
78
|
+
pass
|
|
79
|
+
|
|
67
80
|
|
|
68
81
|
def add_SimulationIoServicer_to_server(servicer: SimulationIoServicer, server: grpc.Server) -> None: ...
|
flwr/server/driver/driver.py
CHANGED
|
@@ -27,7 +27,7 @@ class Driver(ABC):
|
|
|
27
27
|
"""Abstract base Driver class for the ServerAppIo API."""
|
|
28
28
|
|
|
29
29
|
@abstractmethod
|
|
30
|
-
def
|
|
30
|
+
def set_run(self, run_id: int) -> None:
|
|
31
31
|
"""Request a run to the SuperLink with a given `run_id`.
|
|
32
32
|
|
|
33
33
|
If a Run with the specified `run_id` exists, a local Run
|
|
@@ -112,12 +112,8 @@ class GrpcDriver(Driver):
|
|
|
112
112
|
channel.close()
|
|
113
113
|
log(DEBUG, "[Driver] Disconnected")
|
|
114
114
|
|
|
115
|
-
def
|
|
116
|
-
"""
|
|
117
|
-
# Check if is initialized
|
|
118
|
-
if self._run is not None:
|
|
119
|
-
return
|
|
120
|
-
|
|
115
|
+
def set_run(self, run_id: int) -> None:
|
|
116
|
+
"""Set the run."""
|
|
121
117
|
# Get the run info
|
|
122
118
|
req = GetRunRequest(run_id=run_id)
|
|
123
119
|
res: GetRunResponse = self._stub.GetRun(req)
|
|
@@ -62,10 +62,8 @@ class InMemoryDriver(Driver):
|
|
|
62
62
|
):
|
|
63
63
|
raise ValueError(f"Invalid message: {message}")
|
|
64
64
|
|
|
65
|
-
def
|
|
65
|
+
def set_run(self, run_id: int) -> None:
|
|
66
66
|
"""Initialize the run."""
|
|
67
|
-
if self._run is not None:
|
|
68
|
-
return
|
|
69
67
|
run = self.state.get_run(run_id)
|
|
70
68
|
if run is None:
|
|
71
69
|
raise RuntimeError(f"Cannot find the run with ID: {run_id}")
|
flwr/server/run_serverapp.py
CHANGED
|
@@ -174,7 +174,7 @@ def run_server_app() -> None:
|
|
|
174
174
|
root_certificates=root_certificates,
|
|
175
175
|
)
|
|
176
176
|
flwr_dir = get_flwr_dir(args.flwr_dir)
|
|
177
|
-
driver.
|
|
177
|
+
driver.set_run(args.run_id)
|
|
178
178
|
run_ = driver.run
|
|
179
179
|
if not run_.fab_hash:
|
|
180
180
|
raise ValueError("FAB hash not provided.")
|
|
@@ -204,7 +204,7 @@ def run_server_app() -> None:
|
|
|
204
204
|
req = CreateRunRequest(fab_id=fab_id, fab_version=fab_version)
|
|
205
205
|
res: CreateRunResponse = driver._stub.CreateRun(req) # pylint: disable=W0212
|
|
206
206
|
# Fetch full `Run` using `run_id`
|
|
207
|
-
driver.
|
|
207
|
+
driver.set_run(res.run_id) # pylint: disable=W0212
|
|
208
208
|
run_id = res.run_id
|
|
209
209
|
|
|
210
210
|
# Obtain server app reference and the run config
|
flwr/server/serverapp/app.py
CHANGED
|
@@ -189,7 +189,7 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212
|
|
|
189
189
|
run = run_from_proto(res.run)
|
|
190
190
|
fab = fab_from_proto(res.fab)
|
|
191
191
|
|
|
192
|
-
driver.
|
|
192
|
+
driver.set_run(run.run_id)
|
|
193
193
|
|
|
194
194
|
# Start log uploader for this run
|
|
195
195
|
log_uploader = start_log_uploader(
|
|
@@ -48,12 +48,12 @@ def aggregate_inplace(results: list[tuple[ClientProxy, FitRes]]) -> NDArrays:
|
|
|
48
48
|
num_examples_total = sum(fit_res.num_examples for (_, fit_res) in results)
|
|
49
49
|
|
|
50
50
|
# Compute scaling factors for each result
|
|
51
|
-
scaling_factors =
|
|
52
|
-
fit_res.num_examples / num_examples_total for _, fit_res in results
|
|
53
|
-
|
|
51
|
+
scaling_factors = np.asarray(
|
|
52
|
+
[fit_res.num_examples / num_examples_total for _, fit_res in results]
|
|
53
|
+
)
|
|
54
54
|
|
|
55
55
|
def _try_inplace(
|
|
56
|
-
x: NDArray, y: Union[NDArray,
|
|
56
|
+
x: NDArray, y: Union[NDArray, np.float64], np_binary_op: np.ufunc
|
|
57
57
|
) -> NDArray:
|
|
58
58
|
return ( # type: ignore[no-any-return]
|
|
59
59
|
np_binary_op(x, y, out=x)
|
|
@@ -40,7 +40,6 @@ from .utils import (
|
|
|
40
40
|
generate_rand_int_from_bytes,
|
|
41
41
|
has_valid_sub_status,
|
|
42
42
|
is_valid_transition,
|
|
43
|
-
make_node_unavailable_taskres,
|
|
44
43
|
)
|
|
45
44
|
|
|
46
45
|
|
|
@@ -257,21 +256,6 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
|
257
256
|
task_res_list.append(task_res)
|
|
258
257
|
replied_task_ids.add(reply_to)
|
|
259
258
|
|
|
260
|
-
# Check if the node is offline
|
|
261
|
-
for task_id in task_ids - replied_task_ids:
|
|
262
|
-
task_ins = self.task_ins_store.get(task_id)
|
|
263
|
-
if task_ins is None:
|
|
264
|
-
continue
|
|
265
|
-
node_id = task_ins.task.consumer.node_id
|
|
266
|
-
online_until, _ = self.node_ids[node_id]
|
|
267
|
-
# Generate a TaskRes containing an error reply if the node is offline.
|
|
268
|
-
if online_until < time.time():
|
|
269
|
-
err_taskres = make_node_unavailable_taskres(
|
|
270
|
-
ref_taskins=task_ins,
|
|
271
|
-
)
|
|
272
|
-
self.task_res_store[UUID(err_taskres.task_id)] = err_taskres
|
|
273
|
-
task_res_list.append(err_taskres)
|
|
274
|
-
|
|
275
259
|
# Mark all of them as delivered
|
|
276
260
|
delivered_at = now().isoformat()
|
|
277
261
|
for task_res in task_res_list:
|
|
@@ -57,7 +57,6 @@ from .utils import (
|
|
|
57
57
|
generate_rand_int_from_bytes,
|
|
58
58
|
has_valid_sub_status,
|
|
59
59
|
is_valid_transition,
|
|
60
|
-
make_node_unavailable_taskres,
|
|
61
60
|
)
|
|
62
61
|
|
|
63
62
|
SQL_CREATE_TABLE_NODE = """
|
|
@@ -640,20 +639,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
|
640
639
|
data = {f"id_{i}": str(node_id) for i, node_id in enumerate(offline_node_ids)}
|
|
641
640
|
task_ins_rows = self.query(query, data)
|
|
642
641
|
|
|
643
|
-
# Make TaskRes containing node unavailabe error
|
|
644
|
-
for row in task_ins_rows:
|
|
645
|
-
for row in rows:
|
|
646
|
-
# Convert values from sint64 to uint64
|
|
647
|
-
convert_sint64_values_in_dict_to_uint64(
|
|
648
|
-
row, ["run_id", "producer_node_id", "consumer_node_id"]
|
|
649
|
-
)
|
|
650
|
-
|
|
651
|
-
task_ins = dict_to_task_ins(row)
|
|
652
|
-
err_taskres = make_node_unavailable_taskres(
|
|
653
|
-
ref_taskins=task_ins,
|
|
654
|
-
)
|
|
655
|
-
result.append(err_taskres)
|
|
656
|
-
|
|
657
642
|
return result
|
|
658
643
|
|
|
659
644
|
def num_task_ins(self) -> int:
|
|
@@ -15,21 +15,15 @@
|
|
|
15
15
|
"""Utility functions for State."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
import time
|
|
19
|
-
from logging import ERROR
|
|
20
18
|
from os import urandom
|
|
21
|
-
from uuid import uuid4
|
|
22
19
|
|
|
23
|
-
from flwr.common import ConfigsRecord, Context,
|
|
24
|
-
from flwr.common.constant import
|
|
20
|
+
from flwr.common import ConfigsRecord, Context, serde
|
|
21
|
+
from flwr.common.constant import Status, SubStatus
|
|
25
22
|
from flwr.common.typing import RunStatus
|
|
26
|
-
from flwr.proto.error_pb2 import Error # pylint: disable=E0611
|
|
27
23
|
from flwr.proto.message_pb2 import Context as ProtoContext # pylint: disable=E0611
|
|
28
|
-
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
29
24
|
|
|
30
25
|
# pylint: disable=E0611
|
|
31
26
|
from flwr.proto.recordset_pb2 import ConfigsRecord as ProtoConfigsRecord
|
|
32
|
-
from flwr.proto.task_pb2 import Task, TaskIns, TaskRes # pylint: disable=E0611
|
|
33
27
|
|
|
34
28
|
NODE_UNAVAILABLE_ERROR_REASON = (
|
|
35
29
|
"Error: Node Unavailable - The destination node is currently unavailable. "
|
|
@@ -161,31 +155,6 @@ def configsrecord_from_bytes(configsrecord_bytes: bytes) -> ConfigsRecord:
|
|
|
161
155
|
)
|
|
162
156
|
|
|
163
157
|
|
|
164
|
-
def make_node_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
|
|
165
|
-
"""Generate a TaskRes with a node unavailable error from a TaskIns."""
|
|
166
|
-
current_time = time.time()
|
|
167
|
-
ttl = ref_taskins.task.ttl - (current_time - ref_taskins.task.created_at)
|
|
168
|
-
if ttl < 0:
|
|
169
|
-
log(ERROR, "Creating TaskRes for TaskIns that exceeds its TTL.")
|
|
170
|
-
ttl = 0
|
|
171
|
-
return TaskRes(
|
|
172
|
-
task_id=str(uuid4()),
|
|
173
|
-
group_id=ref_taskins.group_id,
|
|
174
|
-
run_id=ref_taskins.run_id,
|
|
175
|
-
task=Task(
|
|
176
|
-
producer=Node(node_id=ref_taskins.task.consumer.node_id, anonymous=False),
|
|
177
|
-
consumer=Node(node_id=ref_taskins.task.producer.node_id, anonymous=False),
|
|
178
|
-
created_at=current_time,
|
|
179
|
-
ttl=ttl,
|
|
180
|
-
ancestry=[ref_taskins.task_id],
|
|
181
|
-
task_type=ref_taskins.task.task_type,
|
|
182
|
-
error=Error(
|
|
183
|
-
code=ErrorCode.NODE_UNAVAILABLE, reason=NODE_UNAVAILABLE_ERROR_REASON
|
|
184
|
-
),
|
|
185
|
-
),
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
|
|
189
158
|
def is_valid_transition(current_status: RunStatus, new_status: RunStatus) -> bool:
|
|
190
159
|
"""Check if a transition between two run statuses is valid.
|
|
191
160
|
|
|
@@ -23,6 +23,7 @@ from grpc import ServicerContext
|
|
|
23
23
|
from flwr.common.constant import Status
|
|
24
24
|
from flwr.common.logger import log
|
|
25
25
|
from flwr.common.serde import (
|
|
26
|
+
configs_record_to_proto,
|
|
26
27
|
context_from_proto,
|
|
27
28
|
context_to_proto,
|
|
28
29
|
fab_to_proto,
|
|
@@ -36,6 +37,8 @@ from flwr.proto.log_pb2 import ( # pylint: disable=E0611
|
|
|
36
37
|
PushLogsResponse,
|
|
37
38
|
)
|
|
38
39
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
40
|
+
GetFederationOptionsRequest,
|
|
41
|
+
GetFederationOptionsResponse,
|
|
39
42
|
UpdateRunStatusRequest,
|
|
40
43
|
UpdateRunStatusResponse,
|
|
41
44
|
)
|
|
@@ -123,10 +126,28 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
|
|
|
123
126
|
self, request: PushLogsRequest, context: grpc.ServicerContext
|
|
124
127
|
) -> PushLogsResponse:
|
|
125
128
|
"""Push logs."""
|
|
126
|
-
log(DEBUG, "
|
|
129
|
+
log(DEBUG, "SimultionIoServicer.PushLogs")
|
|
127
130
|
state = self.state_factory.state()
|
|
128
131
|
|
|
129
132
|
# Add logs to LinkState
|
|
130
133
|
merged_logs = "".join(request.logs)
|
|
131
134
|
state.add_serverapp_log(request.run_id, merged_logs)
|
|
132
135
|
return PushLogsResponse()
|
|
136
|
+
|
|
137
|
+
def GetFederationOptions(
|
|
138
|
+
self, request: GetFederationOptionsRequest, context: ServicerContext
|
|
139
|
+
) -> GetFederationOptionsResponse:
|
|
140
|
+
"""Get Federation Options associated with a run."""
|
|
141
|
+
log(DEBUG, "SimultionIoServicer.GetFederationOptions")
|
|
142
|
+
state = self.state_factory.state()
|
|
143
|
+
|
|
144
|
+
federation_options = state.get_federation_options(request.run_id)
|
|
145
|
+
if federation_options is None:
|
|
146
|
+
context.abort(
|
|
147
|
+
grpc.StatusCode.FAILED_PRECONDITION,
|
|
148
|
+
"Expected federation options to be set, but none available.",
|
|
149
|
+
)
|
|
150
|
+
return GetFederationOptionsResponse()
|
|
151
|
+
return GetFederationOptionsResponse(
|
|
152
|
+
federation_options=configs_record_to_proto(federation_options)
|
|
153
|
+
)
|
|
@@ -347,7 +347,7 @@ def _main_loop(
|
|
|
347
347
|
|
|
348
348
|
# Initialize Driver
|
|
349
349
|
driver = InMemoryDriver(state_factory=state_factory)
|
|
350
|
-
driver.
|
|
350
|
+
driver.set_run(run_id=run.run_id)
|
|
351
351
|
|
|
352
352
|
# Get and run ServerApp thread
|
|
353
353
|
serverapp_th = run_serverapp_th(
|
flwr/superexec/deployment.py
CHANGED
|
@@ -153,7 +153,7 @@ class DeploymentEngine(Executor):
|
|
|
153
153
|
self,
|
|
154
154
|
fab_file: bytes,
|
|
155
155
|
override_config: UserConfig,
|
|
156
|
-
|
|
156
|
+
federation_options: ConfigsRecord,
|
|
157
157
|
) -> Optional[int]:
|
|
158
158
|
"""Start run using the Flower Deployment Engine."""
|
|
159
159
|
run_id = None
|
flwr/superexec/exec_servicer.py
CHANGED
|
@@ -24,7 +24,7 @@ import grpc
|
|
|
24
24
|
|
|
25
25
|
from flwr.common.constant import LOG_STREAM_INTERVAL, Status
|
|
26
26
|
from flwr.common.logger import log
|
|
27
|
-
from flwr.common.serde import user_config_from_proto
|
|
27
|
+
from flwr.common.serde import configs_record_from_proto, user_config_from_proto
|
|
28
28
|
from flwr.proto import exec_pb2_grpc # pylint: disable=E0611
|
|
29
29
|
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
30
30
|
StartRunRequest,
|
|
@@ -61,7 +61,7 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
|
61
61
|
run_id = self.executor.start_run(
|
|
62
62
|
request.fab.content,
|
|
63
63
|
user_config_from_proto(request.override_config),
|
|
64
|
-
|
|
64
|
+
configs_record_from_proto(request.federation_options),
|
|
65
65
|
)
|
|
66
66
|
|
|
67
67
|
if run_id is None:
|
flwr/superexec/executor.py
CHANGED
|
@@ -19,6 +19,7 @@ from dataclasses import dataclass, field
|
|
|
19
19
|
from subprocess import Popen
|
|
20
20
|
from typing import Optional
|
|
21
21
|
|
|
22
|
+
from flwr.common import ConfigsRecord
|
|
22
23
|
from flwr.common.typing import UserConfig
|
|
23
24
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
|
24
25
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
|
@@ -71,7 +72,7 @@ class Executor(ABC):
|
|
|
71
72
|
self,
|
|
72
73
|
fab_file: bytes,
|
|
73
74
|
override_config: UserConfig,
|
|
74
|
-
|
|
75
|
+
federation_options: ConfigsRecord,
|
|
75
76
|
) -> Optional[int]:
|
|
76
77
|
"""Start a run using the given Flower FAB ID and version.
|
|
77
78
|
|
|
@@ -84,8 +85,8 @@ class Executor(ABC):
|
|
|
84
85
|
The Flower App Bundle file bytes.
|
|
85
86
|
override_config: UserConfig
|
|
86
87
|
The config overrides dict sent by the user (using `flwr run`).
|
|
87
|
-
|
|
88
|
-
The federation options
|
|
88
|
+
federation_options: ConfigsRecord
|
|
89
|
+
The federation options sent by the user (using `flwr run`).
|
|
89
90
|
|
|
90
91
|
Returns
|
|
91
92
|
-------
|
flwr/superexec/simulation.py
CHANGED
|
@@ -25,6 +25,7 @@ from typing_extensions import override
|
|
|
25
25
|
|
|
26
26
|
from flwr.cli.config_utils import load_and_validate
|
|
27
27
|
from flwr.cli.install import install_from_fab
|
|
28
|
+
from flwr.common import ConfigsRecord
|
|
28
29
|
from flwr.common.config import unflatten_dict
|
|
29
30
|
from flwr.common.constant import RUN_ID_NUM_BYTES
|
|
30
31
|
from flwr.common.logger import log
|
|
@@ -124,7 +125,7 @@ class SimulationEngine(Executor):
|
|
|
124
125
|
self,
|
|
125
126
|
fab_file: bytes,
|
|
126
127
|
override_config: UserConfig,
|
|
127
|
-
|
|
128
|
+
federation_options: ConfigsRecord,
|
|
128
129
|
) -> Optional[int]:
|
|
129
130
|
"""Start run using the Flower Simulation Engine."""
|
|
130
131
|
if self.num_supernodes is None:
|
|
@@ -163,14 +164,13 @@ class SimulationEngine(Executor):
|
|
|
163
164
|
"Config extracted from FAB's pyproject.toml is not valid"
|
|
164
165
|
)
|
|
165
166
|
|
|
166
|
-
#
|
|
167
|
-
|
|
167
|
+
# Unflatten underlaying dict
|
|
168
|
+
fed_opt = unflatten_dict({**federation_options})
|
|
168
169
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
verbose: Optional[bool] = federation_config_flat.get("verbose")
|
|
170
|
+
# Read data
|
|
171
|
+
num_supernodes = fed_opt.get("num-supernodes", self.num_supernodes)
|
|
172
|
+
backend_cfg = fed_opt.get("backend", {})
|
|
173
|
+
verbose: Optional[bool] = fed_opt.get("verbose")
|
|
174
174
|
|
|
175
175
|
# In Simulation there is no SuperLink, still we create a run_id
|
|
176
176
|
run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
|
{flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.13.0.
|
|
3
|
+
Version: 1.13.0.dev20241108
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -32,9 +32,9 @@ Classifier: Typing :: Typed
|
|
|
32
32
|
Provides-Extra: rest
|
|
33
33
|
Provides-Extra: simulation
|
|
34
34
|
Requires-Dist: cryptography (>=42.0.4,<43.0.0)
|
|
35
|
-
Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2
|
|
35
|
+
Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
|
|
36
36
|
Requires-Dist: iterators (>=0.0.2,<0.0.3)
|
|
37
|
-
Requires-Dist: numpy (>=1.
|
|
37
|
+
Requires-Dist: numpy (>=1.26.0,<3.0.0)
|
|
38
38
|
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
39
39
|
Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
40
40
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
{flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/RECORD
RENAMED
|
@@ -61,10 +61,10 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=LUsQsEVhCgGzKEBB5Ie
|
|
|
61
61
|
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=BiZPOKEoGiZOuxSHQY_nQHj3KH7wH7QAiVmpxGutOgk,686
|
|
62
62
|
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=6R_bIGyPvXlCtLABF8fHLmGBNlIptG8QrYM69_Fy_nk,710
|
|
63
63
|
flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
|
|
64
|
-
flwr/cli/run/run.py,sha256=
|
|
64
|
+
flwr/cli/run/run.py,sha256=TQm7M0a-oSeNXPCsn75qYrkGB0IPbk0HulcYk1gwmR0,6293
|
|
65
65
|
flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
|
|
66
66
|
flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
|
|
67
|
-
flwr/client/app.py,sha256=
|
|
67
|
+
flwr/client/app.py,sha256=zpYl6I6_1-5BEv93IqGIBX_FDpEvOSYFhDidWjq0K8U,32975
|
|
68
68
|
flwr/client/client.py,sha256=gy6WVlMUFAp8oevN4xpQPX30vPOIYGVqdbuFlTWkyG4,9080
|
|
69
69
|
flwr/client/client_app.py,sha256=cTig-N00YzTucbo9zNi6I21J8PlbflU_8J_f5CI-Wpw,10390
|
|
70
70
|
flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
|
|
@@ -92,6 +92,10 @@ flwr/client/mod/secure_aggregation/__init__.py,sha256=A7DzZ3uvXTUkuHBzrxJMWQQD4R
|
|
|
92
92
|
flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=wI9tuIEvMUETz-wVIEbPYvh-1nK9CEylBLGoVpNhL94,1095
|
|
93
93
|
flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=7cNXsY07ZA0M5_9VSc52F8JUoAoGaraNDA2rgaLvvFo,19680
|
|
94
94
|
flwr/client/mod/utils.py,sha256=dFcTHOjUuuiw34fcQlvyzytYD0sCv1w9x8fQX1Yo8Oc,1201
|
|
95
|
+
flwr/client/nodestate/__init__.py,sha256=UBK-iI4BTiiFi3v6SBo2cizaRRhZzTzkXOhbAZB7cs8,975
|
|
96
|
+
flwr/client/nodestate/in_memory_nodestate.py,sha256=MKI3jVPARPWJmNGw61k1-9LIXROkTx2PrhWjDM8cpHk,1291
|
|
97
|
+
flwr/client/nodestate/nodestate.py,sha256=2sSziyHK65ygayLcEoR78erqyrRe10tZ2tB-QISdRB4,1023
|
|
98
|
+
flwr/client/nodestate/nodestate_factory.py,sha256=LipmYzjYlN2U-CYN20d8Kk0PXyCAJq3L3VQFc6QscJc,1429
|
|
95
99
|
flwr/client/numpy_client.py,sha256=tqGyhIkeeZQGr65BR03B7TWgx4rW3FA7G2874D8z_VU,11167
|
|
96
100
|
flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
|
|
97
101
|
flwr/client/rest_client/connection.py,sha256=k-RqgUFqidACAGlMFPIUM8aawXI5h2LvKUri2OAK7Bg,12817
|
|
@@ -101,8 +105,8 @@ flwr/client/supernode/app.py,sha256=JN24tRBHLbFJ0KeCTA8eS24KUJHCl9J2xGwWjyPQ7Vg,
|
|
|
101
105
|
flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
|
|
102
106
|
flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
|
|
103
107
|
flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
|
|
104
|
-
flwr/common/config.py,sha256=
|
|
105
|
-
flwr/common/constant.py,sha256
|
|
108
|
+
flwr/common/config.py,sha256=qC1QvGAGr4faBtg3Y5dWhfyK5FggyWUMjPqg-Rx_FW4,8083
|
|
109
|
+
flwr/common/constant.py,sha256=D7MNLl1u-P7tJAMdT67xIujSeCibc2QzqtFoqCagoco,4731
|
|
106
110
|
flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
|
|
107
111
|
flwr/common/date.py,sha256=uTvLmCkd3uVQuD4MviPHnIXMGyheL16mEI_UlOsv_R8,894
|
|
108
112
|
flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
|
|
@@ -112,7 +116,7 @@ flwr/common/exit_handlers.py,sha256=MracJaBeoCOC7TaXK9zCJQxhrMSx9ZtczK237qvhBpU,
|
|
|
112
116
|
flwr/common/grpc.py,sha256=6Yi28JjAll19nxYJlOT9B03RN8dvJZP9zUoR3RSmxoY,2487
|
|
113
117
|
flwr/common/logger.py,sha256=AJNu-cymiQUp4Dw1zkw5xww_HVkUAhHvtYxwzUtuohM,11065
|
|
114
118
|
flwr/common/message.py,sha256=4O1m0OWXBAYZz05gKgEtnoJ94J1gjo7hCNHyUXThxRo,13831
|
|
115
|
-
flwr/common/object_ref.py,sha256=
|
|
119
|
+
flwr/common/object_ref.py,sha256=DavEkh-IJv_s0VeLsJvSZS5k-Ix_k1UcNXbldfNFXxM,9859
|
|
116
120
|
flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
|
|
117
121
|
flwr/common/pyproject.py,sha256=EI_ovbCHGmhYrdPx0RSDi5EkFZFof-8m1PA54c0ZTjc,1385
|
|
118
122
|
flwr/common/record/__init__.py,sha256=ejDBQOIA0OkwZAC5cK_tTPHA4oAM0Ju7Oi13-NneMlE,1054
|
|
@@ -134,7 +138,7 @@ flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeN
|
|
|
134
138
|
flwr/common/secure_aggregation/secaggplus_utils.py,sha256=o7IhHH6J9xqinhQy3TdPgQpoj1XyEpyv3OQFyx81RVQ,3193
|
|
135
139
|
flwr/common/serde.py,sha256=_z7-2XC-ecfEPzv2wEjJMTp9YH5FJqgQrTBZneDmhzA,30630
|
|
136
140
|
flwr/common/telemetry.py,sha256=20AYNaePOBaSEh99PIuBrxRxtY53-kZ5-2Ej0JWUJmc,8731
|
|
137
|
-
flwr/common/typing.py,sha256=
|
|
141
|
+
flwr/common/typing.py,sha256=gk9B685P9_TctGOU0wxTlCRTxHbeaESn5TZiR9v6S0E,5104
|
|
138
142
|
flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
|
|
139
143
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
|
140
144
|
flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
|
|
@@ -153,8 +157,8 @@ flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
|
|
|
153
157
|
flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
|
|
154
158
|
flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
155
159
|
flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
156
|
-
flwr/proto/exec_pb2.py,sha256=
|
|
157
|
-
flwr/proto/exec_pb2.pyi,sha256=
|
|
160
|
+
flwr/proto/exec_pb2.py,sha256=e6a-KKc5o7bI5BpdfxmZR-nIj2_RMcIBUVOUnaUU_vA,2976
|
|
161
|
+
flwr/proto/exec_pb2.pyi,sha256=bz1Ld0GmofBRrkr04ustaRToCAWx1AWShxjhJYiwAo0,3906
|
|
158
162
|
flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
|
|
159
163
|
flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
|
|
160
164
|
flwr/proto/fab_pb2.py,sha256=3QSDq9pjbZoqVxsmCRDwHO5PrSjzn2vixjYxE-qPmb0,1589
|
|
@@ -185,18 +189,18 @@ flwr/proto/recordset_pb2.py,sha256=XjEIDU-YlKSY59qNd0qXTFB4COvMHGiszQ5O1krJ1Ks,6
|
|
|
185
189
|
flwr/proto/recordset_pb2.pyi,sha256=ypFNvroU4aIlnN0D6W4XAsOfm0UzTfXhxxL1v7u__Ac,15370
|
|
186
190
|
flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
187
191
|
flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
188
|
-
flwr/proto/run_pb2.py,sha256=
|
|
189
|
-
flwr/proto/run_pb2.pyi,sha256=
|
|
192
|
+
flwr/proto/run_pb2.py,sha256=RDTp7PlvPT-1p0uUYpaQUk4bw1mYr7lktuKA7uRPfrg,5516
|
|
193
|
+
flwr/proto/run_pb2.pyi,sha256=M9Zdokby10jr_sBlNIFBYad97Dre0sz5AB7JI4b9OgY,10903
|
|
190
194
|
flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
191
195
|
flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
192
196
|
flwr/proto/serverappio_pb2.py,sha256=zWnODeaj26oSx98-BFvwtWM_fYvsw9OeSIuV7JnKVvw,4822
|
|
193
197
|
flwr/proto/serverappio_pb2.pyi,sha256=Ib9c32FCtjA9zZY54Ohi6B-DtLgSjokAqOExm_2uOvY,6429
|
|
194
198
|
flwr/proto/serverappio_pb2_grpc.py,sha256=M__pFMmb9yTAGMHVd3_K1V6DeLRuFc9UErJHWjBAsZs,17439
|
|
195
199
|
flwr/proto/serverappio_pb2_grpc.pyi,sha256=ERM-0cQVmUqrVXlvEbS2wfUZpZmv5SlIeNsGZPYMrVo,4779
|
|
196
|
-
flwr/proto/simulationio_pb2.py,sha256=
|
|
200
|
+
flwr/proto/simulationio_pb2.py,sha256=sCJQp_NEJSDtC4EKzyy2yZWtu9z7PGUUFJpLjdA9VUs,3011
|
|
197
201
|
flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
|
|
198
|
-
flwr/proto/simulationio_pb2_grpc.py,sha256
|
|
199
|
-
flwr/proto/simulationio_pb2_grpc.pyi,sha256=
|
|
202
|
+
flwr/proto/simulationio_pb2_grpc.py,sha256=-qcd4rOOK-46LcP57oZswqwASpy2_UvMJmJ80OpzuNM,9622
|
|
203
|
+
flwr/proto/simulationio_pb2_grpc.pyi,sha256=Bk4K7MsPpxF6RmIqByySQIXJeJ1pBrU2I19hrKUoFdI,2795
|
|
200
204
|
flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
|
|
201
205
|
flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
|
|
202
206
|
flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
@@ -217,19 +221,19 @@ flwr/server/compat/driver_client_proxy.py,sha256=Af0bRUEVZNcCYRxt3DjpLPdvVYpTgz6
|
|
|
217
221
|
flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_OdAiF47dY,1804
|
|
218
222
|
flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
|
|
219
223
|
flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
|
|
220
|
-
flwr/server/driver/driver.py,sha256=
|
|
221
|
-
flwr/server/driver/grpc_driver.py,sha256=
|
|
222
|
-
flwr/server/driver/inmemory_driver.py,sha256=
|
|
224
|
+
flwr/server/driver/driver.py,sha256=u_fMfqLYTroTafGCNwKPHI4lttRL-Z5CqeT3_FHSq-Q,5701
|
|
225
|
+
flwr/server/driver/grpc_driver.py,sha256=4_bJGbeiLV2FTrJseClnsFf2TgitwjwYNO_5sm2FltY,9533
|
|
226
|
+
flwr/server/driver/inmemory_driver.py,sha256=gfB4jmkk1indhRa9XCdKCXghVcWBF1qBD-tAxMUyQm0,6404
|
|
223
227
|
flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
|
|
224
|
-
flwr/server/run_serverapp.py,sha256=
|
|
228
|
+
flwr/server/run_serverapp.py,sha256=zvH7XEJt0WpTeDTTf-67VvugCRuaItMm7klSOcbhFIU,10559
|
|
225
229
|
flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
|
|
226
230
|
flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
|
|
227
231
|
flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
|
|
228
232
|
flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
|
|
229
|
-
flwr/server/serverapp/app.py,sha256
|
|
233
|
+
flwr/server/serverapp/app.py,sha256=yRHrTLpwRBOtcQd_VttHy8RR12LhlqFjV70H4FxQRMY,8987
|
|
230
234
|
flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
|
|
231
235
|
flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
|
|
232
|
-
flwr/server/strategy/aggregate.py,sha256=
|
|
236
|
+
flwr/server/strategy/aggregate.py,sha256=PDvekufza13s9AsVmz9WASunaBs3yCtl8JVliFx9j6Q,13978
|
|
233
237
|
flwr/server/strategy/bulyan.py,sha256=DDNLLlTJCHgBtij7EpDsa852GHEYjjDB1iORACZO2KE,6513
|
|
234
238
|
flwr/server/strategy/dp_adaptive_clipping.py,sha256=zrqA9OfQu4gwUkLCXbh59sPsDd_x2IhNs-BER_ITzNE,17447
|
|
235
239
|
flwr/server/strategy/dp_fixed_clipping.py,sha256=ILmO_AsoMpstOAYK9L6hJpqf7zE6erdMj_SD_-hHAFk,12834
|
|
@@ -281,14 +285,14 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
|
|
|
281
285
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DPSioTSKD3YGtS3uJsPD7Hn2Fw,7155
|
|
282
286
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=VL6e_Jwf4uxA-X1EelxJZMv6Eji-_p2J9D0MdHG10a4,13029
|
|
283
287
|
flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
|
|
284
|
-
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=
|
|
288
|
+
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=SxJYOrzHVLWFO8qg3LhoD4PUmCP4ItFiqv6bDWApoxo,21197
|
|
285
289
|
flwr/server/superlink/linkstate/linkstate.py,sha256=ylDV9I_j6a4LtWq-d-VWQyh8ipCob6DT7QcY6A7-LAo,12021
|
|
286
290
|
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
|
|
287
|
-
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=
|
|
288
|
-
flwr/server/superlink/linkstate/utils.py,sha256=
|
|
291
|
+
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=OndEO8VjUHXw09fDw2t65fN1Ong9QBR56N2SyOlirAE,44604
|
|
292
|
+
flwr/server/superlink/linkstate/utils.py,sha256=emryyCNnsSodqhxuxJ3vBLglwHZ_eIA_rawdL7dDVCA,6204
|
|
289
293
|
flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
|
|
290
294
|
flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
|
|
291
|
-
flwr/server/superlink/simulation/simulationio_servicer.py,sha256=
|
|
295
|
+
flwr/server/superlink/simulation/simulationio_servicer.py,sha256=LsW6Cl8qH_vq04F6CeOp3vBtjTGQn4tATKHfirDmJZQ,5942
|
|
292
296
|
flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
|
|
293
297
|
flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
|
|
294
298
|
flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
|
|
@@ -305,17 +309,17 @@ flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQD
|
|
|
305
309
|
flwr/simulation/ray_transport/ray_actor.py,sha256=9-XBguAm5IFqm2ddPFsQtnuuFN6lzqdb00SnCxGUGBo,18996
|
|
306
310
|
flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2vjOKoom3B74C6XU-jC3N6DwYmsLdB-lmkHZ_Xrv96o,7367
|
|
307
311
|
flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
|
|
308
|
-
flwr/simulation/run_simulation.py,sha256=
|
|
312
|
+
flwr/simulation/run_simulation.py,sha256=BoG0lwaixe3g-xL4RZPl_6P47PKj2TiPHsDUtcNztkk,20247
|
|
309
313
|
flwr/simulation/simulationio_connection.py,sha256=Uqtm2pRuZqEM8SxKS2TdBgsMUABSabhVIx9zzCPb_qc,3195
|
|
310
314
|
flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
|
|
311
315
|
flwr/superexec/app.py,sha256=Tt3GonnTwHrMmicwx9XaP-crP78-bf4DUWl-N5cG6zY,1841
|
|
312
|
-
flwr/superexec/deployment.py,sha256=
|
|
316
|
+
flwr/superexec/deployment.py,sha256=C-NNclLE9OVJST6VRemtXv5N_vOoZeb77AQcMptCP6M,6511
|
|
313
317
|
flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2241
|
|
314
|
-
flwr/superexec/exec_servicer.py,sha256=
|
|
315
|
-
flwr/superexec/executor.py,sha256=
|
|
316
|
-
flwr/superexec/simulation.py,sha256=
|
|
317
|
-
flwr_nightly-1.13.0.
|
|
318
|
-
flwr_nightly-1.13.0.
|
|
319
|
-
flwr_nightly-1.13.0.
|
|
320
|
-
flwr_nightly-1.13.0.
|
|
321
|
-
flwr_nightly-1.13.0.
|
|
318
|
+
flwr/superexec/exec_servicer.py,sha256=zNcdPkqLXgJIANKvE9uGIzgxocIs31WAj1YDnwqI6jo,3958
|
|
319
|
+
flwr/superexec/executor.py,sha256=zH3_53il6Jh0ZscIVEB9f4GNnXMeBbCGyCoBCxLgiG0,3114
|
|
320
|
+
flwr/superexec/simulation.py,sha256=prqEgAKnejHcYEj_euK1ICaHHt3QgLa3jnZJkDA7qqI,7623
|
|
321
|
+
flwr_nightly-1.13.0.dev20241108.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
322
|
+
flwr_nightly-1.13.0.dev20241108.dist-info/METADATA,sha256=gbeRnLHzdA0TrNWlmHZWif0SgZWSoHBrPeqU0TRGjY8,15573
|
|
323
|
+
flwr_nightly-1.13.0.dev20241108.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
324
|
+
flwr_nightly-1.13.0.dev20241108.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
|
|
325
|
+
flwr_nightly-1.13.0.dev20241108.dist-info/RECORD,,
|
{flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/LICENSE
RENAMED
|
File without changes
|
{flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241108.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|