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

从 MMCV 到 MMEngine,架构升级,体验升级!

MMCV 作为深度学习基础框架的先驱,一经开源就受到了社区同学的广泛关注。然而随着深度学习任务的需求变得越来越多样化,MMCV 早期的架构设计也开始难以满足日益复杂的需求。因此 OpenMMLab 2.0 发布了新一代训练架构 MMEngine,以统一的执行引擎,灵活支持了 20 个以上的计算机视觉任务。

https://github.com/open-mmlab/mmengine​github.com/open-mmlab/mmengine

如果你刚入坑深度学习,还在苦恼于如何管理实验数据,搭建实验框架,不妨试一试 MMEngine,用最少的代码体验最丰富的功能。

如果你已经使用过 MMCV,我们强烈推荐你升级使用 MMEngine。我们广泛收集了 MMCV 开源以来,大家在使用过程中遇到的问题,并在 MMEngine 中一一解决优化。

啊,怕迁移太麻烦?不用怕,MMEngine 同样提供了详尽的迁移文档,能够让大家无痛迁移。 不少小伙伴们吐槽过 MMCV 的文档过于简单,介绍不全等,MMEngine 痛定思痛,提供了超级详细的教程文档和 API 文档,助力大家快速上手 MMEngine!欢迎大家阅读交流,给出宝贵的意见。

用户文档链接:

​欢迎来到 mmengine 的中文文档! — mmengine 0.1.0 文档

小至 typo,大至文档内容和结构,欢迎小伙伴们提出宝贵意见!如果文档中有代码示例跑不通,欢迎随时在 issue 中反馈。

更加强大的 Runner

  1. 功能更全面!Runner is all you need!配置 Runner 等于配置了整个训练流程

  2. 搭配更灵活!数据集和评测指标能够自由搭配,优化流程更加灵活

  3. 使用更简单!构造 Runner,调用 Runner 就能完成训练验证和测试 使用 MMEngine 的 Runner,我们可以用不到 80 行代码训练 CIFAR10。

​15 分钟上手 MMEngine — mmengine 0.1.0 文档

我们既可以通过构建好的实例去初始化 Runner,也能通过配置文件初始化 Runner,乐高式的构建流程让你的深度学习任务更加灵活。

执行器(Runner) — mmengine 0.1.0 文档

更加丰富的 Hook 点位

MMEngine 归纳总结了 MMCV 开发过程中,社区同学、下游仓库提出的各种意见,重新设计了 Runner 的训练/验证/测试流程和 Hook 点位。

基于新的 Hook 设计,我们可以在训练、测试、验证前后,加载权重前后做一些自定义的操作,让 Hook 的功能更加丰富,此外 Hook 的各个点位也会接受更多参数,让我们能够在 Hook 中更加灵活的实现功能。

更加统一的模型

当你基于 MMCV 开发项目时:

  • 是否苦恼于不知道应该实现模型的哪些接口?

  • 是否疑惑于模型接口的标准是什么,怎么实现接口才符合设计规范?

  • 是否疲于 ctrl c ctrl v 拷贝模型通用的功能代码?

赶快来体验 MMEngine 吧!BaseModel 提供了模型的通用接口,也约定了每个接口的规范,让自定义模型继承 BaseModel,并且按照接口规范去实现模型,相信会有更加流畅的开发体验!

如下图所示,模型的输入输出需要满足数据加载器、评测器、优化器封装的接口约定,因此 BaseModel 定义了 model 和各个模块之间的接口规范:

模型和各个模块之间具体的数据流详见用户文档:

模型(Model) — mmengine 0.1.0 文档

更加通用的优化器封装

如果你之前使用 MMCV 开发自己的项目,会发现要想开启混合精度训练,需要同时配置多个模块,例如给模型设置 fp16_enabled 、启用 Fp16OptimizerHook,还需要给模型的各个接口加上类似 auto_fp16 的装饰器,少写一处都会无法顺利开启混合精度训练。

如果你是 MMGeneration、MMEditing 的用户,并且对 MMDetection 或 MMClassification 等算法库有着一定了解,可能会抱怨,为啥我不能在 MMGeneration 中使用 MMCV 里实现的各种各样的 OptimizerHook 呢,还需要在模型代码里实现混合精度训练、梯度累加等逻辑。

MMEngine 的优化器封装(OptimWrapper )解决了上述问题:

MMEngine 同样提供了 OptimWrapper 的详细图文攻略,包你无痛上手!

优化器封装(OptimWrapper) — mmengine 0.1.0 文档

更加灵活的参数调度器:scheduler

MMCV-1.x、PyTorch 里实现了的调度器,MMEngine 全都有(不仅支持学习率调整,也支持动量调整)

不仅如此,MMEnine 实现的调度器还支持调度器之间的自由组合。

更加灵活的模型精度评测

在模型验证和模型测试中,通常需要对模型精度做定量评测。在 OpenMMLab 1.0 中,模型的精度验证是和 dataset 绑定的,这就对切换评测指标带来了困难。

因此,我们在 MMEngine 中实现了评测指标(Metric)和评测器(Evaluator)模块来完成模型评测,实现评测过程和数据集类的解耦。

  • Metric:负责实现根据测试数据和模型预测结果,完成模型特定精度指标的计算。

  • Evaluator: 类则位于 Metric 的上层,为 Metric 提供格式转换以及分布式通信的支持。

如下图所示,同一个 Evaluator 可以包含多个 Metric,使用不同的评价指标来评估模型。

看到这你或许会疑惑,Runner、Hook 这些核心组件都在 MMEngine 里实现了,那 MMCV 还有啥嘞?架构升级后,我们还能用 MMCV 做哪些事情?

在回答这个问题之前,大家不妨思考一下,OpenMMLab 的算法库里,哪个模块的代码重复率很高?没有错!那就是数据变换(pipeline)。

MMCV 2.0 归纳总结了各个算法数据变换方向的需求,实现了一系列功能强大的数据变换。除此之外,MMCV 也会有一些模块增删,下一期我们就来具体聊聊架构升级后的 MMCV,敬请期待~

GitHub - open-mmlab/mmengine: OpenMMLab Foundational Library for Training Deep Learning Models

相关文章:

  • linux内存重映射的概念及对内核虚拟地址的重映射方法分析
  • 糟了,线上服务出现OOM了
  • centos的目录说明
  • 【Verilog】10.10练习题——Verilog语法知识点补充 和 一些注意点
  • Hive表删除数据不支持使用Delete From...
  • 数据库-进阶-存储引擎
  • LeetCode题目笔记——459. 重复的子字符串,python从700ms到60ms
  • C++ | 12天学好C++ (Day 12)->结构图可视化、代码加通俗理解
  • 【深入理解Kafka系列】第五章 日志存储
  • 想做好数据可视化?手把手教你正确选择图表类型
  • C#【高级篇】 IntPtr是什么?怎么用?
  • 软考知识点---01计算机的基本组成---02存储系统
  • Day09JavaWeb第九次笔记---Request和Response学习
  • 第三章 Flink基础理论之内存优化及常见内存报错解决方案
  • 分数阶粒子群算法-附代码
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • axios 和 cookie 的那些事
  • DataBase in Android
  • Java-详解HashMap
  • mongodb--安装和初步使用教程
  • mysql中InnoDB引擎中页的概念
  • Python 反序列化安全问题(二)
  • SpriteKit 技巧之添加背景图片
  • VUE es6技巧写法(持续更新中~~~)
  • Vue小说阅读器(仿追书神器)
  • webpack入门学习手记(二)
  • 从setTimeout-setInterval看JS线程
  • 大主子表关联的性能优化方法
  • 服务器之间,相同帐号,实现免密钥登录
  • 赢得Docker挑战最佳实践
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #define,static,const,三种常量的区别
  • #ifdef 的技巧用法
  • #预处理和函数的对比以及条件编译
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (LeetCode 49)Anagrams
  • (Note)C++中的继承方式
  • (poj1.3.2)1791(构造法模拟)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)linux下的时间函数使用
  • (转)菜鸟学数据库(三)——存储过程
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .netcore 获取appsettings
  • .NetCore 如何动态路由
  • .NET上SQLite的连接