Roofline Model与深度学习模型的性能分析
原文链接: 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与深度学习模型的性能分析的更多相关文章
- 『高性能模型』Roofline Model与深度学习模型的性能分析
转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...
- 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解
用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...
- 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 ...
- Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)
概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...
- CUDA上深度学习模型量化的自动化优化
CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...
- CUDA上的量化深度学习模型的自动化优化
CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...
- AI佳作解读系列(一)——深度学习模型训练痛点及解决方法
1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...
- 深度学习模型融合stacking
当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题.或者你可以把他们都用起来,就进行模型融合.我主要使用stacking和blend方法.先把代码贴出来,大家可以看一下. import ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
随机推荐
- CentOS7.5基础优化与常用配置
目录 最小化全新安装CentOS7基础优化 配置yum源 安装常用软件 关闭防火墙 关闭SELinux 优化ulimit 历史命令记录改为1万条 把命令提示符改为绿色 添加vim配置文件 添加一个普通 ...
- 非线性方程(组):一维非线性方程(二)插值迭代方法 [MATLAB]
一般而言,方程没有能够普遍求解的silver bullet,但是有几类方程的求解方法已经非常清晰确凿了,比如线性方程.二次方程或一次分式.一次方程可以直接通过四则运算反解出答案,二次方程的求根公式也给 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON SetIcon2
zw版[转发·台湾nvp系列Delphi例程]HALCON SetIcon2 procedure TForm1.Button1Click(Sender: TObject);var img : HUnt ...
- Python 安装pytz
1. https://pypi.org/project/pytz/#files 2. 下载上图标黄的文件, 3. pip install 4. from pytz import ...
- python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式
配置文件:UiObjectMapSendMap.ini用来存放配置信息 GetOptionSendMail.py 用来读取配信息 #encoding=utf-8from selenium.webdri ...
- SecureCRT 会话空闲时超时退出处理
参考文章:http://www.cnblogs.com/xuxm2007/archive/2011/04/21/2023611.html http://yunwei.blog.51cto.com/38 ...
- JS事件监听手机屏幕触摸事件 Touch
JS移动客户端--触屏滑动事件 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的t ...
- AVAudioFoundation(4):音视频录制
本文转自:AVAudioFoundation(4):音视频录制 | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 采集设备的音视 ...
- fileupload上传文件时带参数
var userID = ""; $('#picture').fileupload({ url: "http://localhost:35708/Handler/File ...
- @Tranactional事务没有回滚
一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...