Runner是MMdetection中的一种深度学习算法“工厂”,是对深度学习算法各个组件的“容器”。简单来说,所有的机器学习算法所包含的无非就是数据、模型、训练策略、评估、推理这五个部分。Runner就是将这五个部分组合在一起的工具。
Runner的源码封装在MMCV库当中,目前主要是有epoch_runner和iter_runner两种,本质上差不多,只是大家的习惯不同罢了。 MMDetection 默认采用 Epoch 。
runner = build_runner(
cfg.runner,
default_args=dict(
model=model,
optimizer=optimizer,
work_dir=cfg.work_dir,
logger=logger,
meta=meta))
#runner在配置文件中的设置举例
runner = dict(type='EpochBasedRunner', max_epochs=12)
这个地方有点绕,先通过runner_constructor = build_runner_constructor()实例化DefaultRunnerConstructor类,然后再通过runner = runner_constructor()调用DefaultRunnerConstructor类的__call__函数,然后调用build_from_cfg,实例化EpochBasedRunner
def build_runner(cfg, default_args=None):
runner_cfg = copy.deepcopy(cfg)
constructor_type = runner_cfg.pop('constructor',
'DefaultRunnerConstructor')
runner_constructor = build_runner_constructor(
dict(
type=constructor_type,
runner_cfg=runner_cfg,
default_args=default_args))
runner = runner_constructor()
return runner
class DefaultRunnerConstructor:
def __call__(self):
return RUNNERS.build(self.runner_cfg, default_args=self.default_args)
1、resume和load_checkpoint。对应加载断点文件和预训练模型。
2、save_checkpoint,保存断点,将由checkpointhook调用。
3、register_hook,负责注册hook类到self._hooks中
4、call_hook,调用hook类
5、train和val,训练和验证方法
6、run方法开启真正的工作流