AI图鉴

AI图鉴首页 › AI 资讯 › 剖析火炬内龙(第一部分):AWS列车的系统级剖面。

剖析火炬内龙(第一部分):AWS列车的系统级剖面。

来源:HuggingFace · 发布时间:10-22 · 由 AI图鉴每小时自动聚合

本条资讯的摘要暂未整理出来,可点击下方按钮查看原文;本站每小时自动补充中文摘要。

剖析火炬内龙(第一部分):AWS列车的系统级剖面。

许多ML从业者对如何让模型运行得很快有些直觉,但较少人知道如何分析一个模型为何缓慢。 在这个系列的第一部分中,你将学习如何系统地分析推论的性能,并找出时间花在什么地方。

这个帖子从零开始,并假定没有之前的剖析经验。 行走道使用AWSTrainium,这是专为深层学习培训和推论工作量而专门制造的AI芯片,以及火炬内龙,它的开源本土PyTorch后端。 火炬内龙支持Trainium上的标准PyTorch工作流程,包括急速执行,火炬。 编译,以及标准PyTorch API,最小代码更改。 此外,火炬内龙与Neuron Kernel接口(NKI)集成,使Trainium硬件的自定义操作器和性能优化成为可能。 到最后,你应该知道:

如何配置火炬。 profile 与 Neuron 后端并捕捉干净的追踪。

- 如何读取按键平均()表,以识别哪些操作消耗了Neuron设备时间,并比较其Self CPU时间。

- 如何通过Neuron Explorer跟踪一个操作,从框架发送到运行时间调度,到NeuronCore上的硬件执行。

- 同一行动的三个执行阶段如何改变这些信号。

PyTorch 后端的神经元

在描述工作量之前,它有助于理解Neuron如何与PyTorch融合。

Neuron后端使用PyTorch的PrivateUse1扩展点。 这种机制让一个加速器与框架整合,而不增加一个专门的发送键,如cuda. 火炬 neuronx包与上游PyTorch合作,将Neuron注册为PyTorch代码的本土后端。 关于这一扩展机制的详细情况,请参见PrivateUse1的促进新后端集成。

设置配置器

您使用两个对象来配置 Neuron 工作量:

- NeuronConfig控制哪条Neuron数据流和NeuronCores来捕捉和写入输出。 你把它传递给火炬。 profile. profile 作为实验 config.

- NeuronProfiler取一个NeuronConfig,并提供一个导出追寻回调。 召回书写了框架跟踪,track.json,与Neuron系统跟踪并列。

nc = NeuronConfig(

模式= [ProfileMode.DEVICE, ProfileMode.RUNTIME] (英语).

配置文件输出 dir=UTPUT DIR

抓取启用 for nc='0'

关联 device time= true

)

出口国 = Neuron Profiler(nc)

模式参数选择要捕获的数据流,例如设备指令和运行时间痕迹。 抓取启用 for nc 参数选择NeuronCores来跟踪。 设置关联 device time= True 将设备时间从微量传播到密钥平均()表,您可以在此比较CPU和Neuron设备时间。 关于完整的参数引用和可用的ProfileMode值,参见NeuronConfig Profile Modes文档。

工具:Neuron 探索器

Neuron Explorer是一个基于浏览器的浏览器,用于系统跟踪,设备时间表,以及每引擎崩溃。 你可以通过SSH隧道或Visual Studio代码扩展访问。 在此文章中,您使用 Explorer 来确认哪些密钥平均值( ) 以数字方式报告,并检查发送之间发生的情况。

剖析后,输出目录包含系统跟踪,当您获取设备数据时,匹配.neff和.ntff文件。 Neuron可执行文件格式(NEFF)包含编译的Neuron可执行文件,而匹配的NTFF包含其硬件指令跟踪。 文件共享一个数字散列以识别它们为对。 要在Neuron Explorer中打开配置,上传系统或组合配置的完整输出目录。 对于只使用设备配置文件,请单独上传匹配的.neff和.ntff文件。 参见步骤5:上传您对UI和命令行指令的描述文件。

配置文件 RMSNorm

对于这第一种分析,你描述RMSNorm,一个有明确的算术和还原操作序列的小型操作。

您描述同一操作的三项执行:

- Naive RMSNorm 带有单个 PyTorch 操作:乘法,表示法,加法,对等方根,和乘法。

- 火炬.rms norm(),PyTorch内置降格为单一引信的Neuron内核。

- Naive RMSNorm配有火炬。 编译,使用与第一次执行相同的操作。

脚本使用相同的输入,剖面配置,以及排程,因此结果可以直接比较。

复制此作品的所有脚本都可以在火炬-neuronx实例目录中找到。

简介1:Naive PyTorch操作

开始写 RMSNorm 与单个 PyTorch 操作。 每行映射到一个或多个ATen操作,并可以创建中间载荷。

设备 = 火炬.device('neuron')

x = 火炬.randn (4, 512, dtype=torch.bfloat16,设备=device).

重量 = 火炬.ones(512,dtype=torch.bfloat16,设备=device)

def rms norm fn(t): (法语).

x sq = t * t # 平方边

平均值 sq = x sq.mean(dim=-1, keepdim=True) # 正方形平均值

rms = 火炬.rsqrt(平均值+ 1e-6) # 1 / sqrt(平均值+sq + eps)

返回 t * rms * 重量 # 正常 + 比例

使用 Neuron 后端所需的两个参数调用配置器:

- 包括剖析器活动。 Private Useus1用于从Neuron设备中收集活动。

- 通过NeuronConfig作为实验配置,以启用Neuron特有的Kineto特性。

该表使用wait=2, warmup=1,以及活动=1横跨四个 prof.step() 调用。 这记录了一个温暖的迭代,但不包括初始设置的间接费用。

调用火炬。 neuron. 同步( ) 配置器循环。 没有这种同步,配置器可以在设备完成前导出并留下Neuron时间列空。

带火炬。 profile. profile(

活动=[Profiler Activity.CPU, Professor Activity.Private Uservation1] (中文(简体) ).

实验配置=nc

记录( S)

运行( trace ready=exporter.export trace)

调度=torch.profile.schedule(等待=2,温暖=1,活动=1)

作为prof:

范围(4):

带有火炬.no grad():

=rms norm fn(x) (中文(简体) ).

火炬。 neuron. 同步( )

步骤( )

剖析完成后,请检查密钥平均()表。 按自定义的私人使用1 时间排序,将操作放在设备成本最高的地方。 在此显示的表格被过滤到报告Neuron设备时间的 RMSNorm 操作。 完整的密钥平均()输出还包括CPU侧事件,如分配和主机到设备传输。

打印(prof.key perors (.). table(sort by="self privateuse1 time total,行 limit=4)).

键平均值表显示为3 aten::mul调用占Neuron设备时间的最大份额。

ATen操作运行的表显示,运行频率,以及使用CPU和Neuron设备的时间。 aten:::mul的总设备时间最高,因为函数执行三个乘法。

本国合计:2.355毫秒

每个行直接映射到函数。 aten::mul 运行于 x * x, x * rms,以及最终乘法按重量计算。 aten::意为减小最后一个维度。 aten: add 新增 epsilon值并触发主机到设备复制,因为scalar开始于CPU. aten::rsqrt计算对等的方根。

Neuron Explorer遵循 aten::mul 操作从框架发送到运行时间调度到Neuron硬件车道的执行。

在探索器中读取路径

在Explorer中,时间从左到右流,事件生命周期从上到下流。 每个ATen操作都遵循相同的模式:在框架车道内创建,运行时车道内排程为nrta execut schedule,在硬件车道内设备执行为nc exec running.

系统跟踪视图将事件组织成车道。 在默认分组模式中,标签遵循模式实例/PID/子系统/识别器:

在急切模式下,每个操作独立运行。 使用依赖链查看器跟踪 aten:: mul. 从框架层的tensor通过运行时间调度到设备执行。

依赖链查看器突出显示一个操作在整个框架,运行时间和硬件车道的生命周期。

简介2:火炬.rms 规范

将单个操作替换为 PyTorch 的内置rms norm 函数。 Neuron将操作降低到一个引信内核:

def rms norm fn(t): (法语).

返回火炬.rms norm(t, [512],重量)

引信的RMSNorm在密钥平均值表中作为一个设备操作出现。

本国总产量:403.3 μs

引信的RMSNorm遵循一个框架到硬件路径,而不是分别发送每次算术操作。

比较下移路径

在天真的执行中,每次行动都独立跨越调度边界,并遵循自己的框架-运行时间-硬件路径。 在引信执行中,一个Python呼叫覆盖了完整的计算。 追踪包含一个发送和一个硬件事件,组件操作之间没有间隙。

配置 3:有火炬的Naive PyTorch. 编译

最后的例子,用火炬编译原始的天真RMSNorm函数。 编译。

通过@torch.compile(后端="neuron"),火炬迪纳摩将Python字节代码作为FX图抓取,AOTAutograd将其降为ATen操作。 Neuron后端接收完整的图表,而不是单独发送每个操作。 它将操作整合,优化内存访问,并将图集成一个单一的NEFF文物。 文物是作为硬件发送的

@torch.compile(后端='neuron',全图=True) 互联网档案馆的存檔,存档日期2011-09-02.

def 天真编译( t):

x_sq = t * t

平均值 sq = x sq.mean(dim=-1, keepdim=True)

rms = 火炬.rsqrt(平均值+ 1e-6)

返回 t * rms * 重量

编译的功能作为火炬编译区出现在关键平均值表中。

本国总产量:375.5 微克

编译的图表通过运行时间调度和硬件执行遵循一个路径。

表格显示 1设备执行,如Profile 2,但代码走的路径不同。 编译器没有调用目的建造的引信操作,而是从原来的Python函数中发现了聚变。 在本次运行中,Neuron时间与火炬.rms norm相当,为375 μs,而403 μs.

侧式摘要

双火炬.rms norm和火炬。 将引信 RMSNorm 编成一个内核调度。 在这些运行中,任一方法都占用了天真的执行装置时间的六分之一。 Fusion可以消除硬件执行之间的空隙,避免在单独发送的操作之间实现中间值如x sq和平均 sq.

结论

key 平均 () 显示操作会消耗设备时间,而其全输出也会是揭示 CPU 侧设置和传输。 探索者提供相应的视觉跟踪。 您可以跟踪一个操作,从框架发送到运行时间调度到硬件执行,并看到核聚变消除的漏洞。

在更大的模型上可以使用相同的工作流程:在表格中找到热点,在跟踪中验证,然后确定是引信操作还是火炬。 汇编可以降低成本。

在第二部分中,我们将进入设备级别配置。 您打开 NEFF,检查 TensorEngine, VectorEngine,和直接内存访问( DMA) 分解,并将内核放置在屋顶线上,以确定它是计算键还是内存键。

特别感谢Aritra Roy Gosthipaty的灵感开始这个系列,感谢我的同行Pinak Panigrahi、Samir Araujo、Akhil Azhikodan、Esha Lakhotia及其他评论!

本文由 AI图鉴自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

Atoms

第一支自动构建真实业务的 AI 团队

H2O EvalGPT

H2O.ai推出的基于Elo评级方法的大模型评估系统

PartnerStack

领先的合作伙伴生态系统平台

书生大模型

上海人工智能实验室推出的系列AI模型

相关免费羊毛

AWS

新用户最高 $200 免费额度(6 个月)

AWS Activate

创业公司最高 $200k 云额度

Amazon Bedrock

新用户 $200 AWS 额度

Google Gemini API

Gemini API 免费层可直接试用

同源资讯

NVIDIA Kumo 关系超常操作监督机器学习关系数据,不需要培训

HuggingFace · 10-22

专门化可持续土地管理词汇如何降低实际应用的推论成本77%

HuggingFace · 10-22

阅读原文(huggingface.co)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI图鉴首页 · 提交工具 · 商务合作 · 关于本站 · 586 款 AI 工具分类导航 · 每日 AI 热门项目与动态