Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make communications pluggable in C++ SDK #2763

Merged
merged 45 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
82e3f4b
Initial draft
charlesbvll Dec 19, 2023
696c474
Add pluggable communications
charlesbvll Dec 22, 2023
4b009b3
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Dec 22, 2023
a06f05f
Fix error
charlesbvll Dec 23, 2023
ea32ab6
Merge branch 'main' into cpp-better-comms
charlesbvll Dec 31, 2023
d5fb8ed
Add missing include
charlesbvll Dec 31, 2023
c6509ce
Merge branch 'main' into cpp-better-comms
charlesbvll Jan 5, 2024
7f1cde0
Update protofiles
charlesbvll Jan 5, 2024
73593f8
Merge branch 'main' into cpp-better-comms
charlesbvll Jan 17, 2024
4041f28
Merge branch 'main' into cpp-better-comms
charlesbvll Jan 17, 2024
9455350
Merge branch 'main' into cpp-better-comms
charlesbvll Mar 1, 2024
a363d56
Merge branch 'main' into cpp-better-comms
charlesbvll Mar 1, 2024
174ca2c
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Mar 1, 2024
c9c4625
Add new proto files
charlesbvll Mar 1, 2024
89b2375
Testing new classes
charlesbvll Mar 4, 2024
fa6b9c7
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Mar 15, 2024
514e1f7
No errors
charlesbvll Mar 25, 2024
1faf14b
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Mar 25, 2024
804250b
Remove legacy start_client
charlesbvll Mar 25, 2024
b2fbda9
Update example
charlesbvll Mar 25, 2024
8fac094
Fix validate and recordvalue serialization
charlesbvll Mar 25, 2024
7b43022
Non empty config record
charlesbvll Mar 27, 2024
8639340
Remove print statement
charlesbvll Mar 27, 2024
c474f12
Add dependency
charlesbvll Mar 27, 2024
0d4a307
Remove undefined namespace
charlesbvll Mar 27, 2024
8313cc8
Update cpp.yml
charlesbvll Mar 28, 2024
d412a1f
Update cpp.yml
charlesbvll Mar 28, 2024
09ffeb4
Update cpp.yml
charlesbvll Mar 28, 2024
fce2fd4
Add ttl and created_at
charlesbvll Mar 28, 2024
32a7278
Merge branch 'cpp-better-comms' of https://github.com/adap/flower int…
charlesbvll Mar 28, 2024
da1587e
Use empty taskid
charlesbvll Mar 28, 2024
8057db1
Fix validation
charlesbvll Mar 28, 2024
08b4baf
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Mar 28, 2024
bd07964
Update protos and add ttl
charlesbvll Mar 28, 2024
c71678a
Try CI fix
charlesbvll Mar 28, 2024
a5e914c
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Apr 1, 2024
ecf0aef
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Apr 3, 2024
982d1d4
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Apr 4, 2024
ee8a958
Set ping interval
charlesbvll Apr 4, 2024
a67b1dc
Merge branch 'main' into cpp-better-comms
tanertopal Apr 4, 2024
5abfd6a
Merge branch 'main' into cpp-better-comms
charlesbvll Apr 4, 2024
677aae6
Remove debug print
charlesbvll Apr 8, 2024
f812e2a
Merge branch 'main' of https://github.com/adap/flower into cpp-better…
charlesbvll Apr 8, 2024
d486813
Merge branch 'main' into cpp-better-comms
charlesbvll Apr 12, 2024
87864b7
Merge branch 'main' into cpp-better-comms
charlesbvll Apr 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions .github/workflows/cpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,18 @@ jobs:
cmake -DUSE_LOCAL_FLWR=ON -S . -B build
cmake --build build
pip install ../..
timeout 2m python server.py &
pid=$!
timeout 3m flower-superlink --insecure &
sleep 10
timeout 2m build/flwr_client 0 127.0.0.1:9092 &
sleep 3
build/flwr_client 0 127.0.0.1:8080 &
timeout 2m build/flwr_client 1 127.0.0.1:9092 &
sleep 3
build/flwr_client 1 127.0.0.1:8080 &
flower-server-app server:app --insecure &
pid=$!
wait $pid
res=$?
if [[ "$res" = "0" ]];
then echo "Training worked correctly";
then echo "Training worked correctly" && exit 0;
else echo "Training had an issue" && exit 1;
fi

Expand Down
1 change: 0 additions & 1 deletion examples/quickstart-cpp/fedavg_cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ def aggregate_evaluate(
# Do not aggregate if there are failures and failures are not accepted
if not self.accept_failures and failures:
return None, {}
print(results[0][1])
loss_aggregated = weighted_loss_avg(
[
(
Expand Down
20 changes: 13 additions & 7 deletions examples/quickstart-cpp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@
import numpy as np
from fedavg_cpp import FedAvgCpp, weights_to_parameters

model_size = 2
initial_weights = [
np.array([1.0, 2.0], dtype=np.float64),
np.array([3.0], dtype=np.float64),
]
initial_parameters = weights_to_parameters(initial_weights)
strategy = FedAvgCpp(initial_parameters=initial_parameters)

app = fl.server.ServerApp(
config=fl.server.ServerConfig(num_rounds=3),
strategy=strategy,
)

# Start Flower server for three rounds of federated learning
if __name__ == "__main__":
model_size = 2
initial_weights = [
np.array([1.0, 2.0], dtype=np.float64),
np.array([3.0], dtype=np.float64),
]
initial_parameters = weights_to_parameters(initial_weights)
strategy = FedAvgCpp(initial_parameters=initial_parameters)
fl.server.start_server(
server_address="0.0.0.0:8080",
config=fl.server.ServerConfig(num_rounds=3),
Expand Down
26 changes: 6 additions & 20 deletions examples/quickstart-cpp/src/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,10 @@
#include "start.h"

int main(int argc, char **argv) {
if (argc != 3 && argc != 4) {
std::cout << "Client takes three mandatory arguments and one optional as "
"follows: "
<< std::endl;
std::cout << "./client CLIENT_ID SERVER_URL [GRPC_MODE]" << std::endl;
std::cout
<< "GRPC_MODE is optional and can be either 'bidi' (default) or 'rere'."
<< std::endl;
std::cout << "Example: ./flwr_client 0 '127.0.0.1:8080' bidi" << std::endl;
std::cout << "This is the same as: ./flwr_client 0 '127.0.0.1:8080'"
<< std::endl;
if (argc != 3) {
std::cout << "Client takes 2 mandatory arguments as follows: " << std::endl;
std::cout << "./client CLIENT_ID SERVER_URL" << std::endl;
std::cout << "Example: ./flwr_client 0 '127.0.0.1:8080'" << std::endl;
return 0;
}

Expand Down Expand Up @@ -45,15 +38,8 @@ int main(int argc, char **argv) {
// Define a server address
std::string server_add = SERVER_URL;

if (argc == 4 && std::string(argv[3]) == "rere") {
std::cout << "Starting rere client" << std::endl;
// Start rere client
start::start_rere_client(server_add, &client);
} else {
std::cout << "Starting bidi client" << std::endl;
// Start bidi client
start::start_client(server_add, &client);
}
std::cout << "Starting rere client" << std::endl;
start::start_client(server_add, &client);

return 0;
}
1 change: 1 addition & 0 deletions src/cc/flwr/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
build/
.clangd
*.bak
2 changes: 2 additions & 0 deletions src/cc/flwr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ GENERATE_AND_COPY(transport)
GENERATE_AND_COPY(node)
GENERATE_AND_COPY(task)
GENERATE_AND_COPY(fleet)
GENERATE_AND_COPY(error)
GENERATE_AND_COPY(recordset)

add_library(flwr_grpc_proto STATIC ${ALL_PROTO_FILES})

Expand Down
30 changes: 30 additions & 0 deletions src/cc/flwr/include/communicator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef COMMUNICATOR_H
#define COMMUNICATOR_H

#include "flwr/proto/fleet.pb.h"
#include <chrono>
#include <optional>

class Communicator {
public:
virtual bool send_create_node(flwr::proto::CreateNodeRequest request,
flwr::proto::CreateNodeResponse *response) = 0;

virtual bool send_delete_node(flwr::proto::DeleteNodeRequest request,
flwr::proto::DeleteNodeResponse *response) = 0;

virtual bool
send_pull_task_ins(flwr::proto::PullTaskInsRequest request,
flwr::proto::PullTaskInsResponse *response) = 0;

virtual bool
send_push_task_res(flwr::proto::PushTaskResRequest request,
flwr::proto::PushTaskResResponse *response) = 0;
};

void create_node(Communicator *communicator);
void delete_node(Communicator *communicator);
void send(Communicator *communicator, flwr::proto::TaskRes task_res);
std::optional<flwr::proto::TaskIns> receive(Communicator *communicator);

#endif
27 changes: 27 additions & 0 deletions src/cc/flwr/include/flwr/proto/error.grpc.pb.cc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 51 additions & 0 deletions src/cc/flwr/include/flwr/proto/error.grpc.pb.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading