MEC —— 优化内存与速度的卷积计算

2023-05-16

本次介绍一种内存利用率高且速度较快的卷积计算方法。 来自ICML2017, 《MEC: Memory-efficient Convolution for Deep Neural Network》

1. 背景工作

目前的CNN模型中,全连接层往往在最后一层才会使用。 意思也就是说,网络的主体是由卷积层构成的。 因此,加快卷积层的计算对于整个网络的性能至关重要。

目前,卷积的计算大多采用间接计算的方式,主要有以下三种实现方式:

  • im2col + GEMM。 caffe等很多框架中都使用了这种计算方式,原因是将问题转化为矩阵乘法后可以方便的使用很多矩阵运算库(如MKL、openblas、Eigen等)。
  • FFT变换。 时域卷积等于频域相乘,因此可将问题转化为简单的乘法问题。
  • Winograd。 这种不太熟悉,据说在GPU上效率更高。 NNPACK就是FFT和Winograd方法的结合。

上面三种方法执行效率都还不错,但对内存占用比较高,因为需要存储中间结果或者临时辅助变量。

本文的方法主要改进了im2col + GEMM的策略,目的主要是减少内存消耗的同时顺便提升点速度。由于同样可以利用目前成熟的矩阵运算库,因此算法的实现难度并不大。

下图分别是直接计算卷积以及im2col + GEMM的实现方式。 可见后者需要比较多的内存存储一个临时矩阵(用于保存im2col的结果)。

2. 方法介绍

首先规定一下符号:

2.1 初级版本

这里先介绍一下简单情况下的MEC的实现方式,我将其称之为“初级版本”,因为里面不考虑batchsize和channel这两个维度。 虽然是“初级版本”,但想要理解还是需要熟悉上面Figure1中im2col+GEMM的计算方式(可参考知乎上的一个高票回答,图示很清楚, https://www.zhihu.com/question/28385679?sort=created)。

下面给出算法流程以及一个示例(7x7输入,3x3卷积核,步长为1):

上面的算法伪代码可能太复杂了,我来个中文版本的示例解说:

1. 由于是3x3卷积核,且步长为1。因此,循环取出A、B、C、D、E这5个子矩阵, 每个矩阵的维度都是: 输入高度x3。

2. 将A、B、C、D、E按照行优先展开并拼成一个大的中间矩阵L, L的维度则为: 5x21。

3. 从L中循环取出P、Q、R、S、T这5个子矩阵,并计算5次矩阵乘法,就得到了最终的结果。

从上面的示例中我们不难看出,MEC的解决思路在于将im2col这一过程分成了Height和Width两部分,于是需要存储的中间矩阵也大大减小了。 可能带来的问题就是,原来的一次矩阵乘法,现在会变成多次小矩阵乘法。虽然有利于并行计算,但也失去了BLAS库计算大矩阵乘法的优势。

2.2 高级版本

相比初级版本, 高级版本进而考虑了batchsize和channel维度。

照例先给出算法伪代码和示例图:

Solution A:

Algorithm2中的9-19行。 9-13行和Algorithm1方法一致,14-19行对临时结果做排列转换。

Solution B:

Algorithm2中的21-25行。 循环每次处理一个样本,无需再做排列变换。

上面两种解决方案的浮点乘法计算量是一致的。但是实际操作中,子矩阵的数量对性能的影响很大,特别是在GPU设备上。 所以,在Algorithm2的第8行采用了一个参数T来控制是使用A还是B。 T是一个和平台有关的参数,文章发现对于目前的GPU来说100是一个不错的选择。

3. 实验对比

理论的复杂度就不说了,意义不大。 下面直接上实际对比结果。

3.1 配置说明以及benchmarks

C++实现CPU和GPU,矩阵运算库采用多线程OpenBLAS、OpenMP、cuBLAS,数据类型为32位浮点数。

3.2 对比结果

总结: 无论从内存占用还是计算速度上来看提升都不错,比较有复现价值。 不过缺少了和NNPACK以及CUDNN的对比,同时都是多线程操作,不知道单线程效率如何(估计会差一点)。 多线程的实现对编程能力要求还挺高的,先坐等大牛复现。(自己以后有应用需求也会考虑复现。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MEC —— 优化内存与速度的卷积计算 的相关文章

  • 文件传输命令(持续更新中)

    文件传输是非常常用的命令 xff0c 今天小编就带大家整理一下自己常用的一些文件传输命令 xff1a rsync 命令 rsync是可以实现增量备份的工具 配合任务计划 xff0c rsync能实现定时或间隔同步 xff0c 配合inoti
  • 滑模控制

    滑模控制 举例说明滑模控制 对于一个典型的二阶系统 x 1 61 x
  • wildfly软件介绍

    WildFly是什么 xff1f Wildfly是一个开源的基于JavaEE的轻量级应用服务器 xff0c 目前 xff0c 最新版本是Wildfly 15 xff0c wildfly遵循LGPL2 1许可 xff0c 意味着可以在任何商业
  • JDK介绍与安装

    xff08 一 xff09 JDK 简介 JDK Java SE Development kit JDK java开发工具包 JDK 全称Java SE Development kit JDK xff0c 即java 标准版 开发包 xff
  • 一个简单的java程序

    xff08 一 xff09 简单的java程序 public class MyFirstApp public static void main String args System out print 34 Hello world 34 x
  • Java 注释

    xff08 一 xff09 注释的重要性 编写程序的时候 xff0c 总需要为程序添加一些注释 xff0c 用以说明某段代码的作用 xff0c 或者说明某个类的用途 xff0c 某个方法的工能 xff0c 以及该方法的的参数和返回值的数据类
  • java 标识符,分隔符,关键字

    xff08 一 xff09 标识符的介绍 Java语言中 xff0c 对于变量 xff0c 常量 xff0c 函数 xff0c 语句块也有名字 xff0c 我们统统称之为Java标识符 标识符是用来给类 对象 方法 变量 接口和自定义数据类
  • Java基本数据类型

    这节博客将向大家讲解java的数据类型 xff0c 在讲解数据类型前 xff0c 先来看一下变量 xff08 一 xff09 变量 java语言是强类型语言 xff0c 强类型包含两方面的含义 1 xff1a 所有的变量必须先声明 xff0
  • 自动类型转换

    xff08 一 xff09 自动类型转换 在java 程序中 xff0c 不同的基本类型的值经常需要进行相互类型转换 xff0c 类型转换分为自动类型转换和强制类型转换 布尔类型boolean占有一个字节 xff0c 由于其本身所代码的特殊
  • Eclipse中设置Tomcat服务器

    01首先打开eclipse软件 xff0c 点击顶部的windows菜单 xff0c 选择下拉菜单中的preferences选项 xff0c 如下图所示 02在弹出的Preference界面中选择Server 找到左侧的Runtime En
  • games系列学习 -- Möller Trumbore 算法

    M ller Trumbore 算法 是三角形与射线 光线 之间判定是否相交的快速算法 利用了重心坐标来表示三角形 首先假设射线的方程 xff1a O为发射点 D为方向向量 再假设三角形平面方程 xff1a b1 b2 1 b1 b2 分别
  • 使用手机摄像头实现视频监控实时播放

    使用手机摄像头实现视频监控实时播放 一 概述 视频监控实时播放的原理与目前较为流行的直播是一致的 xff0c 所以采用直播的架构实现视频监控实时播放 xff0c 流程图如下 xff1a

随机推荐

  • 滑模观测器

    什么是滑模观测器 1 滑模观测器是一类动态系统 2 滑模观测器是指根据系统的外部变量 输入变量和输出变量 的实测值得出状态变量估计值的一类动态系统 xff0c 也称为状态重构器 3 作用 xff1a xff08 1 xff09 滑模观测器不
  • ROS入门_1.18 接下来做什么?

    此时你应该已经对ROS中的一些核心概念有了一定的理解 给你一台运行ROS的机器人 xff0c 你应该能够运用所学知识来列出机器人上发布和订阅的各种话题 xff08 topic xff09 xff0c 查看话题中发布的消息 xff0c 然后编
  • 【git】看懂git diff

    git diff 可以用来比较 xff1a 1 staging area和working area的文件 xff08 无其他参数时 xff09 plain view plain copy print git diff 2 master分支和
  • makefile 自动编译同一个目录下的所有文件

    SOURCE 61 wildcard c OBJS 61 patsubst c o SOURCE CROSS COMPILE 61 arm linux CXX 61 gcc CFLAGS 43 61 static CLFAGS 43 61
  • PX4_Bootloader单步调试配置(STM32F7 配置)

    Bootloader Makefile 编译选项 Os g 43 O0 43 ggdb3 Bootloader libopencm3 lib stm32 f7 Makefile TGT CFLAGS 61 Os g 43 TGT CFLAG
  • 2021北邮自考c++实践题及答案

    北邮c 43 43 实践考期 xff0c 只能在每年的下半年进行报名 xff0c 11月进行考试 由于疫情原因 xff0c 现在均为线上考试 xff0c 每人的考题不同 xff0c 但是大同小异 xff0c 此为2021年的c 43 43
  • 从idea推送代码到github,到jenkins部署,再到从github下载代码完成构建的全部详细操作流程

    目录 1 idea推送代码到github 1 1 github创建 1 2 git下载与安装 xff08 windows xff09 1 3 idea关联github 1 3 1 windows生成公私钥 1 3 2 idea关联githu
  • Jmeter常用场景梳理

    一 在一段时间内持续发送请求 此场景可以用于稳定性测试 xff0c 在稳定性测试中 xff0c 通常需要持续压测几个小时甚至几天时间 xff0c 查看接口是否有报错 xff0c 或者cpu 内存会上涨 xff0c 此时就需要通过控制持续时间
  • vnc viewer连不上,vnc viewer连不上是什么原因?解决方法

    vnc viewer连不上是什么原因 接下来尝试在CentOS上安装一个VNC Server CentOS5 已经自带了VNC xff0c 默认也已经安装了 xff0c 只要配置一下就可以了 如果没有安装 xff0c 可以 yum inst
  • 基于netty框架的JTT808/JTT905/JTT1078协议客户端

    基于netty框架的JTT808 JTT905 JTT1078协议客户端 JTT808客户端网络处理 span class token keyword private span span class token keyword void s
  • The BMJ研究:现有的新冠病毒诊断AI模型,几乎毫无用处

    图片出处 xff1a unsplash 本文作者 xff1a 朱演瑞 新型冠状病毒对全球健康造成了严重的威胁 xff0c 为了减轻医疗保健系统的负担 xff0c 也给患者提供最佳的护理 xff0c 高效的诊断和疾病预后信息问题亟待解决 理论
  • 自动驾驶多传感器融合

    12月28日 xff0c 百度Apollo平台携手国内激光雷达公司禾赛科技扔下一颗名为Pandora的重磅炸弹 xff0c 此举将极大地加快无人驾驶落地的进程 xff0c 却也会让不少自动驾驶初创公司陷入无比尴尬的境地 简单地说 xff0c
  • YMFC-32 小四轴 (一)

    https github com jamesshao8 ymfc mini drone 本博客前几天送出了几个v1 0版本的ymfc小四轴 在这里我要说一下组装教程和使用方法 原材料采购 除了我的板子以外还需要一些零件 1 间距0 254的
  • HackRF 代码讲解 (一)

    本文包括驱动 固件 CPLD代码讲解 xff08 也包括gr osmosdr中的相关部分 xff09 HackRF是比较早期的一款SDR设备 xff0c 凭借其相对低廉的价格加上半双工收发能力 xff0c 在国内的SDR市场中占比很高 这款
  • STM32 GPS悬停飞控 (十)气压计

    上次的飞机有干扰问题 没法解决 可能因为我的元器件有问题 或者走线问题 本来打算按老外的一模一样做一个的 但现在想直接做带GPS的了 因为除GPS 罗盘 气压 数传外基本和上次那个一样的 这些部分即使装上也可以禁用 只剩摇控不一样了 暂时忽
  • 自制嵌入式GUI 【前1-3篇】-基于freeRTOS

    自制GUI第4篇 xff1a https blog csdn net shungry article details 78659613 自制GUI第5篇 xff1a https blog csdn net shungry article d
  • 基于C++的PID控制器

    PID控制器是一种广泛用于各种工业控制场合的控制器 xff0c 它结构简单 xff0c 可以根据工程经验整定参数Kp Ki Kd 虽然现在控制专家提出了很多智能的控制算法 xff0c 比如神经网络 xff0c 模糊控制等 xff0c 但是P
  • 模糊PID控制算法的C++实现

    很久没有更新博客了 xff0c 今天就来讲讲模糊PID的C 43 43 实现方法 先来看一下整体的框架 xff1a 解释下上面框图的意思 xff0c 模糊PID其实是在普通PID的基础之上 xff0c 通过输入的两个变量 xff1a 误差和
  • C++ Map常见用法说明

    一 声明二 插入操作 1 使用 进行单个插入1 使用insert进行单个和多个插入 三 取值四 容量查询五 迭代器六 删除交换 1 删除2 交换 七 顺序比较八 查找九 操作符 C 43 43 中map提供的是一种键值对容器 xff0c 里
  • MEC —— 优化内存与速度的卷积计算

    本次介绍一种内存利用率高且速度较快的卷积计算方法 来自ICML2017 MEC Memory efficient Convolution for Deep Neural Network 1 背景工作 目前的CNN模型中 xff0c 全连接层