资讯详情

TorchAir Eager 模式算子数据 Dump 功能:NPU 图模式推理的输入输出取证与问题定位指南

📅 2026/10/14 20:15:59 | 华诺云谱 👁 阅读
TorchAir Eager 模式算子数据 Dump 功能:NPU 图模式推理的输入输出取证与问题定位指南
人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载导读本文介绍 TorchAirtorchair在Eager 模式下对算子级输入/输出数据执行 dump的调试能力通过torchair.get_npu_backend的compiler_config一键开启将图计算过程中各算子的输入、输出张量以npy格式落盘用于算子运行性能、精度类问题的定位与分析。读完本文你将掌握data_dump.type、data_dump.path、data_dump.filter三个配置项的使用方法、Node.name的获取技巧借助图结构 dump、以及 dump 产物文件命名规则与目录组织方式并理解其底层基于torch.fx.Interpreter的实现原理。功能简介在 PyTorch 的torch.compile(model, backendnpu_backend)图编译流程中TorchAir 先将模型转换为 FX 图再进一步转换为昇腾 GE 图并执行。当模型出现算子运行性能异常或精度问题如某个算子输出不符合预期时最直接的排查手段就是查看该算子在实际运行时的输入与输出数据。Eager 模式下的算子数据 dump 功能正是为这一场景设计在 Eager 执行阶段把图计算过程中每个或经过 filter 筛选的算子的输入、输出数据导出为npy文件供后续离线比对与分析。需要特别说明的是该功能会在 Eager 阶段完成数据采集因此与“图模式GE 图编译执行下的功能配置”互斥详见下文使用约束。使用约束开启本功能后GE 图模式相关的功能配置均不生效。从源码实现可以更清楚地理解这一点在 npu_fx_compiler.py 中当config.debug.data_dump.enabled为真时编译器会跳过正常的 NPU 图编译流程改用_NpuFxDumper一个基于torch.fx.Interpreter的 FX 图解释器以 Eager 方式逐节点执行并落盘数据并打印如下告警日志When dumping data of FX Graph, npu run will be skipped, and FALLBACK to EAGER execution, once dump finished, please make sure to disable the data dump config to ensure that the graph is compiled and executed.因此请牢记dump 完成后务必关闭该配置否则模型将一直以 Eager 回退方式执行无法获得图编译带来的性能收益。同理debug.fx_summary等其他调试项在开启时也会有类似的执行方式影响使用调试功能时请注意区分。使用方法配置入口该功能通过 torchair.get_npu_backend 中的compiler_config配置CompilerConfig.debug.data_dump即数据 dump 配置对象。以下示例仅供参考不支持直接拷贝运行依赖具体模型与运行环境import torch, torch_npu, torchair config torchair.CompilerConfig() # Eager模式下数据dump功能 config.debug.data_dump.type npy config.debug.data_dump.path ./test # 若只dump add_1 和 sub 算子n.name为Node类实例化的name属性 config.debug.data_dump.filter lambda n: n if n.name in [add_1, sub] else None npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, backendnpu_backend)配置完成后直接正常调用opt_model(...)即可触发 dump。参数说明表 1参数说明| 参数名 | 参数说明 | | -- | -- | | data_dump.type | 指定 dump 文件类型字符串类型。默认为None表示不导出 dump 数据。若设置当前仅支持npy格式。 | | data_dump.filter | 用户自定义过滤函数保留满足函数条件的内容。输入PyTorch 中的Node类的实例n输出PyTorch 中的Node类的实例n或者None。默认值为None表示不过滤任何内容。说明Node类实例化的各属性如name、target等获取方法主要通过图结构 dump 功能获取。以常见的name属性为例获取方法见下文。 | | data_dump.path | 设置 dump 文件生成的路径字符串型。可选配置如果不设置默认为当前执行路径。请确保参数中指定的路径真实存在并且运行用户具有读取和写入权限。 |获取 Node.name 属性配合图结构 dumpdata_dump.filter回调接收的是torch.fx.Node实例其name节点名与target算子目标等属性可以通过图结构 dump 功能获取具体步骤如下先以py格式 dump 图信息config.debug.graph_dump.type py在当前执行路径下会生成dynamo_*.py文件其中包含 TorchAir 构图信息。搜索关键词FX Code其后面字段即对应n.name属性信息。示例如下# File /home/a.py, line 32, in forward xxy ## FX Code: **add_1**: torch.float32[s0, s0]npu:0 torch.ops.aten.add.Tensor(add: torch.float32[s0, s0]npu:0, arg2_1: torch.float32[s0, s0]npu:0) Add_1_0 ge.Add(Add_0, arg2_1_0, node_nameAdd_1) # File /home/a.py, line 36, in forward xx-1 ## FX Code: **sub**: torch.float32[s0, s0]npu:0 torch.ops.aten.sub.Tensor(mul_1: torch.float32[s0, s0]npu:0, 1) Sub_0 ge.Sub(Cast_1_0, ge.Const(1, dtype0), node_nameSub)上例中FX Code一行的**add_1**、**sub**即对应filter回调中n.name的取值可直接用于筛选目标算子。图结构 dump 功能的完整介绍graph_dump.type的py/txt/pbtxt三种格式与产物样例参见 图结构 dump 功能。配置项的源码级细节从 debug_config.py 可以看到_DataDump类的定义要点type使用OptionValue(None, [npy])定义默认值为None可选值当前仅[npy]若传入不在可选列表中的值配置框架会直接抛出ValueError见 _option_base.pyfilter默认为None作为固定属性_fixed_attrs参与配置比较与序列化path通过setter执行os.path.realpath(value)做真实路径归一化因此配置相对路径时也会被解析为绝对路径后再拼接产物路径_DebugBase.enabled属性判定type.value is not None即只要设置了type即视为开启本功能见 debug_config.py。CompilerConfig.debug在 compiler_config.py 中实例化为_DebugConfig()其中同时包含graph_dump、data_dump、fx_summary、run_eagerly、deadlock_check等调试子项本文聚焦data_dump。功能原理基于 torch.fx.Interpreter 的 Eager 数据采集理解产物结构与过滤行为有必要看一下底层实现 fx_dumper.py_NpuFxDumper继承自torch.fx.Interpreterfx_dumper.py以解释执行方式逐个运行 FX 图节点run_node中先调用用户filter若返回None则跳过 dump、正常执行该节点否则以过滤后的节点进入 dump 上下文fx_dumper.py_trace_dump装饰器fx_dumper.py在节点执行前后分别落盘输入与输出call_function执行前保存每个输入参数含 list/tuple 形态的序列化输入按外层索引i与内层索引j展开执行后保存每个输出OUTPUT.{i}张量统一通过_as_numpy转为numpy.ndarray保存其中bfloat16张量会先转成float32再落盘fx_dumper.py比对数据时需注意 dtype 差异每次run即对编译后模型的一次调用结束后_step 1作为 dump 目录中的 step 标识从 0 开始递增fx_dumper.py分布式场景下若torch.distributed已初始化且world_size 1目录会按worldsize{world_size}_global_rank{global_rank}分卡组织fx_dumper.py。另外非 ATen 目标无对应 GE converter 的节点如部分自定义 target会被跳过不参与 dump日志中会打印Skip dump non aten target级别的调试信息fx_dumper.py即data_dump主要覆盖可被 GE 转换的 ATen 算子。产物说明开启数据 dump 功能后得到如下命名的文件${op_type}-${aten_ir}.${param_type}${param_idx}${timestamp}.npy各字段含义${op_type}算子类型即 FX 节点的name属性如add_1、sub${aten_ir}ATen 算子名即节点的target如aten.add.Tensor、aten.sub.Tensor${param_type}参数类型INPUT或OUTPUT${param_idx}输入/输出参数的索引默认从 0 开始${timestamp}时间戳${world_size}/${global_rank}集合通信中的world_size以及global_rank信息仅分布式多卡场景体现于目录名。产物路径默认为当前执行目录目录结构如下├ torch_test.py // PyTorch脚本 │ ├── worldsize${world_size}_global_rank${global_rank} // 若只涉及单卡则表示为worldsize1_global_rank0 │ ├── graph_1 // ${global_rank}所在进程的子图名称 │ ├── 0 // 首次dump的结果文件通过step id标记step id从0开始 │ ├── add_1-aten.add.Tensor.INPUT.0.20251017071211190258.npy // filter过滤函数dump的结果文件 │ ├── add_1-aten.add.Tensor.INPUT.1.20251017071211190258.npy │ ├── add_1-aten.add.Tensor.OUTPUT.0.20251017071211190258.npy │ ├── sub-aten.sub.Tensor.INPUT.0.20251017071211202083.npy │ ├── sub-aten.sub.Tensor.INPUT.1.20251017071211202083.npy │ ├── sub-aten.sub.Tensor.OUTPUT.0.20251017071211202083.npy │ ...... │ ├── n // 第n1次dump的结果文件通过step id标记 │ ├── xxx.npy │ ...... │ ├── worldsize${world_size}_global_rank${global_rank} │ ├── graph_1 │ ├── 0 │ ├── xxx.npy上述组织方式与源码实现一一对应worldsize${world_size}_global_rank${global_rank}/graph_${id}/${step}/的路径拼接逻辑见 fx_dumper.py其中graph_${id}中的${id}来自npu_fx_compiler.py中的全局唯一图序号_next_unique_graph_id()${step}即每次调用模型产生的 step id。实操验证与测试参考仓库内置了数据 dump 的自动化测试可作为功能开启方式与产物校验的参考tests/smoke/data_dump_test.pytest_data_dump_with_scope演示了通过torchair.scope.data_dump()上下文对局部算子add、sub开启 dump并断言产物目录worldsize*_global_rank*/0/graph_*/1/0下同时存在 add 与 sub 相关文件test_aclgraph_data_dump演示了mode reduce-overheadaclgraph 模式下基于dump_config.enable_dump的 dump 流程tests/st/torchair_st.pytest_data_dump_generation直接设置config.debug.data_dump.type npy、config.debug.data_dump.path ./test_data_dump_generation/dir随后断言worldsize1_global_rank0目录下生成 3 个 npy 文件对应某算子的 2 个输入 1 个输出test_data_dump_failpath则验证了当path指向一个已存在的普通文件非目录时的失败行为——因此务必保证data_dump.path指向真实存在的可写目录。典型使用流程总结开启图结构 dumpconfig.debug.graph_dump.type py确认模型执行从生成的dynamo_*.py中FX Code关键词处摘录目标算子的name关闭图结构 dump开启数据 dump设置config.debug.data_dump.type npy、config.debug.data_dump.path 存在的可写目录并按需编写data_dump.filter回调只保留目标算子重新执行模型从产物路径默认为当前执行目录下的worldsize1_global_rank0/graph_*/0/中读取对应算子的INPUT/OUTPUTnpy 文件与期望值或相邻 step 的数据进行比对分析问题定位完成后务必关闭data_dump配置将type恢复为None使模型恢复正常的 GE 图编译执行避免持续的 Eager 回退带来性能开销。通过上述流程即可在 Eager 模式下对任意关注算子的输入输出完成“取证”为算子性能瓶颈分析与精度问题排查提供可靠的数据基础。赞分享人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载相关推荐TorchAir 算子 data dump 功能详解Ascend IR 图模式下算子输入/输出数据的采集、配置与精度定位实践TorchAir 算子 data dump 功能详解Ascend IR 图模式下算子输入/输出数据的采集、配置与精度定位实践 导读 本文聚焦 TorchAir人工智能模型编译AscendTorchAir 图模式算子 data dump 范围控制torchair.scope.data_dump 接口实战与原理TorchAir 图模式算子 data dump 范围控制torchair.scope.data_dump 接口实战与原理 本文面向在昇腾 NPU 上使用 T人工智能模型编译AscendTorchAir 图模式性能分析实战用 Profiling 数据定位昇腾 NPU 上的耗时瓶颈TorchAir 图模式性能分析实战用 Profiling 数据定位昇腾 NPU 上的耗时瓶颈 本文以 performance_cases.md https:人工智能模型编译Ascend上一篇Phi-3-medium-128k-instruct部署指南从云端到边缘计算的完整解决方案下一篇大恒相机控制源码C/C显示/控制/存储创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑