ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

CANN/ge:使用改图接口修改Graph 使用改图接口修改Graph【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge如果用户想要直接优化图的结构比如将某些特定子图替换成一个融合算子以减少计算步骤、外存访问、调度时间等或者在某些算子之间添加一个算子此时可以通过本节内容将图直接修改成期望的结构。功能介绍本节以在算子A和算子B之间添加算子C为例说明如何修改Graph涉及的主要接口如下本手册除了通过改图接口修改Graph还提供了将改图函数封装为自定义Pass来修改Graph的方式详细介绍请参见基于改图接口实现Pass。开发示例包含的头文件。#include graph.h #include ascend_string.h #include ge_ir_build.h #include gnode.h可选步骤修改图之前可以先调用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::vectorOperator inputs{data}; std::vectorOperator outputs{data,square1}; // 调用接口设置Graph的输入输出算子 graph.SetInputs(inputs).SetOutputs(outputs); std::mapstd::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::coutdump graph failed.std::endl; } // 编译生成离线模型并保存到内存缓冲区 ret aclgrphBuildModel(graph,op_name); if(ret ! GRAPH_SUCCESS) { std::coutaclgrphBuildModel failed.std::endl; }在算子A和算子B之间增加算子C比如在Const和Add算子之间插入Abs。const std::string CONST Const; const std::string ADD Add; GNode src_node; GNode dst_node; std::vectorGNode 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);调用GetAllNodes找到Const算子和Add算子。调用RemoveEdge删除Const算子和Add算子的连边数据边或控制边。参考使用算子原型衍生接口定义算子创建Operator类算子Abs也可以调用OperatorFactory::CreateOperator创建算子。调用AddNodeByOp创建GNode类算子Abs。创建完算子后可以根据需要更新该算子的input和output TensorDesc一般根据源节点的Output TensorDesc更新算子abs的Input TensorDesc和Output TensorDesc。如果不更新系统会设置默认值在模型编译时对Tensor Shapetype进行推导。调用AddDataEdge添加Const算子和Abs算子Abs算子和Add算子之间的连边。如果有控制边再调用AddControlEdge添加控制边。如果在A与B插入多个算子比如A-C-D-B参考以上步骤分别执行操作A-C, C-D, D-B。删除算子A和算子B之间的C算子比如删除算子Const和Add之间的Abs。graph.RemoveNode(node_abs); graph.AddDataEdge(src_node, 0, dst_node, 0);调用RemoveNode删除Abs算子。调用AddDataEdge添加Const和Add算子之间的连边。如果有控制边再调用AddControlEdge添加控制边。此外如果需要查询GNode的信息可以参考GNode提供的方法。【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表