# dataset and dataloader transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) trainset = CIFAR10(root='data', train=True, download=True, transform=transform) trainloader = DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2) optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) logger = get_logger('mmcv') # runner is a scheduler to manage the training runner = EpochBasedRunner(model, optimizer=optimizer, work_dir='./work_dir', logger=logger, max_epochs=4) # learning rate scheduler config lr_config = dict(policy='step', step=[2, 3]) # configuration of optimizer optimizer_config = dict(grad_clip=None) # configuration of saving checkpoints periodically checkpoint_config = dict(interval=1) # save log periodically and multiple hooks can be used simultaneously log_config = dict(interval=100, hooks=[dict(type='TextLoggerHook')])
def test_eval_hook(): with pytest.raises(AssertionError): # `save_best` should be a str test_dataset = Model() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best=True) with pytest.raises(TypeError): # dataloader must be a pytorch DataLoader test_dataset = Model() data_loader = [DataLoader(test_dataset)] EvalHook(data_loader) with pytest.raises(ValueError): # key_indicator must be valid when rule_map is None test_dataset = ExampleDataset() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best='unsupport') with pytest.raises(KeyError): # rule must be in keys of rule_map test_dataset = Model() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best='auto', rule='unsupport') test_dataset = ExampleDataset() loader = DataLoader(test_dataset) model = Model() data_loader = DataLoader(test_dataset) eval_hook = EvalHook(data_loader, save_best=None) with tempfile.TemporaryDirectory() as tmpdir: # total_epochs = 1 logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 1) test_dataset.evaluate.assert_called_with( test_dataset, [torch.tensor([1])], logger=runner.logger) assert runner.meta is None or 'best_score' not in runner.meta[ 'hook_msgs'] assert runner.meta is None or 'best_ckpt' not in runner.meta[ 'hook_msgs'] # when `save_best` is set to 'auto', first metric will be used. loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, interval=1, save_best='auto') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best acc and corresponding epoch loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, interval=1, save_best='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best score and corresponding epoch data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook( data_loader, interval=1, save_best='score', rule='greater') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_score_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best score using less compare func # and indicate corresponding epoch data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, save_best='acc', rule='less') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_6.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == -3 # Test the EvalHook when resume happend data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, save_best='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 2) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_2.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 4 resume_from = osp.join(tmpdir, 'latest.pth') loader = DataLoader(ExampleDataset()) eval_hook = EvalHook(data_loader, save_best='acc') runner = EpochBasedRunner( model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.resume(resume_from) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath( ckpt_path) assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7
def test_precise_bn(): with pytest.raises(TypeError): # `data_loader` must be a Pytorch DataLoader test_dataset = ExampleModel() data_loader = DataLoader(test_dataset, batch_size=2, sampler=None, num_workers=0, shuffle=False) PreciseBNHook('data_loader') optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) test_dataset = ExampleDataset() loader = DataLoader(test_dataset, batch_size=2) model = ExampleModel() optimizer = build_optimizer(model, optimizer_cfg) data_loader = DataLoader(test_dataset, batch_size=2) precise_bn_loader = copy.deepcopy(data_loader) logger = get_logger('precise_bn') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) with pytest.raises(AssertionError): # num_iters should be no larget than total # iters precise_bn_hook = PreciseBNHook(precise_bn_loader, num_iters=5) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1) # test non-DDP model test_bigger_dataset = BiggerDataset() loader = DataLoader(test_bigger_dataset, batch_size=2) precise_bn_hook = PreciseBNHook(loader, num_iters=5) assert precise_bn_hook.num_iters == 5 assert precise_bn_hook.interval == 1 runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1) # test model w/ gn layer loader = DataLoader(test_bigger_dataset, batch_size=2) precise_bn_hook = PreciseBNHook(loader, num_iters=5) assert precise_bn_hook.num_iters == 5 assert precise_bn_hook.interval == 1 model = GNExampleModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1) # test model without bn layer loader = DataLoader(test_bigger_dataset, batch_size=2) precise_bn_hook = PreciseBNHook(loader, num_iters=5) assert precise_bn_hook.num_iters == 5 assert precise_bn_hook.interval == 1 model = NoBNExampleModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1) # test how precise it is loader = DataLoader(test_bigger_dataset, batch_size=2) precise_bn_hook = PreciseBNHook(loader, num_iters=6) # run all assert precise_bn_hook.num_iters == 6 assert precise_bn_hook.interval == 1 model = SingleBNModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1) imgs_list = list() for _, data in enumerate(loader): imgs_list.append(np.array(data['imgs'])) mean = np.mean([np.mean(batch) for batch in imgs_list]) # bassel correction used in Pytorch, therefore ddof=1 var = np.mean([np.var(batch, ddof=1) for batch in imgs_list]) assert np.equal(mean, np.array(model.bn.running_mean)) assert np.equal(var, np.array(model.bn.running_var)) @pytest.mark.skipif(not torch.cuda.is_available(), reason='requires CUDA support') def test_ddp_model_precise_bn(): # test DDP model test_bigger_dataset = BiggerDataset() loader = DataLoader(test_bigger_dataset, batch_size=2) precise_bn_hook = PreciseBNHook(loader, num_iters=5) assert precise_bn_hook.num_iters == 5 assert precise_bn_hook.interval == 1 model = ExampleModel() model = MMDistributedDataParallel( model.cuda(), device_ids=[torch.cuda.current_device()], broadcast_buffers=False, find_unused_parameters=True) runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)], 1)
def get_root_logger(log_file=None, log_level=logging.INFO): return get_logger('qdtrack', log_file, log_level)
def test_eval_hook(): with pytest.raises(TypeError): # dataloader must be a pytorch DataLoader test_dataset = ExampleModel() data_loader = [ DataLoader(test_dataset, batch_size=1, sampler=None, num_worker=0, shuffle=False) ] EvalHook(data_loader) with pytest.raises(ValueError): # when `save_best` is True, `key_indicator` should not be None test_dataset = ExampleModel() data_loader = DataLoader(test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) EvalHook(data_loader, key_indicator=None) with pytest.raises(KeyError): # rule must be in keys of rule_map test_dataset = ExampleModel() data_loader = DataLoader(test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) EvalHook(data_loader, save_best=False, rule='unsupport') with pytest.raises(ValueError): # key_indicator must be valid when rule_map is None test_dataset = ExampleModel() data_loader = DataLoader(test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) EvalHook(data_loader, key_indicator='unsupport') optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) test_dataset = ExampleDataset() loader = DataLoader(test_dataset, batch_size=1) model = ExampleModel() optimizer = build_optimizer(model, optimizer_cfg) data_loader = DataLoader(test_dataset, batch_size=1) eval_hook = EvalHook(data_loader, save_best=False) with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 1) test_dataset.evaluate.assert_called_with(test_dataset, [torch.tensor([1])], logger=runner.logger) best_json_path = osp.join(tmpdir, 'best.json') assert not osp.exists(best_json_path) loader = DataLoader(EvalDataset(), batch_size=1) model = ExampleModel() data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHook(data_loader, interval=1, save_best=True, key_indicator='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) best_json_path = osp.join(tmpdir, 'best.json') best_json = mmcv.load(best_json_path) real_path = osp.join(tmpdir, 'epoch_4.pth') assert best_json['best_ckpt'] == osp.realpath(real_path) assert best_json['best_score'] == 7 assert best_json['key_indicator'] == 'acc' data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHook(data_loader, interval=1, save_best=True, key_indicator='score', rule='greater') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) best_json_path = osp.join(tmpdir, 'best.json') best_json = mmcv.load(best_json_path) real_path = osp.join(tmpdir, 'epoch_4.pth') assert best_json['best_ckpt'] == osp.realpath(real_path) assert best_json['best_score'] == 7 assert best_json['key_indicator'] == 'score' data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHook(data_loader, rule='less', key_indicator='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) best_json_path = osp.join(tmpdir, 'best.json') best_json = mmcv.load(best_json_path) real_path = osp.join(tmpdir, 'epoch_6.pth') assert best_json['best_ckpt'] == osp.realpath(real_path) assert best_json['best_score'] == -3 assert best_json['key_indicator'] == 'acc' data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHook(data_loader, key_indicator='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 2) best_json_path = osp.join(tmpdir, 'best.json') best_json = mmcv.load(best_json_path) real_path = osp.join(tmpdir, 'epoch_2.pth') assert best_json['best_ckpt'] == osp.realpath(real_path) assert best_json['best_score'] == 4 assert best_json['key_indicator'] == 'acc' resume_from = osp.join(tmpdir, 'latest.pth') loader = DataLoader(ExampleDataset(), batch_size=1) eval_hook = EvalHook(data_loader, key_indicator='acc') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.resume(resume_from) runner.run([loader], [('train', 1)], 8) best_json_path = osp.join(tmpdir, 'best.json') best_json = mmcv.load(best_json_path) real_path = osp.join(tmpdir, 'epoch_4.pth') assert best_json['best_ckpt'] == osp.realpath(real_path) assert best_json['best_score'] == 7 assert best_json['key_indicator'] == 'acc'
def test_eval_hook(EvalHookCls): with pytest.raises(TypeError): # dataloader must be a pytorch DataLoader test_dataset = ExampleDataset() data_loader = [ DataLoader(test_dataset, batch_size=1, sampler=None, num_worker=0, shuffle=False) ] EvalHookCls(data_loader) with pytest.raises(KeyError): # rule must be in keys of rule_map test_dataset = ExampleDataset() data_loader = DataLoader(test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) EvalHookCls(data_loader, save_best='auto', rule='unsupport') with pytest.raises(ValueError): # key_indicator must be valid when rule_map is None test_dataset = ExampleDataset() data_loader = DataLoader(test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) EvalHookCls(data_loader, save_best='unsupport') optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) test_dataset = ExampleDataset() loader = DataLoader(test_dataset, batch_size=1) model = ExampleModel() optimizer = build_optimizer(model, optimizer_cfg) data_loader = DataLoader(test_dataset, batch_size=1) eval_hook = EvalHookCls(data_loader, save_best=None) with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 1) assert runner.meta is None or 'best_score' not in runner.meta[ 'hook_msgs'] assert runner.meta is None or 'best_ckpt' not in runner.meta[ 'hook_msgs'] # when `save_best` is set to 'auto', first metric will be used. loader = DataLoader(EvalDataset(), batch_size=1) model = ExampleModel() data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, interval=1, save_best='auto') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.7 loader = DataLoader(EvalDataset(), batch_size=1) model = ExampleModel() data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, interval=1, save_best='mAP') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.7 data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, interval=1, save_best='score', rule='greater') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) real_path = osp.join(tmpdir, 'best_score_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.7 data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, save_best='mAP', rule='less') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) real_path = osp.join(tmpdir, 'best_mAP_epoch_6.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.05 data_loader = DataLoader(EvalDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, save_best='mAP') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 2) real_path = osp.join(tmpdir, 'best_mAP_epoch_2.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.4 resume_from = osp.join(tmpdir, 'latest.pth') loader = DataLoader(ExampleDataset(), batch_size=1) eval_hook = EvalHookCls(data_loader, save_best='mAP') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.resume(resume_from) runner.run([loader], [('train', 1)], 8) real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) assert runner.meta['hook_msgs']['best_score'] == 0.7
def test_precise_bn(): optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) test_dataset = ExampleDataset() loader = DataLoader(test_dataset, batch_size=2) model = ExampleModel() optimizer = build_optimizer(model, optimizer_cfg) logger = get_logger('precise_bn') runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) with pytest.raises(AssertionError): # num_samples must be larger than 0 precise_bn_hook = PreciseBNHook(num_samples=-1) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)]) with pytest.raises(AssertionError): # interval must be larger than 0 precise_bn_hook = PreciseBNHook(interval=0) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)]) with pytest.raises(AssertionError): # interval must be larger than 0 runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) precise_bn_hook = PreciseBNHook(interval=0) runner.register_hook(precise_bn_hook) runner.run([loader], [('train', 1)]) with pytest.raises(AssertionError): # only support EpochBaseRunner runner = IterBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) precise_bn_hook = PreciseBNHook(interval=2) runner.register_hook(precise_bn_hook) print_log(runner) runner.run([loader], [('train', 1)]) # test non-DDP model test_bigger_dataset = BiggerDataset() loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=4) assert precise_bn_hook.num_samples == 4 assert precise_bn_hook.interval == 1 runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)]) # test DP model test_bigger_dataset = BiggerDataset() loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=4) assert precise_bn_hook.num_samples == 4 assert precise_bn_hook.interval == 1 model = MMDataParallel(model) runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)]) # test model w/ gn layer loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=4) assert precise_bn_hook.num_samples == 4 assert precise_bn_hook.interval == 1 model = GNExampleModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)]) # test model without bn layer loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=4) assert precise_bn_hook.num_samples == 4 assert precise_bn_hook.interval == 1 model = NoBNExampleModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)]) # test how precise it is loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=12) assert precise_bn_hook.num_samples == 12 assert precise_bn_hook.interval == 1 model = SingleBNModel() runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)]) imgs_list = list() for loader in loaders: for i, data in enumerate(loader): imgs_list.append(np.array(data['imgs'])) mean = np.mean([np.mean(batch) for batch in imgs_list]) # bassel correction used in Pytorch, therefore ddof=1 var = np.mean([np.var(batch, ddof=1) for batch in imgs_list]) assert np.equal(mean, np.array( model.bn.running_mean)), (mean, np.array(model.bn.running_mean)) assert np.equal(var, np.array( model.bn.running_var)), (var, np.array(model.bn.running_var)) @pytest.mark.skipif(not torch.cuda.is_available(), reason='requires CUDA support') def test_ddp_model_precise_bn(): # test DDP model test_bigger_dataset = BiggerDataset() loader = DataLoader(test_bigger_dataset, batch_size=2) loaders = [loader] precise_bn_hook = PreciseBNHook(num_samples=5) assert precise_bn_hook.num_samples == 5 assert precise_bn_hook.interval == 1 model = ExampleModel() model = MMDistributedDataParallel( model.cuda(), device_ids=[torch.cuda.current_device()], broadcast_buffers=False, find_unused_parameters=True) runner = EpochBasedRunner(model=model, batch_processor=None, optimizer=optimizer, logger=logger, max_epochs=1) runner.register_hook(precise_bn_hook) runner.run(loaders, [('train', 1)])
def test_eval_hook(): with pytest.raises(AssertionError): # `save_best` should be a str test_dataset = Model() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best=True) with pytest.raises(TypeError): # dataloader must be a pytorch DataLoader test_dataset = Model() data_loader = [DataLoader(test_dataset)] EvalHook(data_loader) with pytest.raises(ValueError): # key_indicator must be valid when rule_map is None test_dataset = ExampleDataset() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best='unsupport') with pytest.raises(KeyError): # rule must be in keys of rule_map test_dataset = ExampleDataset() data_loader = DataLoader(test_dataset) EvalHook(data_loader, save_best='auto', rule='unsupport') # if eval_res is an empty dict, print a warning information with pytest.warns(UserWarning) as record_warnings: class _EvalDataset(ExampleDataset): def evaluate(self, results, logger=None): return {} test_dataset = _EvalDataset() data_loader = DataLoader(test_dataset) eval_hook = EvalHook(data_loader, save_best='auto') runner = _build_epoch_runner() runner.register_hook(eval_hook) runner.run([data_loader], [('train', 1)], 1) # Since there will be many warnings thrown, we just need to check if the # expected exceptions are thrown expected_message = ('Since `eval_res` is an empty dict, the behavior to ' 'save the best checkpoint will be skipped in this ' 'evaluation.') for warning in record_warnings: if str(warning.message) == expected_message: break else: assert False test_dataset = ExampleDataset() loader = DataLoader(test_dataset) model = Model() data_loader = DataLoader(test_dataset) eval_hook = EvalHook(data_loader, save_best=None) with tempfile.TemporaryDirectory() as tmpdir: # total_epochs = 1 logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 1) test_dataset.evaluate.assert_called_with( test_dataset, [torch.tensor([1])], logger=runner.logger) assert runner.meta is None or 'best_score' not in runner.meta[ 'hook_msgs'] assert runner.meta is None or 'best_ckpt' not in runner.meta[ 'hook_msgs'] # when `save_best` is set to 'auto', first metric will be used. loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, interval=1, save_best='auto') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best acc and corresponding epoch loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, interval=1, save_best='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best loss_top and corresponding epoch loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, interval=1, save_best='loss_top') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_loss_top_epoch_6.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == -3 # total_epochs = 8, return the best score and corresponding epoch data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook( data_loader, interval=1, save_best='score', rule='greater') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_score_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 # total_epochs = 8, return the best score using less compare func # and indicate corresponding epoch data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, save_best='acc', rule='less') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_6.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == -3 # Test the EvalHook when resume happened data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook(data_loader, save_best='acc') with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 2) old_ckpt_path = osp.join(tmpdir, 'best_acc_epoch_2.pth') assert runner.meta['hook_msgs']['best_ckpt'] == old_ckpt_path assert osp.exists(old_ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 4 resume_from = old_ckpt_path loader = DataLoader(ExampleDataset()) eval_hook = EvalHook(data_loader, save_best='acc') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.resume(resume_from) assert runner.meta['hook_msgs']['best_ckpt'] == old_ckpt_path assert osp.exists(old_ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 4 runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_4.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == 7 assert not osp.exists(old_ckpt_path) # test EvalHook with customer test_fn and greater/less keys loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) eval_hook = EvalHook( data_loader, save_best='acc', test_fn=mock.MagicMock(return_value={}), greater_keys=[], less_keys=['acc']) with tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) ckpt_path = osp.join(tmpdir, 'best_acc_epoch_6.pth') assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert osp.exists(ckpt_path) assert runner.meta['hook_msgs']['best_score'] == -3 # test EvalHook with specified `out_dir` loader = DataLoader(EvalDataset()) model = Model() data_loader = DataLoader(EvalDataset()) out_dir = 's3://user/data' eval_hook = EvalHook( data_loader, interval=1, save_best='auto', out_dir=out_dir) with patch.object(PetrelBackend, 'put') as mock_put, \ patch.object(PetrelBackend, 'remove') as mock_remove, \ patch.object(PetrelBackend, 'isfile') as mock_isfile, \ tempfile.TemporaryDirectory() as tmpdir: logger = get_logger('test_eval') runner = EpochBasedRunner(model=model, work_dir=tmpdir, logger=logger) runner.register_checkpoint_hook(dict(interval=1)) runner.register_hook(eval_hook) runner.run([loader], [('train', 1)], 8) basename = osp.basename(runner.work_dir.rstrip(osp.sep)) ckpt_path = f'{out_dir}/{basename}/best_acc_epoch_4.pth' assert runner.meta['hook_msgs']['best_ckpt'] == ckpt_path assert runner.meta['hook_msgs']['best_score'] == 7 assert mock_put.call_count == 3 assert mock_remove.call_count == 2 assert mock_isfile.call_count == 2
def get_root_logger(log_file=None, log_level=logging.INFO): return get_logger('mmcls', log_file, log_level)
def get_root_logger(log_file=None, log_level=logging.INFO): logger = get_logger(name='mmdet', log_file=log_file, log_level=log_level) return logger
def main(): args = parse_args() # setup logger logger = get_logger(name='mmdet', log_file=args.out) # setup https_proxy if args.https_proxy: os.environ['https_proxy'] = args.https_proxy # setup http_session http_session = requests.Session() for resource_prefix in ('http://', 'https://'): http_session.mount( resource_prefix, requests.adapters.HTTPAdapter(max_retries=5, pool_connections=20, pool_maxsize=args.num_threads), ) logger.info('Finding all markdown files in the current directory...') project_root = (pathlib.Path(__file__).parent / '..').resolve() markdown_files = project_root.glob('**/*.md') all_matches = set() url_regex = re.compile(r'\[([^!][^\]]+)\]\(([^)(]+)\)') for markdown_file in markdown_files: with open(markdown_file) as handle: for line in handle.readlines(): matches = url_regex.findall(line) for name, link in matches: if 'localhost' not in link: all_matches.add( MatchTuple(source=str(markdown_file), name=name, link=link)) logger.info(f' {len(all_matches)} markdown files found') logger.info('Checking to make sure we can retrieve each link...') with Pool(processes=args.num_threads) as pool: results = pool.starmap(check_link, [(match, http_session, logger) for match in list(all_matches)]) # collect unreachable results unreachable_results = [(match_tuple, reason) for match_tuple, success, reason in results if not success] if unreachable_results: logger.info('================================================') logger.info(f'Unreachable links ({len(unreachable_results)}):') for match_tuple, reason in unreachable_results: logger.info(' > Source: ' + match_tuple.source) logger.info(' Name: ' + match_tuple.name) logger.info(' Link: ' + match_tuple.link) if reason is not None: logger.info(' Reason: ' + reason) sys.exit(1) logger.info('No Unreachable link found.')