人工智能|【金猿技术展】模块注册机制——打造AI算法流水线

人工智能|【金猿技术展】模块注册机制——打造AI算法流水线
文章插图

模块注册机制基于注册器和构建器,可以轻松地进行模块拓展,而不需要在原有框架代码中进行改动。使用注册器管理字符串到类的映射,其中支持注册的模块类型包括但不限于模型结构、数据预处理模块、优化器。使用构建器可以将配置文件转换成对应的模块,其提供了灵活的构建方式,使得可以构建定制化的训练流水线。模块注册机制的另一特性是采用分层策略划分模块的注册域,不仅能够避免跨项目间同名模块的冲突,也能够支持跨项目间模块的相互调用。
技术说明
模块注册和跨项目调用机制
开发算法工具库以解决人工智能基础理论知识与商用业务落地工程经验间脱节的问题。OpenMMLab基于在学术研究和行业落地的经验,对 AI算法进行标准化模块工具开发,大大降低具体行业业务人员的算法学习成本,将以工业化的人工智能研究颠覆传统手工作坊式的研究方式,提供先进的研发工具,使人工智能研究进入快车道。
算法核心组件作为开放算法体系的基础,为算法提供公共的架构支持和模块实现。核心组件主要分为三个部分:基础支持库、通用算子和训练流程框架。基础支持库提供了友好的文件读写接口、图像视频处理接口、基础工具库等,通用算子提供了常用算子的高效的 GPU 实现,训练流程框架提供了通用的算法训练流程支持,使得体系内的算法能够在相同的架构中进行训练。
在 OpenMMLab 开源算法体系的整体架构中,突出两个特点:模块化和简洁化。模块化让用户可以更灵活地进行排列组合,以及开发新的方法和模块;简洁化让用户不用过多关注和核心逻辑无关的事情,将辅助功能交由框架自行处理。
OpenMMLab 开源算法体系通过配置文件、注册器和构建器实现模块化的基础支持,然后在模块层面将数据、模型等进行拆解和抽象,进行模块化的实现,在最顶层通过执行器来实现流程的简洁化。
人工智能|【金猿技术展】模块注册机制——打造AI算法流水线
文章插图
注册器提供了在不修改算法框架核心代码的前提下进行模块拓展的能力。通过管理字符串到类的映射,可以实现从配置文件直接构建模块。在开放算法体系中,不论是模型结构,数据预处理组件,还是优化器,甚至顶层的训练流程,都是通过这种方式来构建的,给用户提供了极大的拓展空间。
人工智能|【金猿技术展】模块注册机制——打造AI算法流水线
文章插图
图2-2 MMCV 中注册器的构建机制
基于注册器和构建器,可以轻松地进行模块拓展,而不需要在原有框架代码中进行改动,这也是OpenMMLab 推荐的进行算法开发的流程。
在 OpenMMLab 中,Registry 类可以提供一种完全相似的对外装饰函数来管理构建不同的组件,例如 backbones、head 和 necks 等等,Registry 类内部维护的是一个全局 key-value 对。通过 Registry 类,用户可以通过字符串方式实例化任何想要的模块。例如在 Faster R-CNN 的 backbone 模块实例化时,可以采用如下配置:
backbone=dict(type='ResNet', # 待实例化的类名depth=50, # 后面的都是对于的类初始化参数num_stages=4,out_indices=(0, 1, 2, 3),frozen_stages=1,norm_cfg=dict(type='BN', requires_grad=True),norm_eval=True,style='pytorch'),Registry 类最大好处是:解耦性强、可扩展性强,代码更易理解。
回到 Registry 类本身,有如下几种用法:
# 0. 先构建一个全局的 CATS 注册器类CATS = mmcv.Registry('cat')# 通过装饰器方式作用在想要加入注册器的具体类中# 1. 不需要传入任何参数,此时默认实例化的配置字符串是 str (类名)@CATS.register_module()class BritishShorthair:pass# 类实例化CATS.get('BritishShorthair')(**args)# 2.传入指定 str,实例化时候只需要传入对应相同 str 即可@CATS.register_module(name='Siamese')class SiameseCat:pass# 类实例化CATS.get('Siamese')(**args)# 3.如果出现同名 Registry Key,可以选择报错或者强制覆盖# 如果指定了 force=True,那么不会报错# 此时 Registry 的 Key 中,Siamese2Cat 类会覆盖 SiameseCat 类# 否则会报错@CATS.register_module(name='Siamese',force=True)class Siamese2Cat:pass# 类实例化CATS.get('Siamese')(**args)# 4. 可以直接注册类class Munchkin:passCATS.register_module(Munchkin)# 类实例化CATS.get('Munchkin')(**args)目前 Registry 类一共有4种用法,方便不同场景下注册。