嵌入式设备上卷积神经网络推理时memory的优化
以前的神经网络几乎都是部署在云端(服务器上),设备端采集到数据通过网络发送给服务器做inference(推理),结果再通过网络返回给设备端。如今越来越多的神经网络部署在嵌入式设备端上,即inference在设备端上做。嵌入式设备的特点是算力不强、memory小。可以通过对神经网络做量化来降load和省memory,但有时可能memory还吃紧,就需要对神经网络在memory使用上做进一步优化。本文就以一维卷积神经网络为例谈谈怎么来进一步优化卷积神经网络使用的memory。
文章(卷积神经网络中一维卷积的计算过程)讲了卷积神经网络一维卷积的处理过程,可以看出卷积层的输入是一个大矩阵,输出也是一个大矩阵,保存这些矩阵是挺耗memory的。其实做卷积计算时,每次都是从输入中取出kernel size大小的数据与kernel做卷积运算,得到的是一个值,保存在卷积层的输出buffer里,输出也是下一层的输入。如果输入是卷积层kernel的大小(即是能做运算的最小size),输出是下一层的能做运算的最小size,相对于整个输入和输出的size而言,能节省不少memory。下面就讲讲怎么用这种思路来做CNN的memory优化。
假设当前层和下一层均为卷积层,stride为1,padding模式为same。当前层的输入是一个MxN的矩阵,kernel size是P,kernel count是Q,所以kernel是一个MxP的矩阵,当前层的输出是一个QxN矩阵。当前卷积层的输出就是下一卷积层的输入。下一卷积层的kernel size是J,kernel count是K,所以下一卷积层的kernel是一个QxJ的矩阵,输出是一个KxN的矩阵。示意如下图:
首先从输入矩阵中取出0~(P-1)列(共P列)放进输入buffer中,正好放满。与第一个kernel做卷积运算就得到一个值放进输出buffer中(0,0)位置。同样与第二个kernel做卷积得到的值放在输出buffer中(1,0)位置,与所有kernel做完卷积后得到是一个Q行1列的矩阵,放在输出buffer第一列上,如下图:
再将输入矩阵的第1~P列取出放进输入buffer中(即把输入buffer中每列向前移一格,0列移出buffer,第P列放在最后1列),同上面一样计算,得到的依旧是1列数值放进输出buffer的第2列中。如下图:
依次这么做下去,当输出buffer里的最后一列被填满时,就要触发下一卷积层做卷积运算,与K个kernel卷积运算后得到的是一个K行1列的值放进下一卷积层输出buffer的第一列中。如下图:
由于下一卷积层的输出buffer未满,不能触发后面的运算。又回到从输入矩阵中取数据放进当前卷积层的输入buffer中,再进行当前卷积层和下一卷积层的运算,结果放在各自的输出buffer里(如输出buffer满了就要把每列左移一格,0列移出buffer,新生成的1列数据放在最后1列)。类似的处理,直到把输入矩阵中取到最后一列,再把各个层的输入buffer全处理完,最后得到结果。
从上面的思路看出,输入和输出buffer从大矩阵变成kernel大小的小矩阵可以省不少memory。具体软件实现时,有输入层,中间各层(包括卷积层等),每一层为一个整体,要用event机制去触发下一个要处理的层。当一层处理完后要判断下一步是哪一层做处理(有可能是下一层,也有可能是当前层或上一层,还有可能是输入层等),就给那一层发event,那一层收到event后就会继续处理。示意如下图:
软件实现时还有很多细节要处理,尤其是当输入层数据取完后后面各层的处理,这里就不一一细述了。软件调试时先用不省memory的原始code生成每层的输出,保存在各自的文件里,用于做比特校验。然后对省memory的code进行调试,先从第一层开始,一层一层的调试。优化后的代码每层的输出跟优化前的输出是完全一样的才算调试完成。
嵌入式设备上卷积神经网络推理时memory的优化的更多相关文章
- Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?
前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...
- 嵌入式设备上的 Linux 系统开发
转载:http://www.ibm.com/developerworks/cn/linux/embed/embdev/index.html 如果您刚接触嵌入式开发,那么大量可用的引导装载程序(bo ...
- MNIST数据集上卷积神经网络的简单实现(使用PyTorch)
设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图 两个卷积层, 第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1* ...
- 用Qemu模拟vexpress-a9 (七) --- 嵌入式设备上安装telnet服务
转载: http://blog.csdn.net/liuqz2009/article/details/6921789 Telnet协议是登陆远程网 络主机最简单的方法之一,只是安全性非常低.对targ ...
- 嵌入式设备上运行AllJoyn注意事项
1. 交叉编译AllJoyn库.编译成功后的文件位于:alljoyn-3.3.0-src\build\linux\arm\debug\dist\目录下: 2. 程序要使用AllJoyn,必须要启动al ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 轻量级卷积神经网络——MobileNet
谷歌论文题目: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 其他参考: CNN ...
- FFMPEG在嵌入式硬件上应用之 —— 基本环境搭建及编译
前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了.今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家 ...
- 在嵌入式设备中使用 JavaScript 的前景
by Conmajia PC上的JavaScript已经发展到ECMAScript 6(ES6),马上ES10都快出来了(虽然还是草案),但是硬件上的JS却很少听说.这几年手持设备/可穿戴设备的发展非 ...
随机推荐
- python virtualenv 基本使用
下载 pip install virtualenv 校验是否成功 virtualenv --version 使用 创建env环境 要写一个新项目,使用env先创建环境 cd xx\xx\xx\ # 进 ...
- Both Dolby Atmos driver and API need to be installed问题的一个解决方法
问题的原因在于缺少以下两个部分: Dolby Atmos driver:指你的声卡驱动中自带的杜比文件 如果驱动里没有,说明你的硬件可能不支持杜比,或者驱动太老没有包含杜比. Dolby Atmos ...
- SpringBoot配置文件(2)
六.配置文件加载 SpringBoot 启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 file:./co ...
- Js中函数式编程的理解
函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...
- Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)
一.Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使用稳定版本. 2.上传Nginx到Linux服务器. 3.安装依赖环 ...
- selenium自动化 | 实现抢课功能
# -*- coding: utf-8 -*-"""Created on Wed Jan 1 23:39:34 2020@author: billie程序运行环境要求:- ...
- Nginx 路由转发和反向代理 location 配置
Nginx 配置的三种方式 第一种直接替换 location 匹配部分 第二种 proxy_pass 的目标地址,默认不带 /,表示只代理域名,url 和参数部分不会变(把请求的 path 拼接到 p ...
- Linux 防火墙基于 CentOS7 的防火墙操作命令
防火墙服务操作命令 重启防火墙 systemctl restart firewalld 查看防火墙状态 systemctl status firewalld 开启.关闭.重启防火墙 # 开启 serv ...
- 【Shell】使用awk sed获取一行内容的两个值
突然有需求需要一个脚本,同时获取到每一行数据的两个值,下面做了一个例子模板,仅供记录参考 cat test.txt id=1,name=zclinux1 id=2,name=zclinux2 id= ...
- 华为刘腾:华为终端云Cassandra运维实践分享
点击此处观看完整活动视频 各位线上的嘉宾朋友大家好,我是来自华为消费者BG云服务部的刘腾,我今天给大家分享的主题是华为终端云Cassandra运维实践.和前面王峰老师提到的Cassandra在360中 ...