Skip to content
Snippets Groups Projects
measure_instance.py 3.95 KiB
# python3 measure_instance.py -c config_instances.json -i 1 -x 1 -r 1

import os
import argparse
import json
import time
import expetator.experiment as experiment
from expetator.monitors import Mojitos
from expetator.leverages import Dvfs, GpuClock
#import run_flwr as run_flwr

# Set up argument parser
parser = argparse.ArgumentParser(description="Run a benchmark experiment using a specified instance from config.json.")
parser.add_argument("-x", "--suffix", type=str, required=True, help="Suffix for the log directory (e.g., experiment name or timestamp)")
parser.add_argument("-c", "--config", type=str, required=True, help="Path to the config file (e.g., config_instances.json)")
parser.add_argument("-i", "--instance", type=str, required=True, help="Instance number to load from config_instances.json (e.g., '1' or '2')")
parser.add_argument("-r", "--repeat", type=int, default=1, required=True, help="Number of repetitions (e.g., 2, the experiment will run twice)")

# Parse arguments
args = parser.parse_args()

config_path = os.path.abspath(args.config)
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)
except FileNotFoundError:
    print(f"Error: Config file {args.config} not found!")
    exit(1)
except json.JSONDecodeError:
    print(f"Error: Config file {args.config} contains invalid JSON!")
    exit(1)

instance_key = str(args.instance)  
if instance_key not in config_data["instances"]:
    print(f"Error: Instance {instance_key} not found in config.json!")
    exit(1)

# Load config instance 
config = config_data["instances"][instance_key]

# extract DVFS infor (cpu and gpu)
if "dvfs_cpu" in config:
    dvfs_config = config["dvfs_cpu"]
    dvfs = Dvfs(
        dummy=dvfs_config.get("dummy", False),
        baseline=dvfs_config.get("baseline", False),
        frequencies=dvfs_config.get("frequencies", None)
    )
    LEVERAGES = [dvfs]
elif "dvfs_gpu" in config:
    dvfs_config = config["dvfs_gpu"]
    dvfs = GpuClock(
        dummy=dvfs_config.get("dummy", False),
        baseline=dvfs_config.get("baseline", False),
        steps=dvfs_config.get("steps", 2),
        zoomfrom=dvfs_config.get("zoomfrom", 0),
        zoomto=dvfs_config.get("zoomto", 0)
    )
    LEVERAGES = [dvfs]
else:
    LEVERAGES = []

# Log directory
# log_dir = 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:
    json.dump(config, file, indent=4, sort_keys=True, ensure_ascii=False, allow_nan=False)

class DemoBench:
    def __init__(self, params=[args.suffix]):
        self.names = {"flower"}
        self.params = params
  
    def build(self, executor):
        return {"flower": self.params}
        
    def run(self, bench, param, executor):
        before = time.time()
        #run_flwr.main(args.config, args.instance, args.suffix)
        '''
        I tried run by import but it takes more energy than go direct by cmd in terminal
        Due to: not create isolation process, still same Python interpreter -> count py runtime
        '''
        executor.local(f"python3 run_flwr.py -c {args.config} -i {args.instance} -x {args.suffix}")
        return time.time() - before, "flower"

if __name__ == "__main__":
    experiment.run_experiment(
        flower_log_dir, 
        [DemoBench()],
        leverages= LEVERAGES,
        monitors=[Mojitos(sensor_set={'user', 'rxp', 'dram0'})],
        times=args.repeat
    )