深度神经网络中的计算和内存带宽

深度神经网络中的计算和内存带宽

文章目录

  • 深度神经网络中的计算和内存带宽
    • 来源
    • 原理介绍
    • 分析1:线性层
    • 分析2:卷积层
    • 分析3:循环层
    • 总结

来源

相关知识来源于这里。


原理介绍

Memory bandwidth and data re-use in deep neural network computation can be estimated with a few simple simulations and calculations. Deep neural network computation requires the use of weight data and input data. Weights are neural network parameters, and input data (maps, activations) is the data you want to process from one layer to the next.

深度神经网络计算中的内存带宽(memory bandwidth)和数据重用(data reuse)可以通过一些简单的模拟计算来估计。深度神经网络计算需要使用权重数据输入数据权重数据是神经网络参数,输入数据(线性映射、非线性激活函数)是要从 一个神经网络层 传输到 下一个神经网络层 的数据。

In general, if a computation re-uses data, it will require less memory bandwidth. Re-use can be accomplished by:

  • sending more inputs to be processed by the same weights;
  • sending more weights to process the same inputs.

如果计算重用数据,则需要较少的内存带宽。可以通过以下方式实现重用:

  1. 发送更多输入,以由相同的权重进行处理;
  2. 发送更多权重以处理相同的输入;
  3. 如果没有输入或权重数据重用,则带宽对于给定应用程序处于最大值。

为什么“计算重用数据可以减小内存带宽”?这是我的理解:如果把 数据分布 作为横轴,数据的使用次数作为纵轴,那么就可以画出左边“高带宽”( 数据分布 广且数据使用次数低)以及右边“低带宽”( 数据分布 窄但数据使用次数高)的图。显然,当把数据“拆成”可重复利用的三份时, 数据分布 变窄且数据的使用次数自然提高,以便保证处理到所有的数据,因此可以右边是“低带宽”。

1

对于一个深度学习模型而言,可以用到的数据就是权重数据输入数据。所以减小内存带宽的策略就是对这两部分数据进行复用。复用权重数据就是频繁地把不同数据输入到一组权重数据中;复用输入数据就是频繁地把一组输入数据输入到不同权重数据中。最好的情况是同时复用权重数据输入数据(似乎有点困难)。最差的情况是同时都不复用权重数据输入数据,此时内存带宽达到最大值,类似于上图左半部分。


分析1:线性层

Here a weight matrix of M M M by M M M is used to process a vector of M M M values with b b b bits. Total data transferred is: b ( M + M 2 ) b(M+M^{2}) b(M+M2) or ≈ b M 2 \approx bM^{2} bM2 .

这里使用 M × M M\times M M×M 的权重矩阵来处理具有 b b b 位的 M M M 值向量。传输的数据总数为: b ( M + M 2 ) b(M+M^{2}) b(M+M2) ≈ b M 2 \approx bM^{2} bM2

这是在执行线性层操作时,需要移动或处理的数据总量。公式 b ( M + M 2 ) b(M+M^{2}) b(M+M2) 给出了在这个过程中涉及的总位数(即数据量)。 b M bM bM 表示向量的位数总和,因为向量有 M M M 个值,每个值 b b b 位。 b M 2 bM^{2} bM2 表示权重矩阵中所有元素的位数总和,因为矩阵有 b M 2 bM^{2} bM2 个元素,每个元素 b b b 位。

也就是说,线性矩阵层的计算包括矩阵计算计算结果传输两个步骤。矩阵计算本质就是矩阵乘法,必然是对矩阵内的所有元素进行计算;计算结果传输即是生成新的向量。此外,当模型比较大的时候, M M M 值较大,此时 M 2 M^{2} M2 远远大于 M M M ,那么就意味着传输的来源主要是矩阵计算中间变量

If the linear layer is used only for one vector, it will require to send the entire M 2 M^{2} M2 matrix of weights as computation occurs. If your system has T T T operations/second of performance, then the time to perform the computation is b M 2 T \frac{bM^{2}}{T} TbM2. Given than bandwidth B W = total data transferred / time BW = \text{total data transferred} / \text{time} BW=total data transferred/time , in case of linear layers B W = T BW = T BW=T.

如果线性层仅用于一个向量,则在进行计算时,它将需要发送整个 M 2 M^{2} M2 权重矩阵。如果系统具有 T T T 次操作/秒的性能,则执行计算的时间为 b M 2 T \frac{bM^{2}}{T} TbM2。给定带宽 B W = 传输的总数据 / 时间 BW= 传输的总数据 / 时间 BW=传输的总数据/时间 ,如果是线性层, B W = T BW = T BW=T

这就说明,对于一个网络模型全是线性矩阵的话,系统每秒能处理的计算操作越多,那么内存带宽就会越大

This means that if your system has 128 G-ops/s of performance, you will need a bandwidth of more than 128 GB/s to perform the operation at full system efficiency (provided, of course that the system can do this!).

如果系统具有 128 G-ops/s 的性能,您将需要超过 128 GB/s 的带宽才能以全系统效率执行线性矩阵计算操作(当然,前提是系统可以做到这一点!作者在这里提到“全效率”这个概念,主要是想表达,如果网络模型大部分是线性层、且只操作单个向量的话,一般是比较低效的。

Of course if you have multiple inputs for the same linear layer (multiple vectors that need to be multiplied by the same matrix) then: B W = T / B BW = T/B BW=T/B, where B B B is the number of vectors or Batch.

如果同一线性层有多个输入(需要乘以同一矩阵的多个矢量),那么 B W = T / B BW = T/B BW=T/B ,其中 B B B 是向量数或批次数。

当线性矩阵处理的不是一个向量而是一个矩阵的时候,相当于复用权重数据——频繁地把不同数据输入到一组权重数据中,相当于多个向量把内存带宽“拆解”了,从公式 B W = T / B BW = T/B BW=T/B 可以看出, B B B 越大内存带宽越小。我的理解是,transformer 中对一个序列 ( 1 × N ) (1\times N) (1×N) 进行嵌入处理,得到了维度比较高的矩阵 ( N × d e m b ) (N\times d_{emb}) (N×demb) ,这也是在降低 transformer 中的带宽。


分析2:卷积层

For convolution operation, the bandwidth requirements are usually lower, as an input map data can be used in several convolution operation in parallel, and convolution weights are relatively small.

对于卷积运算,内存带宽要求通常较低,因为输入图数据可以并行用于多个卷积运算,并且卷积权值相对较小。

For example: a 13 × \times × 13 pixel map in a 3 × \times × 3 convolution operation from 192 input maps to 192 output maps (as, for example, in Alexnet layer 3) requires: ≈ \approx 4MB weight data and ≈ \approx 0.1MB input data from memory. This may require about 3.2 GB/s to be performed on a 128 G-ops/s system with ≈ \approx 99% efficiency (SnowFlake Spring 2017 version). The bandwidth usage is low is because the same input data is used to compute 192 outputs, albeit with different small weight matrices.

从 192 个输入映射到 192 个输出映射(例如在 Alexnet 第 3 层中)的 3 × \times × 3 卷积运算中的 13 × \times × 13 像素映射需要: ≈ \approx 4MB 权重数据和 ≈ \approx 0.1MB 内存输入数据。这可能需要在 128 G-ops/s 系统上执行约 3.2 GB/s,效率约为 99%。带宽使用率较低是因为相同的输入数据用于计算 192 个输出,尽管具有不同的小权重矩阵。

每个输出像素需要进行一次完整的卷积运算,即九次乘加操作(对于 3 × \times × 3 滤波器)。
因此,对于一个输出特征映射,需要169(像素点) × \times × 9(操作/像素点)= 1,521次运算。
对于192个输出特征映射,总计算量为:1,521 × \times × 192 = 291,840次运算。
如果系统运行在128 G-ops/s(即128亿次运算/秒),那么执行291,840次运算大约需要:291,840 / (128 x 10^9)秒 ≈ 0.00228毫秒。可见是很高效的。


分析3:循环层

Memory bandwidth for recurrent neural networks is one of the highest. Deep Speech 2 system or similar use 4 RNN layers of 400 size (see here and here). Each layer uses the equivalent of 3 linear-layer-like matrix multiplications in a GRU model. During inference the input batch is only 1 or a small number, and thus running these neural network requires the highest amount of memory bandwidth, so high it usually it is not possible to fully utilize even efficient hardware at full utilization.

循环神经网络的内存带宽是最高的。Deep Speech 2 系统或类似系统使用 4 个 400 大小的 RNN 层。每层相当于 GRU 模型中 3 个线性层的矩阵乘法。在推理过程中,输入批次只有 1 个或很小的数字,因此运行这些神经网络需要的内存带宽最高,即使是高效硬件通常也无法充分利用。

我的理解是,RNN 系列的工作是串行的,意味着输入数据部分难复用;此外,GRU 或者 LSTM 的模型本身复杂,权重数据也很难复用。这就导致推理时硬件效率低下,占用内存带宽太高。


总结

2

This is the arithmetic intensity for our accelerator Snowflake. Arithmetic intensity is the number of operations performed on a byte of data. As you can see all neural network models tested perform at the maximum (roofline) efficiency of the device. On the other hand linear layers have very little data re-use and are limited by memory bandwidth constraints.

在加速器 Snowflake 下测试的算术强度。算术强度是对一个字节的数据进行运算的次数。 可以看到,所有测试过的神经网络模型都达到了设备的最高(顶线、极限情况)效率。线性层的数据重复利用率非常低,并且受到内存带宽的限制。顶端的 GoogleNet 、 AlexNet 和 Resnet-50 都是卷积层为主的网络,效率和复用率都是很高的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S32 Design Studio PE工具配置UART

配置操作 先得配置下GPIO用的是哪个引脚 跟之前的外设一样,它这里有两个UART可以用。 这里只能用UART0和2的原因是UART1被LIN使用了。 配置的内容为 生成代码对应 首先会根据components名称创建个驱动状态结构体 /*! Driver state structure */ lpuart_state_t …

程序媛的mac修炼手册-- 2024如何彻底卸载Python

啊,前段时间因为想尝试chatgpt的API,需要先创建一个python虚拟环境来安装OpenAI Python library. 结果,不出意外的出意外了,安装好OpenAI Python library后,因为身份认证问题,根本就没有获取API key的权限…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后,仅有手部表现不符合预期(多指,畸形等)。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作,重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

试卷打印如何去除答案?3个方法一键还原

试卷打印如何去除答案?在日常学习中,在打印试卷时,去除答案是一个常见的需求,特别是在学生复习或老师准备教学材料时。答案的存在可能会干扰学生的学习过程,或者使得试卷的重复使用变得困难。为了解决这个问题&#xf…

JWT学习笔记

了解 JWT Token 释义及使用 | Authing 文档 JSON Web Token Introduction - jwt.io JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。该 token 被设计为紧凑…

Another Redis Desktop Manager工具连接集群

背景:使用Another Redis Desktop Manager连接redsi集群 win10安装 使用 下载 某盘: 链接:https://pan.baidu.com/s/1dg9kPm9Av8-bbpDfDg9DsA 提取码:t1sm 使用

[c++] char * 和 std::string

1 char * 和 std::string 的区别 char * 字符串是常量字符串,不能修改;std::string 指向的字符串可以修改 实例代码如下图所示,s1 和 s2 均是常量字符串,字符串常量保存在只读数据区,是只读的,不能写&…

接口自动化测试用例如何设计

说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀,甚至出现“ 做平台的 &…

kafka生产者2

1.数据可靠 • 0:生产者发送过来的数据,不需要等数据落盘应答。 风险:leader挂了之后,follower还没有收到消息。。。。 • 1:生产者发送过来的数据,Leader收到数据后应答。 风险:leader应答…

Pyglet综合应用|推箱子游戏地图编辑器之图片跟随鼠标

目录 推箱子游戏 升级一:鼠标操作 升级二:增加网格 升级三:模拟按钮 综合应用:地图编辑器 关卡地图洗数 推箱子游戏 本篇为之前写的博客《Pyglet综合应用|推箱子游戏之关卡图片载入内存》的续篇,内容…

剪辑视频调色怎么让画质变得清晰 视频剪辑调色技巧有哪些方面 剪辑视频免费的软件有哪些 会声会影调色在哪里 会声会影模板素材

视频调色的作用有很多,除了进行风格化剪辑以外,还可以让作品的画质变得清晰。通过调色来增强画面的清晰度,在观感上也会显得十分自然。视频调色的技巧有很多,并且原理大都十分简单。有关剪辑视频调色怎么让画质变得清晰&#xff0…

Linux之部署前后端分离项目

Nginx配置安装 1.安装依赖 我们这里安装的依赖是有4个的 [rootlocalhost opt]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.上传解压安装包 [rootlocalhost opt]# tar -xvf nginx-1.13.7.tar.gz -C /usr/local/java/3.安装Nginx &#xff0…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程,主要包括准备环境、模型转换、编写代码和模型推理。 首先,确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK,它能对TensorFlow、PyTorch等框架训…

Windows系统搭建Elasticsearch引擎结合内网穿透实现远程连接查询数据

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎,它提供了一个分布式、多…

javaApI(Application Programming Interface)应用程序编程接口

ApI概念 Apl:指的是官方给开发人员提供的说明文档,对语言中有哪些类,类中有哪些方法进行说明 Objict 类 java.lang.Object 是java类体系结构中最顶层的类 Object可以表示java中任意的类 Object类中的方法 toString() 输出一个对象,但是…

适合新手博主站长使用的免费响应式WordPress博客主题JianYue

这款JianYue主题之所以命名为 JianYue,意思就是简单而不简约的。是根据Blogs主题优化而成,剔除了一些不必要的功能及排版,仅保留一种博客布局,让新手站长能够快速手上WordPress。可以说这款主题比较适合新手博主站长使用&#xff…

【Linux】部署前后端分离项目---(Nginx自启,负载均衡)

目录 前言 一 Nginx(自启动) 2.1 Nginx的安装 2.2 设置自启动Nginx 二 Nginx负载均衡tomcat 2.1 准备两个tomcat 2.1.1 复制tomcat 2.1.2 修改server.xml文件 2.1.3 开放端口 2.2 Nginx配置 2.2.1 修改nginx.conf文件 2.2.2 重启Nginx服务 2…

【MySQL】探索表结构、数据类型和基本操作

表、记录、字段 数据库的E-R(entity-relationship,实体-关系)模型中有三个主要概念: 实体集 、 属性 、 关系集 。 一个实体集对应于数据库中的一个表,一个实体则对应于数据库表 中的一行,也称为一条记录。…

adb-连接模拟器和真机操作

目录 1. 连接模拟器(夜神模拟器示例) 1.1 启动并连接模拟器 1.2 开启调试模式 2. USB连接真机调试 2.1 usb数据线连接好电脑,手机打开调试模式 2.2 输入adb devices检测手机 3. Wifi连接真机调试 3.1 USB连接手机和电脑 3.2 运行 adb…

12 Autosar_SWS_MemoryMapping.pdf解读

AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费:不同类型的变量,为了对齐造成的空间两份; 1.2 特殊RAM的用途:比如一些变量通过位掩码来获取,如果map到特定RAM可以通过编译器的位掩码…