CVPR 2023 | EfficientViT:让ViT在多个部署场景实现实时推理

news2024/12/25 1:20:57

随着近两年来对视觉Transformer模型(ViT)的深入研究,ViT的表达能力不断提升,并已经在大部分视觉基础任务 (分类,检测,分割等) 上实现了大幅度的性能突破。

然而,很多实际应用场景对模型实时推理的能力要求较高,但大部分轻量化ViT仍无法在多个部署场景 (GPU,CPU,ONNX,移动端等)达到与轻量级CNN(如MobileNet) 相媲美的速度。

为了实现对ViT模型的实时部署,来自微软和港中文的研究者从三个维度分析了ViT的速度瓶颈,包括多头自注意力(MHSA)导致的大量访存时间,注意力头之间的计算冗余,以及低效的模型参数分配,进而提出了一个高效ViT模型EfficientViT。它以EfficientViT block作为基础模块,每个block由三明治结构 (Sandwich Layout) 和级联组注意力(Cascaded Group Attention, CGA)组成。此外,作者进一步进行了参数重分配(Parameter Reallocation)以实现更高效的channel, block, 和stage数量权衡。该方法在ImageNet数据集上实现了 77.1% 的 Top-1 分类准确率,超越了MobileNetV3-Large [1] 1.9%精度的同时,在NVIDIA V100 GPU和Intel Xeon CPU上实现了40.4% 和 45.2%的吞吐量提升,并且大幅领先其他轻量级ViT的速度和精度。代码已开源。

论文链接:

https://arxiv.org/abs/2305.07027

代码链接:

https://github.com/microsoft/Cream/tree/main/EfficientViT

轻量级CNN和ViT模型吞吐量和精度对比的展示

图1 NVIDIA V100上的Throughput和ImageNet-1K分类性能对比

一、问题分析

1.1 访存时间瓶颈

在ViT中,多头自注意力(MHSA)和前馈神经网络(FFN)通常是不可或缺的两个组成模块且交替排列。然而,MHSA中的大量操作如reshape,element-wise addition,normalization是非计算密集的,因此较多时间浪费在了在数据读取操作上,导致推理过程中只有很小一部分时间用来进行张量计算,如下图所示:

图2 运行时间分析

尽管有一些工作提出了简化传统自注意力 [2, 3] 以获得加速,但是模型的表达能力也受到了一定的影响导致性能下降。因此,本文作者从探索最优的模块排列方式入手,以求减少低效的MHSA的模块在模型中的使用。

首先,作者通过减少MHSA和FFN block的方式,构建了多个比Swin-T和DeiT-T加速1.25和1.5倍的子网络,每个子网络有着不同的MHSA block比例。对这些子网络进行训练后,作者发现原始Transformer的MHSA和FFN的1:1设计范式并不能实现最优速度-精度权衡,而有着更少的MHSA模块比例(20%~40%)的子网络却可以达到更高的精度。

图3 不同MHSA比例的模型性能对比

1.2 计算冗余瓶颈

Transformer中的多头自注意力将输入序列在多个子空间中分别计算注意力,以获得更多样化的特征表达。然而,注意力计算非常耗时,而且已有研究表明并不是所有的头都对结果有显著贡献 [4, 5]。

为了度量ViT在轻量化后是否也会出现头部的计算冗余,作者构建了宽度更小的Swin-T和DeiT-T模型,并计算不同头映射特征的余弦相似度。如图4,许多头部学习到了类似的模式而产生大量计算冗余。作者认为这一现象与给每个头部输入的是同样的完整特征有关。因此,为了显式地解耦不同头部映射的模式,作者尝试只给每个注意力头提供一部分输入特征(w/ Head Splits),以减小不同头部映射的相似度,并发现这一操作确实使相似度和冗余得到了一定程度的降低。

图4 注意力头的平均余弦相似度

1.3 参数分配瓶颈

作者注意到,为了实现高效推理,轻量化CNN如MobileNet通常有着不同于ResNet等通用网络的宽度和层数设计,而现有的轻量化ViT大多遵循DeiT、Swin的参数分配策略,如给Q,K,V相同的特征维度,Head数目随着网络加深而逐渐增加,宽度在每个stage加倍等,这种方式可能无法实现ViT的最优效率。受Rethinking Channel Pruning [6] 和NViT [7] 启发,本文作者采用Taylor Structured Pruning [8] 自动寻找Swin-T中的重要成分,并探索参数分配的最有效方式。如下图所示,模型在浅层保留了更多的维度,而在深层保留的更少;Q、K和FFN的维度被大量修剪,而V的维度几乎被全部保留,只在最后几个block处出现了轻微减少。因此,传统的ViT通道配置可能在深层产生大量冗余,且Q,K的的冗余度比V大得多,而V的维度倾向于与输入接近。

图5 Swin-T修建前后的通道对比

二 、模型构建

基于上述分析,作者构建了如上图所示的EfficientViT。其核心为EfficientViT block,每个EfficientViT block的输入特征先经过N个FFN,再经过一个级联组注意力CGA,再经过N个FFN层变换得到输出特征。这一基础模块减少了注意力的使用,缓解了注意力计算导致的访存时间消耗问题。同时,作者在每个FFN之前加入了一层DWConv作为局部token之间信息交互并帮助引入归纳偏置。

对于CGA模块,作者采用了将输入特征拆分,只给每个注意力头提供一部分输入特征的方式以减小计算冗余。同时,注意力计算采用了逐个头级联的方式,在不增加额外参数的情况下提升了轻量级网络的深度和表达能力。

最后,作者基于上述参数重要性分析对网络的组成成分进行了参数重排,给 Q 和 K 更小的维度,并调整了 V 的维度保证其与每个头的输入维度一致,并使用了expansion ratio为2的FFN。

模型的设计还包括其他细节。具体来说,EfficientViT用了overlap patch embedding以增强模型的low-level视觉表征能力。由于BN可以与线性层和卷积层在推理时融合以实现加速,网络中的归一化层采用了BN来替换LN。类似MobileNetV3 [1]和LeViT [9],网络在大尺度下层数更少,并在每个stage用了小于2的宽度扩展系数以减轻深层的冗余。

表1 EfficientViT系列模型

三 、实验结果

作者在ImageNet分类,下游分类,检测任务和实例分割任务上验证了EfficientViT的性能。在下表2中,EfficientViT的性能领先于轻量级CNN和ViT模型,并在NVIDIA GPU,Intel CPU,和部署为ONNX模型的场景下有着显著的速度优势。

表2 ImageNet-1k分类性能

下表3展示了EfficientViT和通用ViT模型的对比,以及在下游分类任务上的性能。EfficientViT在轻量化和实时推理的同时仍有良好的迁移能力。

表3 ImageNet-1k和下游分类任务性能

下表4展示了在检测和实例分割框架下,EfficientViT依然保持性能优势。

表4 检测和实例分割性能

作者在消融实验中详尽的分析了每个模块的作用,并比较了在不同的超参设计和训练策略下模型的性能变化。

表5 消融实验

四 、结语

本文详细分析了现有ViT的推理速度瓶颈,提出了EfficientViT以实现不同部署场景下的实时推理,其基本模块由三明治结构和级联组注意力构成。在多个任务和数据集上的实验展示了模型的性能和速度。随着各个领域的研究人员对ViT的深入探索,模型的潜力正在被不断发掘。研究者希望通过本文能给ViT轻量化和在有实时性要求的场景下广泛应用提供灵感。在未来工作中,研究者将尝试通过网络结构搜索进一步提高效率,减少模型参数,以及探索如何扩展到不同任务和数据模态下的Transformer中。

参考文献

[1] Andrew Howard, Mark Sandler, Grace Chu, Liang-Chieh Chen, Bo Chen, Mingxing Tan, Weijun Wang, Yukun Zhu, Ruoming Pang, Vijay Vasudevan, et al. Searching for mobilenetv3. In ICCV, 2019

[2] Sachin Mehta and Mohammad Rastegari. Separable self-attention for mobile vision transformers. arXiv preprint arXiv:2206.02680, 2022

[3] Nikita Kitaev, Łukasz Kaiser, and Anselm Levskaya. Reformer: The efficient transformer. In ICLR, 2020.

[4] Paul Michel, Omer Levy, and Graham Neubig. Are sixteen heads really better than one? NeurIPS, 32, 2019

[5] Elena Voita, David Talbot, Fedor Moiseev, Rico Sennrich, and Ivan Titov. Analyzing multi-head self-attention: Specialized heads do the heavy lifting, the rest can be pruned. In ACL, pages 5797–5808, 2019

[6] Zhuang Liu, Mingjie Sun, Tinghui Zhou, Gao Huang, and Trevor Darrell. Rethinking the value of network pruning. In ICLR, 2018.

[7] Huanrui Yang, Hongxu Yin, Pavlo Molchanov, Hai Li, and Jan Kautz. Nvit: Vision transformer compression and parameter redistribution. arXiv preprint arXiv:2110.04869, 2021.

[8] Pavlo Molchanov, Arun Mallya, Stephen Tyree, Iuri Frosio, and Jan Kautz. Importance estimation for neural network pruning. In CVPR, pages 11264–11272, 2019.

[9] Benjamin Graham, Alaaeldin El-Nouby, Hugo Touvron, Pierre Stock, Armand Joulin, Herv ́e J ́egou, and Matthijs Douze. Levit: a vision transformer in convnet’s clothing for faster inference. In ICCV, 2021

Illustration by IconScout Store from IconScout

-The End-

点击阅读原文

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

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

相关文章

从零入门激光SLAM(十)——刚体位姿表达与优化

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激…

django ORM框架 第三章 关联表的数据创建与查询

一、背景: 创建一组一对多的表。 # 班级表 class Class(models.Model):class_id models.IntegerField(primary_keyTrue, verbose_name班级id, help_text班级id)class_name models.CharField(max_length20,verbose_name班级名称, help_text班级名称)# 学生信息表 …

Centos虚拟机与window共享文件夹

1.安装完centos系统后,查看是否安装好VMware tools 如果未安装,请参考此文章安装: CentOS安装VMwareTools_centos安装vmware tools_Sunqk5665的博客-CSDN博客 2.添加共享文件夹 3.使用vmware-hgfsclient查看共享文件夹。本例中为share 4. 挂…

5.1 标准IO介绍及缓冲区

目录 标准I/O介绍 文件的概念和类型 标准I/O-流(可理解为数据) 流的缓冲类型 标准I/O——stdin,stdout,stderr 标准I/O介绍 在寄存器中的输入输出标准,在任何系统上可运行,是一系列的接口,所以被称为标准IO lin…

学会ECharts 数据缩放组件

本文首发自「慕课网」(imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号! 作者:范文杰_fe|慕课网讲师 在一个数据图表中,可能由于数据所表…

Mtlab基础(十):极限的求解

在做研究的过程中,需要涉及到极限的求解,面对简单的极限大家都能够轻松解决,但是当面临复杂的问题时,传统的差分进化算法就难以解决了。 对于求解极限,Matlab提供了非常好的工具**limit**,具体的使用方法: limit(f,v,a)-------------------------------------------…

RFID在空调装配中的作用

RFID在空调装配中的作用 随着物联网和射频识别技术 (RFID) 的发展,越来越多的应用开始使用 RFID 技术来提高生产效率和产品质量。在空调装配过程中,RFID 技术可以发挥重要作用。 RFID 技术可以帮助空调制造商提高装配效率。使用 RFID 技术,…

CircuitBreaker Resilience4J 介绍

最近接触到了CircuitBreaker Resilience4J ,网上查了查资料,这里整合记录一下,供大家学习和参考 目录 前言 1、熔断器出现背景 ​​​​​​​ 2、支持断路器实现有以下几种 3、Circuit Breaker原理 4、概念说明 限流 — RateLimiter …

CPU Architecture

CPU Architecture [/ˈɑːrkɪtektʃər/] 指令集架构 (Instruction Set Architecture)精简指令集处理器 RISC (Reduce Instruction Set Computer)复杂指令集处理器 CISC (Complex Instruction Set Computer) CPU按指令集架构分类ARM运行模式非特权模式…

什么是NTFS for Mac?2023新版本如何下载

在NTFS for Mac中包含了多种功能操作,促进软件更好地使用,可以进行全局设置,也可以针对某一各挂载的磁盘进行针对性设置。 本集小编主要向大家介绍它包含的一些基本功能,看看这款mac读写工具能够实现那些功能,全面了解…

安科瑞电能表对于预付费平台的费控策略应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略,介绍3个子策略的制定原则、设计流程&…

Flink学习——状态编程

目录 一、Flink中的状态 二、状态编程 (一)ValueState案例——判断传感器的数据 1.代码实现 2.端口进行传输数据 3.运行结果 (二)ListState (三)MapState案例——比较学生每次考试成绩 1.代码实现 2.端口传输学生成绩 3.运行结果 (四)ReducingState 一、Flink中的状…

0Ω的电阻作用

0欧姆电阻即电阻标值为0欧姆的电阻,多用于PCB设计等方面,是一种理想电阻。那0欧姆电阻是表示没有电阻吗?当然不是,0欧姆电阻的阻值不是0欧姆,只是接近0欧姆。 1、调试方便或者兼容设计:可以选择器件、功能…

网络安全--XXE漏洞利用思路

一、XXE 是什么 介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞 如图所示: 既然能插入 XML 代码,那我们肯定不能善罢甘休,我们需要更多,于是出…

Python环境安装,操作MySQL数据脚本

安装Python 下载地址Python Releases for macOS | Python.org下载安装包点击安装执行python3命令查看安装及版本 安装插件 安装PyMySQL python3 -m pip install PyMySQL 编写脚本 创建文件selectMysql.py #!/usr/bin/python import pymysql.cursors def updateuser(user_…

chatgpt赋能Python-python3_4

Python3-4: 编程领域的瑰宝 简介 Python3-4 是一种开源解释型高级编程语言,具有简单易学、可读性强、语法简洁的特点。它由谷歌公司所开发,在全球范围内被广泛应用于Web开发、人工智能、科学计算、数据分析等领域。 优势 1. 语法简洁 Python3-4采用…

今天面试招了个20K的人,从腾讯出来的果然都有两把刷子···

现在找个会自动化测试的人真是难呀,10个里面有8个写了会自动化,但一问就是三不知 公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-20k,面试的…

实施基于零信任网络安全的设备控制

零信任安全是一种数据保护策略,除非系统管理员进行彻底验证,否则网络边界内外的所有设备和实体都不受信任。Device Control Plus 可帮助管理员为其网络实施和自动化零信任安全协议,以确保对来自未经批准的外围设备的所有端点数据提供最佳保护…

嵌入式软件测试笔记1 | 简单说明 嵌入式系统认识和测试目标

1 | 简单说明 & 嵌入式系统认识和测试目标 1 为什么看这个?2 一些说明3 主要内容是什么?4 嵌入式系统测试的目标4.1 测试的任务4.2 最终目标4.3 测试过程4.4 通用元素 5 嵌入式系统的一些基础 1 为什么看这个? 一直在间断性的学习和了解…

chatgpt赋能Python-python3_6怎么调整字体大小

Python3.6 是一种广泛使用的编程语言,可以帮助人们创建各种各样的应用程序。不过,当我们在使用 Python3.6 编写程序时,有时会遇到一些困难,比如如何调整字体大小。那么,今天我们就来看看如何应对这个问题。 如何在 Py…