news 2026/9/10 20:49:59

CANN/ge:使用改图接口修改Graph

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/ge:使用改图接口修改Graph

使用改图接口修改Graph

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

如果用户想要直接优化图的结构,比如将某些特定子图替换成一个融合算子,以减少计算步骤、外存访问、调度时间等,或者在某些算子之间添加一个算子,此时可以通过本节内容将图直接修改成期望的结构。

功能介绍

本节以在算子A和算子B之间添加算子C为例,说明如何修改Graph,涉及的主要接口如下:

本手册除了通过改图接口修改Graph,还提供了将改图函数封装为自定义Pass来修改Graph的方式,详细介绍请参见基于改图接口实现Pass。

开发示例

  1. 包含的头文件。

    #include "graph.h" #include "ascend_string.h" #include "ge_ir_build.h" #include "gnode.h"
  2. (可选步骤)修改图之前,可以先调用aclgrphDumpGraph把Graph dump到本地,查看Graph信息。

    需要注意的是,aclgrphDumpGraph接口必须在SetInputs接口和SetOutputs接口之后调用,例如:

    string op_name = "tc_ge_openpass_0001"; // 创建Graph对象 Graph graph(op_name); // 创建Data算子实例 auto data = op::Data("data").set_attr_index(0); // 定义数据张量的描述信息 TensorDesc data_desc2(ge::Shape({3, 3, 3, 3}), FORMAT_NHWC, DT_FLOAT); data.update_input_desc_x(data_desc2); data.update_output_desc_y(data_desc2); // 创建MatrixInverse算子实例,并设置其输入为Data的输出 auto matrixinverse = op::MatrixInverse("MatrixInverse").set_input_x(data); // 创建Square算子实例,并设置其输入为MatrixInverse的输出 auto square1 = op::Square("square1").set_input_x(matrixinverse); std::vector<Operator> inputs{data}; std::vector<Operator> outputs{data,square1}; // 调用接口,设置Graph的输入输出算子 graph.SetInputs(inputs).SetOutputs(outputs); std::map<std::string, std::string> init_options = { {ge::ir_option::SOC_VERSION,"xxx"} }; // 模型初始化,申请资源 auto ret = aclgrphBuildInitialize(init_options); EXPECT_EQ(ret, GRAPH_SUCCESS); std::cout << "BuildInitialize before infershape Success." << std::endl; size_t filesize =24; const char* file = "tc_ge_openpass_0001_dump"; // 将输入的Graph导出到文件中 ret = ge::aclgrphDumpGraph(graph,file,filesize); if(ret != GRAPH_SUCCESS) { std::cout<<"dump graph failed."<<std::endl; } // 编译生成离线模型并保存到内存缓冲区 ret = aclgrphBuildModel(graph,op_name); if(ret != GRAPH_SUCCESS) { std::cout<<"aclgrphBuildModel failed."<<std::endl; }
  3. 在算子A和算子B之间增加算子C,比如在Const和Add算子之间插入Abs。

    const std::string CONST = "Const"; const std::string ADD = "Add"; GNode src_node; GNode dst_node; std::vector<GNode> nodes = graph.GetAllNodes(); for(auto &node : nodes) { ge::AscendString name; node.GetName(name); std::string node_name(name.GetString()); if(node_name == CONST) { src_node = node;} else if(node_name == ADD) { dst_node = node;} } graph.RemoveEdge(src_node, 0, dst_node, 0); auto abs = op::Abs("input3_abs"); GNode node_abs = graph.AddNodeByOp(abs); TensorDesc output_tensor_desc; src_node.GetOutputDesc(0, output_tensor_desc); abs.UpdateInputDesc(0, output_tensor_desc); abs.UpdateOutputDesc(0, output_tensor_desc); graph.AddDataEdge(src_node, 0, node_abs, 0); graph.AddDataEdge(node_abs, 0, dst_node, 0);
    1. 调用GetAllNodes找到Const算子和Add算子。

    2. 调用RemoveEdge删除Const算子和Add算子的连边(数据边或控制边)。

    3. 参考使用算子原型衍生接口定义算子,创建Operator类算子Abs(也可以调用OperatorFactory::CreateOperator创建算子)。

    4. 调用AddNodeByOp创建GNode类算子Abs。

      创建完算子后,可以根据需要更新该算子的input和output TensorDesc,一般根据源节点的Output TensorDesc更新算子abs的Input TensorDesc和Output TensorDesc。如果不更新,系统会设置默认值,在模型编译时对Tensor Shape,type进行推导。

    5. 调用AddDataEdge添加Const算子和Abs算子,Abs算子和Add算子之间的连边。如果有控制边,再调用AddControlEdge添加控制边。

    如果在A与B插入多个算子,比如,A->C->D->B,参考以上步骤,分别执行操作A->C, C->D, D->B。

  4. 删除算子A和算子B之间的C算子,比如删除算子Const和Add之间的Abs。

    graph.RemoveNode(node_abs); graph.AddDataEdge(src_node, 0, dst_node, 0);
    1. 调用RemoveNode删除Abs算子。
    2. 调用AddDataEdge添加Const和Add算子之间的连边。如果有控制边,再调用AddControlEdge添加控制边。
  5. 此外,如果需要查询GNode的信息,可以参考GNode提供的方法。

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 20:46:28

Python大数据架构在在线考试系统中的应用实践

1. 项目概述&#xff1a;当大数据遇上在线考试系统去年参与某高校在线考试平台重构项目时&#xff0c;我深刻体会到传统考试系统在面对万人级并发时有多么脆弱。考试开始前5分钟的系统崩溃&#xff0c;监考老师手动记录考生名单的混乱场景至今难忘。这正是我们选择Python大数据…

作者头像 李华
网站建设 2026/9/10 20:43:55

AI时代程序员的核心竞争力与转型路径

1. 程序员在AI时代的真实处境2017年AlphaGo击败柯洁时&#xff0c;我正带领团队开发一个金融风控系统。那天午休时间&#xff0c;整个办公室的程序员都围在屏幕前观看比赛直播。当看到柯洁中途离场擦眼泪的画面&#xff0c;我注意到团队里几个年轻开发者的表情变得异常凝重。这…

作者头像 李华
网站建设 2026/9/10 20:42:56

开源鸿蒙5.0小型系统SDK编译环境搭建与配置指南

1. 开源鸿蒙5.0小型系统SDK编译环境准备编译开源鸿蒙5.0小型系统的SDK需要先搭建完整的开发环境。根据社区实践反馈&#xff0c;推荐使用Ubuntu 20.04 LTS作为基础操作系统&#xff0c;这是目前验证最稳定的编译平台。以下是具体环境配置步骤&#xff1a;1.1 基础依赖安装首先需…

作者头像 李华
网站建设 2026/9/10 20:42:39

CANN/ge异步模型执行接口

aclmdlExecuteAsyncV2 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、Tens…

作者头像 李华
网站建设 2026/9/10 20:41:27

MySQL存储过程实战:从基础语法到高级应用

1. 存储过程基础概念解析 存储过程&#xff08;Stored Procedure&#xff09;是MySQL中一组预编译的SQL语句集合&#xff0c;它像编程语言中的函数一样可以被重复调用。我第一次接触存储过程是在处理电商平台的订单报表时&#xff0c;当时需要每天凌晨3点生成前一天的销售汇总&…

作者头像 李华
网站建设 2026/9/10 20:39:02

大数据与财务结合:2026届大专生的职业发展新机遇

1. 为什么"大数据财务"是2026届大专生的黄金组合&#xff1f;在财务数字化转型浪潮中&#xff0c;我亲眼见证了一家传统制造企业的财务部门从20人缩减到8人&#xff0c;但数据处理能力却提升了300%。这不是裁员故事&#xff0c;而是财务人技能升级的典型案例。2023年…

作者头像 李华