当前位置: 首页 > news >正文

深度学习-mmcv中build_runner实例化全流程详解

1、实例化的例子

#运行的类型是IterBasedRunne
runner = dict(
type="IterBasedRunner",
max_iters=num_iters_per_epoch * num_epochs,
)
#实例化运行器,会返回一个IterBasedRunner的实例化对象
runner = build_runner(cfg.runner,default_args=dict(model=model,optimizer=optimizer,work_dir=cfg.work_dir,logger=logger,meta=meta,),
)

2、实例化的完整调用流程及关键注释
~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/builder.py:

#调用~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/utils/registry.py中的Registry类,实例化注册器,'runner'、'runner builder'对应__init__的形参name
RUNNERS = Registry('runner')
RUNNER_BUILDERS = Registry('runner builder')def build_runner_constructor(cfg: dict):#实例化~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/default_constructor.py中的DefaultRunnerConstructorreturn RUNNER_BUILDERS.build(cfg)def build_runner(cfg: dict, default_args: Optional[dict] = None):runner_cfg = copy.deepcopy(cfg)#参数配置文件中没提供'constructor',这里采用默认运行构造器'DefaultRunnerConstructor'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()#调用构造器的__call__()方法return runner

~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/default_constructor.py

导入~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/builder.py中的RUNNER_BUILDERS, RUNNERS
from .builder import RUNNER_BUILDERS, RUNNERS@RUNNER_BUILDERS.register_module()
class DefaultRunnerConstructor:def __init__(self, runner_cfg: dict, default_args: Optional[dict] = None):if not isinstance(runner_cfg, dict):raise TypeError('runner_cfg should be a dict',f'but got {type(runner_cfg)}')self.runner_cfg = runner_cfgself.default_args = default_args#~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/builder.py中的runner = runner_constructor()会调用__call__因为self.runner_cfg中的type为IterBasedRunner,所以会实例化~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/iter_based_runner.py中的class IterBasedRunner(BaseRunner):def __call__(self):return RUNNERS.build(self.runner_cfg, default_args=self.default_args)

~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/iter_based_runner.py:

@RUNNERS.register_module()
#继承父类的__init__
class IterBasedRunner(BaseRunner):

~/anaconda3/envs/sparsedrive/lib/python3.7/site-packages/mmcv/runner/base_runner.py:

class BaseRunner(metaclass=ABCMeta):def __init__(self,model: torch.nn.Module,batch_processor: Optional[Callable] = None,optimizer: Union[Dict, torch.optim.Optimizer, None] = None,work_dir: Optional[str] = None,logger: Optional[logging.Logger] = None,meta: Optional[Dict] = None,max_iters: Optional[int] = None,max_epochs: Optional[int] = None) -> None:if batch_processor is not None:if not callable(batch_processor):raise TypeError('batch_processor must be callable, 'f'but got {type(batch_processor)}')warnings.warn('batch_processor is deprecated, please implement ''train_step() and val_step() in the model instead.',DeprecationWarning)# raise an error is `batch_processor` is not None and# `model.train_step()` exists.if is_module_wrapper(model):_model = model.moduleelse:_model = modelif hasattr(_model, 'train_step') or hasattr(_model, 'val_step'):raise RuntimeError('batch_processor and model.train_step()/model.val_step() ''cannot be both available.')else:assert hasattr(model, 'train_step')# check the type of `optimizer`if isinstance(optimizer, dict):for name, optim in optimizer.items():if not isinstance(optim, Optimizer):raise TypeError(f'optimizer must be a dict of torch.optim.Optimizers, 'f'but optimizer["{name}"] is a {type(optim)}')elif not isinstance(optimizer, Optimizer) and optimizer is not None:raise TypeError(f'optimizer must be a torch.optim.Optimizer object 'f'or dict or None, but got {type(optimizer)}')# check the type of `logger`if not isinstance(logger, logging.Logger):raise TypeError(f'logger must be a logging.Logger object, 'f'but got {type(logger)}')# check the type of `meta`if meta is not None and not isinstance(meta, dict):raise TypeError(f'meta must be a dict or None, but got {type(meta)}')self.model = modelself.batch_processor = batch_processorself.optimizer = optimizerself.logger = loggerself.meta = meta# create work_dirif isinstance(work_dir, str):self.work_dir: Optional[str] = osp.abspath(work_dir)mmcv.mkdir_or_exist(self.work_dir)elif work_dir is None:self.work_dir = Noneelse:raise TypeError('"work_dir" must be a str or None')# get model name from the model classif hasattr(self.model, 'module'):self._model_name = self.model.module.__class__.__name__else:self._model_name = self.model.__class__.__name__self._rank, self._world_size = get_dist_info()self.timestamp = get_time_str()self.mode: Optional[str] = Noneself._hooks: List[Hook] = []self._epoch = 0self._iter = 0self._inner_iter = 0if max_epochs is not None and max_iters is not None:raise ValueError('Only one of `max_epochs` or `max_iters` can be set.')self._max_epochs = max_epochsself._max_iters = max_iters# TODO: Redesign LogBuffer, it is not flexible and elegant enoughself.log_buffer = LogBuffer()

相关文章:

  • 985,成立人工智能学院
  • T008-网络管理常用命令:ping,ipconfig,nslookup,route,netstat
  • upload-labs靶场通关详解:第12-13关
  • Leetcode百题斩-字典树
  • 如何在WordPress网站上添加即时聊天功能
  • 深度学习实战 04:卷积神经网络之 VGG16 复现三(训练)
  • docker 安装 Nacos
  • Linux下Docker使用阿里云镜像加速器
  • 在 JavaScript 中正确使用 Elasticsearch,第二部分
  • scNiche识别空间组细胞微环境
  • Index-AniSora模型论文速读:基于人工反馈的动漫视频生成
  • 系统思考:团队策略辅导
  • 02 if...else,switch,do..while,continue,break
  • List更简洁的编码构建
  • 基于C#的Modbus通信协议全面解析与实现指南
  • CSS 背景全解析:从基础属性到视觉魔法
  • Qt文件:XML文件
  • 使用 adb 命令截取 Android 设备的屏幕截图
  • CI/CD的演进之路
  • SpringBoot-4-Spring Boot项目配置文件和日志配置
  • 国台办:不管台湾地区领导人讲什么,都改变不了台湾是中国一部分的地位和事实
  • 竞彩湃|水晶宫夺冠后乘胜追击,四大皆空曼城人间清醒?
  • 出生于1991年,石秀清拟提名为铜陵市辖县(区)政府副县(区)长人选
  • 多家国有大行存款利率即将迎来新一轮下调
  • 交响4K修复版《神女》昨晚上演,观众听到了阮玲玉的声音
  • 玉林一河段出现十年最大洪水,一村民被冲走遇难