def run_experiment(experiment, configs, args, mods=None, **kwargs): config = Config(file_=args.config) if args.config is not None else Config() config.update_missing(configs[args.default_config]) if args.mods is not None: for mod in args.mods: config.update(mods[mod]) config = Config(config=config, update_from_argv=True) # GET EXISTING EXPERIMENTS TO BE ABLE TO SKIP CERTAIN CONFIGS if args.skip_existing: existing_configs = [] for exp in os.listdir(args.base_dir): try: existing_configs.append( Config(file_=os.path.join(args.base_dir, exp, "config", "config.json"))) except Exception as e: pass if args.grid is not None: grid = GridSearch().read(args.grid) else: grid = [{}] for combi in grid: config.update(combi) if args.skip_existing: skip_this = False for existing_config in existing_configs: if existing_config.contains(config): skip_this = True break if skip_this: continue loggers = {} if args.visdomlogger: loggers["visdom"] = ("visdom", {}, 1) exp = experiment(config=config, base_dir=args.base_dir, resume=args.resume, ignore_resume_config=args.ignore_resume_config, loggers=loggers, **kwargs) if not args.test: exp.run() else: exp.run_test()
def run_experiment(experiment, configs, args, mods=None, **kwargs): # set a few defaults if "explogger_kwargs" not in kwargs: kwargs["explogger_kwargs"] = dict( folder_format="{experiment_name}_%Y%m%d-%H%M%S") if "explogger_freq" not in kwargs: kwargs["explogger_freq"] = 1 if "resume_save_types" not in kwargs: kwargs["resume_save_types"] = ("model", "simple", "th_vars", "results") config = Config(file_=args.config) if args.config is not None else Config() config.update_missing(configs[args.default_config].deepcopy()) if args.mods is not None and mods is not None: for mod in args.mods: config.update(mods[mod]) config = Config(config=config, update_from_argv=True) # GET EXISTING EXPERIMENTS TO BE ABLE TO SKIP CERTAIN CONFIGS if args.skip_existing: existing_configs = [] for exp in os.listdir(args.base_dir): try: existing_configs.append( Config(file_=os.path.join(args.base_dir, exp, "config", "config.json"))) except Exception as e: pass if args.grid is not None: grid = GridSearch().read(args.grid) else: grid = [{}] for combi in grid: config.update(combi) if args.skip_existing: skip_this = False for existing_config in existing_configs: if existing_config.contains(config): skip_this = True break if skip_this: continue if "backup_every" in config: kwargs["save_checkpoint_every_epoch"] = config["backup_every"] loggers = {} if args.visdomlogger: loggers["v"] = ("visdom", {}, 1) if args.tensorboardxlogger is not None: if args.tensorboardxlogger == "same": loggers["tx"] = ("tensorboard", {}, 1) else: loggers["tx"] = ("tensorboard", { "target_dir": args.tensorboardxlogger }, 1) if args.telegramlogger: kwargs["use_telegram"] = True if args.automatic_description: difference_to_default = Config.difference_config_static( config, configs["DEFAULTS"]).flat(keep_lists=True, max_split_size=0, flatten_int=True) description_str = "" for key, val in difference_to_default.items(): val = val[0] description_str = "{} = {}\n{}".format(key, val, description_str) config.description = description_str exp = experiment(config=config, base_dir=args.base_dir, resume=args.resume, ignore_resume_config=args.ignore_resume_config, loggers=loggers, **kwargs) trained = False if args.resume is None or args.test is False: exp.run() trained = True if args.test: exp.run_test(setup=not trained) if isinstance(args.resume, str) and exp.elog is not None and args.copy_test: for f in glob.glob(os.path.join(exp.elog.save_dir, "test*")): if os.path.isdir(f): shutil.copytree( f, os.path.join(args.resume, "save", os.path.basename(f))) else: shutil.copy(f, os.path.join(args.resume, "save"))