AI模型在专用加速器上的性能分析指标

背景:本文是《AI 编译器开发指南》一书的学习笔记。

        AI模型在专用加速卡上性能分析大概流程:

1)先计算模型本身的计算访存比,得到模型理论算力带宽需求。

2)根据处理器本身支持的操作字节比(算力,带宽),确认模型在该处理器上的性能表现类型。

3)根据专用加速器内部架构的内存和计算并行性的设计,分析AI模型运行时的schedule,估算得到模型在加速卡上的执行周期。

名词定义

  • 指令级并行性(Instruction-level Parallelism,ILP)
  • 线程级并行(Thread-level Parallelism, TLP)
  • 内存级并行性(Memory-level Parallelism, MLP)
  • 内存线程束并行性(Memory Warp Parallelism, MWP)
  • 计算线程束并行性(Computation Warp Parallelism, CWP)

        就GPU而言,如果线程束调度器在每次指令发射时,从同一线程束中选择独立指令,则表现为ILP;如果线程束调度器在每次发射指令时,从不同线程束选择独立指令,则表现为TLP。GPU主要通过提高TLP来最大限度地利用其功能单元,SM占用率作为GPU程序TLP的定量分析指标,对GPU整体性能有重要影响。

一、AI模型在处理器的性能影响因素

        计算并行性存储访问效率是硬件架构决定AI模型性能的两个最重要因素。相应的,GPU和专用硬件架构为AI模型进行性能优化的方式也围绕着如何提高并行计算能力和高效利用片上存储资源展开。

        从影响计算性能角度出发,GPU或者专用硬件架构运行AI模型性能的约束类型分为:内存带宽受限型, 计算速度受限型,延迟受限型。

内存受限:内存受限型AI模型性能取决于硬件内存带宽。当AI模型的计算密度较小时候(如激活函数,池化,和批量归一化算子),几乎都可能成为内存受限模型。即数据传输速度跟不上计算速度。

计算受限:当具有较多的如矩阵乘等大量计算的算子时候,这时候模型可能会成为计算受限模型。即计算速度跟不上数据传输速度。

延迟受限:在执行AI模型时,GPU设备上的线程束调度器选择就绪指令,并将其发射到线程束的活跃线程,SM准备执行线程束下一条指令所需的时钟周期数即为延迟。如果延迟是由寄存器相关性引起的,即某些输入操作数是由尚未执行完成的前一指令写入的,这时,延迟等于前一指令的执行时间,线程束调度器必须在这段时间内调度其他活跃线程束的指令以隐藏延迟。延迟受限型的AI模型则是由于没有足够的工作负载和相应的活跃线程束,无法隐藏线程束等待切换的延迟而导致性能下降。

二、计算访存比指标

        确定模型时计算受限型或者访存受限型时,应首先分析模型在具体场景下的计算访存比,即计算吞吐量和访存吞吐量的比值。

        以AI模型中常用的GEMM为例,分析访存比的计算。规定矩阵A,B, C的大小分别是M\timesK, K\timesN,M\timesN。优化GEMM的一个方案是将C进行分片处理。分片大小分别是m_{s}\times k_{s}k_{s}\times n_{s}m_{s}\times n_{s}

        每个C分片的访存吞吐量是(m_{s}+ n_{s}\times K,计算吞吐量是2 \times m_{s}\times n_{s} \times K, 常数2是乘法和加法两次计算,计算访存比是(2 \times m_{s}\times n_{s})/(m_{s}+ n_{s}),为了使GEMM计算充分利用GPU的峰值计算能力,希望计算访存比越大越好,也就是m_{s}n_{s}越大越好。但是共享内存中的元素需要提前加载到寄存器,并且m_{s}n_{s}的取值受到线程块的共享内存容量和寄存器文件大小的限制。

三、算术强度和操作字节比的定义

        定义AI模型访存占用时间为T_{mem},计算占用时间为T_{math},模型访问字节数为#bytes, 模型运算次数为#ops, 处理器内存带宽BW_{mem},计算带宽BW_{math}

T_{mem}= #bytes /  BW_{mem},  T_{math}=#ops / BW_{math}

计算受限模型是T_{math}>T_{mem}, 反之是内存受限型。

        如下公式可以推导出算术强度和操作字节比的定义。算术强度可以理解为每从内存读写一个字节需要执行的操作数。操作字节比则与模型无关,只与给定处理的带宽参数有关。

T_{math} > T_{mem}  =》  #ops / BW_{math}  > #bytes /  BW_{mem}  =>

#ops / #bytes  > BW_{math} / BW_{mem}   

算术强度= #ops / #bytes 

操作字节比 = BW_{math} / BW_{mem}

       不同AI模型的算术强度变化范围很大,因此没有一种通用的加速器,比如卷积神经网络一般认为是计算密集型,而机器翻译和自然语言处理模型通常由全连接层组成,权重重用少,需要消耗较多的存储空间,所以AI模型的计算结构和规模决定其算术强度,进而决定其对特定硬件架构的适用性。

        以V100 GPU执行GEMM为例,V100的FP16峰值计算性能是125TFLOPS,片外存储带宽约为900GB/s, 片上L2带宽为3.1TB/s

  • 如果输入数据来自片外存储器,操作字节比约为125/0.9≈138.9
  • 如果输入数据来自片上存储器,操作字节比约为125/3.1≈40

        对于M\timesK\timesN的GEMM来说,算术强度  =    \frac{2\times M\times N\times K}{2\times (M\times K+K\times N+M\times N)} = \frac{M\times N\times K}{ M\times K+K\times N+M\times N}, 分子的2是指FMA的乘法和加法, 分母的乘法是指FP16类型的2byte。

        当GEMM的形状是8192\times128\times8192,算术强度是124.1,低于V100的操作字节比138.9,该操作为内存受限型

        当GEMM的形状是8192\times8192\times8192,算术强度是2730,远高于V100的操作字节比138.9,该操作是计算受限型。

        判断AI模型时内存受限还是计算受限型的前提是模型的工作负载足够大,足以令处理器的算术或存储流水线一直处于饱和工作状态。如果AI模型的工作负载不够大,不能提供足够的并行性,处理器无法充分利用,此模型则既不属于计算受限也不属于内存受限,而是属于延迟受限型。

        在评估模型性能首先类型时,开发者应该首先通过评估AI模型工作负载需要消耗的线程块数量和大小,确定工作负载是否足够的并行性使GPU资源达到饱和。通过如果AI模型消耗的线程块数量达到SM的4倍,则可以认为,AI模型的工作负载有足够的并行性,不属于延迟受限型。

        综上,对于GEMM计算

  • 1)当K很小时,即M≈N >> K, GEMM为延迟受限型
  • 2)当M或N很小时,即N≈K >> M, 或M≈K >> N,GEMM为内存受限型
  • 3)当M,N,K都很大时,GEMM为计算受限型。

        优化AI模型性能的另一个关键因素是提高全局内存访问效率。全局内存驻留在设备内存中,设备内存可通过128字节,64字节或32字节内存事务访问。这些内存事务只能读取或写入与其大小对其的设备内存的128字节,64字节或32字节。根据GPU的计算能力或运行时配置,当某个线程束执行一条访问全局内存的指令时,如果线程束中各线程的全局内存访问地址落入相同的128字节,64字节或32字节地址段,则这些全局内存访问可以合并为128字节,64字节或32字节内存事务。如果不采用合并访问方式,而是发散访问,则需要发射额外的内存事务。发散访问的方式会导致全局内存吞吐量降幅非常显著。

        比如为每个线程4字节访问生成一个32字节的内存事务,每个内存事务包含28字节无用数据,导致全局内存吞吐量降低32/4=8倍,如果采用128字节内存事务,则全局内存吞吐量降低32倍。因此发散访问导致线程束吞吐量下降比由此导致的线程束延迟增加严重的多。为了最大化内存吞吐量,优化全局内存访问尤为重要,因为与片上存储器带宽和算术指令吞吐量相比,全局内存带宽较低,因此全局内存访问通常对性能有重要影响

四、内存级并行性和线程级并行性指标

        内存线程束并行性(MWP)用于刻画系统内存并行性,其表示从SM处理器开始执行某个线程束的内存指令后,到同一线程束的所有内存请求得到服务为止的时间段内,每个SM可以同时访问内存的最大线程束数量。

        计算线程束并行性(CWP)用于刻画模型特征,表示SM处理器在一个内存线程束等待期间可以执行的线程束数量加1,加1是为了包括等待内存值的线程束本身。CWP与算术强度有相似之处和不同之处,相似之处在与两者都表示访存操作与运算操作的比例关系,不同之处在于,算术强度不具有时序信息,而CWP重点考虑内存等待周期内的时序信息,并可用于确定代码段总执行时间是由计算占用时间决定,还是由访存占用时间决定。内存等待周期表示系统处理内存请求的时间段。

        如上图,白色方框表示计算指令占用的计算周期,彩色方框表示访存指令占用的内存等待周期,方框中的标识表示线程束序号。图6-2中所有的计算周期和内存等待周期来自第i-i+7个不同的线程束。从图上可以看出1个内存等待周期是计算周期的2倍,所以CWP=2+1=3。图6-2的左图假设系统可以同时处理两个内存线程束,即MWP=2。图6-2的有图假设系统可以同时处理8个内存线程束,所以MWP=8。

        可以发现左图CWP>MWP, SM中由足够多的线程束等待内存值,所以内存访问周期可以被计算周期隐藏。代码段总执行时间为2个计算周期+4个内存等待周期之和。而右图CWP<MWP,代码段总执行时间为8个计算周期+1个内存访问周期之和。

        综上,当CWP大于MWP时,执行成本主要由访存占用时间决定;当CWP小于MWP时,执行成本主要由计算占用时间决定。

        基于MWP和CWP指标建立GPU性能模型通过评估每个SM在一个内存等待周期内可以同时访问的线程束数量,以及可以在同一时间段内完成计算的线程束数量,进而离线估算得到模型执行的时钟周期数,而不需要实际执行模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

次梯度算法介绍

系列文章目录 最优化笔记&#xff0c;主要参考资料为《最优化&#xff1a;建模、算法与理论》 文章目录 系列文章目录一、次梯度1 定义2 存在性 二、次梯度的计算1 按定义计算2 常用计算规则 三、最优性条件1 无约束优化问题2 约束优化问题 四、次梯度算法1 迭代格式2 收敛性 参…

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃&#xff08;二&#xff09; 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目&#xff0c;其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…

Elasticsearch基本操作之索引操作

本文说下Elasticsearch基本操作之索引操作 文章目录 概述创建索引创建索引示例重复创建索引示例 查看索引查看所有索引查看单个索引 概述 由于是使用命令来操作Elasticsearch&#xff0c;可以使用kibana&#xff0c;postman和apifox等工具 我使用了apifox来执行命令&#xff0c…

macbook电脑2024免费好用的系统清理优化软件CleanMyMac X4.14.7

CleanMyMac X2024来帮助你找到和删除不需要的文件。CleanMyMac X是一款专业的mac清理软件&#xff0c;它可以智能地扫描你的磁盘空间&#xff0c;找出并删除大型和旧文件&#xff0c;系统垃圾&#xff0c;iTunes垃圾&#xff0c;邮件附件&#xff0c;照片库垃圾等&#xff0c;让…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的&#xff1f; 这个问题是本文的重点&#xff0c;也是面试中经常问到的问题&#xff0c;所以就引出了下文的 …

力扣 验证二叉搜索树 递归

&#x1f468;‍&#x1f3eb; 题目地址 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left,…

vc2017编译从github网站上下载的源码

以ZLmediakit为例 1.下载软件 cmakehttps://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5-windows-x86_64.zip Microsoft Visual Studio https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_ido~msft~vscom~older-downloads …

测评大通关攻略

天下苦测评已久&#xff0c;今天就让我来聊聊测评这回事。首先我们不单独谈银行的测评&#xff0c;银行的第一次笔试经常是超级多的测评&#xff0c;这个测评需要单独谈。我们今天就先来聊聊大多数公司的测评。&#xff08;本文所用的所有题目均不是本人参加测评所截图的&#…

【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历

目录 一、二叉树的定义 1、二叉树的定义 2、二叉树的五种形态 二叉树的子树 &#xff1a; 3、满二叉树与完全二叉树 4、二叉树的性质 5、二叉树的存储结构 1、顺序存储 ​编辑 2、链式存储 二、二叉树的遍历 按照前序序列构建二叉树 1、前 (先) 序遍历(Preorder …

使用Python和Pygame库创建简单的的彩球效果

简介 Pygame是一款强大的游戏开发库&#xff0c;可以用于创建各种有趣的图形效果。为了更好地了解Pygame的功能&#xff0c;今天我们将要做的是在屏幕上随机生成一些彩色的小球&#xff0c;并使它们以不同的速度和方向移动。当小球碰到屏幕边缘时&#xff0c;它们将反弹。 功能…

为什么会去华为 OD?网传的 OD 转华为正编,真的假的?

目录 专栏导读一、为什么会去华为 OD二、华为 OD 的工作内容三、OD 与华为自有员工的对比四、那&#xff0c;到底要不要去华为 OD&#xff1f;五、网传的 OD 转华为正编&#xff0c;真的假的&#xff1f;1、连续两次绩效 A2、通过可信专业级认证 六、最后&#xff0c;真的感谢 …

GitHub上的15000个Go模块存储库易受劫持攻击

内容概要&#xff1a; 目前研究发现&#xff0c;GitHub上超过15000个Go模块存储库容易受到一种名为“重新劫持”的攻击。 由于GitHub用户名的更改会造成9000多个存储库容易被重新劫持&#xff0c;同时因为帐户删除&#xff0c;会对6000多个存储库造成重新劫持的危机。目前统计…

CentOS 7 实战指南:文件或目录的权限操作命令详解

前言 这篇文章详细介绍了文件和目录的常用权限操作命令&#xff0c;并提供了全面的技术解析。通过本文&#xff0c;你将学习如何使用 chmod 和 chown 命令来管理文件和目录的权限&#xff0c;控制用户和用户组的访问权限。无论你是初学者还是有经验的系统管理员&#xff0c;这…

代码随想录刷题笔记(DAY 8)

今日总结&#xff1a;最后一道题解决的比较糟糕&#xff0c;后续会补上新解法&#xff0c;今天还是将中心放在了前端。 Day 8 01. 反转字符串&#xff08;No. 344&#xff09; 题目链接 代码随想录题解 1.1 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。…

如何解决大模型的「幻觉」问题?

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;贝叶斯滤波与Kalman估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能&#xff0c…

【12】ES6:模块化

一、JavaScript 模块化 JavaScript 模块化是一种组织和管理 JavaScript 代码的方法&#xff0c;它将代码分割为独立的模块&#xff0c;每个模块都有自己的作用域&#xff0c;并且可以导出和导入功能。模块化可以提高代码的可维护性、可重用性和可扩展性。 在JavaScript中&…

FCN学习-----第一课

语义分割中的全卷积网络 CVPR IEEE国际计算机视觉与模式识别会议 PAMI IEEE模式分析与机器智能汇刊 需要会的知识点&#xff1a; 神经网络&#xff1a;前向传播和反向传播 卷积神经网络&#xff1a;CNN&#xff0c;卷积&#xff0c;池化&#xff0c;上采样 分类网络&#xff1a…

CCF模拟题 202312-1 仓库规划

问题描述 试题编号&#xff1a; 202312-1 试题名称&#xff1a; 仓库规划 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 输入格式 输出格式 样例输入 4 2 0 0 -1 -1 1 2 0 -1样例输出 3 1 0 3样例解释 Java实现代码&#xff1a; import …

Spring高手之路-Spring Bean、Java Bean和对象的区别与联系

目录 什么是Spring Bean 什么是Java Bean 什么是对象 Spring Bean与Java Bean与对象的联系与区别 联系 区别 什么是Spring Bean 在Spring官方文档中对Bean的解释如下&#xff1a; In Spring, the objects that form the backbone of your application and that are manage…

贪吃蛇C语言实现(有源码)

前言 之前学了一点easyx图形库的使用&#xff0c;掌握一些基本用法后就用贪吃蛇来进行实战了&#xff0c;运行视频放在csdn视频那一栏了&#xff0c;之前的烟花也是。 1.头文件 #define _CRT_SECURE_NO_WARNINGS 1 #include<easyx.h> #include<conio.h> #includ…