flwr-nightly 1.8.0.dev20240210__py3-none-any.whl → 1.8.0.dev20240211__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flwr/__init__.py +1 -2
- flwr/client/__init__.py +2 -2
- flwr/client/app.py +10 -10
- flwr/client/clientapp.py +1 -1
- flwr/common/telemetry.py +9 -5
- flwr/server/__init__.py +6 -3
- flwr/server/app.py +112 -19
- flwr/server/driver/__init__.py +12 -1
- flwr/{driver → server/driver}/app.py +1 -1
- flwr/{driver → server/driver}/driver.py +1 -1
- flwr/server/superlink/__init__.py +15 -0
- flwr/server/superlink/driver/__init__.py +15 -0
- flwr/server/{driver → superlink/driver}/driver_servicer.py +1 -1
- flwr/server/{fleet → superlink/fleet}/grpc_bidi/flower_service_servicer.py +6 -2
- flwr/server/{fleet → superlink/fleet}/grpc_bidi/grpc_client_proxy.py +5 -1
- flwr/server/{fleet → superlink/fleet}/grpc_bidi/grpc_server.py +5 -3
- flwr/server/{fleet → superlink/fleet}/grpc_rere/fleet_servicer.py +2 -2
- flwr/server/{fleet → superlink/fleet}/message_handler/message_handler.py +1 -1
- flwr/server/{fleet → superlink/fleet}/rest_rere/rest_api.py +2 -2
- flwr/server/{state → superlink/state}/in_memory_state.py +1 -1
- {flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/METADATA +1 -1
- {flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/RECORD +37 -36
- flwr_nightly-1.8.0.dev20240211.dist-info/entry_points.txt +7 -0
- flwr/driver/__init__.py +0 -26
- flwr_nightly-1.8.0.dev20240210.dist-info/entry_points.txt +0 -6
- /flwr/{driver → server/driver}/driver_client_proxy.py +0 -0
- /flwr/{driver → server/driver}/grpc_driver.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/__init__.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/grpc_bidi/__init__.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/grpc_bidi/grpc_bridge.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/grpc_rere/__init__.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/message_handler/__init__.py +0 -0
- /flwr/server/{fleet → superlink/fleet}/rest_rere/__init__.py +0 -0
- /flwr/server/{state → superlink/state}/__init__.py +0 -0
- /flwr/server/{state → superlink/state}/sqlite_state.py +0 -0
- /flwr/server/{state → superlink/state}/state.py +0 -0
- /flwr/server/{state → superlink/state}/state_factory.py +0 -0
- {flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/WHEEL +0 -0
flwr/__init__.py
CHANGED
@@ -17,12 +17,11 @@
|
|
17
17
|
|
18
18
|
from flwr.common.version import package_version as _package_version
|
19
19
|
|
20
|
-
from . import client, common,
|
20
|
+
from . import client, common, server, simulation
|
21
21
|
|
22
22
|
__all__ = [
|
23
23
|
"client",
|
24
24
|
"common",
|
25
|
-
"driver",
|
26
25
|
"server",
|
27
26
|
"simulation",
|
28
27
|
]
|
flwr/client/__init__.py
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
"""Flower client."""
|
16
16
|
|
17
17
|
|
18
|
-
from .app import
|
18
|
+
from .app import run_client_app as run_client_app
|
19
19
|
from .app import start_client as start_client
|
20
20
|
from .app import start_numpy_client as start_numpy_client
|
21
21
|
from .client import Client as Client
|
@@ -28,7 +28,7 @@ __all__ = [
|
|
28
28
|
"ClientApp",
|
29
29
|
"ClientFn",
|
30
30
|
"NumPyClient",
|
31
|
-
"
|
31
|
+
"run_client_app",
|
32
32
|
"start_client",
|
33
33
|
"start_numpy_client",
|
34
34
|
]
|
flwr/client/app.py
CHANGED
@@ -45,13 +45,13 @@ from .node_state import NodeState
|
|
45
45
|
from .numpy_client import NumPyClient
|
46
46
|
|
47
47
|
|
48
|
-
def
|
49
|
-
"""Run Flower client."""
|
50
|
-
event(EventType.
|
48
|
+
def run_client_app() -> None:
|
49
|
+
"""Run Flower client app."""
|
50
|
+
event(EventType.RUN_CLIENT_APP_ENTER)
|
51
51
|
|
52
52
|
log(INFO, "Long-running Flower client starting")
|
53
53
|
|
54
|
-
args =
|
54
|
+
args = _parse_args_run_client_app().parse_args()
|
55
55
|
|
56
56
|
# Obtain certificates
|
57
57
|
if args.insecure:
|
@@ -86,7 +86,7 @@ def run_client() -> None:
|
|
86
86
|
|
87
87
|
log(
|
88
88
|
DEBUG,
|
89
|
-
"Flower will load ClientApp `%s`
|
89
|
+
"Flower will load ClientApp `%s`",
|
90
90
|
getattr(args, "client-app"),
|
91
91
|
)
|
92
92
|
|
@@ -105,13 +105,13 @@ def run_client() -> None:
|
|
105
105
|
root_certificates=root_certificates,
|
106
106
|
insecure=args.insecure,
|
107
107
|
)
|
108
|
-
event(EventType.
|
108
|
+
event(EventType.RUN_CLIENT_APP_LEAVE)
|
109
109
|
|
110
110
|
|
111
|
-
def
|
112
|
-
"""Parse command line arguments."""
|
111
|
+
def _parse_args_run_client_app() -> argparse.ArgumentParser:
|
112
|
+
"""Parse flower-client-app command line arguments."""
|
113
113
|
parser = argparse.ArgumentParser(
|
114
|
-
description="Start a
|
114
|
+
description="Start a Flower client app",
|
115
115
|
)
|
116
116
|
|
117
117
|
parser.add_argument(
|
@@ -145,7 +145,7 @@ def _parse_args_client() -> argparse.ArgumentParser:
|
|
145
145
|
"--dir",
|
146
146
|
default="",
|
147
147
|
help="Add specified directory to the PYTHONPATH and load Flower "
|
148
|
-
"
|
148
|
+
"app from there."
|
149
149
|
" Default: current working directory.",
|
150
150
|
)
|
151
151
|
|
flwr/client/clientapp.py
CHANGED
@@ -46,7 +46,7 @@ class ClientApp:
|
|
46
46
|
If the above code is in a Python module called `client`, it can be started as
|
47
47
|
follows:
|
48
48
|
|
49
|
-
>>> flower-client client:app --insecure
|
49
|
+
>>> flower-client-app client:app --insecure
|
50
50
|
|
51
51
|
In this `client:app` example, `client` refers to the Python module `client.py` in
|
52
52
|
which the previous code lives in and `app` refers to the global attribute `app` that
|
flwr/common/telemetry.py
CHANGED
@@ -137,8 +137,8 @@ class EventType(str, Enum):
|
|
137
137
|
RUN_FLEET_API_LEAVE = auto()
|
138
138
|
|
139
139
|
# Driver API and Fleet API
|
140
|
-
|
141
|
-
|
140
|
+
RUN_SUPERLINK_ENTER = auto()
|
141
|
+
RUN_SUPERLINK_LEAVE = auto()
|
142
142
|
|
143
143
|
# Simulation
|
144
144
|
START_SIMULATION_ENTER = auto()
|
@@ -152,9 +152,13 @@ class EventType(str, Enum):
|
|
152
152
|
START_DRIVER_ENTER = auto()
|
153
153
|
START_DRIVER_LEAVE = auto()
|
154
154
|
|
155
|
-
#
|
156
|
-
|
157
|
-
|
155
|
+
# flower-client-app
|
156
|
+
RUN_CLIENT_APP_ENTER = auto()
|
157
|
+
RUN_CLIENT_APP_LEAVE = auto()
|
158
|
+
|
159
|
+
# flower-server-app
|
160
|
+
RUN_SERVER_APP_ENTER = auto()
|
161
|
+
RUN_SERVER_APP_LEAVE = auto()
|
158
162
|
|
159
163
|
|
160
164
|
# Use the ThreadPoolExecutor with max_workers=1 to have a queue
|
flwr/server/__init__.py
CHANGED
@@ -15,11 +15,12 @@
|
|
15
15
|
"""Flower server."""
|
16
16
|
|
17
17
|
|
18
|
-
from . import strategy
|
18
|
+
from . import driver, strategy
|
19
19
|
from .app import ServerConfig as ServerConfig
|
20
20
|
from .app import run_driver_api as run_driver_api
|
21
21
|
from .app import run_fleet_api as run_fleet_api
|
22
|
-
from .app import
|
22
|
+
from .app import run_server_app as run_server_app
|
23
|
+
from .app import run_superlink as run_superlink
|
23
24
|
from .app import start_server as start_server
|
24
25
|
from .client_manager import ClientManager as ClientManager
|
25
26
|
from .client_manager import SimpleClientManager as SimpleClientManager
|
@@ -28,10 +29,12 @@ from .server import Server as Server
|
|
28
29
|
|
29
30
|
__all__ = [
|
30
31
|
"ClientManager",
|
32
|
+
"driver",
|
31
33
|
"History",
|
32
34
|
"run_driver_api",
|
33
35
|
"run_fleet_api",
|
34
|
-
"
|
36
|
+
"run_server_app",
|
37
|
+
"run_superlink",
|
35
38
|
"Server",
|
36
39
|
"ServerConfig",
|
37
40
|
"SimpleClientManager",
|
flwr/server/app.py
CHANGED
@@ -20,7 +20,7 @@ import importlib.util
|
|
20
20
|
import sys
|
21
21
|
import threading
|
22
22
|
from dataclasses import dataclass
|
23
|
-
from logging import ERROR, INFO, WARN
|
23
|
+
from logging import DEBUG, ERROR, INFO, WARN
|
24
24
|
from os.path import isfile
|
25
25
|
from pathlib import Path
|
26
26
|
from signal import SIGINT, SIGTERM, signal
|
@@ -44,16 +44,16 @@ from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
|
|
44
44
|
add_FleetServicer_to_server,
|
45
45
|
)
|
46
46
|
from flwr.server.client_manager import ClientManager, SimpleClientManager
|
47
|
-
from flwr.server.driver.driver_servicer import DriverServicer
|
48
|
-
from flwr.server.fleet.grpc_bidi.grpc_server import (
|
49
|
-
generic_create_grpc_server,
|
50
|
-
start_grpc_server,
|
51
|
-
)
|
52
|
-
from flwr.server.fleet.grpc_rere.fleet_servicer import FleetServicer
|
53
47
|
from flwr.server.history import History
|
54
48
|
from flwr.server.server import Server
|
55
|
-
from flwr.server.state import StateFactory
|
56
49
|
from flwr.server.strategy import FedAvg, Strategy
|
50
|
+
from flwr.server.superlink.driver.driver_servicer import DriverServicer
|
51
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import (
|
52
|
+
generic_create_grpc_server,
|
53
|
+
start_grpc_server,
|
54
|
+
)
|
55
|
+
from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
56
|
+
from flwr.server.superlink.state import StateFactory
|
57
57
|
|
58
58
|
ADDRESS_DRIVER_API = "0.0.0.0:9091"
|
59
59
|
ADDRESS_FLEET_API_GRPC_RERE = "0.0.0.0:9092"
|
@@ -75,6 +75,60 @@ class ServerConfig:
|
|
75
75
|
round_timeout: Optional[float] = None
|
76
76
|
|
77
77
|
|
78
|
+
def run_server_app() -> None:
|
79
|
+
"""Run Flower server app."""
|
80
|
+
event(EventType.RUN_SERVER_APP_ENTER)
|
81
|
+
|
82
|
+
args = _parse_args_run_server_app().parse_args()
|
83
|
+
|
84
|
+
# Obtain certificates
|
85
|
+
if args.insecure:
|
86
|
+
if args.root_certificates is not None:
|
87
|
+
sys.exit(
|
88
|
+
"Conflicting options: The '--insecure' flag disables HTTPS, "
|
89
|
+
"but '--root-certificates' was also specified. Please remove "
|
90
|
+
"the '--root-certificates' option when running in insecure mode, "
|
91
|
+
"or omit '--insecure' to use HTTPS."
|
92
|
+
)
|
93
|
+
log(
|
94
|
+
WARN,
|
95
|
+
"Option `--insecure` was set. "
|
96
|
+
"Starting insecure HTTP client connected to %s.",
|
97
|
+
args.server,
|
98
|
+
)
|
99
|
+
root_certificates = None
|
100
|
+
else:
|
101
|
+
# Load the certificates if provided, or load the system certificates
|
102
|
+
cert_path = args.root_certificates
|
103
|
+
if cert_path is None:
|
104
|
+
root_certificates = None
|
105
|
+
else:
|
106
|
+
root_certificates = Path(cert_path).read_bytes()
|
107
|
+
log(
|
108
|
+
DEBUG,
|
109
|
+
"Starting secure HTTPS client connected to %s "
|
110
|
+
"with the following certificates: %s.",
|
111
|
+
args.server,
|
112
|
+
cert_path,
|
113
|
+
)
|
114
|
+
|
115
|
+
log(
|
116
|
+
DEBUG,
|
117
|
+
"Flower will load ServerApp `%s`",
|
118
|
+
getattr(args, "server-app"),
|
119
|
+
)
|
120
|
+
|
121
|
+
log(
|
122
|
+
DEBUG,
|
123
|
+
"root_certificates: `%s`",
|
124
|
+
root_certificates,
|
125
|
+
)
|
126
|
+
|
127
|
+
log(WARN, "Not implemented: run_server_app")
|
128
|
+
|
129
|
+
event(EventType.RUN_SERVER_APP_LEAVE)
|
130
|
+
|
131
|
+
|
78
132
|
def start_server( # pylint: disable=too-many-arguments,too-many-locals
|
79
133
|
*,
|
80
134
|
server_address: str = ADDRESS_FLEET_API_GRPC_BIDI,
|
@@ -239,7 +293,7 @@ def run_driver_api() -> None:
|
|
239
293
|
"""Run Flower server (Driver API)."""
|
240
294
|
log(INFO, "Starting Flower server (Driver API)")
|
241
295
|
event(EventType.RUN_DRIVER_API_ENTER)
|
242
|
-
args =
|
296
|
+
args = _parse_args_run_driver_api().parse_args()
|
243
297
|
|
244
298
|
# Parse IP address
|
245
299
|
parsed_address = parse_address(args.driver_api_address)
|
@@ -276,7 +330,7 @@ def run_fleet_api() -> None:
|
|
276
330
|
"""Run Flower server (Fleet API)."""
|
277
331
|
log(INFO, "Starting Flower server (Fleet API)")
|
278
332
|
event(EventType.RUN_FLEET_API_ENTER)
|
279
|
-
args =
|
333
|
+
args = _parse_args_run_fleet_api().parse_args()
|
280
334
|
|
281
335
|
# Obtain certificates
|
282
336
|
certificates = _try_obtain_certificates(args)
|
@@ -344,11 +398,11 @@ def run_fleet_api() -> None:
|
|
344
398
|
|
345
399
|
|
346
400
|
# pylint: disable=too-many-branches, too-many-locals, too-many-statements
|
347
|
-
def
|
401
|
+
def run_superlink() -> None:
|
348
402
|
"""Run Flower server (Driver API and Fleet API)."""
|
349
403
|
log(INFO, "Starting Flower server")
|
350
|
-
event(EventType.
|
351
|
-
args =
|
404
|
+
event(EventType.RUN_SUPERLINK_ENTER)
|
405
|
+
args = _parse_args_run_superlink().parse_args()
|
352
406
|
|
353
407
|
# Parse IP address
|
354
408
|
parsed_address = parse_address(args.driver_api_address)
|
@@ -419,7 +473,7 @@ def run_server() -> None:
|
|
419
473
|
_register_exit_handlers(
|
420
474
|
grpc_servers=grpc_servers,
|
421
475
|
bckg_threads=bckg_threads,
|
422
|
-
event_type=EventType.
|
476
|
+
event_type=EventType.RUN_SUPERLINK_LEAVE,
|
423
477
|
)
|
424
478
|
|
425
479
|
# Block
|
@@ -561,7 +615,7 @@ def _run_fleet_api_rest(
|
|
561
615
|
try:
|
562
616
|
import uvicorn
|
563
617
|
|
564
|
-
from flwr.server.fleet.rest_rere.rest_api import app as fast_api_app
|
618
|
+
from flwr.server.superlink.fleet.rest_rere.rest_api import app as fast_api_app
|
565
619
|
except ModuleNotFoundError:
|
566
620
|
sys.exit(MISSING_EXTRA_REST)
|
567
621
|
if workers != 1:
|
@@ -584,7 +638,7 @@ def _run_fleet_api_rest(
|
|
584
638
|
raise ValueError(validation_exceptions)
|
585
639
|
|
586
640
|
uvicorn.run(
|
587
|
-
app="flwr.server.fleet.rest_rere.rest_api:app",
|
641
|
+
app="flwr.server.superlink.fleet.rest_rere.rest_api:app",
|
588
642
|
port=port,
|
589
643
|
host=host,
|
590
644
|
reload=False,
|
@@ -621,7 +675,7 @@ def _validate_ssl_files(
|
|
621
675
|
return validation_exceptions
|
622
676
|
|
623
677
|
|
624
|
-
def
|
678
|
+
def _parse_args_run_driver_api() -> argparse.ArgumentParser:
|
625
679
|
"""Parse command line arguments for Driver API."""
|
626
680
|
parser = argparse.ArgumentParser(
|
627
681
|
description="Start a Flower Driver API server. "
|
@@ -638,7 +692,7 @@ def _parse_args_driver() -> argparse.ArgumentParser:
|
|
638
692
|
return parser
|
639
693
|
|
640
694
|
|
641
|
-
def
|
695
|
+
def _parse_args_run_fleet_api() -> argparse.ArgumentParser:
|
642
696
|
"""Parse command line arguments for Fleet API."""
|
643
697
|
parser = argparse.ArgumentParser(
|
644
698
|
description="Start a Flower Fleet API server."
|
@@ -655,7 +709,7 @@ def _parse_args_fleet() -> argparse.ArgumentParser:
|
|
655
709
|
return parser
|
656
710
|
|
657
711
|
|
658
|
-
def
|
712
|
+
def _parse_args_run_superlink() -> argparse.ArgumentParser:
|
659
713
|
"""Parse command line arguments for both Driver API and Fleet API."""
|
660
714
|
parser = argparse.ArgumentParser(
|
661
715
|
description="This will start a Flower server "
|
@@ -760,3 +814,42 @@ def _add_args_fleet_api(parser: argparse.ArgumentParser) -> None:
|
|
760
814
|
type=int,
|
761
815
|
default=1,
|
762
816
|
)
|
817
|
+
|
818
|
+
|
819
|
+
def _parse_args_run_server_app() -> argparse.ArgumentParser:
|
820
|
+
"""Parse flower-server-app command line arguments."""
|
821
|
+
parser = argparse.ArgumentParser(
|
822
|
+
description="Start a Flower server app",
|
823
|
+
)
|
824
|
+
|
825
|
+
parser.add_argument(
|
826
|
+
"server-app",
|
827
|
+
help="For example: `server:app` or `project.package.module:wrapper.app`",
|
828
|
+
)
|
829
|
+
parser.add_argument(
|
830
|
+
"--insecure",
|
831
|
+
action="store_true",
|
832
|
+
help="Run the server app without HTTPS. By default, the app runs with "
|
833
|
+
"HTTPS enabled. Use this flag only if you understand the risks.",
|
834
|
+
)
|
835
|
+
parser.add_argument(
|
836
|
+
"--root-certificates",
|
837
|
+
metavar="ROOT_CERT",
|
838
|
+
type=str,
|
839
|
+
help="Specifies the path to the PEM-encoded root certificate file for "
|
840
|
+
"establishing secure HTTPS connections.",
|
841
|
+
)
|
842
|
+
parser.add_argument(
|
843
|
+
"--server",
|
844
|
+
default="0.0.0.0:9092",
|
845
|
+
help="Server address",
|
846
|
+
)
|
847
|
+
parser.add_argument(
|
848
|
+
"--dir",
|
849
|
+
default="",
|
850
|
+
help="Add specified directory to the PYTHONPATH and load Flower "
|
851
|
+
"app from there."
|
852
|
+
" Default: current working directory.",
|
853
|
+
)
|
854
|
+
|
855
|
+
return parser
|
flwr/server/driver/__init__.py
CHANGED
@@ -12,4 +12,15 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Flower driver
|
15
|
+
"""Flower driver SDK."""
|
16
|
+
|
17
|
+
|
18
|
+
from .app import start_driver
|
19
|
+
from .driver import Driver
|
20
|
+
from .grpc_driver import GrpcDriver
|
21
|
+
|
22
|
+
__all__ = [
|
23
|
+
"Driver",
|
24
|
+
"GrpcDriver",
|
25
|
+
"start_driver",
|
26
|
+
]
|
@@ -72,7 +72,7 @@ def start_driver( # pylint: disable=too-many-arguments, too-many-locals
|
|
72
72
|
An implementation of the abstract base class
|
73
73
|
`flwr.server.strategy.Strategy`. If no strategy is provided, then
|
74
74
|
`start_server` will use `flwr.server.strategy.FedAvg`.
|
75
|
-
client_manager : Optional[flwr.server.
|
75
|
+
client_manager : Optional[flwr.server.ClientManager] (default: None)
|
76
76
|
An implementation of the class `flwr.server.ClientManager`. If no
|
77
77
|
implementation is provided, then `start_driver` will use
|
78
78
|
`flwr.server.SimpleClientManager`.
|
@@ -17,7 +17,6 @@
|
|
17
17
|
|
18
18
|
from typing import Iterable, List, Optional, Tuple
|
19
19
|
|
20
|
-
from flwr.driver.grpc_driver import DEFAULT_SERVER_ADDRESS_DRIVER, GrpcDriver
|
21
20
|
from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
22
21
|
CreateRunRequest,
|
23
22
|
GetNodesRequest,
|
@@ -26,6 +25,7 @@ from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
26
25
|
)
|
27
26
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
28
27
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
28
|
+
from flwr.server.driver.grpc_driver import DEFAULT_SERVER_ADDRESS_DRIVER, GrpcDriver
|
29
29
|
|
30
30
|
|
31
31
|
class Driver:
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Flower SuperLink."""
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2022 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Flower driver service."""
|
@@ -35,7 +35,7 @@ from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
|
|
35
35
|
)
|
36
36
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
37
37
|
from flwr.proto.task_pb2 import TaskRes # pylint: disable=E0611
|
38
|
-
from flwr.server.state import State, StateFactory
|
38
|
+
from flwr.server.superlink.state import State, StateFactory
|
39
39
|
from flwr.server.utils.validator import validate_task_ins_or_res
|
40
40
|
|
41
41
|
|
@@ -30,8 +30,12 @@ from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
|
|
30
30
|
ServerMessage,
|
31
31
|
)
|
32
32
|
from flwr.server.client_manager import ClientManager
|
33
|
-
from flwr.server.fleet.grpc_bidi.grpc_bridge import
|
34
|
-
|
33
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_bridge import (
|
34
|
+
GrpcBridge,
|
35
|
+
InsWrapper,
|
36
|
+
ResWrapper,
|
37
|
+
)
|
38
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_client_proxy import GrpcClientProxy
|
35
39
|
|
36
40
|
|
37
41
|
def default_bridge_factory() -> GrpcBridge:
|
@@ -24,7 +24,11 @@ from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
|
|
24
24
|
ServerMessage,
|
25
25
|
)
|
26
26
|
from flwr.server.client_proxy import ClientProxy
|
27
|
-
from flwr.server.fleet.grpc_bidi.grpc_bridge import
|
27
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_bridge import (
|
28
|
+
GrpcBridge,
|
29
|
+
InsWrapper,
|
30
|
+
ResWrapper,
|
31
|
+
)
|
28
32
|
|
29
33
|
|
30
34
|
class GrpcClientProxy(ClientProxy):
|
@@ -28,9 +28,11 @@ from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
|
|
28
28
|
add_FlowerServiceServicer_to_server,
|
29
29
|
)
|
30
30
|
from flwr.server.client_manager import ClientManager
|
31
|
-
from flwr.server.driver.driver_servicer import DriverServicer
|
32
|
-
from flwr.server.fleet.grpc_bidi.flower_service_servicer import
|
33
|
-
|
31
|
+
from flwr.server.superlink.driver.driver_servicer import DriverServicer
|
32
|
+
from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
|
33
|
+
FlowerServiceServicer,
|
34
|
+
)
|
35
|
+
from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
34
36
|
|
35
37
|
INVALID_CERTIFICATES_ERR_MSG = """
|
36
38
|
When setting any of root_certificate, certificate, or private_key,
|
@@ -31,8 +31,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
31
31
|
PushTaskResRequest,
|
32
32
|
PushTaskResResponse,
|
33
33
|
)
|
34
|
-
from flwr.server.fleet.message_handler import message_handler
|
35
|
-
from flwr.server.state import StateFactory
|
34
|
+
from flwr.server.superlink.fleet.message_handler import message_handler
|
35
|
+
from flwr.server.superlink.state import StateFactory
|
36
36
|
|
37
37
|
|
38
38
|
class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
@@ -31,7 +31,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
31
31
|
)
|
32
32
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
33
33
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
34
|
-
from flwr.server.state import State
|
34
|
+
from flwr.server.superlink.state import State
|
35
35
|
|
36
36
|
|
37
37
|
def create_node(
|
@@ -24,8 +24,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
24
24
|
PullTaskInsRequest,
|
25
25
|
PushTaskResRequest,
|
26
26
|
)
|
27
|
-
from flwr.server.fleet.message_handler import message_handler
|
28
|
-
from flwr.server.state import State
|
27
|
+
from flwr.server.superlink.fleet.message_handler import message_handler
|
28
|
+
from flwr.server.superlink.state import State
|
29
29
|
|
30
30
|
try:
|
31
31
|
from starlette.applications import Starlette
|
@@ -23,7 +23,7 @@ from uuid import UUID, uuid4
|
|
23
23
|
|
24
24
|
from flwr.common import log, now
|
25
25
|
from flwr.proto.task_pb2 import TaskIns, TaskRes # pylint: disable=E0611
|
26
|
-
from flwr.server.state.state import State
|
26
|
+
from flwr.server.superlink.state.state import State
|
27
27
|
from flwr.server.utils import validate_task_ins_or_res
|
28
28
|
|
29
29
|
|
{flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/RECORD
RENAMED
@@ -1,8 +1,8 @@
|
|
1
|
-
flwr/__init__.py,sha256=
|
2
|
-
flwr/client/__init__.py,sha256=
|
3
|
-
flwr/client/app.py,sha256=
|
1
|
+
flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
|
2
|
+
flwr/client/__init__.py,sha256=ypNGqhSDxEPX_6XwcQyVseBf8oS_Zvs_JkrLbVIeKxw,1186
|
3
|
+
flwr/client/app.py,sha256=p7x3n3PGzlkIEgi-DNxLOgUfHDGF2QmrD5ZJBvPntNY,20020
|
4
4
|
flwr/client/client.py,sha256=ATcsqAMS9zpMBJ9ZUbBeB7BEPWX_VWISONy0p6Wxl5g,8210
|
5
|
-
flwr/client/clientapp.py,sha256=
|
5
|
+
flwr/client/clientapp.py,sha256=M_7GZ8dbRhYXdI306TAFIbkm8AOyyQX5O-C3QPFDEdI,4190
|
6
6
|
flwr/client/dpfedavg_numpy_client.py,sha256=9Tnig4iml2J88HBKNahegjXjbfvIQyBtaIQaqjbeqsA,7435
|
7
7
|
flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
|
8
8
|
flwr/client/grpc_client/connection.py,sha256=x50raKKVKVNjNNOr2u1gOS2Ts6ohs2cAGrRXZw6sgLE,8226
|
@@ -46,14 +46,9 @@ flwr/common/secure_aggregation/quantization.py,sha256=appui7GGrkRPsupF59TkapeV4N
|
|
46
46
|
flwr/common/secure_aggregation/secaggplus_constants.py,sha256=pITi-nuzrNvKWR42XwVFBuejv1RdGLwmuErLp0X0t_Y,1686
|
47
47
|
flwr/common/secure_aggregation/secaggplus_utils.py,sha256=PleDyDu7jHNAfbRoEaoQiOjxG6iMl9yA8rNKYTfnyFw,3155
|
48
48
|
flwr/common/serde.py,sha256=rXUSH9TNFsRDBTdr9bGCKGLyjNuzagUOQVynS_luWkI,19643
|
49
|
-
flwr/common/telemetry.py,sha256=
|
49
|
+
flwr/common/telemetry.py,sha256=VtumOl5Zfrip6crU6DMOGAYzraP4NuImVRp-EN6joUA,7783
|
50
50
|
flwr/common/typing.py,sha256=3Wu6Ol1Ja6Gb0WdlcXVEn1EHYJbc4oRRJA81vEegxBo,4382
|
51
51
|
flwr/common/version.py,sha256=A0MKvyKPrV8wLg0YCAODTqM71v26NEH36c6JYtfgg0o,667
|
52
|
-
flwr/driver/__init__.py,sha256=NQ4KeZ5fP9wdxGjcr2cP41_7TLuuYQ3u4J7GwYtQ488,870
|
53
|
-
flwr/driver/app.py,sha256=rhACazH0J06Tnqy5aU0DoJlx5ZksK4b0NgHkM1bAE38,7268
|
54
|
-
flwr/driver/driver.py,sha256=BhCXx55Lk9WdpcfjlHhKyLbGdiIvawIvMWYPewIaI8I,4009
|
55
|
-
flwr/driver/driver_client_proxy.py,sha256=wKC3R-293dOqxNytzf78z6tuDCXORbuJAdICyZ5jeK8,6126
|
56
|
-
flwr/driver/grpc_driver.py,sha256=Ekcxx4Miqume02fiBjBRJhItaOFNpn120WT3uRIPWIc,4585
|
57
52
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
58
53
|
flwr/proto/driver_pb2.py,sha256=JHIdjNPTgp6YHD-_lz5ZZFB0VIOR3_GmcaOTN4jndc4,3115
|
59
54
|
flwr/proto/driver_pb2.pyi,sha256=xwl2AqIWn0SwAlg-x5RUQeqr6DC48eywnqmD7gbaaFs,4670
|
@@ -80,32 +75,18 @@ flwr/proto/transport_pb2.pyi,sha256=CZvJRWTU3QWFWLXNFtyLSrSKFatIyMcy-ohzLbQ-G9c,
|
|
80
75
|
flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPcosk,2598
|
81
76
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
82
77
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
83
|
-
flwr/server/__init__.py,sha256=
|
84
|
-
flwr/server/app.py,sha256=
|
78
|
+
flwr/server/__init__.py,sha256=DLFm2lDhZdJlkZqAhb2culpScX7WrjW43GUDmwgt1Zk,1480
|
79
|
+
flwr/server/app.py,sha256=wVg2Gebb3tZeys2r5bJv77RFNYbauXJg0aqVmGsi1vw,28477
|
85
80
|
flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
|
86
81
|
flwr/server/client_proxy.py,sha256=8ScGDvP3jHbl8DV3hyFID5N5VEVlXn8ZTQXtkdOfssI,2234
|
87
82
|
flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
|
88
|
-
flwr/server/driver/__init__.py,sha256=
|
89
|
-
flwr/server/driver/
|
90
|
-
flwr/server/
|
91
|
-
flwr/server/
|
92
|
-
flwr/server/
|
93
|
-
flwr/server/fleet/grpc_bidi/grpc_bridge.py,sha256=LSOmabFXAQxKycQOliplKmigbmVwdm-D4CI-hJ0Pav0,6458
|
94
|
-
flwr/server/fleet/grpc_bidi/grpc_client_proxy.py,sha256=MubuEEAZAcKzx9LYAB87B2sjvZWWyQS3RPAJJm1GS4I,4695
|
95
|
-
flwr/server/fleet/grpc_bidi/grpc_server.py,sha256=TY_Z8ComreNNOOKveeUO6eE5hoSuTvx_EWqQl0zRADQ,11779
|
96
|
-
flwr/server/fleet/grpc_rere/__init__.py,sha256=bEJOMWbSlqkw-y5ZHtEXczhoSlAxErcRYffmTMQAV8M,758
|
97
|
-
flwr/server/fleet/grpc_rere/fleet_servicer.py,sha256=I6-mfOIKjxiGgHuL2AeiKqYnXDY_qBN1YXDJw1cttcA,2705
|
98
|
-
flwr/server/fleet/message_handler/__init__.py,sha256=hEY0l61ojH8Iz30_K1btm1HJ6J49iZJSFUsVYqUTw3A,731
|
99
|
-
flwr/server/fleet/message_handler/message_handler.py,sha256=_SauWQUO6VCMRRNXDfg3gv2h1FKG7e7p8F-Nj4aY6OM,2823
|
100
|
-
flwr/server/fleet/rest_rere/__init__.py,sha256=VKDvDq5H8koOUztpmQacVzGJXPLEEkL1Vmolxt3mvnY,735
|
101
|
-
flwr/server/fleet/rest_rere/rest_api.py,sha256=c2wMs9Ytx0BprIyPQIFnbLaPXNy_NoCOs72ERRat0z0,5886
|
83
|
+
flwr/server/driver/__init__.py,sha256=NQ4KeZ5fP9wdxGjcr2cP41_7TLuuYQ3u4J7GwYtQ488,870
|
84
|
+
flwr/server/driver/app.py,sha256=jbd8OrPFWvi354wp3DRUWb5dBXYaBCyNv23xdXzmzco,7262
|
85
|
+
flwr/server/driver/driver.py,sha256=OWbLd4rlXiZb-RQZ_i_m_6LwCZzIx5sEvTJe6ZIvNbE,4016
|
86
|
+
flwr/server/driver/driver_client_proxy.py,sha256=wKC3R-293dOqxNytzf78z6tuDCXORbuJAdICyZ5jeK8,6126
|
87
|
+
flwr/server/driver/grpc_driver.py,sha256=Ekcxx4Miqume02fiBjBRJhItaOFNpn120WT3uRIPWIc,4585
|
102
88
|
flwr/server/history.py,sha256=W7PHCFX7dLXrdnaVfl5V4tuzmtxh6zArkWYxVXvTZ1c,4904
|
103
89
|
flwr/server/server.py,sha256=skrNgQp9vlCVHruovlaB0Rh1W7xdH7KqEfVCMZGpK7c,15965
|
104
|
-
flwr/server/state/__init__.py,sha256=ij-7Ms-hyordQdRmGQxY1-nVa4OhixJ0jr7_YDkys0s,1003
|
105
|
-
flwr/server/state/in_memory_state.py,sha256=kODjcJrvF_I7Oc3UVfsnxPksTD0oas0x91shbJ4IdbY,7893
|
106
|
-
flwr/server/state/sqlite_state.py,sha256=Adc2g1DecAN9Cl9F8lekuTb885mIHiOi6sQv4nxbmSc,21203
|
107
|
-
flwr/server/state/state.py,sha256=JtsI92HfdKd8KzBQ9Om7A7xwngDXVxtET2Bk9aQ7nao,5316
|
108
|
-
flwr/server/state/state_factory.py,sha256=91cSB-KOAFM37z7T098WxTkVeKNaAZ_mTI75snn2_tk,1654
|
109
90
|
flwr/server/strategy/__init__.py,sha256=EDTv_lU67VmZ8pRqy5fabQDhq5x4oRiD-KHoXhOIWMs,2096
|
110
91
|
flwr/server/strategy/aggregate.py,sha256=QyRIJtI5gnuY1NbgrcrOvkHxGIxBvApq7d9Y4xl-6W4,13468
|
111
92
|
flwr/server/strategy/bulyan.py,sha256=8GsSVJzRSoSWE2zQUKqC3Z795grdN9xpmc3MSGGXnzM,6532
|
@@ -128,6 +109,26 @@ flwr/server/strategy/fedyogi.py,sha256=fG9i1WEdUXTYh5mTmagGLHqc12OogEsj3s3IopwM4
|
|
128
109
|
flwr/server/strategy/krum.py,sha256=yaYAZw4KOL84nc_PZAp43rBl0pXC0dT6y46sEuZrirA,6285
|
129
110
|
flwr/server/strategy/qfedavg.py,sha256=s-4C-96PKZiUbwZ9_v1ALAd9GmvucjmeOKETipK7fNo,10150
|
130
111
|
flwr/server/strategy/strategy.py,sha256=g6VoIFogEviRub6G4QsKdIp6M_Ek6GhBhqcdNx5ueUk,7543
|
112
|
+
flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
|
113
|
+
flwr/server/superlink/driver/__init__.py,sha256=STB1_DASVEg7Cu6L7VYxTzV7UMkgtBkFim09Z82Dh8I,712
|
114
|
+
flwr/server/superlink/driver/driver_servicer.py,sha256=69-QMkdefgd8BDDAuy4TSJHVcmZAGqq8Yy9ZPDq2kks,4563
|
115
|
+
flwr/server/superlink/fleet/__init__.py,sha256=C6GCSD5eP5Of6_dIeSe1jx9HnV0icsvWyQ5EKAUHJRU,711
|
116
|
+
flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=mgGJGjwT6VU7ovC1gdnnqttjyBPlNIcZnYRqx4K3IBQ,735
|
117
|
+
flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=57b3UL5-baGdLwgCtB0dCUTTSbmmfMAXcXV5bjPZNWQ,5993
|
118
|
+
flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=LSOmabFXAQxKycQOliplKmigbmVwdm-D4CI-hJ0Pav0,6458
|
119
|
+
flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=ajQEfMo8wvLc3tgU0pq6PiiF3-ccZReLTxyz4XbWHcE,4722
|
120
|
+
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=1QyBX5qcFPjMVlv7TrvnQkcET4muvg94Fy9hAQUBYnY,11818
|
121
|
+
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=bEJOMWbSlqkw-y5ZHtEXczhoSlAxErcRYffmTMQAV8M,758
|
122
|
+
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=Mgb4WscpKrkmAVp-09MIzi8S0i_Bkcp88D0_1ief6Uw,2725
|
123
|
+
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=hEY0l61ojH8Iz30_K1btm1HJ6J49iZJSFUsVYqUTw3A,731
|
124
|
+
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=iUBTJ2fzVL0XB8vfaEzCNJ6okeuOWrK6LJe__ElP9x8,2833
|
125
|
+
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=VKDvDq5H8koOUztpmQacVzGJXPLEEkL1Vmolxt3mvnY,735
|
126
|
+
flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=7JCs7NW4Qq8W5QhXxqsQNFiCLlRY-b_iD420vH1Mu-U,5906
|
127
|
+
flwr/server/superlink/state/__init__.py,sha256=ij-7Ms-hyordQdRmGQxY1-nVa4OhixJ0jr7_YDkys0s,1003
|
128
|
+
flwr/server/superlink/state/in_memory_state.py,sha256=viGGGyg7LwwxKfCnndV6Tp9poVeZTrbN9z0tt-4qrqI,7903
|
129
|
+
flwr/server/superlink/state/sqlite_state.py,sha256=Adc2g1DecAN9Cl9F8lekuTb885mIHiOi6sQv4nxbmSc,21203
|
130
|
+
flwr/server/superlink/state/state.py,sha256=JtsI92HfdKd8KzBQ9Om7A7xwngDXVxtET2Bk9aQ7nao,5316
|
131
|
+
flwr/server/superlink/state/state_factory.py,sha256=91cSB-KOAFM37z7T098WxTkVeKNaAZ_mTI75snn2_tk,1654
|
131
132
|
flwr/server/utils/__init__.py,sha256=RQVbo-bcsVtp_lJBf7dL5w01FbLrr7v3YedeGp5_YMs,908
|
132
133
|
flwr/server/utils/tensorboard.py,sha256=k0G6bqsLx7wfYbH2KtXsDYcOCfyIeE12-hefXA7lZdg,5485
|
133
134
|
flwr/server/utils/validator.py,sha256=IJN2475yyD_i_9kg_SJ_JodIuZh58ufpWGUDQRAqu2s,4740
|
@@ -137,8 +138,8 @@ flwr/simulation/ray_transport/__init__.py,sha256=FsaAnzC4cw4DqoouBCix6496k29jACk
|
|
137
138
|
flwr/simulation/ray_transport/ray_actor.py,sha256=G_g50ISt3Knf0zuX1wmw39gsDXSoMI5f3rmYZWGrUh4,17062
|
138
139
|
flwr/simulation/ray_transport/ray_client_proxy.py,sha256=UxQEzWmklp3WO2V7LH5vNyAgYL7KYFFZQa1HTUSgEqY,9429
|
139
140
|
flwr/simulation/ray_transport/utils.py,sha256=5dwzUppfJP8lrpBU1rvhzfPZqAeGo8wx-hOm8wy_HmA,3376
|
140
|
-
flwr_nightly-1.8.0.
|
141
|
-
flwr_nightly-1.8.0.
|
142
|
-
flwr_nightly-1.8.0.
|
143
|
-
flwr_nightly-1.8.0.
|
144
|
-
flwr_nightly-1.8.0.
|
141
|
+
flwr_nightly-1.8.0.dev20240211.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
142
|
+
flwr_nightly-1.8.0.dev20240211.dist-info/METADATA,sha256=4s6_U1jDWkqo8LuxTsJzmv2U-1srbMgDB5q5X7s_lHs,14811
|
143
|
+
flwr_nightly-1.8.0.dev20240211.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
144
|
+
flwr_nightly-1.8.0.dev20240211.dist-info/entry_points.txt,sha256=ltLHw7Y12K5lp8ahi7SPR0bWb_p_0mkknC3F2JI9LPM,240
|
145
|
+
flwr_nightly-1.8.0.dev20240211.dist-info/RECORD,,
|
flwr/driver/__init__.py
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# Copyright 2022 Flower Labs GmbH. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
# ==============================================================================
|
15
|
-
"""Flower driver SDK."""
|
16
|
-
|
17
|
-
|
18
|
-
from .app import start_driver
|
19
|
-
from .driver import Driver
|
20
|
-
from .grpc_driver import GrpcDriver
|
21
|
-
|
22
|
-
__all__ = [
|
23
|
-
"Driver",
|
24
|
-
"GrpcDriver",
|
25
|
-
"start_driver",
|
26
|
-
]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{flwr_nightly-1.8.0.dev20240210.dist-info → flwr_nightly-1.8.0.dev20240211.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|