flwr-nightly 1.12.0.dev20240917__py3-none-any.whl → 1.12.0.dev20240919__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/new/new.py +1 -1
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -0
- flwr/proto/clientappio_pb2.py +1 -1
- flwr/proto/control_pb2.py +27 -0
- flwr/proto/control_pb2.pyi +7 -0
- flwr/proto/control_pb2_grpc.py +67 -0
- flwr/proto/control_pb2_grpc.pyi +27 -0
- flwr/proto/driver_pb2.py +15 -24
- flwr/proto/driver_pb2.pyi +0 -52
- flwr/proto/driver_pb2_grpc.py +6 -6
- flwr/proto/driver_pb2_grpc.pyi +4 -4
- flwr/proto/exec_pb2.py +1 -1
- flwr/proto/message_pb2.py +1 -1
- flwr/proto/node_pb2.py +1 -1
- flwr/proto/run_pb2.py +18 -9
- flwr/proto/run_pb2.pyi +52 -0
- flwr/proto/task_pb2.py +1 -1
- flwr/server/run_serverapp.py +2 -2
- flwr/server/superlink/driver/driver_servicer.py +2 -2
- flwr/server/superlink/state/sqlite_state.py +103 -23
- flwr/server/superlink/state/utils.py +98 -2
- flwr/superexec/deployment.py +3 -1
- flwr/superexec/exec_servicer.py +68 -3
- flwr/superexec/executor.py +2 -1
- {flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/METADATA +1 -1
- {flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/RECORD +29 -25
- {flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/entry_points.txt +0 -0
flwr/cli/new/new.py
CHANGED
|
@@ -275,7 +275,7 @@ def new(
|
|
|
275
275
|
)
|
|
276
276
|
)
|
|
277
277
|
|
|
278
|
-
_add = " huggingface-cli login\n" if
|
|
278
|
+
_add = " huggingface-cli login\n" if llm_challenge_str else ""
|
|
279
279
|
print(
|
|
280
280
|
typer.style(
|
|
281
281
|
f" cd {package_name}\n" + " pip install -e .\n" + _add + " flwr run\n",
|
flwr/proto/clientappio_pb2.py
CHANGED
|
@@ -17,7 +17,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
|
17
17
|
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x11\n\x0fGetTokenRequest\"!\n\x10GetTokenResponse\x12\r\n\x05token\x18\x01 \x01(\
|
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x11\n\x0fGetTokenRequest\"!\n\x10GetTokenResponse\x12\r\n\x05token\x18\x01 \x01(\x04\"+\n\x1aPullClientAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\x04\"\xa5\x01\n\x1bPullClientAppInputsResponse\x12$\n\x07message\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\"x\n\x1bPushClientAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\x04\x12$\n\x07message\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"Q\n\x1cPushClientAppOutputsResponse\x12\x31\n\x06status\x18\x01 \x01(\x0b\x32!.flwr.proto.ClientAppOutputStatus*L\n\x13\x43lientAppOutputCode\x12\x0b\n\x07SUCCESS\x10\x00\x12\x15\n\x11\x44\x45\x41\x44LINE_EXCEEDED\x10\x01\x12\x11\n\rUNKNOWN_ERROR\x10\x02\x32\xad\x02\n\x0b\x43lientAppIo\x12G\n\x08GetToken\x12\x1b.flwr.proto.GetTokenRequest\x1a\x1c.flwr.proto.GetTokenResponse\"\x00\x12h\n\x13PullClientAppInputs\x12&.flwr.proto.PullClientAppInputsRequest\x1a\'.flwr.proto.PullClientAppInputsResponse\"\x00\x12k\n\x14PushClientAppOutputs\x12\'.flwr.proto.PushClientAppOutputsRequest\x1a(.flwr.proto.PushClientAppOutputsResponse\"\x00\x62\x06proto3')
|
|
21
21
|
|
|
22
22
|
_globals = globals()
|
|
23
23
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: flwr/proto/control.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
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/run.proto2U\n\x07\x43ontrol\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x62\x06proto3')
|
|
19
|
+
|
|
20
|
+
_globals = globals()
|
|
21
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.control_pb2', _globals)
|
|
23
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
24
|
+
DESCRIPTOR._options = None
|
|
25
|
+
_globals['_CONTROL']._serialized_start=62
|
|
26
|
+
_globals['_CONTROL']._serialized_end=147
|
|
27
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
|
|
5
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ControlStub(object):
|
|
9
|
+
"""Missing associated documentation comment in .proto file."""
|
|
10
|
+
|
|
11
|
+
def __init__(self, channel):
|
|
12
|
+
"""Constructor.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
channel: A grpc.Channel.
|
|
16
|
+
"""
|
|
17
|
+
self.CreateRun = channel.unary_unary(
|
|
18
|
+
'/flwr.proto.Control/CreateRun',
|
|
19
|
+
request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
|
20
|
+
response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ControlServicer(object):
|
|
25
|
+
"""Missing associated documentation comment in .proto file."""
|
|
26
|
+
|
|
27
|
+
def CreateRun(self, request, context):
|
|
28
|
+
"""Request to create a new run
|
|
29
|
+
"""
|
|
30
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
31
|
+
context.set_details('Method not implemented!')
|
|
32
|
+
raise NotImplementedError('Method not implemented!')
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def add_ControlServicer_to_server(servicer, server):
|
|
36
|
+
rpc_method_handlers = {
|
|
37
|
+
'CreateRun': grpc.unary_unary_rpc_method_handler(
|
|
38
|
+
servicer.CreateRun,
|
|
39
|
+
request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
|
|
40
|
+
response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
|
|
41
|
+
),
|
|
42
|
+
}
|
|
43
|
+
generic_handler = grpc.method_handlers_generic_handler(
|
|
44
|
+
'flwr.proto.Control', rpc_method_handlers)
|
|
45
|
+
server.add_generic_rpc_handlers((generic_handler,))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# This class is part of an EXPERIMENTAL API.
|
|
49
|
+
class Control(object):
|
|
50
|
+
"""Missing associated documentation comment in .proto file."""
|
|
51
|
+
|
|
52
|
+
@staticmethod
|
|
53
|
+
def CreateRun(request,
|
|
54
|
+
target,
|
|
55
|
+
options=(),
|
|
56
|
+
channel_credentials=None,
|
|
57
|
+
call_credentials=None,
|
|
58
|
+
insecure=False,
|
|
59
|
+
compression=None,
|
|
60
|
+
wait_for_ready=None,
|
|
61
|
+
timeout=None,
|
|
62
|
+
metadata=None):
|
|
63
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/CreateRun',
|
|
64
|
+
flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
|
65
|
+
flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
|
66
|
+
options, channel_credentials,
|
|
67
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import abc
|
|
6
|
+
import flwr.proto.run_pb2
|
|
7
|
+
import grpc
|
|
8
|
+
|
|
9
|
+
class ControlStub:
|
|
10
|
+
def __init__(self, channel: grpc.Channel) -> None: ...
|
|
11
|
+
CreateRun: grpc.UnaryUnaryMultiCallable[
|
|
12
|
+
flwr.proto.run_pb2.CreateRunRequest,
|
|
13
|
+
flwr.proto.run_pb2.CreateRunResponse]
|
|
14
|
+
"""Request to create a new run"""
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ControlServicer(metaclass=abc.ABCMeta):
|
|
18
|
+
@abc.abstractmethod
|
|
19
|
+
def CreateRun(self,
|
|
20
|
+
request: flwr.proto.run_pb2.CreateRunRequest,
|
|
21
|
+
context: grpc.ServicerContext,
|
|
22
|
+
) -> flwr.proto.run_pb2.CreateRunResponse:
|
|
23
|
+
"""Request to create a new run"""
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def add_ControlServicer_to_server(servicer: ControlServicer, server: grpc.Server) -> None: ...
|
flwr/proto/driver_pb2.py
CHANGED
|
@@ -16,36 +16,27 @@ 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
17
|
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
18
18
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
19
|
-
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
20
19
|
|
|
21
20
|
|
|
22
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\
|
|
21
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x66lwr/proto/driver.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.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\"@\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"F\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes2\xc7\x03\n\x06\x44river\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\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\x62\x06proto3')
|
|
23
22
|
|
|
24
23
|
_globals = globals()
|
|
25
24
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
26
25
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.driver_pb2', _globals)
|
|
27
26
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
28
27
|
DESCRIPTOR._options = None
|
|
29
|
-
_globals['
|
|
30
|
-
_globals['
|
|
31
|
-
_globals['
|
|
32
|
-
_globals['
|
|
33
|
-
_globals['
|
|
34
|
-
_globals['
|
|
35
|
-
_globals['
|
|
36
|
-
_globals['
|
|
37
|
-
_globals['
|
|
38
|
-
_globals['
|
|
39
|
-
_globals['
|
|
40
|
-
_globals['
|
|
41
|
-
_globals['
|
|
42
|
-
_globals['
|
|
43
|
-
_globals['_PUSHTASKINSRESPONSE']._serialized_start=586
|
|
44
|
-
_globals['_PUSHTASKINSRESPONSE']._serialized_end=625
|
|
45
|
-
_globals['_PULLTASKRESREQUEST']._serialized_start=627
|
|
46
|
-
_globals['_PULLTASKRESREQUEST']._serialized_end=697
|
|
47
|
-
_globals['_PULLTASKRESRESPONSE']._serialized_start=699
|
|
48
|
-
_globals['_PULLTASKRESRESPONSE']._serialized_end=764
|
|
49
|
-
_globals['_DRIVER']._serialized_start=767
|
|
50
|
-
_globals['_DRIVER']._serialized_end=1222
|
|
28
|
+
_globals['_GETNODESREQUEST']._serialized_start=129
|
|
29
|
+
_globals['_GETNODESREQUEST']._serialized_end=162
|
|
30
|
+
_globals['_GETNODESRESPONSE']._serialized_start=164
|
|
31
|
+
_globals['_GETNODESRESPONSE']._serialized_end=215
|
|
32
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_start=217
|
|
33
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_end=281
|
|
34
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_start=283
|
|
35
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_end=322
|
|
36
|
+
_globals['_PULLTASKRESREQUEST']._serialized_start=324
|
|
37
|
+
_globals['_PULLTASKRESREQUEST']._serialized_end=394
|
|
38
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_start=396
|
|
39
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_end=461
|
|
40
|
+
_globals['_DRIVER']._serialized_start=464
|
|
41
|
+
_globals['_DRIVER']._serialized_end=919
|
|
51
42
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/driver_pb2.pyi
CHANGED
|
@@ -3,10 +3,8 @@
|
|
|
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.task_pb2
|
|
9
|
-
import flwr.proto.transport_pb2
|
|
10
8
|
import google.protobuf.descriptor
|
|
11
9
|
import google.protobuf.internal.containers
|
|
12
10
|
import google.protobuf.message
|
|
@@ -15,56 +13,6 @@ import typing_extensions
|
|
|
15
13
|
|
|
16
14
|
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
17
15
|
|
|
18
|
-
class CreateRunRequest(google.protobuf.message.Message):
|
|
19
|
-
"""CreateRun"""
|
|
20
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
21
|
-
class OverrideConfigEntry(google.protobuf.message.Message):
|
|
22
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
23
|
-
KEY_FIELD_NUMBER: builtins.int
|
|
24
|
-
VALUE_FIELD_NUMBER: builtins.int
|
|
25
|
-
key: typing.Text
|
|
26
|
-
@property
|
|
27
|
-
def value(self) -> flwr.proto.transport_pb2.Scalar: ...
|
|
28
|
-
def __init__(self,
|
|
29
|
-
*,
|
|
30
|
-
key: typing.Text = ...,
|
|
31
|
-
value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
|
|
32
|
-
) -> None: ...
|
|
33
|
-
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
|
34
|
-
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
35
|
-
|
|
36
|
-
FAB_ID_FIELD_NUMBER: builtins.int
|
|
37
|
-
FAB_VERSION_FIELD_NUMBER: builtins.int
|
|
38
|
-
OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
|
|
39
|
-
FAB_FIELD_NUMBER: builtins.int
|
|
40
|
-
fab_id: typing.Text
|
|
41
|
-
fab_version: typing.Text
|
|
42
|
-
@property
|
|
43
|
-
def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
|
|
44
|
-
@property
|
|
45
|
-
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
|
46
|
-
def __init__(self,
|
|
47
|
-
*,
|
|
48
|
-
fab_id: typing.Text = ...,
|
|
49
|
-
fab_version: typing.Text = ...,
|
|
50
|
-
override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
|
|
51
|
-
fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
|
|
52
|
-
) -> None: ...
|
|
53
|
-
def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
|
|
54
|
-
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: ...
|
|
55
|
-
global___CreateRunRequest = CreateRunRequest
|
|
56
|
-
|
|
57
|
-
class CreateRunResponse(google.protobuf.message.Message):
|
|
58
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
59
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
|
60
|
-
run_id: builtins.int
|
|
61
|
-
def __init__(self,
|
|
62
|
-
*,
|
|
63
|
-
run_id: builtins.int = ...,
|
|
64
|
-
) -> None: ...
|
|
65
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
66
|
-
global___CreateRunResponse = CreateRunResponse
|
|
67
|
-
|
|
68
16
|
class GetNodesRequest(google.protobuf.message.Message):
|
|
69
17
|
"""GetNodes messages"""
|
|
70
18
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
flwr/proto/driver_pb2_grpc.py
CHANGED
|
@@ -18,8 +18,8 @@ class DriverStub(object):
|
|
|
18
18
|
"""
|
|
19
19
|
self.CreateRun = channel.unary_unary(
|
|
20
20
|
'/flwr.proto.Driver/CreateRun',
|
|
21
|
-
request_serializer=
|
|
22
|
-
response_deserializer=
|
|
21
|
+
request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
|
22
|
+
response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
|
23
23
|
)
|
|
24
24
|
self.GetNodes = channel.unary_unary(
|
|
25
25
|
'/flwr.proto.Driver/GetNodes',
|
|
@@ -98,8 +98,8 @@ def add_DriverServicer_to_server(servicer, server):
|
|
|
98
98
|
rpc_method_handlers = {
|
|
99
99
|
'CreateRun': grpc.unary_unary_rpc_method_handler(
|
|
100
100
|
servicer.CreateRun,
|
|
101
|
-
request_deserializer=
|
|
102
|
-
response_serializer=
|
|
101
|
+
request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
|
|
102
|
+
response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
|
|
103
103
|
),
|
|
104
104
|
'GetNodes': grpc.unary_unary_rpc_method_handler(
|
|
105
105
|
servicer.GetNodes,
|
|
@@ -148,8 +148,8 @@ class Driver(object):
|
|
|
148
148
|
timeout=None,
|
|
149
149
|
metadata=None):
|
|
150
150
|
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Driver/CreateRun',
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
|
|
152
|
+
flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
|
|
153
153
|
options, channel_credentials,
|
|
154
154
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
155
155
|
|
flwr/proto/driver_pb2_grpc.pyi
CHANGED
|
@@ -11,8 +11,8 @@ import grpc
|
|
|
11
11
|
class DriverStub:
|
|
12
12
|
def __init__(self, channel: grpc.Channel) -> None: ...
|
|
13
13
|
CreateRun: grpc.UnaryUnaryMultiCallable[
|
|
14
|
-
flwr.proto.
|
|
15
|
-
flwr.proto.
|
|
14
|
+
flwr.proto.run_pb2.CreateRunRequest,
|
|
15
|
+
flwr.proto.run_pb2.CreateRunResponse]
|
|
16
16
|
"""Request run_id"""
|
|
17
17
|
|
|
18
18
|
GetNodes: grpc.UnaryUnaryMultiCallable[
|
|
@@ -44,9 +44,9 @@ class DriverStub:
|
|
|
44
44
|
class DriverServicer(metaclass=abc.ABCMeta):
|
|
45
45
|
@abc.abstractmethod
|
|
46
46
|
def CreateRun(self,
|
|
47
|
-
request: flwr.proto.
|
|
47
|
+
request: flwr.proto.run_pb2.CreateRunRequest,
|
|
48
48
|
context: grpc.ServicerContext,
|
|
49
|
-
) -> flwr.proto.
|
|
49
|
+
) -> flwr.proto.run_pb2.CreateRunResponse:
|
|
50
50
|
"""Request run_id"""
|
|
51
51
|
pass
|
|
52
52
|
|
flwr/proto/exec_pb2.py
CHANGED
|
@@ -16,7 +16,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
|
16
16
|
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\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\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\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\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"#\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"(\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t2\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
|
|
20
20
|
|
|
21
21
|
_globals = globals()
|
|
22
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
flwr/proto/message_pb2.py
CHANGED
|
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
|
|
|
17
17
|
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xbf\x02\n\x07\x43ontext\x12\x0f\n\x07node_id\x18\x01 \x01(\
|
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xbf\x02\n\x07\x43ontext\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x38\n\x0bnode_config\x18\x02 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12$\n\x05state\x18\x03 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12\x36\n\nrun_config\x18\x04 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbb\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x18\n\x10reply_to_message\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\x62\x06proto3')
|
|
21
21
|
|
|
22
22
|
_globals = globals()
|
|
23
23
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
flwr/proto/node_pb2.py
CHANGED
|
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"*\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"*\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x11\n\tanonymous\x18\x02 \x01(\x08\x62\x06proto3')
|
|
18
18
|
|
|
19
19
|
_globals = globals()
|
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
flwr/proto/run_pb2.py
CHANGED
|
@@ -12,10 +12,11 @@ from google.protobuf.internal import builder as _builder
|
|
|
12
12
|
_sym_db = _symbol_database.Default()
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
15
16
|
from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\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\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\"\xeb\x01\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\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\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\x1f\n\rGetRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Runb\x06proto3')
|
|
19
20
|
|
|
20
21
|
_globals = globals()
|
|
21
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -24,12 +25,20 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
24
25
|
DESCRIPTOR._options = None
|
|
25
26
|
_globals['_RUN_OVERRIDECONFIGENTRY']._options = None
|
|
26
27
|
_globals['_RUN_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
|
|
27
|
-
_globals['
|
|
28
|
-
_globals['
|
|
29
|
-
_globals['
|
|
30
|
-
_globals['
|
|
31
|
-
_globals['
|
|
32
|
-
_globals['
|
|
33
|
-
_globals['
|
|
34
|
-
_globals['
|
|
28
|
+
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._options = None
|
|
29
|
+
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
|
|
30
|
+
_globals['_RUN']._serialized_start=87
|
|
31
|
+
_globals['_RUN']._serialized_end=300
|
|
32
|
+
_globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=227
|
|
33
|
+
_globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=300
|
|
34
|
+
_globals['_CREATERUNREQUEST']._serialized_start=303
|
|
35
|
+
_globals['_CREATERUNREQUEST']._serialized_end=538
|
|
36
|
+
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=227
|
|
37
|
+
_globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=300
|
|
38
|
+
_globals['_CREATERUNRESPONSE']._serialized_start=540
|
|
39
|
+
_globals['_CREATERUNRESPONSE']._serialized_end=575
|
|
40
|
+
_globals['_GETRUNREQUEST']._serialized_start=577
|
|
41
|
+
_globals['_GETRUNREQUEST']._serialized_end=608
|
|
42
|
+
_globals['_GETRUNRESPONSE']._serialized_start=610
|
|
43
|
+
_globals['_GETRUNRESPONSE']._serialized_end=656
|
|
35
44
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/run_pb2.pyi
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
isort:skip_file
|
|
4
4
|
"""
|
|
5
5
|
import builtins
|
|
6
|
+
import flwr.proto.fab_pb2
|
|
6
7
|
import flwr.proto.transport_pb2
|
|
7
8
|
import google.protobuf.descriptor
|
|
8
9
|
import google.protobuf.internal.containers
|
|
@@ -51,7 +52,58 @@ class Run(google.protobuf.message.Message):
|
|
|
51
52
|
def ClearField(self, field_name: typing_extensions.Literal["fab_hash",b"fab_hash","fab_id",b"fab_id","fab_version",b"fab_version","override_config",b"override_config","run_id",b"run_id"]) -> None: ...
|
|
52
53
|
global___Run = Run
|
|
53
54
|
|
|
55
|
+
class CreateRunRequest(google.protobuf.message.Message):
|
|
56
|
+
"""CreateRun"""
|
|
57
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
58
|
+
class OverrideConfigEntry(google.protobuf.message.Message):
|
|
59
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
60
|
+
KEY_FIELD_NUMBER: builtins.int
|
|
61
|
+
VALUE_FIELD_NUMBER: builtins.int
|
|
62
|
+
key: typing.Text
|
|
63
|
+
@property
|
|
64
|
+
def value(self) -> flwr.proto.transport_pb2.Scalar: ...
|
|
65
|
+
def __init__(self,
|
|
66
|
+
*,
|
|
67
|
+
key: typing.Text = ...,
|
|
68
|
+
value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
|
|
69
|
+
) -> None: ...
|
|
70
|
+
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
|
71
|
+
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
72
|
+
|
|
73
|
+
FAB_ID_FIELD_NUMBER: builtins.int
|
|
74
|
+
FAB_VERSION_FIELD_NUMBER: builtins.int
|
|
75
|
+
OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
|
|
76
|
+
FAB_FIELD_NUMBER: builtins.int
|
|
77
|
+
fab_id: typing.Text
|
|
78
|
+
fab_version: typing.Text
|
|
79
|
+
@property
|
|
80
|
+
def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
|
|
81
|
+
@property
|
|
82
|
+
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
|
83
|
+
def __init__(self,
|
|
84
|
+
*,
|
|
85
|
+
fab_id: typing.Text = ...,
|
|
86
|
+
fab_version: typing.Text = ...,
|
|
87
|
+
override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
|
|
88
|
+
fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
|
|
89
|
+
) -> None: ...
|
|
90
|
+
def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
|
|
91
|
+
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: ...
|
|
92
|
+
global___CreateRunRequest = CreateRunRequest
|
|
93
|
+
|
|
94
|
+
class CreateRunResponse(google.protobuf.message.Message):
|
|
95
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
96
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
|
97
|
+
run_id: builtins.int
|
|
98
|
+
def __init__(self,
|
|
99
|
+
*,
|
|
100
|
+
run_id: builtins.int = ...,
|
|
101
|
+
) -> None: ...
|
|
102
|
+
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
|
103
|
+
global___CreateRunResponse = CreateRunResponse
|
|
104
|
+
|
|
54
105
|
class GetRunRequest(google.protobuf.message.Message):
|
|
106
|
+
"""GetRun"""
|
|
55
107
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
56
108
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
57
109
|
run_id: builtins.int
|
flwr/proto/task_pb2.py
CHANGED
|
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
|
|
|
17
17
|
from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\x89\x02\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x11\n\tpushed_at\x18\x05 \x01(\x01\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\
|
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\x89\x02\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x11\n\tpushed_at\x18\x05 \x01(\x01\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
|
|
21
21
|
|
|
22
22
|
_globals = globals()
|
|
23
23
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
flwr/server/run_serverapp.py
CHANGED
|
@@ -35,11 +35,11 @@ from flwr.common.constant import DRIVER_API_DEFAULT_ADDRESS
|
|
|
35
35
|
from flwr.common.logger import log, update_console_handler, warn_deprecated_feature
|
|
36
36
|
from flwr.common.object_ref import load_app
|
|
37
37
|
from flwr.common.typing import UserConfig
|
|
38
|
-
from flwr.proto.
|
|
38
|
+
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
39
|
+
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
39
40
|
CreateRunRequest,
|
|
40
41
|
CreateRunResponse,
|
|
41
42
|
)
|
|
42
|
-
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
43
43
|
|
|
44
44
|
from .driver import Driver
|
|
45
45
|
from .driver.grpc_driver import GrpcDriver
|
|
@@ -32,8 +32,6 @@ from flwr.common.serde import (
|
|
|
32
32
|
from flwr.common.typing import Fab
|
|
33
33
|
from flwr.proto import driver_pb2_grpc # pylint: disable=E0611
|
|
34
34
|
from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
35
|
-
CreateRunRequest,
|
|
36
|
-
CreateRunResponse,
|
|
37
35
|
GetNodesRequest,
|
|
38
36
|
GetNodesResponse,
|
|
39
37
|
PullTaskResRequest,
|
|
@@ -44,6 +42,8 @@ from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
|
44
42
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
|
45
43
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
|
46
44
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
|
45
|
+
CreateRunRequest,
|
|
46
|
+
CreateRunResponse,
|
|
47
47
|
GetRunRequest,
|
|
48
48
|
GetRunResponse,
|
|
49
49
|
Run,
|
|
@@ -33,7 +33,14 @@ from flwr.proto.task_pb2 import Task, TaskIns, TaskRes # pylint: disable=E0611
|
|
|
33
33
|
from flwr.server.utils.validator import validate_task_ins_or_res
|
|
34
34
|
|
|
35
35
|
from .state import State
|
|
36
|
-
from .utils import
|
|
36
|
+
from .utils import (
|
|
37
|
+
convert_sint64_to_uint64,
|
|
38
|
+
convert_sint64_values_in_dict_to_uint64,
|
|
39
|
+
convert_uint64_to_sint64,
|
|
40
|
+
convert_uint64_values_in_dict_to_sint64,
|
|
41
|
+
generate_rand_int_from_bytes,
|
|
42
|
+
make_node_unavailable_taskres,
|
|
43
|
+
)
|
|
37
44
|
|
|
38
45
|
SQL_CREATE_TABLE_NODE = """
|
|
39
46
|
CREATE TABLE IF NOT EXISTS node(
|
|
@@ -223,6 +230,12 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
223
230
|
# Store TaskIns
|
|
224
231
|
task_ins.task_id = str(task_id)
|
|
225
232
|
data = (task_ins_to_dict(task_ins),)
|
|
233
|
+
|
|
234
|
+
# Convert values from uint64 to sint64 for SQLite
|
|
235
|
+
convert_uint64_values_in_dict_to_sint64(
|
|
236
|
+
data[0], ["run_id", "producer_node_id", "consumer_node_id"]
|
|
237
|
+
)
|
|
238
|
+
|
|
226
239
|
columns = ", ".join([f":{key}" for key in data[0]])
|
|
227
240
|
query = f"INSERT INTO task_ins VALUES({columns});"
|
|
228
241
|
|
|
@@ -284,6 +297,9 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
284
297
|
AND delivered_at = ""
|
|
285
298
|
"""
|
|
286
299
|
else:
|
|
300
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
301
|
+
data["node_id"] = convert_uint64_to_sint64(node_id)
|
|
302
|
+
|
|
287
303
|
# Retrieve all TaskIns for node_id
|
|
288
304
|
query = """
|
|
289
305
|
SELECT task_id
|
|
@@ -292,7 +308,6 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
292
308
|
AND consumer_node_id == :node_id
|
|
293
309
|
AND delivered_at = ""
|
|
294
310
|
"""
|
|
295
|
-
data["node_id"] = node_id
|
|
296
311
|
|
|
297
312
|
if limit is not None:
|
|
298
313
|
query += " LIMIT :limit"
|
|
@@ -322,6 +337,12 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
322
337
|
# Run query
|
|
323
338
|
rows = self.query(query, data)
|
|
324
339
|
|
|
340
|
+
for row in rows:
|
|
341
|
+
# Convert values from sint64 to uint64
|
|
342
|
+
convert_sint64_values_in_dict_to_uint64(
|
|
343
|
+
row, ["run_id", "producer_node_id", "consumer_node_id"]
|
|
344
|
+
)
|
|
345
|
+
|
|
325
346
|
result = [dict_to_task_ins(row) for row in rows]
|
|
326
347
|
|
|
327
348
|
return result
|
|
@@ -354,6 +375,12 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
354
375
|
# Store TaskIns
|
|
355
376
|
task_res.task_id = str(task_id)
|
|
356
377
|
data = (task_res_to_dict(task_res),)
|
|
378
|
+
|
|
379
|
+
# Convert values from uint64 to sint64 for SQLite
|
|
380
|
+
convert_uint64_values_in_dict_to_sint64(
|
|
381
|
+
data[0], ["run_id", "producer_node_id", "consumer_node_id"]
|
|
382
|
+
)
|
|
383
|
+
|
|
357
384
|
columns = ", ".join([f":{key}" for key in data[0]])
|
|
358
385
|
query = f"INSERT INTO task_res VALUES({columns});"
|
|
359
386
|
|
|
@@ -431,6 +458,12 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
431
458
|
# Run query
|
|
432
459
|
rows = self.query(query, data)
|
|
433
460
|
|
|
461
|
+
for row in rows:
|
|
462
|
+
# Convert values from sint64 to uint64
|
|
463
|
+
convert_sint64_values_in_dict_to_uint64(
|
|
464
|
+
row, ["run_id", "producer_node_id", "consumer_node_id"]
|
|
465
|
+
)
|
|
466
|
+
|
|
434
467
|
result = [dict_to_task_res(row) for row in rows]
|
|
435
468
|
|
|
436
469
|
# 1. Query: Fetch consumer_node_id of remaining task_ids
|
|
@@ -474,6 +507,13 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
474
507
|
for row in task_ins_rows:
|
|
475
508
|
if limit and len(result) == limit:
|
|
476
509
|
break
|
|
510
|
+
|
|
511
|
+
for row in rows:
|
|
512
|
+
# Convert values from sint64 to uint64
|
|
513
|
+
convert_sint64_values_in_dict_to_uint64(
|
|
514
|
+
row, ["run_id", "producer_node_id", "consumer_node_id"]
|
|
515
|
+
)
|
|
516
|
+
|
|
477
517
|
task_ins = dict_to_task_ins(row)
|
|
478
518
|
err_taskres = make_node_unavailable_taskres(
|
|
479
519
|
ref_taskins=task_ins,
|
|
@@ -544,8 +584,11 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
544
584
|
self, ping_interval: float, public_key: Optional[bytes] = None
|
|
545
585
|
) -> int:
|
|
546
586
|
"""Create, store in state, and return `node_id`."""
|
|
547
|
-
# Sample a random
|
|
548
|
-
|
|
587
|
+
# Sample a random uint64 as node_id
|
|
588
|
+
uint64_node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
|
|
589
|
+
|
|
590
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
591
|
+
sint64_node_id = convert_uint64_to_sint64(uint64_node_id)
|
|
549
592
|
|
|
550
593
|
query = "SELECT node_id FROM node WHERE public_key = :public_key;"
|
|
551
594
|
row = self.query(query, {"public_key": public_key})
|
|
@@ -562,17 +605,28 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
562
605
|
|
|
563
606
|
try:
|
|
564
607
|
self.query(
|
|
565
|
-
query,
|
|
608
|
+
query,
|
|
609
|
+
(
|
|
610
|
+
sint64_node_id,
|
|
611
|
+
time.time() + ping_interval,
|
|
612
|
+
ping_interval,
|
|
613
|
+
public_key,
|
|
614
|
+
),
|
|
566
615
|
)
|
|
567
616
|
except sqlite3.IntegrityError:
|
|
568
617
|
log(ERROR, "Unexpected node registration failure.")
|
|
569
618
|
return 0
|
|
570
|
-
|
|
619
|
+
|
|
620
|
+
# Note: we need to return the uint64 value of the node_id
|
|
621
|
+
return uint64_node_id
|
|
571
622
|
|
|
572
623
|
def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
|
|
573
624
|
"""Delete a node."""
|
|
625
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
626
|
+
sint64_node_id = convert_uint64_to_sint64(node_id)
|
|
627
|
+
|
|
574
628
|
query = "DELETE FROM node WHERE node_id = ?"
|
|
575
|
-
params = (
|
|
629
|
+
params = (sint64_node_id,)
|
|
576
630
|
|
|
577
631
|
if public_key is not None:
|
|
578
632
|
query += " AND public_key = ?"
|
|
@@ -597,15 +651,20 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
597
651
|
If the provided `run_id` does not exist or has no matching nodes,
|
|
598
652
|
an empty `Set` MUST be returned.
|
|
599
653
|
"""
|
|
654
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
655
|
+
sint64_run_id = convert_uint64_to_sint64(run_id)
|
|
656
|
+
|
|
600
657
|
# Validate run ID
|
|
601
658
|
query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
|
|
602
|
-
if self.query(query, (
|
|
659
|
+
if self.query(query, (sint64_run_id,))[0]["COUNT(*)"] == 0:
|
|
603
660
|
return set()
|
|
604
661
|
|
|
605
662
|
# Get nodes
|
|
606
663
|
query = "SELECT node_id FROM node WHERE online_until > ?;"
|
|
607
664
|
rows = self.query(query, (time.time(),))
|
|
608
|
-
|
|
665
|
+
|
|
666
|
+
# Convert sint64 node_ids to uint64
|
|
667
|
+
result: set[int] = {convert_sint64_to_uint64(row["node_id"]) for row in rows}
|
|
609
668
|
return result
|
|
610
669
|
|
|
611
670
|
def get_node_id(self, node_public_key: bytes) -> Optional[int]:
|
|
@@ -614,7 +673,11 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
614
673
|
row = self.query(query, {"public_key": node_public_key})
|
|
615
674
|
if len(row) > 0:
|
|
616
675
|
node_id: int = row[0]["node_id"]
|
|
617
|
-
|
|
676
|
+
|
|
677
|
+
# Convert the sint64 value to uint64 after reading from SQLite
|
|
678
|
+
uint64_node_id = convert_sint64_to_uint64(node_id)
|
|
679
|
+
|
|
680
|
+
return uint64_node_id
|
|
618
681
|
return None
|
|
619
682
|
|
|
620
683
|
def create_run(
|
|
@@ -626,12 +689,15 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
626
689
|
) -> int:
|
|
627
690
|
"""Create a new run for the specified `fab_id` and `fab_version`."""
|
|
628
691
|
# Sample a random int64 as run_id
|
|
629
|
-
|
|
692
|
+
uint64_run_id = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
|
|
693
|
+
|
|
694
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
695
|
+
sint64_run_id = convert_uint64_to_sint64(uint64_run_id)
|
|
630
696
|
|
|
631
697
|
# Check conflicts
|
|
632
698
|
query = "SELECT COUNT(*) FROM run WHERE run_id = ?;"
|
|
633
|
-
# If
|
|
634
|
-
if self.query(query, (
|
|
699
|
+
# If sint64_run_id does not exist
|
|
700
|
+
if self.query(query, (sint64_run_id,))[0]["COUNT(*)"] == 0:
|
|
635
701
|
query = (
|
|
636
702
|
"INSERT INTO run "
|
|
637
703
|
"(run_id, fab_id, fab_version, fab_hash, override_config)"
|
|
@@ -639,14 +705,22 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
639
705
|
)
|
|
640
706
|
if fab_hash:
|
|
641
707
|
self.query(
|
|
642
|
-
query,
|
|
708
|
+
query,
|
|
709
|
+
(sint64_run_id, "", "", fab_hash, json.dumps(override_config)),
|
|
643
710
|
)
|
|
644
711
|
else:
|
|
645
712
|
self.query(
|
|
646
713
|
query,
|
|
647
|
-
(
|
|
714
|
+
(
|
|
715
|
+
sint64_run_id,
|
|
716
|
+
fab_id,
|
|
717
|
+
fab_version,
|
|
718
|
+
"",
|
|
719
|
+
json.dumps(override_config),
|
|
720
|
+
),
|
|
648
721
|
)
|
|
649
|
-
return run_id
|
|
722
|
+
# Note: we need to return the uint64 value of the run_id
|
|
723
|
+
return uint64_run_id
|
|
650
724
|
log(ERROR, "Unexpected run creation failure.")
|
|
651
725
|
return 0
|
|
652
726
|
|
|
@@ -705,26 +779,32 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
705
779
|
|
|
706
780
|
def get_run(self, run_id: int) -> Optional[Run]:
|
|
707
781
|
"""Retrieve information about the run with the specified `run_id`."""
|
|
782
|
+
# Convert the uint64 value to sint64 for SQLite
|
|
783
|
+
sint64_run_id = convert_uint64_to_sint64(run_id)
|
|
708
784
|
query = "SELECT * FROM run WHERE run_id = ?;"
|
|
709
|
-
|
|
710
|
-
|
|
785
|
+
rows = self.query(query, (sint64_run_id,))
|
|
786
|
+
if rows:
|
|
787
|
+
row = rows[0]
|
|
711
788
|
return Run(
|
|
712
|
-
run_id=run_id,
|
|
789
|
+
run_id=convert_sint64_to_uint64(row["run_id"]),
|
|
713
790
|
fab_id=row["fab_id"],
|
|
714
791
|
fab_version=row["fab_version"],
|
|
715
792
|
fab_hash=row["fab_hash"],
|
|
716
793
|
override_config=json.loads(row["override_config"]),
|
|
717
794
|
)
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
return None
|
|
795
|
+
log(ERROR, "`run_id` does not exist.")
|
|
796
|
+
return None
|
|
721
797
|
|
|
722
798
|
def acknowledge_ping(self, node_id: int, ping_interval: float) -> bool:
|
|
723
799
|
"""Acknowledge a ping received from a node, serving as a heartbeat."""
|
|
800
|
+
sint64_node_id = convert_uint64_to_sint64(node_id)
|
|
801
|
+
|
|
724
802
|
# Update `online_until` and `ping_interval` for the given `node_id`
|
|
725
803
|
query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?;"
|
|
726
804
|
try:
|
|
727
|
-
self.query(
|
|
805
|
+
self.query(
|
|
806
|
+
query, (time.time() + ping_interval, ping_interval, sint64_node_id)
|
|
807
|
+
)
|
|
728
808
|
return True
|
|
729
809
|
except sqlite3.IntegrityError:
|
|
730
810
|
log(ERROR, "`node_id` does not exist.")
|
|
@@ -33,8 +33,104 @@ NODE_UNAVAILABLE_ERROR_REASON = (
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
def generate_rand_int_from_bytes(num_bytes: int) -> int:
|
|
36
|
-
"""Generate a random `num_bytes`
|
|
37
|
-
return int.from_bytes(urandom(num_bytes), "little", signed=
|
|
36
|
+
"""Generate a random unsigned integer from `num_bytes` bytes."""
|
|
37
|
+
return int.from_bytes(urandom(num_bytes), "little", signed=False)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def convert_uint64_to_sint64(u: int) -> int:
|
|
41
|
+
"""Convert a uint64 value to a sint64 value with the same bit sequence.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
u : int
|
|
46
|
+
The unsigned 64-bit integer to convert.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
int
|
|
51
|
+
The signed 64-bit integer equivalent.
|
|
52
|
+
|
|
53
|
+
The signed 64-bit integer will have the same bit pattern as the
|
|
54
|
+
unsigned 64-bit integer but may have a different decimal value.
|
|
55
|
+
|
|
56
|
+
For numbers within the range [0, `sint64` max value], the decimal
|
|
57
|
+
value remains the same. However, for numbers greater than the `sint64`
|
|
58
|
+
max value, the decimal value will differ due to the wraparound caused
|
|
59
|
+
by the sign bit.
|
|
60
|
+
"""
|
|
61
|
+
if u >= (1 << 63):
|
|
62
|
+
return u - (1 << 64)
|
|
63
|
+
return u
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def convert_sint64_to_uint64(s: int) -> int:
|
|
67
|
+
"""Convert a sint64 value to a uint64 value with the same bit sequence.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
s : int
|
|
72
|
+
The signed 64-bit integer to convert.
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
int
|
|
77
|
+
The unsigned 64-bit integer equivalent.
|
|
78
|
+
|
|
79
|
+
The unsigned 64-bit integer will have the same bit pattern as the
|
|
80
|
+
signed 64-bit integer but may have a different decimal value.
|
|
81
|
+
|
|
82
|
+
For negative `sint64` values, the conversion adds 2^64 to the
|
|
83
|
+
signed value to obtain the equivalent `uint64` value. For non-negative
|
|
84
|
+
`sint64` values, the decimal value remains unchanged in the `uint64`
|
|
85
|
+
representation.
|
|
86
|
+
"""
|
|
87
|
+
if s < 0:
|
|
88
|
+
return s + (1 << 64)
|
|
89
|
+
return s
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def convert_uint64_values_in_dict_to_sint64(
|
|
93
|
+
data_dict: dict[str, int], keys: list[str]
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Convert uint64 values to sint64 in the given dictionary.
|
|
96
|
+
|
|
97
|
+
Parameters
|
|
98
|
+
----------
|
|
99
|
+
data_dict : dict[str, int]
|
|
100
|
+
A dictionary where the values are integers to be converted.
|
|
101
|
+
keys : list[str]
|
|
102
|
+
A list of keys in the dictionary whose values need to be converted.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
None
|
|
107
|
+
This function does not return a value. It modifies `data_dict` in place.
|
|
108
|
+
"""
|
|
109
|
+
for key in keys:
|
|
110
|
+
if key in data_dict:
|
|
111
|
+
data_dict[key] = convert_uint64_to_sint64(data_dict[key])
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def convert_sint64_values_in_dict_to_uint64(
|
|
115
|
+
data_dict: dict[str, int], keys: list[str]
|
|
116
|
+
) -> None:
|
|
117
|
+
"""Convert sint64 values to uint64 in the given dictionary.
|
|
118
|
+
|
|
119
|
+
Parameters
|
|
120
|
+
----------
|
|
121
|
+
data_dict : dict[str, int]
|
|
122
|
+
A dictionary where the values are integers to be converted.
|
|
123
|
+
keys : list[str]
|
|
124
|
+
A list of keys in the dictionary whose values need to be converted.
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
None
|
|
129
|
+
This function does not return a value. It modifies `data_dict` in place.
|
|
130
|
+
"""
|
|
131
|
+
for key in keys:
|
|
132
|
+
if key in data_dict:
|
|
133
|
+
data_dict[key] = convert_sint64_to_uint64(data_dict[key])
|
|
38
134
|
|
|
39
135
|
|
|
40
136
|
def make_node_unavailable_taskres(ref_taskins: TaskIns) -> TaskRes:
|
flwr/superexec/deployment.py
CHANGED
|
@@ -28,8 +28,8 @@ from flwr.common.grpc import create_channel
|
|
|
28
28
|
from flwr.common.logger import log
|
|
29
29
|
from flwr.common.serde import fab_to_proto, user_config_to_proto
|
|
30
30
|
from flwr.common.typing import Fab, UserConfig
|
|
31
|
-
from flwr.proto.driver_pb2 import CreateRunRequest # pylint: disable=E0611
|
|
32
31
|
from flwr.proto.driver_pb2_grpc import DriverStub
|
|
32
|
+
from flwr.proto.run_pb2 import CreateRunRequest # pylint: disable=E0611
|
|
33
33
|
|
|
34
34
|
from .executor import Executor, RunTracker
|
|
35
35
|
|
|
@@ -167,6 +167,8 @@ class DeploymentEngine(Executor):
|
|
|
167
167
|
# Execute the command
|
|
168
168
|
proc = subprocess.Popen( # pylint: disable=consider-using-with
|
|
169
169
|
command,
|
|
170
|
+
stdout=subprocess.PIPE,
|
|
171
|
+
stderr=subprocess.PIPE,
|
|
170
172
|
text=True,
|
|
171
173
|
)
|
|
172
174
|
log(INFO, "Started run %s", str(run_id))
|
flwr/superexec/exec_servicer.py
CHANGED
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"""SuperExec API servicer."""
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
import select
|
|
19
|
+
import sys
|
|
20
|
+
import threading
|
|
21
|
+
import time
|
|
18
22
|
from collections.abc import Generator
|
|
19
23
|
from logging import ERROR, INFO
|
|
20
24
|
from typing import Any
|
|
@@ -33,6 +37,8 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
|
|
33
37
|
|
|
34
38
|
from .executor import Executor, RunTracker
|
|
35
39
|
|
|
40
|
+
SELECT_TIMEOUT = 1 # Timeout for selecting ready-to-read file descriptors (in seconds)
|
|
41
|
+
|
|
36
42
|
|
|
37
43
|
class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
38
44
|
"""SuperExec API servicer."""
|
|
@@ -59,13 +65,72 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
|
59
65
|
|
|
60
66
|
self.runs[run.run_id] = run
|
|
61
67
|
|
|
68
|
+
# Start a background thread to capture the log output
|
|
69
|
+
capture_thread = threading.Thread(
|
|
70
|
+
target=_capture_logs, args=(run,), daemon=True
|
|
71
|
+
)
|
|
72
|
+
capture_thread.start()
|
|
73
|
+
|
|
62
74
|
return StartRunResponse(run_id=run.run_id)
|
|
63
75
|
|
|
64
|
-
def StreamLogs(
|
|
76
|
+
def StreamLogs( # pylint: disable=C0103
|
|
65
77
|
self, request: StreamLogsRequest, context: grpc.ServicerContext
|
|
66
78
|
) -> Generator[StreamLogsResponse, Any, None]:
|
|
67
79
|
"""Get logs."""
|
|
68
|
-
|
|
80
|
+
log(INFO, "ExecServicer.StreamLogs")
|
|
81
|
+
|
|
82
|
+
# Exit if `run_id` not found
|
|
83
|
+
if request.run_id not in self.runs:
|
|
84
|
+
context.abort(grpc.StatusCode.NOT_FOUND, "Run ID not found")
|
|
85
|
+
|
|
86
|
+
last_sent_index = 0
|
|
69
87
|
while context.is_active():
|
|
70
|
-
|
|
88
|
+
# Yield n'th row of logs, if n'th row < len(logs)
|
|
89
|
+
logs = self.runs[request.run_id].logs
|
|
90
|
+
for i in range(last_sent_index, len(logs)):
|
|
71
91
|
yield StreamLogsResponse(log_output=logs[i])
|
|
92
|
+
last_sent_index = len(logs)
|
|
93
|
+
|
|
94
|
+
# Wait for and continue to yield more log responses only if the
|
|
95
|
+
# run isn't completed yet. If the run is finished, the entire log
|
|
96
|
+
# is returned at this point and the server ends the stream.
|
|
97
|
+
if self.runs[request.run_id].proc.poll() is not None:
|
|
98
|
+
log(INFO, "All logs for run ID `%s` returned", request.run_id)
|
|
99
|
+
context.set_code(grpc.StatusCode.OK)
|
|
100
|
+
context.cancel()
|
|
101
|
+
|
|
102
|
+
time.sleep(1.0) # Sleep briefly to avoid busy waiting
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _capture_logs(
|
|
106
|
+
run: RunTracker,
|
|
107
|
+
) -> None:
|
|
108
|
+
while True:
|
|
109
|
+
# Explicitly check if Popen.poll() is None. Required for `pytest`.
|
|
110
|
+
if run.proc.poll() is None:
|
|
111
|
+
# Select streams only when ready to read
|
|
112
|
+
ready_to_read, _, _ = select.select(
|
|
113
|
+
[run.proc.stdout, run.proc.stderr],
|
|
114
|
+
[],
|
|
115
|
+
[],
|
|
116
|
+
SELECT_TIMEOUT,
|
|
117
|
+
)
|
|
118
|
+
# Read from std* and append to RunTracker.logs
|
|
119
|
+
for stream in ready_to_read:
|
|
120
|
+
# Flush stdout to view output in real time
|
|
121
|
+
readline = stream.readline()
|
|
122
|
+
sys.stdout.write(readline)
|
|
123
|
+
sys.stdout.flush()
|
|
124
|
+
# Append to logs
|
|
125
|
+
line = readline.rstrip()
|
|
126
|
+
if line:
|
|
127
|
+
run.logs.append(f"{line}")
|
|
128
|
+
|
|
129
|
+
# Close std* to prevent blocking
|
|
130
|
+
elif run.proc.poll() is not None:
|
|
131
|
+
log(INFO, "Subprocess finished, exiting log capture")
|
|
132
|
+
if run.proc.stdout:
|
|
133
|
+
run.proc.stdout.close()
|
|
134
|
+
if run.proc.stderr:
|
|
135
|
+
run.proc.stderr.close()
|
|
136
|
+
break
|
flwr/superexec/executor.py
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"""Execute and monitor a Flower run."""
|
|
16
16
|
|
|
17
17
|
from abc import ABC, abstractmethod
|
|
18
|
-
from dataclasses import dataclass
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
19
|
from subprocess import Popen
|
|
20
20
|
from typing import Optional
|
|
21
21
|
|
|
@@ -28,6 +28,7 @@ class RunTracker:
|
|
|
28
28
|
|
|
29
29
|
run_id: int
|
|
30
30
|
proc: Popen # type: ignore
|
|
31
|
+
logs: list[str] = field(default_factory=list)
|
|
31
32
|
|
|
32
33
|
|
|
33
34
|
class Executor(ABC):
|
{flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/RECORD
RENAMED
|
@@ -6,7 +6,7 @@ flwr/cli/config_utils.py,sha256=uJmJAHNoqeSeAC3BAxxoBuYOR9eV3mJg8wrWZgbGp3E,7521
|
|
|
6
6
|
flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
|
|
7
7
|
flwr/cli/install.py,sha256=t5tdeKOsTmG3nuInUoSKBVzUU1RnzA096yzYs013VhE,7065
|
|
8
8
|
flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
|
|
9
|
-
flwr/cli/new/new.py,sha256=
|
|
9
|
+
flwr/cli/new/new.py,sha256=wpHBmHOq6X04CPwJDaEgu3H5_MsfoEYsYsv3E-EDhzM,9558
|
|
10
10
|
flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
|
|
11
11
|
flwr/cli/new/templates/app/.gitignore.tpl,sha256=XixnHdyeMB2vwkGtGnwHqoWpH-9WChdyG0GXe57duhc,3078
|
|
12
12
|
flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
@@ -49,7 +49,7 @@ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=NgbPix74X1t3ybaGjqdls
|
|
|
49
49
|
flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
|
|
50
50
|
flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
|
|
51
51
|
flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=4gi90W9_B1kj6rYkpvVJxhNX9Yctsv9OH6CzXP-dcE4,2666
|
|
52
|
-
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256
|
|
52
|
+
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=bYdDP0O8z741pvy1INnH4UBuP-KFvcyQt6Yo81n4frQ,1853
|
|
53
53
|
flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=CHJgkPNkJfzJhEbTe15uiV3AhOtIddQi-yofPZsCk3E,1143
|
|
54
54
|
flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Tq6jeGcoOKzMwWWYxMVnzMcipLURHLiW69iYlD1ywMg,659
|
|
55
55
|
flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=SHwYAA2qgIlOAU3Sb9BKSZcZ7O9biACg27MHexXUtDw,741
|
|
@@ -135,7 +135,7 @@ flwr/common/telemetry.py,sha256=PvdlipCPYciqEgmXRwQ1HklP1uyECcNqt9HTBzthmAg,8904
|
|
|
135
135
|
flwr/common/typing.py,sha256=ZVviEABqDeGCyo_yM9ft8EbIGA9RaLOeoNHmMnTkmUo,4985
|
|
136
136
|
flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
|
|
137
137
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
|
138
|
-
flwr/proto/clientappio_pb2.py,sha256=
|
|
138
|
+
flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
|
|
139
139
|
flwr/proto/clientappio_pb2.pyi,sha256=iL6pOPmnot5wP3aXGiDfiUpp-eJIkysyju0ebPehS8Y,5670
|
|
140
140
|
flwr/proto/clientappio_pb2_grpc.py,sha256=G35GhZ3iEOL8N6tu7Kn_ip4QUx4O2HveXngHAuU2YEM,6112
|
|
141
141
|
flwr/proto/clientappio_pb2_grpc.pyi,sha256=cybktpMPaIMwrItd8hQaQDnRv4zNu_wgRddSqR9REyI,1822
|
|
@@ -143,15 +143,19 @@ flwr/proto/common_pb2.py,sha256=uzSmq0FJdC-MriN9UGPFs7QVIFTKJmX5lyLnzcyZ5WE,2405
|
|
|
143
143
|
flwr/proto/common_pb2.pyi,sha256=0ylFO7G79qqLuRg9IQUCBdgyIIFv4m8VzrfoWad4xXU,5394
|
|
144
144
|
flwr/proto/common_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
145
145
|
flwr/proto/common_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
146
|
-
flwr/proto/
|
|
147
|
-
flwr/proto/
|
|
148
|
-
flwr/proto/
|
|
149
|
-
flwr/proto/
|
|
146
|
+
flwr/proto/control_pb2.py,sha256=qsikYLoAye2IFtPzEd5oPTSEhF09ZkA6VjnCEDh2o7Y,1214
|
|
147
|
+
flwr/proto/control_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
|
|
148
|
+
flwr/proto/control_pb2_grpc.py,sha256=7ou_lfyACrKJ7YhfU8Da87tgd71NH8C2ExSDbYeXNNw,2511
|
|
149
|
+
flwr/proto/control_pb2_grpc.pyi,sha256=2_EKunqhcdwXLDOGbOwFZxpIEpdOW1EFvY-r9MUgUSc,766
|
|
150
|
+
flwr/proto/driver_pb2.py,sha256=Z2fRF9mBa0cR0p6cItgyp5Q70WUAsh--kPEq8aIJuZk,3176
|
|
151
|
+
flwr/proto/driver_pb2.pyi,sha256=jUOe6tHWQhddVbB3xtnNvlrztNUcxRHHJS7-LqGO_70,4034
|
|
152
|
+
flwr/proto/driver_pb2_grpc.py,sha256=SGNmNcpsSWRc0jjNyH0xYNB8a7DAxIsXaL9a0M78vZw,10444
|
|
153
|
+
flwr/proto/driver_pb2_grpc.pyi,sha256=wTVkRgVUNq2Jnzo5yhIIqGFiLN_VRB1zpjfqRLD5QnM,2800
|
|
150
154
|
flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
|
|
151
155
|
flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
|
|
152
156
|
flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
153
157
|
flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
154
|
-
flwr/proto/exec_pb2.py,sha256=
|
|
158
|
+
flwr/proto/exec_pb2.py,sha256=GH_VWC-BZwWmeWdmjP4IkXvwR8yY1uBZNNwKru-ZZL4,3231
|
|
155
159
|
flwr/proto/exec_pb2.pyi,sha256=5y6L3xFkAuCfLTn2pVIHQAlXp17YcTTq8WVDS7_MPl4,4273
|
|
156
160
|
flwr/proto/exec_pb2_grpc.py,sha256=faAN19XEMP8GTKrcIU6jvlWkN44n2KiUsZh_OG0sYcg,4072
|
|
157
161
|
flwr/proto/exec_pb2_grpc.pyi,sha256=VrFhT1Um3Nb8UC2YqnR9GIiM-Yyx0FqaxVOWljh-G_w,1208
|
|
@@ -167,11 +171,11 @@ flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM
|
|
|
167
171
|
flwr/proto/grpcadapter_pb2.pyi,sha256=AR77gDsF6f8zqSIQp3877DUd7S8lP95lFak5Ir_WPkw,1716
|
|
168
172
|
flwr/proto/grpcadapter_pb2_grpc.py,sha256=rRNuNES5nBugUZWfeA8oAy8dMHgzqU_PF1srTseo3b8,2634
|
|
169
173
|
flwr/proto/grpcadapter_pb2_grpc.pyi,sha256=AgA9Qo_lnANb9SNuPzbZGAxupau-xcqYawZz6vqf-24,735
|
|
170
|
-
flwr/proto/message_pb2.py,sha256=
|
|
174
|
+
flwr/proto/message_pb2.py,sha256=GW0ID-d2pvtgylsKxtINQx_oORgNGel3WJ3ybZcXxtI,3151
|
|
171
175
|
flwr/proto/message_pb2.pyi,sha256=_J9NjZa7Pr-kSO7-GGOL5EvIXQx5mQD04iVIvnVHBMU,5617
|
|
172
176
|
flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
173
177
|
flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
174
|
-
flwr/proto/node_pb2.py,sha256=
|
|
178
|
+
flwr/proto/node_pb2.py,sha256=qrxEpf7Up9XhigP8g9cIHVhmpdKmYpxMdlO67H0xjEM,1081
|
|
175
179
|
flwr/proto/node_pb2.pyi,sha256=aX3BHhgXvJE1rvcRnEE_gB-5GcaFQ0SJ88yTE223bjI,751
|
|
176
180
|
flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
177
181
|
flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
@@ -179,11 +183,11 @@ flwr/proto/recordset_pb2.py,sha256=un8L0kvBcgFXQIiQweOseeIJBjlOozUvQY9uTQ42Dqo,6
|
|
|
179
183
|
flwr/proto/recordset_pb2.pyi,sha256=NPzCJWAj1xLWzeZ_xZ6uaObQjQfWGnnqlLtn4J-SoFY,14161
|
|
180
184
|
flwr/proto/recordset_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
181
185
|
flwr/proto/recordset_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
182
|
-
flwr/proto/run_pb2.py,sha256=
|
|
183
|
-
flwr/proto/run_pb2.pyi,sha256=
|
|
186
|
+
flwr/proto/run_pb2.py,sha256=bzgJZq9xXEWviJAb_SGNZKbH4QLI51SRE11pejhV2yU,3206
|
|
187
|
+
flwr/proto/run_pb2.pyi,sha256=oBRYDJwfJ8CWLRGDkPT3CinPWNYIZIHzpjwkIdjbH5A,5404
|
|
184
188
|
flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
185
189
|
flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
186
|
-
flwr/proto/task_pb2.py,sha256=
|
|
190
|
+
flwr/proto/task_pb2.py,sha256=R5GfHgL8IJRI_qHWNeILl1Y9zHjvB0tnCvMHmTgF4Is,2361
|
|
187
191
|
flwr/proto/task_pb2.pyi,sha256=KJVsLm-THY5QjHreHDm_-OS1tyZyD61mx6BzOpoeMjw,4320
|
|
188
192
|
flwr/proto/task_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
189
193
|
flwr/proto/task_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
|
@@ -207,7 +211,7 @@ flwr/server/driver/driver.py,sha256=rGLbOfLhBOn74mUHi_0CMbXqZLX8q_lXqEkcUXoL_wI,
|
|
|
207
211
|
flwr/server/driver/grpc_driver.py,sha256=xd1mxRexeiIJrZw9l-urj2zEIncLT8KtNn0l8hIDYZs,9681
|
|
208
212
|
flwr/server/driver/inmemory_driver.py,sha256=up5L2ux9l0pEUZO3hh8p5LufXntGL95IA4E3e7WsxqY,6465
|
|
209
213
|
flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
|
|
210
|
-
flwr/server/run_serverapp.py,sha256=
|
|
214
|
+
flwr/server/run_serverapp.py,sha256=SaE9hoWLCAPnRXvdAzE4Oi3QaiC8NOTrHxrIGXjgYxU,10531
|
|
211
215
|
flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
|
|
212
216
|
flwr/server/server_app.py,sha256=1hul76ospG8L_KooK_ewn1sWPNTNYLTtZMeGNOBNruA,6267
|
|
213
217
|
flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
|
|
@@ -239,7 +243,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
|
|
|
239
243
|
flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
|
|
240
244
|
flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
|
|
241
245
|
flwr/server/superlink/driver/driver_grpc.py,sha256=ej9T21zIquIJEZyWcvapQSQFckh4oFPamOe6P6DhB2s,2048
|
|
242
|
-
flwr/server/superlink/driver/driver_servicer.py,sha256=
|
|
246
|
+
flwr/server/superlink/driver/driver_servicer.py,sha256=x8L8rIO6r7kVdmWZFJp-xmTB0K_Tz1mh-7Akc6I_ZjY,6967
|
|
243
247
|
flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
|
|
244
248
|
flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
|
|
245
249
|
flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
|
|
@@ -266,10 +270,10 @@ flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=7kB3re3mR53b7E6L6DP
|
|
|
266
270
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=cGPsjS_4SJHm8jszGjsHh8ZNk9nqWoIQwW_62yKKR1Y,12647
|
|
267
271
|
flwr/server/superlink/state/__init__.py,sha256=Gj2OTFLXvA-mAjBvwuKDM3rDrVaQPcIoybSa2uskMTE,1003
|
|
268
272
|
flwr/server/superlink/state/in_memory_state.py,sha256=DvPSyK-ITZI9XfW-1M0bljLa6Sj0JIUeHFbg5tKKc2s,13142
|
|
269
|
-
flwr/server/superlink/state/sqlite_state.py,sha256=
|
|
273
|
+
flwr/server/superlink/state/sqlite_state.py,sha256=GNSBin45-ZgLXNdDSoaPvU6Nem_dUwjarpjIAlkYHdM,32132
|
|
270
274
|
flwr/server/superlink/state/state.py,sha256=KpM894R8RE1N0b-s_Nlii6i0TDxj0DRkKa3Vf24Gt70,8127
|
|
271
275
|
flwr/server/superlink/state/state_factory.py,sha256=Fo8pBQ1WWrVJK5TOEPZ_zgJE69_mfTGjTO6czh6571o,2021
|
|
272
|
-
flwr/server/superlink/state/utils.py,sha256=
|
|
276
|
+
flwr/server/superlink/state/utils.py,sha256=OsF3OOoU4bU4PgLWkypX6EDoFs0L8RP_mHEBG-tVqGA,5227
|
|
273
277
|
flwr/server/typing.py,sha256=5kaRLZuxTEse9A0g7aVna2VhYxU3wTq1f3d3mtw7kXs,1019
|
|
274
278
|
flwr/server/utils/__init__.py,sha256=pltsPHJoXmUIr3utjwwYxu7_ZAGy5u4MVHzv9iA5Un8,908
|
|
275
279
|
flwr/server/utils/tensorboard.py,sha256=gEBD8w_5uaIfp5aw5RYH66lYZpd_SfkObHQ7eDd9MUk,5466
|
|
@@ -289,13 +293,13 @@ flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUq
|
|
|
289
293
|
flwr/simulation/run_simulation.py,sha256=AN62VEoJhqe88VmkJ5dlJPVcDhUXGBaMKo4KjHqUu_8,22744
|
|
290
294
|
flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
|
|
291
295
|
flwr/superexec/app.py,sha256=mKwlsysbtmGPuz4CpWAPDPWAEFZH3b8u0JKRkWpfzuw,6552
|
|
292
|
-
flwr/superexec/deployment.py,sha256=
|
|
296
|
+
flwr/superexec/deployment.py,sha256=TbzOAAaY2sNt7O516w1GS6N5xvt0UV-dML74O6WA2O4,6344
|
|
293
297
|
flwr/superexec/exec_grpc.py,sha256=ZPq7EP55Vwj0kRcLVuTCokFqfIgBk-7YmDykZoMKi-c,1935
|
|
294
|
-
flwr/superexec/exec_servicer.py,sha256=
|
|
295
|
-
flwr/superexec/executor.py,sha256
|
|
298
|
+
flwr/superexec/exec_servicer.py,sha256=TRpwPVl7eI0Y_xlCY6DmVpAo0yFU1gLwzyIeqFw9pyk,4746
|
|
299
|
+
flwr/superexec/executor.py,sha256=-5J-ZLs-uArro3T2pCq0YQRC65cs18M888nufzdYE4E,2375
|
|
296
300
|
flwr/superexec/simulation.py,sha256=J6pw-RqCSiUed8I_3MasZH4tl57ZmDebPAHNnbb0-vE,7420
|
|
297
|
-
flwr_nightly-1.12.0.
|
|
298
|
-
flwr_nightly-1.12.0.
|
|
299
|
-
flwr_nightly-1.12.0.
|
|
300
|
-
flwr_nightly-1.12.0.
|
|
301
|
-
flwr_nightly-1.12.0.
|
|
301
|
+
flwr_nightly-1.12.0.dev20240919.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
302
|
+
flwr_nightly-1.12.0.dev20240919.dist-info/METADATA,sha256=emQXCFq14TLzQuX1biZ5scBeUejF0hm9cpuiZyAvCk4,15452
|
|
303
|
+
flwr_nightly-1.12.0.dev20240919.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
304
|
+
flwr_nightly-1.12.0.dev20240919.dist-info/entry_points.txt,sha256=WUCbqhLEOzjx_lyATIM0-f0e8kOVaQjzwOvyOxHrMhs,434
|
|
305
|
+
flwr_nightly-1.12.0.dev20240919.dist-info/RECORD,,
|
{flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/LICENSE
RENAMED
|
File without changes
|
{flwr_nightly-1.12.0.dev20240917.dist-info → flwr_nightly-1.12.0.dev20240919.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|