BrendanGregg:AI火焰图

原创 Linux阅码场 2024-11-02 12:31

译者按:本文译自Brendan的博客。

想象一下,将 AI 的资源成本减半,这对地球和行业意味着什么 - 根据极端估计,到 2030 年,这种节省可以将美国的总用电量减少 10%以上 1。在英特尔,我们一直在创建一种新的分析工具,以帮助降低 AI 成本,称为 AI 火焰图:一种基于我的 CPU 火焰图显示 AI 加速器或 GPU 硬件配置文件以及完整软件堆栈的可视化工具。我们的第一个版本作为英特尔 Data Center GPU Max 系列(以前称为 Ponte Vecchio)的预览版提供给英特尔 Tiber AI Cloud 中的客户。下面是一个示例:



简单示例:SYCL 矩阵乘法微基准测试

(点击进入交互式 SVG。绿色帧是在 AI 或 GPU 加速器上运行的实际指令,浅绿色显示这些函数的源代码,红色 (C)、黄色 (C++) 和橙色(内核)表示启动这些 AI/GPU 程序的 CPU 代码路径。灰色的 “-” 框只是帮助突出 CPU 和 AI/GPU 代码之间的边界。x 轴与成本成正比,因此您需要寻找最广泛的事物并找到减少它们的方法。

分层

此火焰图显示了一个用于 SYCL(一种用于加速器的高级 C++ 语言)的简单程序,该程序测试矩阵乘法的三种实现,并使用相同的输入工作负载运行它们。火焰图由最慢的实现 multiply_basic() 主导,它不使用任何优化,消耗 72% 的 stall 样本,显示为最宽的塔。右侧是两个薄塔,分别用于 21% 的 multiply_local_access() 和用于 6% 的 multiply_local_access_and_tiling() (),它还添加了矩阵平铺。随着优化的添加,塔变得越来越小。

此火焰图分析器是基于 Intel EU stall profiling 的原型,用于硬件分析和 eBPF 用于软件插桩。它的设计简单且开销低,就像 CPU 性能分析器一样。您应该能够随时生成现有 AI 工作负载的火焰图,而无需重新启动任何内容或通过中介层启动其他代码。

指令偏移分析

这不是第一个构建 AI 分析器甚至 AI 火焰图 的项目,但是,我见过的其他项目专注于跟踪 CPU 堆栈和时序加速器执行,但不分析加速器上运行的指令偏移量;或者通过昂贵的二进制插桩来分析它们。我想构建像 CPU 火焰图一样工作的 AI 火焰图:易于使用、成本可忽略不计、生产安全,并显示所有内容。开发人员的日常工具,大部分可视化都使用开发人员的语言:源代码函数。

这是英特尔过去一年的一个内部人工智能项目。英特尔已经在这一领域进行投资,为 Intel Data Center GPU Max 系列构建了 EU 停顿分析器功能,可提供硬件指令采样的近似值。我很幸运地邀请到了 Matthew (Ben) Olson 博士,他是一名英特尔人工智能工程师,也曾从事过 eBPF 性能工具 (processwatch) 和内存管理研究,他加入了我的团队,并完成了大部分开发工作。他的背景帮助我们克服了看似无法克服的困难。Brandon Kammerdiener 博士(巧合的是,他也是田纳西大学的另一位毕业生,与 Ben 一样)也加入了我们的行列,他也拥有 eBPF 和内存内部经验,一直在帮助我们承担越来越难的工作量。Gabriel Muñoz 今天刚刚加入,帮助发布。现在,我们的小团队已经证明这是可能的,我们将与英特尔的其他团队一起进一步发展。

几个月前,我们本可以使用英特尔 GTPin 构建一个更难使用且开销更高的版本,但要得到广泛采用,它需要最少的开销和易用性,以便开发人员可以毫不犹豫地每天使用它并将其添加到部署管道中。

什么是火焰图?

火焰图是我在 2011 年发明的一种可视化效果,用于显示采样的代码堆栈跟踪。它已成为 CPU 分析和分析的标准,可帮助开发人员快速找到性能改进并消除回归。CPU 火焰图显示了运行软件的“大图”,其中 x 轴与 CPU 成本成正比。右侧的示例图片总结了从计算成本到负责任的代码路径是多么容易。在火焰图之前,通过阅读数百页输出,可能需要数小时才能理解复杂的配置文件。现在只需几秒钟:您所要做的就是寻找最宽的矩形。

火焰图已在全球范围内得到采用。到目前为止,它们已成为 5 家初创公司的基础,已被 30 多种性能分析产品采用,并有 80 多次实施。

我第一次实现火焰图是在周三晚上下班后的几个小时。真正的努力是在那之后的十年中,我使用不同的分析器、运行时、库、内核、编译器和虚拟机管理程序来使火焰图在不同环境中正常工作,包括修复堆栈遍历和符号化。今年早些时候,我发布了关于最后一个缺失部分的文章:帮助发行版启用帧指针,以便跨标准系统库进行分析。

对于 AI 工作负载,类似的工作是必要的:修复堆栈和符号,并让分析适用于不同的硬件、内核驱动程序、用户模式驱动程序、框架、运行时、语言和模型。工作量也大得多,因为 AI 分析的成熟度低于 CPU 分析。

搜索样本

如果您不熟悉火焰图,那么值得一提的是内置的搜索功能。在前面的示例中,大多数 stall 样本是由 sbid:software scoreboard 依赖项引起的。由于这可能是一个唯一的搜索词,您可以在 “sbid” 上运行搜索(Ctrl-F,或单击“搜索”),它将以洋红色突出显示它:



搜索还显示右下角包含 sbid 的堆栈样本总数:78.4%。您可以在火焰图中搜索任何术语:加速器指令、源路径、函数名称等,以快速计算存在该术语的堆栈百分比(不包括垂直重叠),从而帮助您确定性能工作的优先级。

请注意,样本是基于 EU stall 的,这意味着理论性能获胜可以将百分比降至零。这与 CPU 分析中通常使用的基于计时器的样本不同。停顿意味着您最好专注于痛苦,即代码中没有取得进展的部分,但您不会看到未停滞的指令对资源的使用情况。我也希望将来支持基于计时器的样本,这样我们就可以同时拥有这两种视图。

谁将使用它?

在最近的一次 golang 会议上,我要求 200+ 的观众举手,如果他们使用的是 CPU 火焰图。几乎每个人都举起了手。我知道有些公司将火焰图作为开发人员用来理解和调整其代码的日常工具,从而降低计算成本。这将成为 AI 开发人员的日常工具。

我的雇主也会将其用于评估分析,寻找需要调整的领域以击败竞争对手,以及更好地了解工作负载性能以帮助设计。

为什么 AI 分析很难?

考虑 CPU 指令分析:当程序和符号表都位于文件系统中并且采用标准化文件格式(如 ELF)时,这很容易,就像本机编译代码 (C) 一样。对于符合 JIT 的代码(如 Java),CPU 分析变得很困难,因为指令和符号是动态生成的,并放置在主内存(进程堆)中,而没有遵循通用标准。对于此类 JITted 代码,我们使用特定于运行时的方法和代理来检索堆信息的快照,每个运行时的快照都不同。

AI 工作负载也具有不同的运行时(以及框架、语言、用户模式驱动程序、编译器等),其中任何运行时都可能需要特殊的修改才能使其 CPU 堆栈和符号正常工作。这些 CPU 堆栈在 AI 火焰图中显示为红色、橙色和黄色帧。一些 AI 工作负载很容易让这些帧正常工作,而一些 (如 PyTorch) 则需要更多的工作。

但真正的挑战是对实际的 GPU 和 AI 加速器程序(显示为浅绿色帧)进行指令分析,并将它们与下面的 CPU 堆栈正确关联。这些 GPU 和 AI 程序不仅可能不存在于文件系统中,甚至可能不存在于主内存中!甚至对于正在运行的程序也是如此。一旦执行开始,它们就可以从主内存中释放出来,并且只存在于特殊的加速器内存中,超出了 OS 分析器和调试器的直接范围。或者触手可及,但只能通过高开销的特定于硬件的调试器接口。

这些程序也没有 /proc 表示形式(我一直在建议构建一个等效的程序),因此甚至无法直接判断哪些程序正在运行,哪些程序未运行,以及所有其他 /proc 详细信息。忘记指令分析,即使 ps(1) 和所有其他处理工具都不起作用。

这是一次令人费解的经历,揭示了什么被认为是理所当然的,因为它在 CPU 领域已经存在了几十年:进程表。工艺工具。标准文件格式。文件系统中存在的程序。从主内存运行的程序。调试。Profiliers.核心转储。拆卸。单步。静态和动态检测。等。对于 GPU 和 AI 来说,这一切都远没有那么成熟。它有时会使工作变得令人兴奋,当你认为某件事是不可能的,然后找到或想办法时。

幸运的是,我们有一个良好的开端,因为有些事情确实存在。根据运行时和内核驱动程序,有一些调试接口,您可以在其中列出正在运行的加速器程序和其他统计数据,如 intel_gpu_top(1) 等工具使用的那样。您可以使用 intel_gpu_abrt(1) 终止 -9 个 GPU 工作负载。一些接口甚至可以为正在运行的加速器程序生成基本的 ELF 文件,您可以尝试在像 gdb(1) 这样的调试器中加载这些文件。并且支持对 GPU/AI 程序反汇编,如果您可以掌握二进制文件。在我看来,操作系统风格的 GPU/AI 调试大约有两年的历史了。总比零好,但还处于早期阶段,还有很多事情要做。至少十年。

AI 开发人员对此有何看法?

我们已经向英特尔的其他 AI 开发人员展示了 AI 火焰图,常见的反应是有点困惑,想知道该怎么处理它。AI 开发人员会考虑他们的代码,但借助 AI 火焰图,他们现在可以第一次看到整个堆栈,包括硬件,以及他们通常不会考虑或不知道的许多层。它基本上看起来像一堆胡言乱语,他们的代码只是火焰图的一小部分。


CPU 火焰图 实现

这种反应类似于人们第一次使用 CPU 火焰图,它显示了开发人员和工程师通常不会处理的系统部分,例如运行时内部、系统库和内核内部。火焰图非常擅长突出显示最重要的十几个函数,因此学习这些函数在几个不同的代码库(通常是开源的)中的作用就成为一个问题。理解十几个这样的函数可能需要几个小时甚至几天 - 但如果这导致 10% 或 2 倍的成本收益,那么时间是值得的。下次用户查看火焰图时,他们开始说“我以前见过那个函数”,以此类推。您可以达到不到一分钟的时间理解 CPU 火焰图的大部分:查找最宽的塔,单击缩放,阅读帧,完成。

CPU 火焰图的成功让我深受鼓舞,它有 80 多个实现和无数的实际案例研究。有时我在 github 上浏览我关心的性能问题,然后点击页面,然后有一个 CPU 火焰图。他们无处不在。

我希望 AI 开发人员也能够在不到一分钟的时间内理解 AI 火焰图,但首先,人们将花费一天或更长时间来浏览他们不知道涉及的代码库。发布 Found Wins 的案例研究也将帮助人们学习如何解释它们,也有助于解释其价值。

PyTorch 怎么样?

我们遇到的另一个常见反应是 AI 开发人员正在使用 PyTorch,最初我们不支持它,因为它意味着遍历 Python 堆栈,这并非易事。但之前的工作已经在那里完成(以支持 CPU 分析),经过大量修补,我们现在有了第一个 PyTorch AI 火焰图:



粉色的 PyTorch 帧

(点击进入交互式 SVG。PyTorch 函数位于底部,颜色为粉红色。此示例运行 oneDNN 内核,这些内核是 JIT 生成的,并且没有源路径,因此该层只读取“jit”。将所有其他层都包括进来真的很痛苦,但这是一个重要的里程碑。我们认为,如果我们能做到 PyTorch,我们就能做任何事情。

在此火焰图中,我们显示了使用 Intel Extensions for PyTorch (IPEX) 运行 Llama 2 7B 模型的 PyTorch。此火焰图显示了 GPU 内核执行的来源,一直追溯到以粉红色显示的 Python 源代码。大多数样本来自导致 aqua 中显示的 gemm_kernel(矩阵乘法)的堆栈,与前面的示例一样,由于软件记分板,该堆栈有许多停顿。

有两个指令(0xa30 和 0xa90),加起来占整个配置文件的 27%。我估计有人会问:我们不能点击说明,让它弹出一个带有完整源代码的反汇编视图吗?是的,这应该是可能的,但我还不能回答我们将如何提供这个服务。另一个我还无法回答的预期问题:既然现在有多个产品使用 CPU 火焰图(包括 Intel Granulate)提供 CPU 工作负载的 AI 自动调整,我们难道不能使用 AI 火焰图对 AI 工作负载进行 AI 自动调整吗?

首次发布:有时困难且开销适中

AI 火焰图 处理某些工作负载很容易,但其他工作负载目前很困难,开销成本适中。它类似于 CPU 分析,其中某些工作负载和语言很容易分析,而其他工作负载和语言则需要修复各种问题。一些 AI 工作负载使用许多软件依赖项,这些依赖项需要各种调整和重新编译(例如,启用帧指针以便堆栈遍历正常工作),这使得设置非常耗时。PyTorch 特别困难,可能需要一周以上的操作系统工作才能为 AI 火焰图做好准备。我们将努力在各自的存储库中更改上游的这些调整,这涉及 Intel 内部和外部的团队,我预计这个过程至少需要一年时间。在此期间,AI 工作负载将逐渐变得更容易可视化为火焰图,并且开销也更低。

我想起了早期的 eBPF:你必须修补并重新编译内核、LLVM 和 Clang,如果你遇到错误,这可能需要几天时间。从那时起,所有 eBPF 依赖项补丁都被合并,默认设置也发生了变化,因此 eBPF“正常工作”。我们也会通过 AI Flame Graphs 实现这一目标,但目前仍处于早期阶段。

AI 火焰图 所需的更改实际上是关于改进一般调试,并且是 Fast by Friday 的要求:这是我们可以在 5 天或更短的时间内分析任何内容的根本原因。

可用性

AI 火焰图 将首先在 Intel Tiber AI Cloud 上作为 Intel Data Center GPU Max 系列的预览功能提供。如果您目前被部署到那里,您可以通过 Intel 服务渠道申请抢先体验。至于它是否或何时会支持其他硬件类型、出现在其他 Intel 产品中、正式发布、开源等,这些都涉及 Intel 的其他各个团队,他们需要先发布自己的公告,然后才能在这里讨论。

结论

为 AI 数据中心寻找仅几分之一的性能改进,就可以在全球范围内节省电、水和钱。如果AI 火焰图像 CPU 火焰图一样成功,我预计超过 10% 的改进将是很常见的,最终会发现 50% 或更高的改进*。但在早期阶段,这并不容易,因为仍有许多软件组件需要调整和重新编译,并且 AI 火焰图中揭示了需要了解的软件层。

在未来的几年里,我想象其他人会构建自己的AI 火焰图,看起来和这个一样,甚至可能有初创公司在卖它们,但如果他们使用更难使用和开销更高的技术,我担心他们可能会让公司完全关闭AI 火焰图的想法,并阻止他们找到急需的胜利。这太重要了,不能做得不好。AI 火焰图应该易于使用,开销可以忽略不计,确保生产安全,并显示所有内容。英特尔已经证明这是可能的。

免責聲明

* 这是一篇个人博客文章,仅作个人预测,但不保证可能的性能改进。请随意对任何索赔持保留态度,并随时等待 Intel 关于这项技术的正式发布和公开发布。

1 根据 Arm 首席执行官 Rene Haas 估计的 20-25%,ArsTechnica 的 Kyle Orland 在《仔细研究 AI 的所谓能源灾难》中引用了这一估计。

谢谢

感谢 Intel 的每一位员工,他们帮助我们实现了这一目标。Markus Flierl 推动了这个项目并将其作为重中之重,Greg Lavender 也表达了他的支持。特别感谢 Michael Cole、Matthew Roper、Luis Strano、Rodrigo Vivi、Joonas Lahtinen、Stanley Gambarin、Timothy Bauer、Brandon Yates、Maria Kraynyuk、Denis Samoylov、Krzysztof Raszknowski、Sanchit Jain、Po-Yu Chen、Felix Degrood、Piotr Rozenfeld、Andi Kleen 以及所有其他帮助我们解决问题的同事,并提前感谢将在未来几个月内帮助我们的其他人。

最后,我要感谢那些实际动手处理火焰图的公司和开发人员,他们收集它们,检查它们,找到性能优势,并应用它们。您正在帮助拯救地球。

Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 65浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 102浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 41浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 70浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 66浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 37浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 98浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 83浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 86浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 51浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦