使用Roofline Model 进行深度学习模型的性能分析

转载请注明作者和出处: http://blog.csdn.net/john_bh/

PPT下载链接:https://pan.baidu.com/s/1jJhZDv4 密码:riye

分享视频回放链接:Momenta Paper Reading 第二季

文章目录

  • 1.计算平台的两个指标:算力 π \pi π 与带宽 β \beta β
  • 2. 模型的两个指标:计算量 与 访存量
  • 3. Roof-line Model
    • 3.1 Roof-line 的形态
    • 3.2 Roof-line 划分出的两个瓶颈区域
  • 4. 模型实例分析
    • 4.1 VGG16
    • 4.2 MobileNet
    • 4.3 两个模型在 1080Ti 上的对比
  • QA

在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等)才能展现自己的实力。此时,模型和计算平台的"默契程度"会决定模型的实际表现。Roofline Model 提出了使用 Operational Intensity(计算强度)进行定量分析的方法,并给出了模型在计算平台上所能达到理论计算性能上限公式。

1.计算平台的两个指标:算力 π \pi π 与带宽 β \beta β

  • 算力 π \pi π :也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数。单位是FLOP/s。

π : M a x i m u m   F L O P s   P e r   S e c o n d \pi: Maximum\ FLOPs\ Per\ Second π:Maximum FLOPs Per Second

  • 带宽 β \beta β :也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量。单位是Byte/s。
    β : M a x i m u m   M e m o r y   A c c e s s   P e r   S e c o n d \beta:Maximum\ Memory\ Access\ Per\ Second β:Maximum Memory Access Per Second
  • 计算强度上限 I m a x I_{max} Imax :两个指标相除即可得到计算平台的计算强度上限。它描述的是在这个计算平台上,单位内存交换最多用来进行多少次计算。单位是 F L O P / B y t e FLOP/Byte FLOP/Byte

I m a x = π β I_{max}=\frac{\pi}{\beta} Imax=βπ

注:这里所说的“内存”是广义上的内存。对于CPU计算平台而言指的就是真正的内存;而对于GPU计算平台指的则是显存。

2. 模型的两个指标:计算量 与 访存量

  • 计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度。单位是FLOPS。(FLOPS指的是每秒浮点运算数,而FLOPs指的是浮点运算数,前者描述的是计算速度,后者描述的是计算量。)
    C o n v   L a y e r   T i m e   C o m p l e x i t y : M 2 ⋅ K 2 ⋅ C i n ⋅ C o u t    ( F L O P S ) Conv\ Layer\ Time\ Complexity: M^2\cdot K^2\cdot C_{in}\cdot C_{out} \ \ (FLOPS) Conv Layer Time Complexity:M2K2CinCout  (FLOPS)

  • 访存量:指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。在理想情况下(即不考虑片上缓存),模型的访存量就是模型各层权重参数的内存占用(Kernel Mem)与每层所输出的特征图的内存占用(Output Mem)之和。单位是 B y t e Byte Byte。由于数据类型通常为 f l o a t 32 float32 float32 ,因此需要乘以四。
    C o n v   L a y e r   S p a c e   C o m p l e x i t y : ( K 2 ⋅ C i n ⋅ C o u t + M 2 ⋅ C o u t ) ⋅ 4    ( B y t e s ) Conv\ Layer\ Space\ Complexity: (K^2\cdot C_{in}\cdot C_{out}+M^2\cdot C_{out})\cdot 4 \ \ (Bytes) Conv Layer Space Complexity:(K2CinCout+M2Cout)4  (Bytes)

  • 模型的计算强度 I I I :由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每 B y t e Byte Byte内存交换到底用于进行多少次浮点运算。单位是 F L O P / B y t e FLOP/Byte FLOP/Byte。可以看到,模计算强度越大,其内存使用效率越高。

  • 模型的理论性能 P P P :我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 F L O P / s FLOP/s FLOP/s。下面我们即将介绍的 Roof-line Model 给出的就是计算这个指标的方法。终于可以进入正题了。

3. Roof-line Model

其实 Roof-line Model 说的是很简单的一件事:模型在一个计算平台的限制下,到底能达到多快的浮点计算速度。更具体的来说,Roof-line Model 解决的,是“计算量为A且访存量为B的模型在算力为C且带宽为D的计算平台所能达到的理论性能上限E是多少”这个问题。

3.1 Roof-line 的形态

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

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

使用Roofline Model 进行深度学习模型的性能分析_第1张图片

3.2 Roof-line 划分出的两个瓶颈区域

在这里插入图片描述
计算瓶颈区域 Compute-Bound
不管模型的计算强度 I I I 有多大,它的理论性能 P P P 最大只能等于计算平台的算力 π \pi π 。当模型的计算强度 I I I 大于计算平台的计算强度上限 I m a x I_{max} Imax 时,模型在当前计算平台处于 Compute-Bound状态,即模型的理论性能 P P P受到计算平台算力 π \pi π 的限制,无法与计算强度 I I I成正比。但这其实并不是一件坏事,因为从充分利用计算平台算力的角度上看,此时模型已经 100 % 100\% 100% 的利用了计算平台的全部算力。可见,计算平台的算力 π \pi π越高,模型进入计算瓶颈区域后的理论性能 P P P也就越大。

带宽瓶颈区域 Memory-Bound
当模型的计算强度 I I I 小于计算平台的计算强度上限 I m a x I_{max} Imax 时,由于此时模型位于“房檐”区间,因此模型理论性能 P P P 的大小完全由计算平台的带宽上限 β \beta β (房檐的斜率)以及模型自身的计算强度 I I I所决定,因此这时候就称模型处于 Memory-Bound 状态。可见,在模型处于带宽瓶颈区间的前提下,计算平台的带宽 β \beta β 越大(房檐越陡),或者模型的计算强度 I I I越大,模型的理论性能 P P P可呈线性增长。

4. 模型实例分析

下面让我们先分别给出 VGG16 和 MobileNet 的计算量和访存量统计表格,然后再用 Roof-line Model 理论来对比分析一下.

FLOPs统计的是float的乘加操作的次数,下表中对卷积操作FLOPs的统计是否应该在现有值的基础上乘以2,以表示乘和加操作呢?根据表中的数据,应该是没有乘以2的。
严格来说一次乘加操作是2flops。只是大家在讨论的时候有的时候说的是“乘和加”的次数,有的时候把乘加看作一个操作(FMA)来讨论次数,所以有些混淆。本文表格确实没有乘2,严格来说如果单位是flops,应该乘2

4.1 VGG16

使用Roofline Model 进行深度学习模型的性能分析_第2张图片

计算VGG6的FLOPS及参数量时,为什么没有考虑卷积的bias?
严谨的来说是要计算的,为了简单就没有统计哈,毕竟bias的数量级太小

VGG 可以说是在计算强度上登峰造极的一个模型系列,简约不简单。以 VGG16 为例,从上表可以看到,仅包含一次前向传播的计算量就达到了 15GFLOPs,如果包含反向传播,则需要再乘二。访存量则是 Kernel Mem 和 Output Mem 之和再乘以四,大约是 600MB。因此 VGG16 的计算强度就是 25 FLOP/Byte

另外如果把模型顶端那两个硕大无比的全链接层(其参数量占整个模型的80%以上)替换为GAP以降低访存量(事实证明这样修改并不会影响准确率),那么它的实际计算强度可以再提升四倍以上,简直突破天际。

注:以上分析仅限于前向传播计算过程(即模型预测)。如果涵盖反向传播(即模型训练),则计算量和访存量都要考虑梯度更新的具体方式,例如计算 Momentum 几个变量时引入的时间和空间复杂度。

4.2 MobileNet

使用Roofline Model 进行深度学习模型的性能分析_第3张图片

BN层的FLOPS 为啥是0?
这里为了简化就没有统计哈~不过实际部署模型的时候都会使用fused bn,将BN吸收进前面的卷积层了,所以计算量确实是零。

MobileNet 是以轻量著称的小网络代表。相比简单而庞大的 VGG16 结构,MobileNet 的网络更为细长,加入了大量的BN,每一层都通过 DW + PW 的方式降低了计算量,同时也付出了计算效率低的代价。从上面超级长的表格就能有一个感性的的认识。

MobileNet 的计算量只有大约 0.5 GFLOPS(VGG16 则是 15 GFLOPS),其访存量也只有 74 MB(VGG16 则是约 600 MB)。这样看上去确实轻量了很多,但是由于计算量和访存量都下降了,而且相比之下计算量下降的更厉害,因此 MobileNet 的计算强度只有 7 FLOP/Byte。

4.3 两个模型在 1080Ti 上的对比

作为性价比之王的 1080Ti,我们的两个模型 VGG16 和 MobileNet 的性能将分别位于这个计算平台 Roof-line Model 的什么位置呢?

  • 1080Ti 的算力 π = 11.3 T F L O P / s \pi = 11.3TFLOP/s π=11.3TFLOP/s
  • 1080Ti 的带宽 β = 484 G B / s \beta = 484 GB/s β=484GB/s
  • 1080Ti 计算平台的最大计算强度 I m a x ≈ 24 I_{max} \approx 24 Imax24
  • VGG16的计算强度 I V ≈ 25 I_{V} \approx 25 IV25
  • MobileNet 的计算强度 I V ≈ 7 I_{V} \approx 7 IV7
    使用Roofline Model 进行深度学习模型的性能分析_第4张图片

由上图可以非常清晰的看到,

  • MobileNet 处于 Memory-Bound 区域。在 1080Ti 上的理论性能只有 3.3 TFLOP/s。
  • VGG16 刚好迈入 Compute-Bound 区域。完全利用 1080Ti 的全部算力

虽然 MobileNet 进行前向传播的计算量只有 VGG 的三十分之一,但是由于计算平台的带宽限制,它不能像 VGG 那样完全利用 1080Ti 这个计算平台的全部算力,因此它在 1080Ti 上每秒钟可以进行的浮点运算数只能达到 VGG 的 30%,因此理论上的运行速度大约是 VGG 的十倍(实际上会因为各方面其他因素的限制而使得差别更小)。

MobileNet 这类小型网络更适合运行在嵌入式平台之上。首先这类轻量级的计算平台根本就放不下也运行不起来 VGG 这种大模型。更重要的是,由于这类计算平台本身的计算强度上限就很低,可能比 MobileNet 的计算强度还要小,因此 MobileNet 运行在这类计算平台上的时候,它就不再位于 Memory-Bound 区域,而是农奴翻身把歌唱的进入了 Compute-Bound 区域,此时 MobileNet 和 VGG16 一样可以充分利用计算平台的算力,而且内存消耗和计算量都小了一两个数量级,同时分类准确率只下降了1%,所以大家才愿意用它。

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

QA

  1. 对于不同的计算平台算力和带宽一般可以通过什么方法获得? 查官网的tech spec就好了

参考链接:Roofline Model与深度学习模型的性能分析

你可能感兴趣的:(模型优化,Roofline,Roofline,model,深度学习,深度学习模型性能分析,模型性能分析)