人工智能模型编译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),仅供参考