Spaces:
Runtime error
Runtime error
| import sys | |
| import argparse | |
| import os | |
| import time | |
| import logging | |
| from datetime import datetime | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--config', required=True, help='path to config file') | |
| parser.add_argument('--gpu', default='0', help='GPU(s) to be used') | |
| parser.add_argument('--resume', default=None, help='path to the weights to be resumed') | |
| parser.add_argument( | |
| '--resume_weights_only', | |
| action='store_true', | |
| help='specify this argument to restore only the weights (w/o training states), e.g. --resume path/to/resume --resume_weights_only' | |
| ) | |
| group = parser.add_mutually_exclusive_group(required=True) | |
| group.add_argument('--train', action='store_true') | |
| group.add_argument('--validate', action='store_true') | |
| group.add_argument('--test', action='store_true') | |
| group.add_argument('--predict', action='store_true') | |
| # group.add_argument('--export', action='store_true') # TODO: a separate export action | |
| parser.add_argument('--exp_dir', default='./exp') | |
| parser.add_argument('--runs_dir', default='./runs') | |
| parser.add_argument('--verbose', action='store_true', help='if true, set logging level to DEBUG') | |
| args, extras = parser.parse_known_args() | |
| # set CUDA_VISIBLE_DEVICES then import pytorch-lightning | |
| os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' | |
| os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu | |
| n_gpus = len(args.gpu.split(',')) | |
| import datasets | |
| import systems | |
| import pytorch_lightning as pl | |
| from pytorch_lightning import Trainer | |
| from pytorch_lightning.callbacks import ModelCheckpoint, LearningRateMonitor | |
| from pytorch_lightning.loggers import TensorBoardLogger, CSVLogger | |
| from utils.callbacks import CodeSnapshotCallback, ConfigSnapshotCallback, CustomProgressBar | |
| from utils.misc import load_config | |
| # parse YAML config to OmegaConf | |
| config = load_config(args.config, cli_args=extras) | |
| config.cmd_args = vars(args) | |
| config.trial_name = config.get('trial_name') or (config.tag + datetime.now().strftime('@%Y%m%d-%H%M%S')) | |
| config.exp_dir = config.get('exp_dir') or os.path.join(args.exp_dir, config.name) | |
| config.save_dir = config.get('save_dir') or os.path.join(config.exp_dir, config.trial_name, 'save') | |
| config.ckpt_dir = config.get('ckpt_dir') or os.path.join(config.exp_dir, config.trial_name, 'ckpt') | |
| config.code_dir = config.get('code_dir') or os.path.join(config.exp_dir, config.trial_name, 'code') | |
| config.config_dir = config.get('config_dir') or os.path.join(config.exp_dir, config.trial_name, 'config') | |
| logger = logging.getLogger('pytorch_lightning') | |
| if args.verbose: | |
| logger.setLevel(logging.DEBUG) | |
| if 'seed' not in config: | |
| config.seed = int(time.time() * 1000) % 1000 | |
| pl.seed_everything(config.seed) | |
| dm = datasets.make(config.dataset.name, config.dataset) | |
| system = systems.make(config.system.name, config, load_from_checkpoint=None if not args.resume_weights_only else args.resume) | |
| callbacks = [] | |
| if args.train: | |
| callbacks += [ | |
| ModelCheckpoint( | |
| dirpath=config.ckpt_dir, | |
| **config.checkpoint | |
| ), | |
| LearningRateMonitor(logging_interval='step'), | |
| CodeSnapshotCallback( | |
| config.code_dir, use_version=False | |
| ), | |
| ConfigSnapshotCallback( | |
| config, config.config_dir, use_version=False | |
| ), | |
| CustomProgressBar(refresh_rate=1), | |
| ] | |
| loggers = [] | |
| if args.train: | |
| loggers += [ | |
| TensorBoardLogger(args.runs_dir, name=config.name, version=config.trial_name), | |
| CSVLogger(config.exp_dir, name=config.trial_name, version='csv_logs') | |
| ] | |
| if sys.platform == 'win32': | |
| # does not support multi-gpu on windows | |
| strategy = 'dp' | |
| assert n_gpus == 1 | |
| else: | |
| strategy = 'ddp_find_unused_parameters_false' | |
| trainer = Trainer( | |
| devices=n_gpus, | |
| accelerator='gpu', | |
| callbacks=callbacks, | |
| logger=loggers, | |
| strategy=strategy, | |
| **config.trainer | |
| ) | |
| if args.train: | |
| if args.resume and not args.resume_weights_only: | |
| # FIXME: different behavior in pytorch-lighting>1.9 ? | |
| trainer.fit(system, datamodule=dm, ckpt_path=args.resume) | |
| else: | |
| trainer.fit(system, datamodule=dm) | |
| trainer.test(system, datamodule=dm) | |
| elif args.validate: | |
| trainer.validate(system, datamodule=dm, ckpt_path=args.resume) | |
| elif args.test: | |
| trainer.test(system, datamodule=dm, ckpt_path=args.resume) | |
| elif args.predict: | |
| trainer.predict(system, datamodule=dm, ckpt_path=args.resume) | |
| if __name__ == '__main__': | |
| main() | |