原文链接: https://zhuanlan.zhihu.com/p/34204282

最近在不同的计算平台上验证几种经典深度学习模型的训练和预测性能时,经常遇到模型的实际测试性能表现和自己计算出的复杂度并不完全吻合的现象,令人十分困惑。机缘巧合听了Momenta的技术分享后,我意识到问题的答案其实就在于 Roof-line Model 这个理论,于是认真研究了一下相关论文。现在把自己的心得总结出来,分享给大家。

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

有了 Roofline Model,我就可以知道模型在机器上能跑多快喽~做梦都会笑出声来~


1. 计算平台的两个指标:算力 与带宽

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

  • 带宽 :也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量。单位是Byte/s

  • 计算强度上限 :两个指标相除即可得到计算平台的计算强度上限。它描述的是在这个计算平台上,单位内存交换最多用来进行多少次计算。单位是FLOP/Byte

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


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

  • 计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度。单位是FLOPS。其中卷积层的计算量公式如下(具体分析详见我的另一篇文章

  • 访存量:指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。在理想情况下(即不考虑片上缓存),模型的访存量就是模型各层权重参数的内存占用(Kernel Mem)与每层所输出的特征图的内存占用(Output Mem)之和。单位是Byte。由于数据类型通常为float32 ,因此需要乘以四。

  • 模型的计算强度 由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOP/Byte。可以看到,模计算强度越大,其内存使用效率越高。
  • 模型的理论性能 我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 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”,指的就是由计算平台的算力和带宽上限这两个参数所决定的“屋顶”形态,如下图所示。

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



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

计算瓶颈区域 Compute-Bound

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

带宽瓶颈区域 Memory-Bound

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


4. 模型实例分析

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

4.1 VGG16


VGG-16

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

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

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

4.2 MobileNet


MobileNet V1

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

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

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

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

  • 1080Ti 的算力
  • 1080Ti 的带宽
  • 因此 1080Ti 计算平台的最大计算强度
  • VGG16 的计算强度
  • MobileNet 的计算强度


Roof-line Model : VGG16 vs MobileNet

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

  • 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 模型所定义的边界(屋顶)。


5. 结语

本文系统的介绍了:

  • 计算平台的两个指标:算力和带宽。
  • 模型的两个指标:计算量和访存量。
  • 使用 Roof-line Model 分析模型在计算平台上所能达到的理论计算性能,并分析模型在计算平台上的两种互斥状态:计算受限状态和带宽受限状态。
  • 以 VGG16 和 MobileNet 为例,在 1080Ti 计算平台上分析对比它们的计算性能。

欢迎大家指正。

Roofline Model与深度学习模型的性能分析的更多相关文章

  1. 『高性能模型』Roofline Model与深度学习模型的性能分析

    转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...

  2. 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解

    用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...

  3. Predicting effects of noncoding variants with deep learning–based sequence model | 基于深度学习的序列模型预测非编码区变异的影响

    Predicting effects of noncoding variants with deep learning–based sequence model PDF Interpreting no ...

  4. Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)

    概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...

  5. CUDA上深度学习模型量化的自动化优化

    CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...

  6. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

  7. AI佳作解读系列(一)——深度学习模型训练痛点及解决方法

    1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...

  8. 深度学习模型融合stacking

    当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题.或者你可以把他们都用起来,就进行模型融合.我主要使用stacking和blend方法.先把代码贴出来,大家可以看一下. import ...

  9. PyTorch如何构建深度学习模型?

    简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...

随机推荐

  1. 【转】Deep Learning(深度学习)学习笔记整理系列之(七)

    9.5.Convolutional Neural Networks卷积神经网络 卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点.它的权值共享网络结构使之更类似于生物神经网 ...

  2. (25)HttpClient session

    session概述 session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序需要为某个客户端的请求创建一个session ...

  3. cocos进阶教程(5)各种动画使用心得

    Node类 不解释 ActionTimeline类是一个3.0时代的动画类, 案例一 //建立node方案一Data data = FileUtils::getInstance()->getDa ...

  4. rails常用gem

    一,开发模式下 1,better_errors 使用全新的页面替换 Rails 默认的错误页面,显示更多的上下文信息,例如源码 和变量的值:配合binding_of_caller可以执行代码查看变量的 ...

  5. 20145312《网络对抗》Exp4 恶意代码分析

    20145312<网络对抗>Exp4 恶意代码分析 问题回答 1.总结一下监控一个系统通常需要监控什么.用什么来监控. 监控一个系统通常需要监控这个系统的注册表,进程,开放端口,程序服务还 ...

  6. SwitchyOmega 设置修改代理

    在开发过程中,web.config中很多配置都是生产的域名,但是在本地开发时并不能用这些生产的地址,就想在打开该域名时跳转到本地ip地址. 修改方式: 1.hosts文件修改 这种方式是在整个电脑上面 ...

  7. UVa 11806 拉拉队(容斥原理)

    https://vjudge.net/problem/UVA-11806 题意: 在一个m行n列的矩形网格里放k个相同的石子,有多少种方法?每个格子最多放一个石子,所有石子都要用完,并且第一行.最后一 ...

  8. [转]如何使用VS 2013發布一個可以在Windows XP中獨立運行的可執行文件

    https://read01.com/Mg337.html (台/湾的论坛,需要f/q) 1. 閱讀此文章的同學先看看我的另外一篇文章: 現在,我們深入探討一下: <如何使用VS 2013發布一 ...

  9. Html之网页分屏浏览

    Hi!  Every Body!Welcome to my blog! My name is Caiduping,I hope we learn to make progress together! ...

  10. HIVE之常用字符串函数

    可以参考: 博文 : https://www.iteblog.com/archives/1639.html