Skip to content
Snippets Groups Projects
Commit 057b13d7 authored by huongdm1896's avatar huongdm1896
Browse files

removed hardcode dir to ./

parent b414124b
No related branches found
No related tags found
No related merge requests found
......@@ -18,9 +18,14 @@ def create_csv_filepath(strategy_name: str, num_rounds: int) -> str:
# Determine the parent directory of the current script
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Create the "Log_autres" directory if it doesn't exist
log_dir = os.path.join(parent_dir, "Log_autres")
os.makedirs(log_dir, exist_ok=True)
# # Create the "Log_autres" directory if it doesn't exist
# log_dir = os.path.join(parent_dir, "Log_autres")
# os.makedirs(log_dir, exist_ok=True)
log_dir = args.log_dir
if log_dir is None:
log_dir = os.path.join(parent_dir, "Log_autres")
os.makedirs(log_dir, exist_ok=True)
# Generate a timestamp for the file
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
......@@ -109,6 +114,8 @@ parser.add_argument(
help="Select strategy: fedAvg, fedMedian, fedOpt or fedAdam or fedAvg2Clients",
)
parser.add_argument("-l", "--log_dir", type=str, default=None, help="Directory to save logs")
# Parse the arguments from the command line
args = parser.parse_args()
......
......@@ -174,10 +174,10 @@ cd Run
```
### Step 2. Configure
Create the JSON configuration file (e.g. `config_instances.json` for CPU and `config_instances_1.json` for GPU) to specify experiment details includes one or more instances.
Two JSON configuration files (e.g. `config_instances.json` for CPU and `config_instances_1.json` for GPU) to specify experiment details includes one or more instances.
```bash
vim config_instances.json
cat config_instances.json
```
<u>For example</u>: `config_instances.json` provides two examples of instance configuration. All fields are configured except "`output_dir`" and "`args`" must be updated with your directories setting.
......
......@@ -2,7 +2,7 @@
"instances": {
"1": {
"instance": "fedAvg_cifar10",
"output_dir": "/home/mdo/Framework/eflwr/Log",
"output_dir": "./eflwr/Log",
"dvfs_cpu": {
"dummy": true,
"baseline": false,
......@@ -11,7 +11,7 @@
"server": {
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/server_1.py",
"./eflwr/Flower_v1/server_1.py",
"-r 1",
"-s fedAvg"
],
......@@ -23,7 +23,7 @@
"name": "client1",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"1",
"3"
......@@ -34,7 +34,7 @@
"name": "client2",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"2",
"3"
......@@ -45,7 +45,7 @@
"name": "client3",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"3",
"3"
......@@ -56,7 +56,7 @@
},
"2": {
"instance": "fedAvg2Clients_cifar10",
"output_dir": "/home/mdo/Framework/eflwr/Log",
"output_dir": "./eflwr/Log",
"dvfs_cpu": {
"dummy": true,
"baseline": false,
......@@ -65,7 +65,7 @@
"server": {
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/server_1.py",
"./eflwr/Flower_v1/server_1.py",
"-r 1",
"-s fedAvg2Clients"
],
......@@ -77,7 +77,7 @@
"name": "client1",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"1",
"3"
......@@ -88,7 +88,7 @@
"name": "client2",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"2",
"3"
......@@ -99,7 +99,7 @@
"name": "client3",
"command": "python3",
"args": [
"/home/mdo/Framework/eflwr/Flower_v1/client_1.py",
"./eflwr/Flower_v1/client_1.py",
"cifar10",
"3",
"3"
......
# python3 measure.py -c config_instances.json -i 1 -x 1 -r 1
# python3 measure_instance.py -c config_instances.json -i 1 -x 1 -r 1
import os
import argparse
......@@ -19,6 +19,9 @@ parser.add_argument("-r", "--repeat", type=int, default=1, required=True, help="
# Parse arguments
args = parser.parse_args()
config_path = os.path.abspath(args.config)
config_dir = os.path.dirname(config_path)
try:
with open(args.config, "r") as file:
config_data = json.load(file)
......@@ -60,7 +63,8 @@ else:
LEVERAGES = []
# Log directory
log_dir = config["output_dir"]
# log_dir = config["output_dir"]
log_dir = os.path.abspath(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)
......
......@@ -12,6 +12,9 @@ import argparse
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)
# read json
try:
with open(config_path, "r") as file:
......@@ -30,20 +33,33 @@ def main(config_path, instance, suffix):
sys.exit(1)
# get server/client info
output_dir = instance_config["output_dir"]
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"]
instance_name = instance_config.get("instance", f"default_instance_{instance}")
server_ip = instance_config["server"]["ip"]
server_port = instance_config["server"]["port"]
server_command = [instance_config["server"]["command"], *instance_config["server"]["args"]]
clients = instance_config["clients"]
client_commands = [
{
"ip": client["ip"],
"command": [client["command"], *client["args"], f'"{server_ip}:{server_port}"']
} for client in clients
# Convert server args to absolute paths if needed
server_args = [
os.path.abspath(os.path.join(config_dir, arg)) if arg.startswith("./") else arg
for arg in instance_config["server"]["args"]
]
server_command = [instance_config["server"]["command"], *server_args]
# Convert client args to absolute paths if needed
clients = instance_config["clients"]
client_commands = []
for client in clients:
client_ip = client["ip"]
client_args = [
os.path.abspath(os.path.join(config_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}")
......@@ -55,11 +71,20 @@ def main(config_path, instance, suffix):
print(f"========== Run Server on {server_ip} ==========")
server_log_path = os.path.join(log_exp_dir, f"Server_{server_ip}")
with open(server_log_path, "w") as log_file:
server_command_with_log = server_command.copy()
if "logger" in instance_config["server"]["modules"]:
server_command_with_log.extend(["--log_dir", log_exp_dir]) # Nếu có, thêm log_dir
server_process = subprocess.Popen(
["oarsh", server_ip, *server_command],
["oarsh", server_ip, *server_command_with_log], # Chạy lệnh server (có hoặc không có log_dir)
stdout=log_file, stderr=subprocess.STDOUT
)
# server_process = subprocess.Popen(
# ["oarsh", server_ip, *server_command],
# stdout=log_file, stderr=subprocess.STDOUT
# )
client_processes = []
for client in client_commands:
client_ip = client["ip"]
......
flwr==1.13.0
flwr-datasets==0.4.0
expetator
\ No newline at end of file
expetator
tensorflow>=2.16.1,<2.17.0
tensorflow-datasets==4.4.0
tensorboard>=2.16.2,<2.17.0
scikit-learn>=1.6.1
numpy>=1.26.0,<1.27.0
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment