diff --git a/README.md b/README.md index 76e7ab204e77df5d133db643f0b8613cbab992b4..40440191c8f60266f093ce561925a950d721ea4f 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ This framework requires: ```bash pip install -r requirements.txt ``` -*Note:* You also need to install `tensorflow`, `tensorflow-datasets` `scikit-learn` and `numpy` if you want to run the provided Flower example. +*Note:* `requirements.txt` includes `tensorflow`, `tensorflow-datasets` `scikit-learn` and `numpy` using for the provided Flower example. Navigate to `Run` directory: @@ -91,6 +91,7 @@ Configure instances of experiment in a json format, structure is shown below. "args": [ ], "ip": "", + "modules": ["logger"], "port": 8080 }, "clients": [ @@ -205,7 +206,7 @@ python3 measure_instance.py -c config_instances.json -i 1 -x SingleTest -r 2 Run a campaign with all instances (`1` and `2`), and 2 repetitions: ```bash -python3 measure_instance.py -x CampaignTest -r 2 +python3 measure_campaign.py -x CampaignTest -c config_instances.json -r 2 ``` ### Step 5. Output @@ -225,6 +226,7 @@ Output dir structure: │ ├── Flwr_<timestamp>: Flower log │ │ ├── Client_<ip> │ │ ├── Server_<ip> +│ │ ├── training_results_<instance_name>_<time>.csv │ ├── Flwr_<timestamp> │ │ ├── Client_<ip> │ │ ├── Server_<ip> diff --git a/Run/config_instances.json b/Run/config_instances.json index dc0e2bb005349e7346a7fe0cc0e9460a5b4420d8..941ec5d3072819fbac2bca1023278192cd5391e3 100644 --- a/Run/config_instances.json +++ b/Run/config_instances.json @@ -2,7 +2,7 @@ "instances": { "1": { "instance": "fedAvg_cifar10", - "output_dir": "./eflwr/Log", + "output_dir": "./Log", "dvfs_cpu": { "dummy": true, "baseline": false, @@ -11,11 +11,12 @@ "server": { "command": "python3", "args": [ - "./eflwr/Flower_v1/server_1.py", + "./Flower_v1/server_1.py", "-r 1", "-s fedAvg" ], "ip": "172.16.66.76", + "modules": ["logger"], "port": 8080 }, "clients": [ @@ -23,7 +24,7 @@ "name": "client1", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "1", "3" @@ -34,7 +35,7 @@ "name": "client2", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "2", "3" @@ -45,7 +46,7 @@ "name": "client3", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "3", "3" @@ -56,7 +57,7 @@ }, "2": { "instance": "fedAvg2Clients_cifar10", - "output_dir": "./eflwr/Log", + "output_dir": "./Log", "dvfs_cpu": { "dummy": true, "baseline": false, @@ -65,11 +66,12 @@ "server": { "command": "python3", "args": [ - "./eflwr/Flower_v1/server_1.py", + "./Flower_v1/server_1.py", "-r 1", "-s fedAvg2Clients" ], "ip": "172.16.66.76", + "modules": ["logger"], "port": 8080 }, "clients": [ @@ -77,7 +79,7 @@ "name": "client1", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "1", "3" @@ -88,7 +90,7 @@ "name": "client2", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "2", "3" @@ -99,7 +101,7 @@ "name": "client3", "command": "python3", "args": [ - "./eflwr/Flower_v1/client_1.py", + "./Flower_v1/client_1.py", "cifar10", "3", "3" diff --git a/Run/measure_instance.py b/Run/measure_instance.py index a9df9875f8bdf4324de7d3d8a471f64981e70f9b..d1cf3b222760976928dc88f8b3d77c0065f160d4 100644 --- a/Run/measure_instance.py +++ b/Run/measure_instance.py @@ -20,8 +20,8 @@ parser.add_argument("-r", "--repeat", type=int, default=1, required=True, help=" args = parser.parse_args() config_path = os.path.abspath(args.config) -config_dir = os.path.dirname(config_path) - +root_dir = os.path.abspath(os.path.join(os.path.dirname(config_path), "..")) # Get root eflwr directory +print(root_dir) try: with open(args.config, "r") as file: config_data = json.load(file) @@ -64,11 +64,13 @@ else: # Log directory # log_dir = config["output_dir"] -log_dir = os.path.abspath(config["output_dir"]) +log_dir = os.path.abspath(os.path.join(root_dir, config["output_dir"])) if config["output_dir"].startswith("./") else config["output_dir"] instance_name = config.get("instance", "default_instance") flower_log_dir = os.path.join(log_dir, f"Flower_{args.suffix}", f"Flower_instance_{instance_name}", "Expetator") os.makedirs(flower_log_dir, exist_ok=True) +print(flower_log_dir) + # Add the configure file to log directory config_instance_path = os.path.join(flower_log_dir, f"config_instance_{instance_key}.json") with open(config_instance_path, "w", encoding="utf-8") as file: diff --git a/Run/run_flwr.py b/Run/run_flwr.py index f63f316b58ec90fff87c9db071145cbd5e0c96cd..9320af24357a3efb8393f5f219e25eac5bf11cab 100644 --- a/Run/run_flwr.py +++ b/Run/run_flwr.py @@ -1,4 +1,4 @@ -# python3 run_flwr_1.py -c config_instances.json -i 1 -x 1 +# python3 run_flwr.py -c config_instances.json -i 1 -x 1 import os import sys @@ -13,7 +13,7 @@ def main(config_path, instance, suffix): print(f"Running Flower instance with instance: {instance} and suffix: {suffix}") config_path = os.path.abspath(config_path) - config_dir = os.path.dirname(config_path) + root_dir = os.path.abspath(os.path.join(os.path.dirname(config_path), "..")) # Get root eflwr directory # read json try: @@ -33,14 +33,14 @@ def main(config_path, instance, suffix): sys.exit(1) # get server/client info - output_dir = os.path.abspath(os.path.join(config_dir, instance_config["output_dir"])) if instance_config["output_dir"].startswith("./") else instance_config["output_dir"] + output_dir = os.path.abspath(os.path.join(root_dir, instance_config["output_dir"])) if instance_config["output_dir"].startswith("./") else instance_config["output_dir"] instance_name = instance_config.get("instance", f"default_instance_{instance}") server_ip = instance_config["server"]["ip"] server_port = instance_config["server"]["port"] # Convert server args to absolute paths if needed server_args = [ - os.path.abspath(os.path.join(config_dir, arg)) if arg.startswith("./") else arg + os.path.abspath(os.path.join(root_dir, arg)) if arg.startswith("./") else arg for arg in instance_config["server"]["args"] ] server_command = [instance_config["server"]["command"], *server_args] @@ -51,15 +51,13 @@ def main(config_path, instance, suffix): for client in clients: client_ip = client["ip"] client_args = [ - os.path.abspath(os.path.join(config_dir, arg)) if arg.startswith("./") else arg + os.path.abspath(os.path.join(root_dir, arg)) if arg.startswith("./") else arg for arg in client["args"] ] client_command = [client["command"], *client_args, f'"{server_ip}:{server_port}"'] client_commands.append({"ip": client_ip, "command": client_command}) - # print(server_command, client_commands) - # print(output_dir) - # return + # Create log for experiment Flower current_time = datetime.now().strftime("%Y%m%d_%H%M%S") flower_dir = os.path.join(output_dir, f"Flower_{suffix}")