B-神经网络模型复杂度分析

news2024/12/25 13:17:49

B-神经网络模型复杂度分析

  • 前言
  • 一,模型计算量分析
    • 卷积层 FLOPs 计算
    • 全连接层的 FLOPs 计算
  • 二,模型参数量分析
    • 卷积层参数量
    • BN 层参数量
    • 全连接层参数量
  • 三,模型内存访问代价计算
    • 卷积层 MAC 计算
  • 四,一些概念
    • 双精度、单精度和半精度
    • 浮点计算能力
    • 硬件利用率(Utilization)
  • 五,参考资料

前言

现阶段的轻量级模型 MobileNet/ShuffleNet 系列、CSPNet、RepVGG、VoVNet 等都必须依赖于于具体的计算平台(如 CPU/GPU/ASIC 等)才能更完美的发挥网络架构。

1,计算平台主要有两个指标:算力 π和 带宽 β。

  • 算力指的是计算平台每秒完成的最大浮点运算次数,单位是 FLOPS
  • 带宽指的是计算平台一次每秒最多能搬运多少数据(每秒能完成的内存交换量),单位是 Byte/s

计算强度上限 Imax,上面两个指标相除得到计算平台的计算强度上限。它描述了单位内存交换最多用来进行多少次计算,单位是 FLOPs/Byte

Imax=πβ

这里所说的“内存”是广义上的内存。对于 CPU 而言指的就是真正的内存(RAM);而对于 GPU 则指的是显存。

2,和计算平台的两个指标相呼应,模型也有两个主要的反馈速度的间接指标:计算量 FLOPs 和访存量 MAC

  • 计算量(FLOPs):指的是输入单个样本(一张图像),模型完成一次前向传播所发生的浮点运算次数,即模型的时间复杂度,单位是 FLOPs
  • 访存量(MAC):指的是输入单个样本(一张图像),模型完成一次前向传播所发生的内存交换总量,即模型的空间复杂度,单位是 Byte,因为数据类型通常为 float32,所以需要乘以 4CNN 网络中每个网络层 MAC 的计算分为读输入 feature map 大小、权重大小(DDR 读)和写输出 feature map 大小(DDR 写)三部分。
  • 模型的计算强度 I :I=FLOPsMAC,即计算量除以访存量后的值,表示此模型在计算过程中,每 Byte 内存交换到底用于进行多少次浮点运算。单位是 FLOPs/Byte。可以看到,模计算强度越大,其内存使用效率越高。
  • 模型的理论性能 P :我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 FLOPS or FLOP/sRoof-line Model 给出的就是计算这个指标的方法。

3,Roofline 模型讲的是程序在计算平台的算力和带宽这两个指标限制下,所能达到的理论性能上界,而不是实际达到的性能,因为实际计算过程中还有除算力和带宽之外的其他重要因素,它们也会影响模型的实际性能,这是 Roofline Model 未考虑到的。例如矩阵乘法,会因为 cache 大小的限制、GEMM 实现的优劣等其他限制,导致你几乎无法达到 Roofline 模型所定义的边界(屋顶)。

所谓 “Roof-line”,指的就是由计算平台的算力和带宽上限这两个参数所决定的“屋顶”形态,如下图所示。

  • 算力决定“屋顶”的高度(绿色线段)
  • 带宽决定“房檐”的斜率(红色线段)

Roof-line 划分出的两个瓶颈区域定义如下:

个人感觉如果在给定计算平台上做模型部署工作,因为芯片的算力已定,工程师能做的主要工作应该是提升带宽。

一,模型计算量分析

终端设备上运行深度学习算法需要考虑内存和算力的需求,因此需要进行模型复杂度分析,涉及到模型计算量(时间/计算复杂度)和模型参数量(空间复杂度)分析。

为了分析模型计算复杂度,一个广泛采用的度量方式是模型推断时浮点运算的次数 (FLOPs),即模型理论计算量,但是,它是一个间接的度量,是对我们真正关心的直接度量比如速度或者时延的一种近似估计。

本文的卷积核尺寸假设为为一般情况,即正方形,长宽相等都为 K

  • FLOPs:floating point operations 指的是浮点运算次数,理解为计算量,可以用来衡量算法/模型时间的复杂度。
  • FLOPS:(全部大写),Floating-point Operations Per Second,每秒所执行的浮点运算次数,理解为计算速度,是一个衡量硬件性能/模型速度的指标。
  • MACCs:multiply-accumulate operations,乘-加操作次数,MACCs 大约是 FLOPs 的一半。将 w[0]∗x[0]+... 视为一个乘法累加或 1 个 MACC

注意相同 FLOPs 的两个模型其运行速度是会相差很多的,因为影响模型运行速度的两个重要因素只通过 FLOPs 是考虑不到的,比如 MACMemory Access Cost)和网络并行度;二是具有相同 FLOPs 的模型在不同的平台上可能运行速度不一样。

注意,网上很多文章将 MACCs 与 MACC 概念搞混,我猜测可能是机器翻译英文文章不准确的缘故,可以参考此链接了解更多。需要指出的是,现有很多硬件都将乘加运算作为一个单独的指令

卷积层 FLOPs 计算

卷积操作本质上是个线性运算,假设卷积核大小相等且为 K。这里给出的公式写法是为了方便理解,大多数时候为了方便记忆,会写成比如 MACCs=H×W×K2×Ci×Co。

  • FLOPs=(2×Ci×K2−1)×H×W×Co(不考虑bias)
  • FLOPs=(2×Ci×K2)×H×W×Co(考虑bias)
  • MACCs=(Ci×K2)×H×W×Co(考虑bias)

Ci 为输入特征图通道数,K 为过卷积核尺寸,H,W,Co 为输出特征图的高,宽和通道数二维卷积过程如下图所示:

二维卷积是一个相当简单的操作:从卷积核开始,这是一个小的权值矩阵。这个卷积核在 2 维输入数据上「滑动」,对当前输入的部分元素进行矩阵乘法,然后将结果汇为单个输出像素。

公式解释,参考这里,如下:

理解 FLOPs 的计算公式分两步。括号内是第一步,计算出output feature map 的一个 pixel,然后再乘以 H×W×Co,从而拓展到整个 output feature map。括号内的部分又可以分为两步:(2×Ci×K2−1)=(Ci×K2)+(Ci×K2−1)。第一项是乘法运算次数,第二项是加法运算次数,因为 n 个数相加,要加 n−1次,所以不考虑 bias 的情况下,会有一个 -1,如果考虑 bias,刚好中和掉,括号内变为(2×Ci×K2)。

所以卷积层的 FLOPs=(2×Ci×K2−1)×H×W×Co (Ci 为输入特征图通道数,K 为过滤器尺寸,H,W,Co为输出特征图的高,宽和通道数)。

全连接层的 FLOPs 计算

全连接层的 FLOPs=(2I−1)O,I 是输入层的维度,O 是输出层的维度。

二,模型参数量分析

模型参数数量(params):指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量,单位通常为 MGPU端通常参数用 float32 表示,所以模型大小是参数数量的 4 倍。这里考虑的卷积核长宽是相同的一般情况,都为 K

模型参数量的分析是为了了解内存占用情况,内存带宽其实比 FLOPs 更重要。目前的计算机结构下,单次内存访问比单次运算慢得多的多。对每一层网络,端侧设备需要:

  • 从主内存中读取输入向量 / feature map
  • 从主内存中读取权重并计算点积;
  • 将输出向量或 feature map 写回主内存。

MAes:memory accesse,内存访问次数。

卷积层参数量

卷积层权重参数量 = Ci×K2×Co+Co。

Ci 为输入特征图通道数,K 为过滤器(卷积核)尺寸,Co 为输出的特征图的 channel 数(也是 filter 的数量),算式第二项是偏置项的参数量 。(一般不写偏置项,偏置项对总参数量的数量级的影响可以忽略不记,这里为了准确起见,把偏置项的参数量也考虑进来。)

假设输入层矩阵维度是 96×96×3,第一层卷积层使用尺寸为 5×5、深度为 16 的过滤器(卷积核尺寸为 5×5、卷积核数量为 16),那么这层卷积层的参数个数为 5×5×3×16+16=1216个。

BN 层参数量

BN 层参数量 = 2×Ci。

其中 Ci 为输入的 channel 数(BN层有两个需要学习的参数,平移因子和缩放因子)

全连接层参数量

全连接层参数量 = Ti×To+TO。

Ti 为输入向量的长度, To 为输出向量的长度,公式的第二项为偏置项参数量。(目前全连接层已经逐渐被 Global Average Pooling层取代了。) 注意,全连接层的权重参数量(内存占用)远远大于卷积层。

三,模型内存访问代价计算

MAC(memory access cost) 内存访问代价也叫内存使用量,指的是输入单个样本(一张图像),模型/卷积层完成一次前向传播所发生的内存交换总量,即模型的空间复杂度,单位是 Byte

CNN 网络中每个网络层 MAC 的计算分为读输入 feature map 大小(DDR 读)、权重大小(DDR 读)和写输出 feature map 大小(DDR 写)三部分。

卷积层 MAC 计算

以卷积层为例计算 MAC,可假设某个卷积层输入 feature map 大小是 (Cin, Hin, Win),输出 feature map 大小是 (Hout, Wout, Cout),卷积核是 (Cout, Cin, K, K),理论 MAC(理论 MAC 一般小于 实际 MAC)计算公式如下:

 
# 端侧推理IN8量化后模型,单位一般为 1 byte
input = Hin x Win x Cin # 输入 feature map 大小
output = Hout x Wout x Cout # 输出 feature map 大小
weights = K x K x Cin x Cout + bias # bias 是卷积层偏置
ddr_read = input + weights
ddr_write = output
MAC = ddr_read + ddr_write

feature map 大小一般表示为 (N, C, H, W),MAC 指标一般用在端侧模型推理中,端侧模型推理模式一般都是单帧图像进行推理,即 N = 1(batch_size = 1),不同于模型训练时的 batch_size 大小一般大于 1。

四,一些概念

双精度、单精度和半精度

CPU/GPU 的浮点计算能力得区分不同精度的浮点数,分为双精度 FP64、单精度 FP32 和半精度 FP16。因为采用不同位数的浮点数的表达精度不一样,所以造成的计算误差也不一样,对于需要处理的数字范围大而且需要精确计算的科学计算来说,就要求采用双精度浮点数,而对于常见的多媒体和图形处理计算,32 位的单精度浮点计算已经足够了,对于要求精度更低的机器学习等一些应用来说,半精度 16 位浮点数就可以甚至 8 位浮点数就已经够用了。
对于浮点计算来说, CPU 可以同时支持不同精度的浮点运算,但在 GPU 里针对单精度和双精度就需要各自独立的计算单元。

浮点计算能力

FLOPS:每秒浮点运算次数,每秒所执行的浮点运算次数,浮点运算包括了所有涉及小数的运算,比整数运算更费时间。下面几个是表示浮点运算能力的单位。我们一般常用 TFLOPS(Tops) 作为衡量 NPU/GPU 性能/算力的指标,比如海思 3519AV100 芯片的算力为 1.7Tops 神经网络运算性能。

  • MFLOPS(megaFLOPS):等于每秒一佰万(=10^6)次的浮点运算。
  • GFLOPS(gigaFLOPS):等于每秒拾亿(=10^9)次的浮点运算。
  • TFLOPS(teraFLOPS):等于每秒万亿(=10^12)次的浮点运算。
  • PFLOPS(petaFLOPS):等于每秒千万亿(=10^15)次的浮点运算。
  • EFLOPS(exaFLOPS):等于每秒百亿亿(=10^18)次的浮点运算。

硬件利用率(Utilization)

在这种情况下,利用率(Utilization)是可以有效地用于实际工作负载的芯片的原始计算能力的百分比。深度学习和神经网络使用相对数量较少的计算原语(computational primitives),而这些数量很少的计算原语却占用了大部分计算时间。矩阵乘法(MM)和转置是基本操作。MM 由乘法累加(MAC)操作组成。OPs/s(每秒完成操作的数量)指标通过每秒可以完成多少个 MAC(每次乘法和累加各被认为是 1 个 operation,因此 MAC 实际上是 2 个 OP)得到。所以我们可以将利用率定义为实际使用的运算能力和原始运算能力的比值:

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

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

相关文章

数苹果-第12届蓝桥杯Scratch选拔赛真题精选

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第91讲。 蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选…

【Android】Fragment使用

使用Fragment 我们可以把页面结构划分成几块,每块使用一个Fragment来管理。这样我们可以更加方便的在运行过程中动态地更新Activity中的用户界面,日后迭代更新、维护也是更加方便。 Fragment并不能单独使用,他需要嵌套在Activity 中使用&…

Redis最佳实践(上)

引言 尽管 redis 是一款非常优秀的 NoSQL 数据库,但更重要的是,作为使用者我们应该学会在不同的场景中如何更好的使用它,更大的发挥它的价值。主要可以从这四个方面进行优化:Redis键值设计、批处理优化、服务端优化、集群配置优化…

某些设置由你的组织来管理

今天莫名其妙Windows更新出现:*某些设置由你的组织来管理 我们来看看如何恢复吧。 根据上面的图片我们可以知道, 可查看配置的更新策略: 可以看到设备设置的策略有下面几个: 解决方案 这个时候我们就要进入设置更改那些策略即…

Java企业微信对接(二)微信端回调到企业端

准备工作 先下载demo 下载完成后的目录,把这些类之间copy到工程里面就行,都是封装好的加密算法 回调配置 什么时候需要回调 在集成企业微信与内部系统时,我们往往需要搭建一个回调服务。回调服务,可以实现: 自定义丰富的服务行为。比如,用户向应用发消息时,识别消…

RNA-seq 详细教程:count 数据探索(4)

学习目标 了解 RNA-seq count 数据的特征比较 count 数据的不同数学模型确定最适合 RNA-seq count 数据的模型了解设置生物学重复对于鉴定样本间差异的好处1. 计数矩阵 当开始差异表达基因分析时,先从一个矩阵开始,该矩阵总结了数据集每个样本中的基因水…

ZMQ请求应答模式之无中间件的可靠性--自由者模式

一、引言 我们讲了那么多关于中间件的示例,好像有些违背“ZMQ是无中间件”的说法。但要知道在现实生活中,中间件一直是让人又爱又恨的东西。实践中的很多消息架构能都在使用中间件进行分布式架构的搭建,所以说最终的决定还是需要你自己去权衡…

3.8、集线器与交换机的区别

1、早期总线型以太网 最初使用粗同轴电缆作为传输媒体,后来是用相对便宜的细同轴电缆 普遍认为有源器件不可靠,无缘的电缆线最可靠(并没有那么可靠) 2、只用双绞线和集线器 HUB 的星型以太网 主机中的以太网卡及集线器个接口使…

Old money风盛行,柯罗芭KLOVA演绎中式奢华

Ralph Lauren先生说过:“奢侈是一种感性的生活方式。它和本季推出什么新品无关。它更关乎个人风格和舒适、轻松的环境。奢侈品是质量和永恒的优雅”。Ralph lauren以一己之力托起Old money风格的半壁江山,它属于带着一丝上流社会的雅痞绅士,优…

一起学时序分析之建立/保持时间裕量

何为裕量? 裕量,英文名称叫做“Slack”。我们在Vivado实现后的报告中常常能看到这样一栏: 因为都是缩写,所以我们来解释一下前四栏的含义: WNS,即Worst Negative Slack,最差负时序裕量。这个表…

leetcode:1579. 保证图可完全遍历【并查集思路】

目录题目截图题目分析ac code总结题目截图 题目分析 从删除比较难,考虑增加增加的过程中无用的边就可以删除考虑alice和bob各自的联通分量最后希望都是1,一开始都是n如果将两个独立的联通分量连起来了,那么连通分量个数减1这里很明显就是用并…

kubernetes-Pod详解2

kubernetes-Pod详解2 文章目录kubernetes-Pod详解2Pod生命周期创建和终止pod的创建过程pod的终止过程初始化容器钩子函数容器探测方式一:Exec方式二:TCPSocket方式三:HTTPGet重启策略Pod调度定向调度NodeSelector亲和性调度NodeAffinityPodAf…

Kamiya丨Kamiya艾美捷AREG酶联免疫吸附试验原理

Kamiya艾美捷AREG酶联免疫吸附试验预期用途: 该试剂盒是一种用于体外定量测量大鼠AREG的夹心酶免疫测定法血清、血浆和其他生物流体。仅供研究使用。不用于诊断程序。 存储: 所有试剂应按照小瓶上的标签保存。校准器、检测试剂A、检测试剂B和96孔带板应…

ZMQ之高可靠对称节点--双子星模式

一、概览 双子星模式是一对具有主从机制的高可靠节点。任一时间,某个节点会充当主机,接收所有客户端的请求;另一个则作为一种备机存在。两个节点会互相监控对方,当主机从网络中消失时,备机会替代主机的位置。 双子星模…

gateway网关聚合knife4j文档,同时兼容swagger2与swagger3

基于前两篇文章,进行整合 springcloud-gateway 聚合swagger3请求接口丢失appliactionName解决 springcloud-gateway聚合knife4j接口文档 为何要兼容?微服务开发者有的使用了swagger2版本,有的使用了swagger3版本,但暴露外部给前…

聊一聊我的第一个开源项目

项目地址:https://github.com/kpretty/hdd 我在21年的国庆写过一篇文章:《Docker 实战:部署hadoop集群》,当时也是刚接触docker,作为docker第一个练手项目对很多概念理解的不是很到位,因此那篇文章所使用的…

基于PHP+MySQL菜品食谱美食网站的设计与实现

美食是人类永恒的追求,现在有很多的美食爱好者,他们希望通过自己的各种方式来学习更多的美食制作方式,以及分享自己制作美食的一些过程,说让更多的人。享受到更加美味可口的饭菜。本系统也是基于这样的目的来进行开发的。 本系统是通过PHP:MySQL来进行开发,主要实现…

存储器扩展,画图题

目录 存储器与CPU的接口 地址线的连接 数据线的连接 控制线的连接(读写和片选) 考题 引出 第一题 第二题 第三题 计算地址范围(这里用的38译码器) 第四题 填空题 第五题 第六题(2017) 要求&…

【微信小程序】CSS模块化、使用缓存在本地模拟服务器数据库

🏆今日学习目标:第十五期——CSS模块化、使用缓存在本地模拟服务器数据库 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:25分钟 🎉专栏系列:我的第一个微信小程序 文…

【这款神器可以有】3DMAX一键墙体门洞窗洞插件使用教程

3DMAX一键墙体门洞窗洞插件,只需导入户型图,单/双面墙体一键生成。 【主要功能】 --一键生成墙体 --一键门洞 --一键窗洞 --支持单/双面墙体生成 【安装方法】 无需安装,直接拖动插件脚本到3dmax窗口即可打开插件。 【快速开始】 将3dm…