| print("Imports...", end="", flush=True) |
|
|
| import sys |
| from pathlib import Path |
|
|
| sys.path.append(str(Path(__file__).resolve().parent.parent)) |
|
|
| import atexit |
| import logging |
| from argparse import ArgumentParser |
| from copy import deepcopy |
|
|
| import comet_ml |
| import climategan |
| from comet_ml.api import API |
| from climategan.trainer import Trainer |
| from climategan.utils import get_comet_rest_api_key |
|
|
| logging.basicConfig() |
| logging.getLogger().setLevel(logging.ERROR) |
| import traceback |
|
|
| print("Done.") |
|
|
|
|
| def set_opts(opts, str_nested_key, value): |
| """ |
| Changes an opts with nested keys: |
| set_opts(addict.Dict(), "a.b.c", 2) == Dict({"a":{"b": {"c": 2}}}) |
| |
| Args: |
| opts (addict.Dict): opts whose values should be changed |
| str_nested_key (str): nested keys joined on "." |
| value (any): value to set to the nested keys of opts |
| """ |
| keys = str_nested_key.split(".") |
| o = opts |
| for k in keys[:-1]: |
| o = o[k] |
| o[keys[-1]] = value |
|
|
|
|
| def set_conf(opts, conf): |
| """ |
| Updates opts according to a test scenario's configuration dict. |
| Ignores all keys starting with "__" which are used for the scenario |
| but outside the opts |
| |
| Args: |
| opts (addict.Dict): trainer options |
| conf (dict): scenario's configuration |
| """ |
| for k, v in conf.items(): |
| if k.startswith("__"): |
| continue |
| set_opts(opts, k, v) |
|
|
|
|
| class bcolors: |
| HEADER = "\033[95m" |
| OKBLUE = "\033[94m" |
| OKGREEN = "\033[92m" |
| WARNING = "\033[93m" |
| FAIL = "\033[91m" |
| ENDC = "\033[0m" |
| BOLD = "\033[1m" |
| UNDERLINE = "\033[4m" |
|
|
|
|
| class Colors: |
| def _r(self, key, *args): |
| return f"{key}{' '.join(args)}{bcolors.ENDC}" |
|
|
| def ob(self, *args): |
| return self._r(bcolors.OKBLUE, *args) |
|
|
| def w(self, *args): |
| return self._r(bcolors.WARNING, *args) |
|
|
| def og(self, *args): |
| return self._r(bcolors.OKGREEN, *args) |
|
|
| def f(self, *args): |
| return self._r(bcolors.FAIL, *args) |
|
|
| def b(self, *args): |
| return self._r(bcolors.BOLD, *args) |
|
|
| def u(self, *args): |
| return self._r(bcolors.UNDERLINE, *args) |
|
|
|
|
| def comet_handler(exp, api): |
| def sub_handler(): |
| p = Colors() |
| print() |
| print(p.b(p.w("Deleting comet experiment"))) |
| api.delete_experiment(exp.get_key()) |
|
|
| return sub_handler |
|
|
|
|
| def print_start(desc): |
| p = Colors() |
| cdesc = p.b(p.ob(desc)) |
| title = "| " + cdesc + " |" |
| line = "-" * (len(desc) + 6) |
| print(f"{line}\n{title}\n{line}") |
|
|
|
|
| def print_end(desc=None, ok=None): |
| p = Colors() |
| if ok and desc is None: |
| desc = "Done" |
| cdesc = p.b(p.og(desc)) |
| elif not ok and desc is None: |
| desc = "! Fail !" |
| cdesc = p.b(p.f(desc)) |
| elif desc is not None: |
| cdesc = p.b(p.og(desc)) |
| else: |
| desc = "Unknown" |
| cdesc = desc |
|
|
| title = "| " + cdesc + " |" |
| line = "-" * (len(desc) + 6) |
| print(f"{line}\n{title}\n{line}\n") |
|
|
|
|
| def delete_on_exit(exp): |
| """ |
| Registers a callback to delete the comet exp at program exit |
| |
| Args: |
| exp (comet_ml.Experiment): The exp to delete |
| """ |
| rest_api_key = get_comet_rest_api_key() |
| api = API(api_key=rest_api_key) |
| atexit.register(comet_handler(exp, api)) |
|
|
|
|
| if __name__ == "__main__": |
|
|
| |
| |
| |
| parser = ArgumentParser() |
| parser.add_argument("--no_delete", action="store_true", default=False) |
| parser.add_argument("--no_end_to_end", action="store_true", default=False) |
| parser.add_argument("--include", "-i", nargs="+", default=[]) |
| parser.add_argument("--exclude", "-e", nargs="+", default=[]) |
| args = parser.parse_args() |
|
|
| assert not (args.include and args.exclude), "Choose 1: include XOR exclude" |
|
|
| include = set(int(i) for i in args.include) |
| exclude = set(int(i) for i in args.exclude) |
| if include: |
| print("Including exclusively tests", " ".join(args.include)) |
| if exclude: |
| print("Excluding tests", " ".join(args.exclude)) |
|
|
| |
| |
| |
| print("Creating comet Experiment...", end="", flush=True) |
| global_exp = comet_ml.Experiment( |
| project_name="climategan-test", display_summary_level=0 |
| ) |
| print("Done.") |
|
|
| if not args.no_delete: |
| delete_on_exit(global_exp) |
|
|
| |
| prompt = Colors() |
|
|
| |
| |
| |
| print("Loading opts...", end="", flush=True) |
| base_opts = climategan.utils.load_opts() |
| base_opts.data.check_samples = False |
| base_opts.train.fid.n_images = 5 |
| base_opts.comet.display_size = 5 |
| base_opts.tasks = ["m", "s", "d"] |
| base_opts.domains = ["r", "s"] |
| base_opts.data.loaders.num_workers = 4 |
| base_opts.data.loaders.batch_size = 2 |
| base_opts.data.max_samples = 9 |
| base_opts.train.epochs = 1 |
| if isinstance(base_opts.data.transforms[-1].new_size, int): |
| base_opts.data.transforms[-1].new_size = 256 |
| else: |
| base_opts.data.transforms[-1].new_size.default = 256 |
| print("Done.") |
|
|
| |
| |
| |
|
|
| |
| |
| |
| test_scenarios = [ |
| {"__use_comet": False, "__doc": "MSD no exp", "__verbose": 1}, |
| {"__doc": "MSD with exp"}, |
| { |
| "__doc": "MSD no exp upsample_featuremaps", |
| "__use_comet": False, |
| "gen.d.upsample_featuremaps": True, |
| "gen.s.upsample_featuremaps": True, |
| }, |
| {"tasks": ["p"], "domains": ["rf"], "__doc": "Painter"}, |
| { |
| "__doc": "M no exp low level feats", |
| "__use_comet": False, |
| "gen.m.use_low_level_feats": True, |
| "gen.m.use_dada": False, |
| "tasks": ["m"], |
| }, |
| { |
| "__doc": "MSD no exp deeplabv2", |
| "__use_comet": False, |
| "gen.encoder.architecture": "deeplabv2", |
| "gen.s.architecture": "deeplabv2", |
| }, |
| { |
| "__doc": "MSDP no End-to-end", |
| "domains": ["rf", "r", "s"], |
| "tasks": ["m", "s", "d", "p"], |
| }, |
| { |
| "__doc": "MSDP inference only no exp", |
| "__inference": True, |
| "__use_comet": False, |
| "domains": ["rf", "r", "s"], |
| "tasks": ["m", "s", "d", "p"], |
| }, |
| { |
| "__doc": "MSDP with End-to-end", |
| "__pl4m": True, |
| "domains": ["rf", "r", "s"], |
| "tasks": ["m", "s", "d", "p"], |
| }, |
| { |
| "__doc": "Kitti pretrain", |
| "train.epochs": 2, |
| "train.kitti.pretrain": True, |
| "train.kitti.epochs": 1, |
| "domains": ["kitti", "r", "s"], |
| "train.kitti.batch_size": 2, |
| }, |
| {"__doc": "Depth Dada archi", "gen.d.architecture": "dada"}, |
| { |
| "__doc": "Depth Base archi", |
| "gen.d.architecture": "base", |
| "gen.m.use_dada": False, |
| "gen.s.use_dada": False, |
| }, |
| { |
| "__doc": "Depth Base Classification", |
| "gen.d.architecture": "base", |
| "gen.d.classify.enable": True, |
| "gen.m.use_dada": False, |
| "gen.s.use_dada": False, |
| }, |
| { |
| "__doc": "MSD Resnet V3+ backbone", |
| "gen.deeplabv3.backbone": "resnet", |
| }, |
| { |
| "__use_comet": False, |
| "__doc": "MSD SPADE 12 (without x)", |
| "__verbose": 1, |
| "gen.m.use_spade": True, |
| "gen.m.spade.cond_nc": 12, |
| }, |
| { |
| "__use_comet": False, |
| "__doc": "MSD SPADE 15 (with x)", |
| "__verbose": 1, |
| "gen.m.use_spade": True, |
| "gen.m.spade.cond_nc": 15, |
| }, |
| { |
| "__use_comet": False, |
| "__doc": "Painter With Diff Augment", |
| "__verbose": 1, |
| "domains": ["rf"], |
| "tasks": ["p"], |
| "gen.p.diff_aug.use": True, |
| }, |
| { |
| "__use_comet": False, |
| "__doc": "MSD DADA_s", |
| "__verbose": 1, |
| "gen.s.use_dada": True, |
| "gen.m.use_dada": False, |
| }, |
| { |
| "__use_comet": False, |
| "__doc": "MSD DADA_ms", |
| "__verbose": 1, |
| "gen.s.use_dada": True, |
| "gen.m.use_dada": True, |
| }, |
| ] |
|
|
| n_confs = len(test_scenarios) |
|
|
| fails = [] |
| successes = [] |
|
|
| |
| |
| |
|
|
| for test_idx, conf in enumerate(test_scenarios): |
| if test_idx in exclude or (include and test_idx not in include): |
| reason = ( |
| "because it is in exclude" |
| if test_idx in exclude |
| else "because it is not in include" |
| ) |
| print("Ignoring test", test_idx, reason) |
| continue |
|
|
| |
| test_opts = deepcopy(base_opts) |
| |
| set_conf(test_opts, conf) |
|
|
| |
| print_start( |
| f"[{test_idx}/{n_confs - 1}] " |
| + conf.get("__doc", "WARNING: no __doc for test scenario") |
| ) |
| print() |
|
|
| comet = conf.get("__use_comet", True) |
| pl4m = conf.get("__pl4m", False) |
| inference = conf.get("__inference", False) |
| verbose = conf.get("__verbose", 0) |
|
|
| |
| test_exp = None |
| if comet: |
| test_exp = global_exp |
|
|
| try: |
| |
| trainer = Trainer( |
| opts=test_opts, |
| verbose=verbose, |
| comet_exp=test_exp, |
| ) |
| trainer.functional_test_mode() |
|
|
| |
| if pl4m: |
| trainer.use_pl4m = True |
|
|
| |
| trainer.setup(inference=inference) |
| if not inference: |
| trainer.train() |
|
|
| successes.append(test_idx) |
| ok = True |
| except Exception as e: |
| print(e) |
| print(traceback.format_exc()) |
| fails.append(test_idx) |
| ok = False |
| finally: |
| print_end(ok=ok) |
|
|
| print_end(desc=" ----- Summary ----- ") |
| if len(fails) == 0: |
| print("•• All scenarios were successful") |
| else: |
| print(f"•• {len(successes)}/{len(test_scenarios)} successful tests") |
| print(f"•• Failed test indices: {', '.join(map(str, fails))}") |
|
|