FS-TFP/benchmark/FedHPOBench/fedhpobench/utils/util.py

85 lines
2.9 KiB
Python

import os
import time
import logging
import ConfigSpace as CS
from datetime import datetime
def merge_dict(dict1, dict2):
for key, value in dict2.items():
if key not in dict1:
if isinstance(value, dict):
dict1[key] = merge_dict({}, value)
else:
dict1[key] = [value]
else:
if isinstance(value, dict):
merge_dict(dict1[key], value)
else:
dict1[key].append(value)
return dict1
def disable_fs_logger(cfg, clear_before_add=False):
# Disable FS logger
root_logger = logging.getLogger("federatedscope")
# clear all existing handlers and add the default stream
if clear_before_add:
root_logger.handlers = []
handler = logging.StreamHandler()
logging_fmt = "%(asctime)s (%(module)s:%(lineno)d) %(levelname)s: %(" \
"message)s"
handler.setFormatter(logging.Formatter(logging_fmt))
root_logger.addHandler(handler)
root_logger.setLevel(logging.CRITICAL)
# ================ create outdir to save log, exp_config, models, etc,.
if cfg.outdir == "":
cfg.outdir = os.path.join(os.getcwd(), "exp")
cfg.outdir = os.path.join(cfg.outdir, cfg.expname)
# if exist, make directory with given name and time
if os.path.isdir(cfg.outdir) and os.path.exists(cfg.outdir):
outdir = os.path.join(cfg.outdir, "sub_exp" +
datetime.now().strftime('_%Y%m%d%H%M%S')
) # e.g., sub_exp_20220411030524
while os.path.exists(outdir):
time.sleep(1)
outdir = os.path.join(
cfg.outdir,
"sub_exp" + datetime.now().strftime('_%Y%m%d%H%M%S'))
cfg.outdir = outdir
# if not, make directory with given name
os.makedirs(cfg.outdir)
# create file handler which logs even debug messages
fh = logging.FileHandler(os.path.join(cfg.outdir, 'exp_print.log'))
fh.setLevel(logging.CRITICAL)
logger_formatter = logging.Formatter(
"%(asctime)s (%(module)s:%(lineno)d) %(levelname)s: %(message)s")
fh.setFormatter(logger_formatter)
root_logger.addHandler(fh)
def cfg2name(cfg):
repeat = 0
dir = os.path.join(
cfg.benchmark.out_dir,
f'{cfg.benchmark.data}_{cfg.benchmark.model}_{cfg.benchmark.type}'
f'_{cfg.benchmark.algo}')
os.makedirs(dir, exist_ok=True)
while os.path.exists(
os.path.join(dir, f'{cfg.optimizer.type}_repeat{repeat}.txt')):
repeat += 1
return os.path.join(dir, f'{cfg.optimizer.type}_repeat{repeat}.txt')
def dict2cfg(space):
configuration_space = CS.ConfigurationSpace()
for key, value in space.items():
hyperparameter = CS.CategoricalHyperparameter(key, choices=value)
configuration_space.add_hyperparameter(hyperparameter)
return configuration_space