roofline model 定义 \[运算强度 = 运算量/访存量\] 运算量是 一个样本进行一次前向传播的浮点运算次数 访存量是 一个样本进行一次前向传播的内存交换数量 以运算强度为横轴、每秒浮点运算次数为纵轴画图 ,就能得到roofline 算力决定屋顶的高度,带宽决定屋檐的斜率。 计算绩效上限performance_limit = np.minimum(peak_performance, memory_bandwidth * arithmetic_intensity)# 绘制 Roofline 模型plt.loglog(arithmetic_intensity, performance_limit, label='Roofline')app_arithmetic_intensity = 0.2 Byte)')plt.ylabel('Performance (GFLOPS)')plt.legend()plt.grid(True, which="both", ls="--")plt.title('Roofline
围绕以上问题,本文主要介绍: 1)Roofline 模型定义和绘制方法 2)如何使用Roofline分析模型量化前后性能瓶颈 3)针对模型在不同的受限场景给出优化策略。 1,Roofline 模型定义和绘制 定义:Roofline 模型是一种用于分析硬件计算性能瓶颈的工具,通过可视化计算性能与算术强度(计算量 / 数据搬运量)的关系,判断系统受限于计算能力还是内存带宽。 A6000 GPU 的 Roofline 模型 假设 Nvidia A6000 的硬件参数如下:峰值计算性能:约为 155 TOPS,峰值内存带宽:约为 0.75 TBytes/s。 2,量化的核心机制 模型量化后,提高推理性能的核心原因为:减少内存访问开销并改变计算任务的资源瓶颈类型,这一过程可通过Roofline 模型的框架清晰解释。 LLM Inference Unveiled: Survey and Roofline Model Insights. arXiv:2402.16363
Roofline 性能模型是一个以吞吐量为导向的性能模型,在 HPC 领域广泛使用。它于 2009 年在加州大学伯克利分校开发。模型中的“roofline”表示应用程序的性能不能超过机器的能力。 Roofline 方法可以帮助评估应用程序的这些特性。在 roofline 图表上,我们可以绘制标量单核、SIMD 单核和 SIMD 多核性能的理论最大值 这将使我们了解改进应用程序性能的空间。 Roofline 可以通过为每个内存层次引入专门的 roofline 来实现这一点( 确定硬件限制后,我们可以开始评估应用程序相对于 roofline 的性能。 6 Intel Advisor 自动构建 Roofline 图表,并为给定循环的性能优化提供提示。下图展示了 Intel Advisor 生成的 Roofline 图表示例。 请注意,Roofline 图表使用的是对数刻度。 Roofline 方法可以通过在同一个图表上打印“之前”和“之后”的点来跟踪优化进度。
深度学习网络与 Roofline 模型 对于工程师来说,定性分析并不够,我们还需要能定量分析算法对于内存带宽的需求,以及对于计算性能的影响。 可以使用 Roofline 模型。 典型的 Roofline 曲线模型如上图所示,坐标轴分别是计算性能(纵轴)和算法的运算强度(横轴)。 拿之前 3×3 和 1×1 卷积的例子来说,3×3 卷积可能在 roofline 曲线右边的饱和区,而 1×1 卷积由于运算强度下降,有可能到了 roofline 左边的上升区,这样 1×1 卷积在计算时的计算性能就会下降无法到达峰值性能 如果算法在 roofline 曲线的上升区,那么我们应该增加内存带宽/减小内存带宽需求,提升计算能力/降低计算量对于这类情况并没有帮助。反之亦然。 我们来看一个实际的例子,比较一下各种机器学习算法在 roofline 模型上所处的位置。
深度学习网络与 Roofline 模型 对于工程师来说,定性分析并不够,我们还需要能定量分析算法对于内存带宽的需求,以及对于计算性能的影响。 可以使用 Roofline 模型。 典型的 Roofline 曲线模型如上图所示,坐标轴分别是计算性能(纵轴)和算法的运算强度(横轴)。 拿之前 3x3 和 1x1 卷积的例子来说,3x3 卷积可能在 roofline 曲线右边的饱和区,而 1x1 卷积由于运算强度下降,有可能到了 roofline 左边的上升区,这样 1x1 卷积在计算时的计算性能就会下降无法到达峰值性能 如果算法在 roofline 曲线的上升区,那么我们应该增加内存带宽/减小内存带宽需求,提升计算能力/降低计算量对于这类情况并没有帮助。反之亦然。 我们来看一个实际的例子,比较一下各种机器学习算法在 roofline 模型上所处的位置。
为了回答这个问题,我们需要将Roofline 模型作为背景。如下图所示,roofline模型用于描述在计算平台的算力和带宽的限制下,程序所能达到的理论性能上界。 roofline模型的示意图,有三个重要概念: 算力:每秒所完成的浮点运算次数,单位为FLOP/s或GFLOP/s 带宽:每秒所完成的内存读取量,单位为Byte/s或GByte/s 计算密度:又称访存比 ,是算力与带宽的比值,即每字节读取所完成的浮点运算量,单位为FLOP/Byte “roofline”是指TP对IM的图的形状。 在本文中使用NVIDIA 2080TI GPU作为计算设备在roofline模型的背景下进行分析。 我们在此简要分析了使用Roofline模型的性能。 为了充分利用硬件结构,通常将矩阵乘法的计算划分为块,这样可以使多级存储能够满负荷工作,从而获得最大的内存访问带宽。
为了回答这个问题,我们需要将Roofline 模型作为背景。如下图所示,roofline模型用于描述在计算平台的算力和带宽的限制下,程序所能达到的理论性能上界。 roofline模型的示意图,有三个重要概念: 算力:每秒所完成的浮点运算次数,单位为FLOP/s或GFLOP/s 带宽:每秒所完成的内存读取量,单位为Byte/s或GByte/s 计算密度:又称访存比 ,是算力与带宽的比值,即每字节读取所完成的浮点运算量,单位为FLOP/Byte “roofline”是指TP对IM的图的形状。 在本文中使用NVIDIA 2080TI GPU作为计算设备在roofline模型的背景下进行分析。 我们在此简要分析了使用Roofline模型的性能。 为了充分利用硬件结构,通常将矩阵乘法的计算划分为块,这样可以使多级存储能够满负荷工作,从而获得最大的内存访问带宽。
性能:Roofline、响应时间、吞吐量 为了说明这六个 app 在三个处理器上的性能,我们使用了高性能计算机群(HPC)的 Roofline 性能模型。 没有充足的运算密度时,程序受限于内存带宽,性能只能在 roofline 的「倾斜」部分之下。 为了在 TPU 上使用 Roofline 模型,当 DNN 应用被量化时,我们首先将浮点运算替换成整数运算。 图 3:TPU、CPU 和 GPU 在 log-log 图上的 roofline 模型。 如图 3 所示,这六个 DNN 应用与 Haswell 和 K80 roofline 天花板的距离大于与 TPU roofline 天花板的距离。响应时间是原因所在。
图4:Roofline 模型 内存层次结构为提高性能提供了关键优势:1)它们隐藏了CPU、GPU、内存组件之间的延迟差异,2)它们利用了程序局部性。 这个性能度量由Roofline 模型中的ops:字节比率捕获(图4)。 图5显示了如何从供应商的规格中计算这个。我们看到,ops:字节比是139 V100,和416 A100。 为此,必须使用Roofline模型确定神经网络是算术界限还是内存界限。如果两者都不是,那么升级到更强大的机器就没有价值了。这是第三个要点。 Fermi GPU, Proceeding of the 2011 International Conference on High Performance, Storage, and Analysis Roofline Model, NVIDIA, 2019 Intel Advisor Roofline Analysis Nvidia Nsight Compute Nvidia Ampere A100 Datasheet
性能:Roofline、响应时间、吞吐量 为了说明这六种应用在三类处理器上的性能,我们使用了高性能计算机群(HPC)的 Roofline 性能模型。 没有充足的运算密度时,程序受限于内存带宽,性能只能在 roofline 的“倾斜”部分之下。 为了在 TPU 上使用 Roofline 模型,当DNN应用被量化时,我们首先将浮点运算替换成整数运算。 图 3:TPU、CPU和GPU在 Roofline 模型上的性能表现。 以及 K80 上,这六个 DNN 应用距离 Roofline 天花板的距离都大于 TPU 上的距离。
图 3:全连接网络和卷积神经网络在 TPU 上的 Roofline。矩阵相乘(MatMul)运算的负载是计算密集型的。 (a) 和 (c) 展示了参数化模型和实际模型的 roofline。(b) 和 (d) 展示了运算的分解。 ? 红色的线 (75 Ops/Byte) 是 TPU v2 的 roofline 的拐点。 ? 图 7:具有固定层(64)的全连接模型的 Examples/second(样本/秒)。
Roofline 性能评估 实际上不同模型在特定硬件平台的执行效率情况,可以利用Roofline Model建模进行预估。 Roofline Model 建模是指通过简化硬件计算平台架构,根据计算平台的算力和带宽上限这两个参数和算子的算术强度信息,评估出其能达到的最大性能。 如下图是根据 Roofline Model 进行计算性能仿真的示意图,下面 Step1-Step7 展示了七种由于软件任务或者硬件设计导致不同性能表现的情况,根据这些表现分析,开发人员通过调整相应的软件策略或者改善硬件设计
RoofLine模型。 How to optimize GEMM on CPU 教程讲解。 RoofLine模型 上面已经介绍了GFLOPs(1GFLOPs=10^9FLOPs)和GFLOPS的概念,这里要简单引入一下计算密度和RoofLine模型。 而RoofLine模型是一个用来评估程序在硬件上能达到的性能上界的模型,可用下图表示: RoofLine 模型,来自RoofLine 模型 注意到我们计算出的计算密度183.5FLOPs/Bytes是远大于单核心的 指的一提的是理论上的RoofLine模型和硬件真实的RoofLine模型还有一定的Gap,以及对于矩阵乘来说某些参数的改变可能会让这个算子从计算密集型朝着访存密集形发生改变。 推荐商汤田子宸兄的这篇《深度学习模型大小与模型推理速度的探讨》文章,里面对RoofLine模型做了更加详细的解释以及思考。
另外一个很有用的指标(或者叫性能评价模型)是 Roofline Model[4]。 比如 Google 在 TPU 的论文里采用这 Roofline Model 来和 GPU,CPU 进行了对比,如下图。 ? Roofline model 很好的说明了,一个好的评价模型,可以很直观的给我们展示出最重要的信息。它的玩法很多,用好了也很有帮助,建议大家好好看看。 "Roofline: An Insightful Visual Performance Model for Multicore Architectures". Commun.
这主要有以下几个方面原因 利用数据复用更容易达到设计的峰值性能 利用数据复用可以降低内存访问,降低功耗 广义来看,卷积中规则的数据复用,可以降低处理器设计中缓存/控制逻辑的设计复杂度,提高总体的性能 根据Roofline Roofline模型是一种面向吞吐量的性能评价模型,它指出在理想情况下,处理器性能的理论上界。如下图(Ref. 为了高性能的完成矩阵计算,即使得性能达到Roofline模型中峰值,需要对矩阵计算的三层循环进行优化。 在进行分析之前,需要明确两点固有的特性 处理器的存储是分层设计的,越靠近计算的单元,带宽越大,容量越小 Roofline模型和访存的带宽有关,如下图所示 ? 譬如依旧有一些简单方法可以让一个三维的MAC阵列(类似Cube Core)同时支持GEMM和GEMV操作,但依旧会有一些限制,由于数据复用的不同,这两类运算始终落在Roofline模型的不同位置。
什么样的模型才是最好的匹配移动端的候选网络模型,以减少训练次数; 极轻量级模型设计:在适配移动端设备时,主客观效果相对于大模型不显著下降,且显著优于传统插值放大算法; 模型量化压缩及加速,及工程化; 基于 Roofline 简述就是: 如何设计目标平台的网络结构:结合 Roofline,Mobile GPU 硬件算力,推理引擎的特点,设计极轻量级的网络模型,而该模型在不同的 Mobile GPU 均能达到当前运算峰值; 如何计算帧间信息
通过 CCU,可以使用分析法来发现容器内诸如 CPU 过载、内存问题、roofline 带宽限制以及死锁等其他问题,从而有效地为团队提供解决方案,并提高整体系统的吞吐量和资源利用率。
YOLOv6 各尺寸模型与其他模型性能对比 图1-2 YOLOv6 与其他模型在不同分辨率下性能对比 02 Yolov6关键技术 Hardware-friendly 的骨干网络设计 图2 Roofline
注意力头数网格维度3:序列块数访存减少分析:FA-1相比传统:减少约70%访存FA-2相比FA-1:额外减少10-15%FA-3相比传统:累计减少87%访存矩阵乘法访存优化的数学原理屋顶线模型分析屋顶线模型(Roofline Model)帮助我们理解计算瓶颈:import matplotlib.pyplot as pltimport numpy as npdef roofline_model(): """展示FlashAttention which='both', linestyle='--', alpha=0.7) plt.legend() plt.tight_layout() plt.show()# 运行屋顶线分析roofline_model
/ (1 / 1e9) = 20GFLOPS 我们可以把实际数值和理论峰值比较下,确认运算瓶颈在何处,是memory bound还是cpu bound,然后进一步优化,关于这部分内容,我们以后介绍roofline