敞开生长之旅!这是我参与「日新方案 12 月更文挑战」的第3天,点击查看活动概况。

前语

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

1,核算渠道首要有两个目标:算力 \pi 和 带宽 \beta

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

核算强度上限 ImaxI_{max},上面两个目标相除得到核算渠道的核算强度上限。它描述了单位内存交换最多用来进行多少次核算,单位是 FLOPs/Byte

Imax=I_{max} = \frac {\pi }{\beta}

这儿所说的“内存”是广义上的内存。关于 CPU 而言指的便是真实的内存(RAM);而关于 GPU 则指的是显存。

2,和核算渠道的两个目标相照应,模型也有两个首要的反馈速度的直接目标:核算量 FLOPs 和访存量 MAC

  • 核算量(FLOPs):指的是输入单个样本(一张图画),模型完成一次前向传达所产生的浮点运算次数,即模型的时刻复杂度,单位是 FLOPs
  • 访存量(MAC):指的是输入单个样本(一张图画),模型完成一次前向传达所产生的内存交换总量,即模型的空间复杂度,单位是 Byte,由于数据类型一般为 float32,所以需求乘以 4CNN 网络中每个网络层 MAC 的核算分为读输入 feature map 巨细、权重巨细(DDR 读)和写输出 feature map 巨细(DDR 写)三部分。
  • 模型的核算强度 III=FLOPsMACI = \frac{FLOPs}{MAC},即核算量除以访存量后的值,表明此模型在核算进程中,每 Byte 内存交换到底用于进行多少次浮点运算。单位是 FLOPs/Byte。能够看到,模核算强度越大,其内存运用效率越高。
  • 模型的理论功能 PP :咱们最关心的目标,即模型在核算渠道上所能到达的每秒浮点运算次数(理论值)。单位是 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]+…w[0]*x[0] + … 视为一个乘法累加或 1MACC

留意相同 FLOPs 的两个模型其运转速度是会相差许多的,由于影响模型运转速度的两个重要因素只经过 FLOPs 是考虑不到的,比方 MACMemory Access Cost)和网络并行度;二是具有相同 FLOPs 的模型在不同的渠道上或许运转速度不一样。

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

卷积层 FLOPs 核算

卷积操作本质上是个线性运算,假设卷积核巨细持平且为 KK。这儿给出的公式写法是为了便利了解,大多数时分为了便利回忆,会写成比方 MACCs=HWK2CiCoMACCs = H \times W \times K^2 \times C_i \times C_o

  • FLOPs=(2CiK2−1)HWCoFLOPs=(2\times C_i\times K^2-1)\times H\times W\times C_o(不考虑bias)
  • FLOPs=(2CiK2)HWCoFLOPs=(2\times C_i\times K^2)\times H\times W\times C_o(考虑bias)
  • MACCs=(CiK2)HWCoMACCs=(C_i\times K^2)\times H\times W\times C_o(考虑bias)

CiC_i 为输入特征图通道数,KK 为过卷积核尺度,H,W,CoH,W,C_o 为输出特征图的高,宽和通道数二维卷积进程如下图所示:

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

神经网络模型复杂度分析

公式解释,参阅这儿,如下:

了解 FLOPs 的核算公式分两步。括号内是第一步,核算出output feature map 的一个 pixel,然后再乘以 HWCoH\times W\times C_o,然后拓展到整个 output feature map。括号内的部分又能够分为两步:(2CiK2−1)=(CiK2)+(CiK2−1)(2\times C_i\times K^2-1)=(C_i\times K^2) + (C_i\times K^2-1)。第一项是乘法运算次数,第二项是加法运算次数,由于 nn 个数相加,要加 n−1n-1次,所以不考虑 bias 的状况下,会有一个 -1,假如考虑 bias,刚好中和掉,括号内变为(2CiK2)(2\times C_i\times K^2)

所以卷积层的 FLOPs=(2CiK2−1)HWCoFLOPs=(2\times C_{i}\times K^2-1)\times H\times W\times C_o (CiC_i 为输入特征图通道数,KK 为过滤器尺度,H,W,CoH, W, C_o为输出特征图的高,宽和通道数)。

全衔接层的 FLOPs 核算

全衔接层的 FLOPs=(2I−1)OFLOPs = (2I − 1)OII 是输入层的维度,OO 是输出层的维度。

二,模型参数量剖析

模型参数数量(params):指模型含有多少参数,直接决议模型的巨细,也影响揣度时对内存的占用量,单位一般为 MGPU 端一般参数用 float32 表明,所以模型巨细是参数数量的 4 倍。这儿考虑的卷积核长宽是相同的一般状况,都为 K

模型参数量的剖析是为了了解内存占用状况,内存带宽其实比 FLOPs 更重要。现在的核算机结构下,单次内存拜访比单次运算慢得多的多。对每一层网络,端侧设备需求:

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

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

卷积层参数量

卷积层权重参数量 = CiK2Co+Co C_i\times K^2\times C_o + C_o

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

假设输入层矩阵维度是 96963,第一层卷积层运用尺度为 55、深度为 16 的过滤器(卷积核尺度为 55、卷积核数量为 16),那么这层卷积层的参数个数为 55316+16=1216个。

BN 层参数量

BN 层参数量 = 2Ci2\times C_i

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

全衔接层参数量

全衔接层参数量 = TiTo+TOT_i\times T_o + T_O

TiT_i 为输入向量的长度, ToT_o 为输出向量的长度,公式的第二项为偏置项参数量。(现在全衔接层现已逐渐被 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)得到。所以咱们能够将利用率界说为实践运用的运算才能和原始运算才能的比值,核算公式如下所示。

macutilization=usedOps/srawOPs/s=FLOPs/time(s)Raw_FLOPs(Raw_FLOPs=1.7Tat3519) mac\ utilization = \frac {used\ Ops/s}{raw\ OPs/s} = \frac {FLOPs/time(s)}{Raw\_FLOPs}(Raw\_FLOPs = 1.7T\ at\ 3519)

五,参阅资料

  • PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE
  • 神经网络参数量的核算:以UNet为例
  • How fast is my model?
  • MobileNetV1 & MobileNetV2 简介
  • 双精度,单精度和半精度
  • AI硬件的Computational Capacity详解
  • Roofline Model与深度学习模型的功能剖析