模型压缩算法库 MMRazor 全面升级,更灵活、更自动

news2025/7/24 9:05:29

MMRazor 是 OpenMMLab 开源项目里模型压缩领域的算法工具箱,目前支持了知识蒸馏、模型通道剪枝和模型结构搜索,模型量化部分正在开发中。

量化设计 RFC(request for comment)链接也放在这啦,欢迎各位小伙伴去提需求和建议,一起共建更好用的量化工具!

https://github.com/open-mmlab/mmrazor/issues/347

2022 年 9 月,我们发布了 MMRazor 1.0,全面升级了架构设计,适配全新的 OpenMMLab 2.0 体系

新版本的主要特点如下:

  • 非侵入式,将模型与模型压缩算法的实现解耦,不需更改模型一行代码即可压缩
  • 全面性,支持 OpenMMLab 所有 repo,压缩算法可以快速应用在不同任务上
  • 灵活性,对模型压缩算法进行了解耦,可以快速组合不同算法中的不同 trick

在这里插入图片描述

MMRazor 支持算法类型

我们接下来将从新版本特点、重点模块两个维度,对全新的 MMRazor 1.0 进行介绍。

新版本特点

全面支持 OpenMMLab

在 OpenMMLab 1.0 时期,虽然各个算法库是基于一套统一的设计模式进行开发的,但还是会有一些不统一的地方,比如 apis 和 tools,也就导致了 MMRazor 在适配各个算法库时,需要适配每个算法库的 apis 和 tools。

在 OpenMMLab 2.0 中,我们统一了各个算法库模型、数据、训练和评测等功能的接口,使 MMRazor 可以直接应用在 OpenMMLab 不同的算法库上,不需要再额外去适配每个算法库,适配前后目录结构对比如下图所示:

在这里插入图片描述

Config 更加简洁

在 OpenMMLab 1.0 时期,虽然 Config 有继承、导入等功能,但都是局限在同一算法库内,MMRazor 如果想用其他算法库里的 Config,必须从其他算法库中 copy-paste。比如要对 resnet-18 蒸馏,必须先从 MMClassification 中拷贝 resnet 18 的一系列 Config(模型、数据、训练等)。

OpenMMLab 2.0 新增了基础库 MMEngine,通过 MMEngine,可以实现 Config 的跨库调用,只需要在 Config 路径前加上目标 Config 对应的算法库包名, 再也不用从其他算法库拷贝大量的 Config 了,跨库调用的流程如下图所示:

在这里插入图片描述

知识蒸馏全新升级

相较于知识蒸馏算法本身,知识蒸馏的算法实现会更加繁琐一些。很多知识蒸馏算法都是在围绕如何设计知识蒸馏的损失函数,在实现过程中,为了获取到要计算蒸馏损失的特征图,往往要通过改写模型 forward 的方式。

在 OpenMMLab 1.0 时期,MMRazor 支持了特征图的可配置获取,但只局限于 nn.Module 的输出,无法获得某个具体的函数的输入输出。

此次适配 OpenMMLab 2.0 的过程中,MMRazor 也针对蒸馏的基础模块做了一波升级,新增了 Recorder 和 Delivery 模块;通过 Recorder 可以获取任意位置的输入输出;通过 Delivery 可以实现 teacher 和 student 间任意位置数据的相互传递。

同时,进一步扩充了知识蒸馏算法的数量,覆盖了 data-free distillation 、zero-shot distillation 和 self distillation 等算法类型。

在这里插入图片描述

*MMRazor 知识蒸馏模块*

NAS & Pruning 统一接口

在 OpenMMLab 1.0 时期,MMRazor 将 NAS 和 Pruning 抽象为了 Mutator 和 Pruner,经过半年的开发迭代,发现二者间有大量的可复用代码。

此次适配 OpenMMLab 2.0 的过程中,将 NAS 和 Pruning 统一抽象为了 Mutator,Mutabtor 会控制多个 Mutable (比如 NAS 中的 SearchBlock、Pruning 中的通道数),对于复杂的算法(结构和通道都会变化),通过多种 Mutator 的协作来完成复杂的形变操作。

在这里插入图片描述

NAS & Pruning 调用关系

重点模块

Recorder

Recorder 是此次适配 OpenMMLab 2.0 的过程中新增的模块,用来自动地获取模型中任意位置的输入、输出数据。在使用的过程中可以同时使用多个 Recorder,一个 Recorder 只负责记录一个位置的数据,多个 Recorder 通过 Recorder Manager 统一管理。

在这里插入图片描述

Recorder Pipeline

通过 Recorder,能够获得以下几种类型的中间结果,覆盖了蒸馏算法中的绝大多数场景:

  • Pytorch Module Inputs / Outputs
  • Pytorch Parameter
  • Python Function Inputs / Outputs
  • Python Class Method Inputs / Outputs

在这里插入图片描述

Recorder 示例

Delivery

Delivery 也是此次适配 OpenMMLab 2.0 的过程中新增的模块,用来处理知识蒸馏算法中, student 和 teacher 间的数据传递(比如目标检测蒸馏中有时会将 teacher 的 label assign 结果赋给 student)。

和 Recorder 类似,在使用的过程中可以同时使用多个 Delivery,一个 Delivery 只负责记录一个位置的数据,多个 Delivery 通过 Delivery Manager 统一管理。

在这里插入图片描述

Delivery Pipeline

结合开发过程的实际需求,目前 MMRazor 中支持以下两种 Delivery:

  • Python Function Outputs
  • Python Class Method Outputs

更多细节,可以移步 MMRazor delivery 文档 https://github.com/open-mmlab/mmrazor/blob/dev-1.x/docs/en/advanced_guides/delivery.md

Pruning Tracer

相较于 Pruning 算法本身,Pruning 算法的开发过程显得更加复杂,通道之间有很多依赖关系,一个算法想用在某一个模型上,往往需要重新开发一个模型,将各种通道的相关操作嵌入到 forward 的过程中。这个过程需要开发者对目标模型很熟悉,但即使开发者足够熟悉,开发的过程中也很容易出错,下图简单列举了一些常见的通道依赖:

在这里插入图片描述

在这里插入图片描述

为了能让剪枝算法能够在不同模型间快速切换,MMRazor 新增了能够自动解析通道依赖的 Pruning Tracer,只需 10 行以内代码,就可以快速获得通道依赖关系,配合 MMRazor 中的 Channel Mutator,可以自动化地根据通道依赖对模型进行改写,将剪枝算法的逻辑自动地嵌入到模型中。

更多细节,可以移步 MMRazor Pruning 文档 https://github.com/open-mmlab/mmrazor/blob/dev-1.x/docs/en/user_guides/pruning_user_guide.md

from mmrazor.models.mutators import ChannelMutator
from torchvision.models import mobilenet_v2

model = mobilenet_v2()
mutator = ChannelMutator(parse_cfg=dict(type='PruneTracer'))
mutator.prepare_from_supernet(model)

print(mutator.mutable_units[0])
# SequentialMutableChannelUnit(
#   name=features.0.0_(0, 32)_32
#   (output_related): ModuleList(
#     (0): Channel(features.0.0, index=(0, 32), is_output_channel=true, )
#     (1): Channel(features.0.1, index=(0, 32), is_output_channel=true, )
#     ...
#   )
#   (input_related): ModuleList(
#     (0): Channel(features.0.1, index=(0, 32), is_output_channel=false, )
#     (1): Channel(features.1.conv.0.0, index=(0, 32), is_output_channel=false, )
#     ...
#   )
#   (mutable_channel): SquentialMutableChannel(num_channels=32, activated_channels=32)
# )

总结

此次 OpenMMLab 2.0 的架构升级,打通了 MMRazor 与其他算法库,开发者可以使用 MMRazor 开发各种视觉任务的模型压缩算法,我们也在持续丰富算法种类,争取覆盖更多的算法库。

除了模型压缩算法外,MMRazor 还新增了一系列可以简化模型压缩算法开发的组件,用户也可以灵活地在自己的项目中(非 OpenMMLab 生态)使用这些组件,快速开发属于自己的模型压缩算法。

维护计划

因为 MMRazor 1.0 相较于 0.x 版本变动较大,我们也采取了较为保守的维护策略,确保熟悉了 0.x 版本的用户有充足的时间迁移至新版本。维护计划如下图所示,整体按时间会分为公测期、兼容期和维护期。整体按时间会分为公测期、兼容期和维护期。

公测期(2022/9/1 - 2022/12/31)

  • 公测版代码发布在 1.x 分支,开发分支为 dev-1.x新特性和新模型主要在 1.x 上发布
  • 默认主分支 master 为 MMRazor 0.x 版本,保持对代码的维护和修复,响应用户需求,不会增加主要新功能

兼容期(2023/1/1 - 2023/12/31)

  • 默认主分支切换为 1.x 分支,开发分支仍为 dev-1.x
  • 进一步完善从 MMRazor 0.x 到 MMRazor 1.0 的迁移指引,协助用户进行统一迁移
  • 0.x 系列版本主分支切换到 0.x,保持对旧版本的维护,并确保不引进破坏旧版本兼容性的改动

维护期(2024 起)

  • 旧版本进入维护期,不再进行新功能支持,主要投入到新版本的开发迭代中

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个超好看回忆相册(代码自取)

目录 前言 正文 部分代码 单面截图 更改文档标题 更改图片 更改文字 源码 前言 Calabash Brothers 《葫芦兄弟》(又名:葫芦娃),是上海美术电影制片厂于1985-1987年原创出品的13集系列剪纸动画片,是中国动画第…

python基于PHP+MySQL家政管理系统的设计与实现

随着大家生活水平的提高,在生活中家政服务变得越来越受大家的欢迎,如何来选择一个好的员工就也变得越来越重要,如何让人们足不出户就能找到自己满意的家政人员是本网站要解决的主要问题,我们建立一个家政公司信息系统来实现需求者从网站中快速的获取正确真实的家政服务信息的手…

阿里云账户新手实名认证教程(超简单秒通过)

阿里云账号注册后需要实名认证后才可以使用,阿里云百科教大家快速实名认证的方法,不需要上传身份证的等信息,以个人认证为例,直接拿你当支付宝扫一下即可通过实名认证,阿里云百科来详细说下阿里云个人或企业实名认证方…

单链表(一篇带你掌握单链表)

在之前我们已经学习了顺序表,顺序表有一定的缺陷,比如需要扩容,在插入和删除时需要挪动数据等问题,在此基础上我们可以学习一一种新的数据结构-单链表,相对来说它可以按需申请空间,并且不需要挪动数据。 我…

Spring Security登录流程分析

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法 登录流程分析 要搞请求Spring Security认证流程,我们先得认识与之相关的三个基本组件:AuthenticationMa…

Redis——》事务

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》事务一、概念二、示例multi、execdiscardwatch三、事务发生错误1、入队阶段发生错误2、执…

数据库课程设计——学籍管理系统

目录 1 问题的提出 1 2 需求分析 2 2.1需求描述 2 2.2数据字典 3 2.2.1数据项 3 2.2.2主要的数据流定义 6 2.3数据流图和业务流图 7 2.3.1顶层数据流图 7 2.3.2第一层数据流图 8 2.3.3第一层数据流图 8 2.3.4第一层数据流图 9 2.3.5第一层数据流图 9 3 概念结构设计 10 3.1实…

docker基础命令

docker基础 docker中的三个基本概念: 镜像: Docker 镜像(Image),就相当于是一个 root 文件系统 容器: 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一…

基于STM32的DS18B20多点测温系统(Proteus仿真+程序)

编号:22 基于STM32的DS18B20多点测温系统 功能描述: 本设计由STM32F103单片机三路DS18B20温度传感器1602液晶显示模块组成。 1、主控制器是STM32F103单片机 2、三路共用“单总线”DS1820温度传感器测量温度 3、1602液晶显示温度,保留一位小…

[附源码]java毕业设计明光中学考试系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Meta开源新工具啊,Git地位危险了?

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 从事编程开发的同学,绝大多数都会和版本控制系统打交道。 提到版本控制系统,目前比较主流的就是Git和SVN,尤其是Git,使用最为广泛。 关于Git和SVN之间…

python绘制Bubble气泡图pltscatter

python绘制Bubble气泡图pltscatter 先上结果: 基础语法: Axes.scatter(x, y**,** sNone**,** cNone**,** markerNone**,** cmapNone**,** normNone**,** vminNone**,** vmaxNone**,** alphaNone**,** linewidthsNone**,** , edgecolorsNone,* plotnonf…

nVisual 场景搭建所需接口

使用nVisua在创建新的项目步骤是搭建场景、创建对象、创建对象连接,本章小编带大家先了解搭建场景需要的接口。 场景搭建可根据自身项目需要搭建园区、建筑、楼层、机房这几类场景。分别用到了地图场景创建接口、CAD场景创建接口、静态图片背景创建接口。 1.地图场…

企业内训系统源码,为企业量身定制学习平台

如何进行企业内训系统开发?不同的直播平台的功能是不同的,企业的发展与员工的素质、能力、工作人效等不可分割,如何提高员工的工作能力,企业内部培训是离不开的,那么企业内训系统如何开发?怎么做一个企业学…

Spring Cloud面试题

什么是Spring Cloud Spring Cloud是目前最常用的微服务开发框架(微服务的特点就是"模块化、功能化",微服务架构的本质是将原来的整体项目划分成多个功能模块,每个功能模块都可以独立运行提供服务),它利用Sp…

wps和office可以同时装吗?

wps和office是很多用户都在使用的办公软件,那就有小白用户问了一台电脑可以存在wps和office吗?两个软件兼容吗?wps和office性质上都是办公软件,但是并不算重复,因此是可以同时安装的。 wps和office能同时安装吗 答&…

合并多个PDF怎么合并?建议学会这几个合并方法

你们平时工作的时候,看到自己的电脑桌面有很多文档文件,会不会觉得很杂乱?如果不将这些资料好好整理一番,都不能好好完成接下来的工作。其实如果是同种类型的PDF文件,我们可以将它们合并,这样既可以归类&am…

STM32单片机DS18B20测温液晶1602显示例程(Proteus仿真+程序)

编号:21 STM32单片机DS18B20测温液晶1602显示例程 功能描述: 本设计由STM32F103C8T6单片机最小系统DS18B20温度传感器1602液晶显示模块组成。 1、主控制器是STM32F103C8T6单片机 2、DS1820温度传感器测量温度 3、1602液晶显示温度,保留一位…

理解Linux32位机器下虚拟地址到物理地址的转化

文章目录前言一、基本概念介绍二、虚拟地址到物理地址的转化过程总结前言 简要介绍LINUX32位系统下虚拟地址到物理地址的转化过程。 一、基本概念介绍 在32位机器下,IO的基本单位是块(块:4kb),在程序编译成可执行程序时也划分好了以4kb为单…

Linux的前世今生

14天学习训练营导师课程: 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等&#xf…