def test_collect_env(): env_info = collect_env() assert env_info['PyTorch'] == torch.__version__ assert env_info['TorchVision'] == torchvision.__version__ assert env_info['OpenCV'] == cv2.__version__ assert env_info['MMCV'] == mmcv.__version__ assert env_info['MMPose'] == mmpose.__version__
def test_collect_env(): env_info = collect_env() target_keys = [ 'sys.platform', 'Python', 'CUDA available', 'GCC', 'PyTorch', 'PyTorch compiling details', 'TorchVision', 'OpenCV', 'MMCV', 'MMPose' ] cuda_available = torch.cuda.is_available() if cuda_available: cuda_keys = ['CUDA_HOME', 'NVCC'] devices = defaultdict(list) devices_dict = dict() for k in range(torch.cuda.device_count()): devices[torch.cuda.get_device_name(k)].append(str(k)) for name, devids in devices.items(): devices_dict['GPU ' + ','.join(devids)] = name cuda_keys.append('GPU ' + ','.join(devids)) target_keys.extend(cuda_keys) assert set(env_info.keys()) == set(target_keys) assert env_info['sys.platform'] == sys.platform assert env_info['Python'] == sys.version.replace('\n', '') assert env_info['CUDA available'] == cuda_available if cuda_available: assert env_info['CUDA_HOME'] == CUDA_HOME if CUDA_HOME is not None and osp.isdir(CUDA_HOME): try: nvcc = osp.join(CUDA_HOME, 'bin/nvcc') nvcc = subprocess.check_output( '"{}" -V | tail -n1'.format(nvcc), shell=True) nvcc = nvcc.decode('utf-8').strip() except subprocess.SubprocessError: nvcc = 'Not Available' assert env_info['NVCC'] == nvcc for k, v in devices_dict.items(): assert env_info[k] == v gcc = subprocess.check_output('gcc --version | head -n1', shell=True) gcc = gcc.decode('utf-8').strip() assert env_info['GCC'] == gcc assert env_info['PyTorch'] == torch.__version__ assert env_info['PyTorch compiling details'] == get_build_config() assert env_info['TorchVision'] == torchvision.__version__ assert env_info['OpenCV'] == cv2.__version__ assert env_info['MMCV'] == mmcv.__version__ assert env_info['MMPose'] == mmpose.__version__
def main(): args = parse_args() cfg = Config.fromfile(args.config) if args.options is not None: cfg.merge_from_dict(args.options) # set cudnn_benchmark if cfg.get('cudnn_benchmark', False): torch.backends.cudnn.benchmark = True # work_dir is determined in this priority: CLI > segment in file > filename if args.work_dir is not None: # update configs according to CLI args if args.work_dir is not None cfg.work_dir = args.work_dir elif cfg.get('work_dir', None) is None: # use config filename as default work_dir if cfg.work_dir is None cfg.work_dir = osp.join('./work_dirs', osp.splitext(osp.basename(args.config))[0]) if args.resume_from is not None: cfg.resume_from = args.resume_from if args.gpu_ids is not None: cfg.gpu_ids = args.gpu_ids else: cfg.gpu_ids = range(1) if args.gpus is None else range(args.gpus) if args.autoscale_lr: # apply the linear scaling rule (https://arxiv.org/abs/1706.02677) cfg.optimizer['lr'] = cfg.optimizer['lr'] * len(cfg.gpu_ids) / 8 # init distributed env first, since logger depends on the dist info. if args.launcher == 'none': distributed = False else: distributed = True init_dist(args.launcher, **cfg.dist_params) # create work_dir mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir)) # init the logger before other steps timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) log_file = osp.join(cfg.work_dir, f'{timestamp}.log') logger = get_root_logger(log_file=log_file, log_level=cfg.log_level) # init the meta dict to record some important information such as # environment info and seed, which will be logged meta = dict() # log env info env_info_dict = collect_env() env_info = '\n'.join([(f'{k}: {v}') for k, v in env_info_dict.items()]) dash_line = '-' * 60 + '\n' logger.info('Environment info:\n' + dash_line + env_info + '\n' + dash_line) meta['env_info'] = env_info # log some basic info logger.info(f'Distributed training: {distributed}') logger.info(f'Config:\n{cfg.pretty_text}') # set random seeds if args.seed is not None: logger.info(f'Set random seed to {args.seed}, ' f'deterministic: {args.deterministic}') set_random_seed(args.seed, deterministic=args.deterministic) cfg.seed = args.seed meta['seed'] = args.seed model = build_posenet(cfg.model) datasets = [build_dataset(cfg.data.train)] if len(cfg.workflow) == 2: val_dataset = copy.deepcopy(cfg.data.val) val_dataset.pipeline = cfg.data.train.pipeline datasets.append(build_dataset(val_dataset)) if cfg.checkpoint_config is not None: # save mmpose version, config file content # checkpoints as meta data cfg.checkpoint_config.meta = dict( mmpose_version=__version__ + get_git_hash(digits=7), config=cfg.pretty_text, ) train_model( model, datasets, cfg, distributed=distributed, validate=(not args.no_validate), timestamp=timestamp, meta=meta)