TorchAir 图模式构图元素 Clone 接口详解:基于 TensorMove 的单 Tensor 拷贝与依赖控制
人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载导读本文面向使用 TorchAir 在昇腾 NPU 上开展图模式推理、以及编写自定义算子 GE Converter 的开发者系统讲解torchair.ge.Clone这一构图元素的功能定位、参数语义、底层实现与典型调用场景。阅读完本文后你将掌握如何在 Converter 中通过Clone拷贝任意单个 Tensor、利用dependencies控制节点拓扑执行顺序并理解Clone与底层TensorMove节点的映射关系及其在图优化中的作用。功能说明Converter 中的单 Tensor 拷贝构图元素Clone是 TorchAir 为算子 Converter即 FX 节点到 GE IR 的转换函数提供的构图元素之一用于在 GE 图上创建一个Clone 节点实现图上任意单个 Tensor 的拷贝。在 docs/zh/ascend_ir/api/api_list.md 的torchair.ge接口列表中Clone与Const常量节点、Cast类型转换节点并列为三类基础构图元素其接口说明为算子 Converter 中的构图元素表示一个 Clone 节点该节点可实现图上任意单个 Tensor 的拷贝。从源码结构看Clone并非一个独立的图算子而是对底层 GE 算子TensorMove的封装在 python/torchair/ge/init.py 中Clone被声明为torchair.ge模块的公开导出成员__all__其函数体在完成输入参数校验后直接转发给从 GE IR 自动生成的TensorMove构图函数def Clone(x: Tensor, *, dependencies[], node_nameNone): # pylint: disabledangerous-default-value def check_input_is_tensor(target): if not isinstance(target, Tensor): raise AssertionError(finput {target} need to be Tensor, please check your input) check_input_is_tensor(x) if dependencies is not None: for dependency in dependencies: check_input_is_tensor(dependency) return TensorMove(xx, dependenciesdependencies, node_namenode_name)因此调用Clone后实际写入 GE 图的节点类型为TensorMove参见 auto_generated_ge_raw_ops.py 中REG_OP(TensorMove)的自动生成实现。函数原型Clone(x: Tensor, *, dependencies[], node_nameNone) - Tensor所有参数均以关键字形式传递dependencies与node_name带有默认值可省略。参数说明| 参数 | 输入/输出 | 说明 | |--|--|--| | x | 输入 | 待拷贝的 Tensor。 | | dependencies | 输入 | 指定 Clone 节点的执行顺序标识该节点在图中的拓扑依赖关系传入列表中为 Tensor 类型。表明 Clone 节点在 Tensor 列表后执行。 | | node_name | 输入 | 自定义 Clone 节点的名字默认为 None例如 const_1同一张图中节点名不允许重复。 | | * | 输入 | 预留参数项用于后续功能扩展。 |参数底层语义x必须是Tensor类型。源码中通过check_input_is_tensor校验若传入非 Tensor 对象如普通 Python 标量会抛出AssertionError。这里的Tensor指torchair.ge.TensorTensorBase即 GE 图上的 Tensor 句柄而非 PyTorch 的torch.Tensor。dependencies语义上对应 GE 图中的控制边control edge。在自动生成的TensorMove实现中每个依赖 Tensor 都会通过op.input.append(dependency.controller)挂接到节点输入上见 auto_generated_ge_raw_ops.py从而在图中显式声明本节点必须等这些 Tensor 对应的节点执行完毕后才能执行。这一点与同为构图元素的Cast的参数处理方式完全一致参见 ge/_ge_graph.py。传入的每个依赖项同样会被校验为 Tensor 类型。node_name传入后经next_unique_name(node_name, TensorMove)处理生成节点名。注意next_unique_name会在给定名称的基础上确保全局唯一因此同一张图中不允许出现重名节点未传时自动按 TensorMove、TensorMove_1 等规则生成。返回值说明正常情况下返回一个Tensor表示图上新增的一个TensorMove 节点的输出若参数类型不合法等导致构图失败则报错返回。从自动生成实现可以看出TensorMove的输入为x输出为y支持的数据类型覆盖DT_FLOAT16、DT_FLOAT、DT_INT32、DT_UINT32、DT_INT8、DT_UINT8、DT_UINT64、DT_INT64、DT_BOOL见 auto_generated_ge_raw_ops.py返回的Tensor即该节点的y输出可作为后续构图节点的输入继续参与建图。约束说明官方文档声明无。从实现细节可补充两点实践约束x与dependencies中的元素必须是torchair.ge.Tensornode_name需保证在同一张图内唯一源码通过next_unique_name自动消解重名。调用示例在自定义 Converter 中拷贝输入以下是官方文档给出的完整调用示例展示如何在自定义算子的 Ascend Converter 中使用Clone拷贝输入 Tensor 后再参与构图import torch_npu, torchair # 实现Ascend Converter register_fx_node_ge_converter(torch.ops.npu.npu_scatter_nd_update.default) def converter_npu_scatter_nd_update_default( x: Tensor, indices: Tensor, updates: Tensor, meta_outputs: TensorSpec None, ): # func: scatter_nd_update(Tensor x, Tensor indices, Tensor updates) - Tensor # copy是对x的cloneindices和updates是外部某算子的输出Tensor copy torchair.ge.Clone(x, dependencies[indices, updates], node_nameConst0) return scatterNdUpdateFunc(copy, indices, updates)该示例的核心意图是npu_scatter_nd_update的语义会原地更新输入x若直接以x参与构图可能破坏原 Tensor 的语义。因此先用Clone(x, ...)得到一份拷贝copy再让真正的散射更新算子作用在copy上同时通过dependencies[indices, updates]声明Clone节点必须在indices、updates对应的节点之后执行确保拷贝时所需的外部数据已经就绪。典型应用场景与源码佐证Clone即TensorMove在 TorchAir 内部被广泛用于以下场景可作为自定义 Converter 编写的参考范式aten._to_copy 的类型无关拷贝在 ge_converter/aten/_to_copy.py 中当dtype未改变时_to_copy被转换为ge.TensorMove(self)只有 dtype 发生改变时才转换为ge.Cast。这说明Clone天然承担同类型数据拷贝的构图职责。BatchNorm 运行统计量拷贝在 ge_converter/aten/_native_batch_norm_legit_functional.py 中running_mean、running_var在参与后续构图前均先经过ge.TensorMove拷贝避免原地语义污染运行统计量。inplace 算子自动构图在 fx2ge_converter.py 的_handle_inplace_clone逻辑中当算子被声明为 inplace 且存在 inplace 输出时框架会自动为对应输入生成xxx Clone(xxx)的克隆代码保证 inplace 语义在 GE 图上被安全表达。该机制在测试 tests/st/torchair_auto_converter_functional_st.py 中被验证——转换后的图中会出现TensorMove节点。引用类型算子冗余拷贝优化测试 tests/st/torchair_st.pytest_npu_executor_optimize_ref_op_copy展示了对ge.TensorMove节点的统计与优化场景构图阶段为Scatter、Assign等引用语义算子插入TensorMove拷贝随后通过optimize_reference_op_redundant_copy图优化剔除冗余拷贝最终将TensorMove数量收敛到必要值。这印证了Clone节点在成图后还会参与 GE 侧的冗余拷贝消除优化并非简单多一个拷贝节点。functionalization 辅助在 auto_functionalized_v2.py 的注释中说明TensorMove会被返回给后续节点作为输入从而让后续 pass 能够消除TensorMove——即Clone节点是 TorchAir 处理 inplace/引用语义时构图与优化的中间载体。与其他构图元素的对比| 构图元素 | 底层节点 | 职责 | |--|--|--| | Clone | TensorMove | 拷贝单个 Tensor同类型、同形状 | | Cast | Cast | Tensor 类型转换dst_type指定目标类型 | | Const | Const | 向图中写入常量值 |三者均为torchair.ge模块导出的公开 APIClone被收录在 tests/st/allowlist_for_publicAPI.json 的公开接口白名单中且Cast与Clone都支持dependencies与node_name参数底层对控制边与节点名的处理方式一致。使用建议当自定义算子语义会修改某个输入 Tensor如 inplace、scatter 类更新且后续构图需要保留原值时优先用Clone生成拷贝避免与其他算子产生数据竞争或语义歧义。若需要确保拷贝发生时某些外部 Tensor 已计算完成务必通过dependencies显式声明拓扑依赖该参数在构图层面会生成控制边是图模式中表达跨节点先后关系的重要手段。节点命名建议保持可读性如Const0便于后续调试成图结果无需手动去重框架的next_unique_name会保证节点名在图内唯一。赞分享人工智能模型编译Ascend【免费下载链接】torchairTorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。项目地址https://gitcode.com/Ascend/torchair点击查看免费下载相关推荐PyPTO vf.full 寄存器广播接口详解从标量填充到 Tensor 模式元素复制PyPTO vf.full 寄存器广播接口详解从标量填充到 Tensor 模式元素复制 vf.full 是 PyPTO SIMD 向量编程模型VFVect人工智能编译器模型编译深度学习高性能计算CANNAscendUnity3DTraining 原型模式深度解析从 Clone 浅拷贝到深拷贝的 C 实战Unity3DTraining 原型模式深度解析从 Clone 浅拷贝到深拷贝的 C 实战 原型模式是创建型设计模式中的一员本仓库Unity3DTrain示例工程SameDiff Create View 详解基于共享数据缓冲的零拷贝动态视图机制deeplearning4j ADR-0021SameDiff Create View 详解基于共享数据缓冲的零拷贝动态视图机制deeplearning4j ADR 0021 导读 Create Vi深度学习人工智能机器学习分布式训练上一篇旧款 Mac 装不上新系统OpenCore Legacy Patcher 从 U 盘到根补丁完整实战下一篇Better Auth密钥管理与安全配置策略构建企业级认证防护体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

三星预计实现创纪录的800亿美元利润

三星预计实现创纪录的800亿美元利润

三星电子公司表示,预计将在本季度创造科技行业历史上前所未有的季度利润纪录,首次突破100万亿韩元大关。在今日晚间发布的第三季度初步财报中,该公司透露预计营业利润将达到惊人的107.4万亿韩元(约合801.7亿美元)&…

2026/10/14 2:12:20 阅读更多 →
Zookeeper架构原理与实战:从ZAB协议到Leader选举

Zookeeper架构原理与实战:从ZAB协议到Leader选举

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:12:20 阅读更多 →
三强版 Codex 桌面 AI 智能体,WindowsmacOS 一键部署落地指南

三强版 Codex 桌面 AI 智能体,WindowsmacOS 一键部署落地指南

🔍前言 本文介绍 Codex Harness 一键安装包的部署方案,无需解压,也无需繁琐的环境配置,新手也能快速上手。该方案同时支持 Windows 与 macOS 双平台,跟随向导几步即可完成安装、登录与模型密钥配置。文中完整演示了技…

2026/10/14 2:12:20 阅读更多 →

最新新闻

Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →
C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:04:31 阅读更多 →
SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →
容器内nvidia-smi报Unknown Error的排查与根治

容器内nvidia-smi报Unknown Error的排查与根治

凌晨两点半,工作群里弹出一条消息:某个长期跑的容器,前一秒还好好的,后一秒容器里的nvidia-smi直接报Failed to initialize NVML: Unknown Error。宿主机上执行nvidia-smi一切正常,新建一个临时容器也能正常看到卡&…

2026/10/14 3:03:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →