Skip to content

Commit

Permalink
make FedJob2 default FedJob
Browse files Browse the repository at this point in the history
  • Loading branch information
holgerroth committed Apr 18, 2024
1 parent bf7ae5b commit 7a81dc6
Show file tree
Hide file tree
Showing 10 changed files with 73 additions and 315 deletions.
14 changes: 5 additions & 9 deletions examples/hello-world/python_jobs/pt/client_api_pt.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from code.net import Net

from nvflare import FedJob, ControllerApp, ExecutorApp
from nvflare import FedJob
from nvflare.app_common.workflows.fedavg import FedAvg
from nvflare.app_opt.pt.in_process_client_api_executor import PTInProcessClientAPIExecutor

Expand All @@ -24,24 +24,20 @@
num_rounds = 2
train_script = "code/cifar10_fl.py"

job = FedJob(name="cifar10_fedavg")
job = FedJob(name="cifar10_fedavg", init_model=Net(), external_scripts=[train_script]) # TODO: use load/save model in FedAvg

controller = FedAvg(
min_clients=n_clients,
num_rounds=num_rounds,
)
server_app = ControllerApp(init_model=Net()) # TODO: use load/save model in FedAvg
server_app.add_controller(controller)
job.to(server_app, "server")
job.to(controller, "server")

for i in range(n_clients):
executor = PTInProcessClientAPIExecutor(
executor = PTInProcessClientAPIExecutor( # TODO: ScriptExecutor()
task_script_path=train_script,
task_script_args="" # f"--batch_size 32 --data_path /tmp/data/site-{i}"
)
client_app = ExecutorApp(external_scripts=[train_script])
client_app.add_executor(executor)
job.to(client_app, f"site-{i}", gpu=0)
job.to(executor, f"site-{i}", gpu=0)

job.export_job("/tmp/nvflare/jobs/job_config")
job.simulator_run("/tmp/nvflare/jobs/workdir")
43 changes: 0 additions & 43 deletions examples/hello-world/python_jobs/pt/client_api_pt2.py

This file was deleted.

18 changes: 7 additions & 11 deletions examples/hello-world/python_jobs/pt/client_api_pt_dp_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from code.net import Net

from nvflare import FedJob, ControllerApp, ExecutorApp
from nvflare import FedJob, FilterType
from nvflare.app_common.workflows.fedavg import FedAvg
from nvflare.app_opt.pt.in_process_client_api_executor import PTInProcessClientAPIExecutor
from nvflare.app_common.filters.percentile_privacy import PercentilePrivacy
Expand All @@ -25,28 +25,24 @@
num_rounds = 2
train_script = "code/cifar10_fl.py"

job = FedJob(name="cifar10_fedavg_privacy")
job = FedJob(name="cifar10_fedavg_privacy", init_model=Net(), external_scripts=[train_script])

controller = FedAvg(
min_clients=n_clients,
num_rounds=num_rounds,
)
server_app = ControllerApp(init_model=Net())
server_app.add_controller(controller)
job.to(server_app, "server")
job.to(controller, "server")

for i in range(n_clients):
executor = PTInProcessClientAPIExecutor(
task_script_path=train_script,
task_script_args=""
)
client_app = ExecutorApp(external_scripts=[train_script])
client_app.add_executor(executor=executor, tasks=["train"])
job.to(executor, f"site-{i}", tasks=["train"], gpu=0)

# add privacy filter. # TODO: is there a better way to handle task names?
client_app.add_task_result_filter(["train"], PercentilePrivacy(percentile=10, gamma=0.01))

job.to(client_app, f"site-{i}", gpu=0)
# add privacy filter. # TODO: is there a better way to handle task names and filter type?
pp_filter = PercentilePrivacy(percentile=10, gamma=0.01)
job.to(pp_filter, f"site-{i}", tasks=["train"], filter_type=FilterType.TASK_RESULT)

job.export_job("/tmp/nvflare/jobs/job_config")
job.simulator_run("/tmp/nvflare/jobs/workdir")
48 changes: 0 additions & 48 deletions examples/hello-world/python_jobs/pt/client_api_pt_dp_filter2.py

This file was deleted.

4 changes: 2 additions & 2 deletions examples/hello-world/python_jobs/pt/client_api_pt_swarm.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from code.net import Net

from nvflare import FedJob2
from nvflare import FedJob
from nvflare.apis.dxo import DataKind
from nvflare.app_opt.pt.in_process_client_api_executor import PTInProcessClientAPIExecutor
from nvflare.app_common.ccwf import SwarmServerController, CrossSiteEvalServerController, SwarmClientController, CrossSiteEvalClientController
Expand All @@ -32,7 +32,7 @@
num_rounds = 3
train_script = "code/cifar10_fl.py"

job = FedJob2(name="cifar10_swarm", init_model=Net(), external_scripts=[train_script]) # TODO: use load/save model in FedAvg
job = FedJob(name="cifar10_swarm", init_model=Net(), external_scripts=[train_script]) # TODO: use load/save model in FedAvg

controller = SwarmServerController(
num_rounds=num_rounds,
Expand Down
18 changes: 7 additions & 11 deletions examples/hello-world/python_jobs/pt/model_learner_xsite_val.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,20 @@
from pt.utils.cifar10_data_splitter import Cifar10DataSplitter
from pt.utils.cifar10_data_utils import load_cifar10_data

from nvflare import FedJob, ControllerApp, ExecutorApp
from nvflare import FedJob
from nvflare.app_common.workflows.fedavg import FedAvg
from nvflare.app_common.workflows.cross_site_model_eval import CrossSiteModelEval
from nvflare.app_common.executors.model_learner_executor import ModelLearnerExecutor


if __name__ == "__main__":
n_clients = 2
num_rounds = 2
aggregation_epochs = 4
alpha = 0.1
train_split_root = f"/tmp/cifar10_splits/clients{n_clients}_alpha{alpha}" # avoid overwriting results

job = FedJob(name="cifar10_fedavg")
job = FedJob(name="cifar10_fedavg", init_model=ModerateCNN())

ctrl1 = FedAvg(
min_clients=n_clients,
Expand All @@ -48,11 +49,9 @@
alpha=alpha,
)

server_app = ControllerApp(init_model=ModerateCNN())
server_app.add_controller(ctrl1)
server_app.add_controller(ctrl2)
server_app.add_component(data_splitter)
job.to(server_app, "server")
job.to(ctrl1, "server")
job.to(ctrl2, "server")
job.to(data_splitter, "server")

for i in range(n_clients):
learner = CIFAR10ModelLearner(
Expand All @@ -63,10 +62,7 @@
executor = ModelLearnerExecutor(
learner_id=learner # TODO: change more places that use id to directly accept objects
)
client_app = ExecutorApp()
client_app.add_executor(executor=executor, tasks=["train", "submit_model", "validate"])

job.to(client_app, f"site-{i+1}", gpu=0) # data splitter assumes client names start from 1
job.to(executor, f"site-{i+1}", gpu=0) # data splitter assumes client names start from 1

job.export_job("/tmp/nvflare/jobs/job_config")
job.simulator_run("/tmp/nvflare/jobs/workdir")
68 changes: 0 additions & 68 deletions examples/hello-world/python_jobs/pt/model_learner_xsite_val2.py

This file was deleted.

3 changes: 1 addition & 2 deletions nvflare/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,4 @@
# https://github.com/microsoft/pylance-release/issues/856

from nvflare.private.fed.app.simulator.simulator_runner import SimulatorRunner as SimulatorRunner
from nvflare.fed_job import FedJob, ControllerApp, ExecutorApp
from nvflare.fed_job2 import FedJob2, FilterType
from nvflare.fed_job import FedJob
Loading

0 comments on commit 7a81dc6

Please sign in to comment.