4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer

本文主要是介绍4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现有Transformer模型的速度通常受到内存低效操作的限制,尤其是MHSA(多头自注意力)中的张量整形和逐元素函数。

设计了一种具有三明治布局的新构建块,即在高效FFN(前馈)层之间使用单个内存绑定的MHSA,从而提高内存效率,同时增强通道通信。

注意力图在头部之间具有高度相似性,导致计算冗余。

为了解决这个问题,提出了一个级联的组注意力模块,为注意力头提供完整特征的不同分割。


Transformer模型的速度通常受内存限制。内存访问延迟阻碍了GPU/CPU中计算能力的充分利用,从而对Transformer的运行速度产生严重的负面影响。

内存效率最低的操作是多头自注意力(MHSA)中频繁的张量整形和逐元素函数。通过适当调整MHSA和FFN(前馈网络)层之间的比例,可以在不影响性能的情况下显著减少内存访问时间。

通过向每个头提供不同的特征来显式分解每个头的计算来缓解冗余问题。 

为了提高参数效率,我们使用结构化剪枝来识别最重要的网络组件,并总结模型加速参数重新分配的经验指导。

结构化剪枝是在神经网络已经训练好的情况下,按照一定的剪枝策略来修剪掉一部分神经元或连接,从而减少模型的大小,保持模型的精度,形成一个新的更加简单的模型。

结构化剪枝能够直接减少卷积核的参数量和运算量,减少网络运行时的内存占用,不需要特征运算库即可实现运算加速。

 EfficientViT

  1. MBConv模块使用深度可分离卷积,即每个输入通道只与一个卷积核进行卷积,然后再将结果相加,从而减少了参数数量。
  2. Lighted Multi-scale Self-attention (轻量级多尺度自注意力)

DWConv指的是深度卷积,GConv指的是组卷积。

深度卷积是组卷积的极端情况,即分组数g等于输入通道数cin,也等于输出通道数cout

组卷积常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature
map,而大量的feature map意味着能够编码更多的信息。

组卷积指的是什么:

组卷积是将输入特征图分成多个组,然后在每个组内进行卷积操作,最后将每个组的输出特征图拼接起来作为最终的输出特征图
假设输入特征图的通道数为C,组数为G,每组的通道数为C/G,那么组卷积的操作可以表示为

  1. 将输入特征图分成G组,每组包含C/G个通道。
  2. 对每个组进行卷积操作,得到每组的输出特征图。
  3. 将G个组的输出特征图拼接起来,得到最终的输出特征图。

设计一个具有三明治布局的新块来构建模型:

三明治布局块在FFN层之间应用单个内存绑定的MHSA层;

并应用更多的FFN层来允许不同通道之间的通信,从而提高内存效率

内存绑定的MHSA(多头自注意力)层通过优化数据结构和计算流程,减少了内存使用,提高了计算效率。这种优化可能包括更有效的张量整形操作、减少不必要的数据复制、以及使用更紧凑的数据表示等

级联群体注意力(CGA)

与先前对所有头使用相同特征的自注意力相比,CGA为每个头提供不同的输入分割,并将输出特征级联到各个头。

该模块不仅减少了多头注意力中的计算冗余,而且还通过增加网络深度来提高模型容量。我们通过扩大关键网络组件(例如值投影)的通道宽度来重新分配参数,同时缩小重要性较低的组件(例如FFN中的隐藏维度)

使用Vision Transformers加快速度

内存效率

内存访问开销是影响模型速度的关键因素。Transformer中的许多运算符,例如频繁的整形、逐元素加法和归一化,都是内存效率低下的,需要跨不同内存单元进行耗时的访问。

我们通过减少内存效率低下的层来节省内存访问成本。内存效率低下的操作主要位于MHSA(多头注意力)而不是FFN层。然而,大多数现有的ViT使用相同数量的两层,无法达到最佳效率。

事实证明,适当降低MHSA层利用率可以在提高模型性能的同时提高内存效率。

这篇关于4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936699

相关文章

C++|内存管理(2)

目录 malloc/free和new/delete的区别 共同点 不同点 内存泄漏 什么是内存泄漏 内存泄漏的危害 内存泄漏分类 堆内存泄漏 系统资源泄漏 malloc/free和new/delete的区别 共同点 都是从堆上申请空间,并且需要用户手动释放。 不同点 1. malloc和free是函数,new和delete是操作符 2. malloc申请的

视频拼接融合产品的产品与架构设计(三)内存和显存单元数据迁移

上一篇文章 视频拼接融合产品的产品与架构设计(二) 这一篇沉下先来,彻底放弃了界面,界面最终的体现是最后要做的,现在要做的是产品的架构,使用链式架构方式迁移数据。同时增加插件口,方便编程序。 插件架构 为了视频拼接和算法等的产品化,在视频解码前(录像),解码后在gpu,解码后转颜色空间(bgr),解码后算法处理,解码后算法处理下放部分数据到cpu(如截图),解码后算法处理后转颜色空间,框架必

前端铺子-NodeJS后端:基于Node.js构建高效后端服务的探索与实践

一、引言 随着前端技术的快速发展,越来越多的开发者开始关注前后端分离的开发模式。前端铺子作为一个旨在服务前端开发者的开源项目,近期推出了基于Node.js的后端系统。该系统通过整合Node.js、Nodemon和MySQL等技术,为前端开发者提供了一个高并发、易部署的后端解决方案。本文将对前端铺子后端系统进行详细介绍,并探讨其技术实现和优势。   二、项目概述 前端铺子后端系统是一个基

String的substring()方法导致的内存泄露问题

JDK 6的实现 String(int offset, int count, char value[]) {this.value = value;this.offset = offset;this.count = count;}public String substring(int beginIndex, int endIndex) {//check boundaryreturn new S

并发编程-Java内存模型到底是什么

内存模型 在计算机CPU,内存,IO三者之间速度差异,为了提高系统性能,对这三者速度进行平衡。 CPU 增加了缓存,以均衡与内存的速度差异;操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。 以上三种系统优化,对于硬件的效率有了显著的提升,但是他们同时也带来了可见性,原子性以及顺序性等问题。基

netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法。分析代码之前,先熟悉一些重要的概念: page: 页,一个页是可分配的最小的内存块单元,页的大小:pageSize = 1 << n (n <= 12)。chunk: 块,块是多个页的集合。chunkSize是块中所有page的pageSize之和。T

【原创】(十)Linux内存管理 - zoned page frame allocator - 5

背景 Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 本文将讨论memory reclaim内存回收这个话题。 在内存

Spring Boot 2.X(十九):集成 mybatis-plus 高效开发

前言 之前介绍了 SpringBoot 整合 Mybatis 实现数据库的增删改查操作,分别给出了 xml 和注解两种实现 mapper 接口的方式;虽然注解方式干掉了 xml 文件,但是使用起来并不优雅,本文将介绍 mybats-plus 的常用实例,简化常规的 CRUD 操作。 mybatis-plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyB

视频剪辑的技巧:掌握如何高效批量调整视频尺寸的方法

在视频剪辑的过程中,调整视频尺寸是一个常见的需求。无论是为了适应不同平台的播放要求,还是为了统一多个视频的尺寸以提升观看体验,掌握高效批量调整视频尺寸的技巧都显得尤为重要。本文将为您详细介绍云炫AI智剪如何高效地进行这一操作,助您轻松应对视频剪辑中的尺寸调整问题。 一、了解常见的视频尺寸 在开始调整视频尺寸之前,我们首先需要了解常见的视频尺寸标准。例如,常见的视频尺寸有1920x1080(1080

分页时高效的总页数计算

我们一般分页是这样来计算页码的: int row=200; //记录总数 int page=5;//每页数量 int count=row%5==0?row/page:row/page+1; 上面这种是用的最多的! 那么下面我们来一种最简单的,不用任何判断! 看代码: int row=21;int pageCount=5;int sum=(row-1)/pageCount+1;