昇腾/GE:通过算子原型构建图
发布时间:2026/9/10 11:37:38 锦皓数字建站

通过算子原型构建Graph【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge本节介绍如何通过算子原型和图引擎接口一步步地构建完整Graph。功能介绍使用REG_OP宏将算子原型注册成功后会自动生成对应的衍生接口参见原型定义衍生接口用户可以通过这些接口在Graph中定义算子随后创建一个Graph实例并在Graph中设置输入算子、输出算子从而完成Graph构建。使用算子原型衍生接口定义算子下面仅介绍使用算子原型衍生接口定义算子的通用过程具体各类算子例如数据节点、计算节点的定义示例请参考Graph中各类算子表达样例。包含的头文件。# 必选头文件 #include ops_proto_legacy.h # 可选头文件 #include ops_proto_math.h #include ops_proto_cv.h #include ops_proto_nn.h #include ops_proto_transformer.h对于内置算子定义内置算子类型可使用内置算子类型相关的接口头文件所在路径为“${INSTALL_DIR}/opp/built-in/op_graph/inc/”。开发时必须包含ops_proto_legacy.h头文件。此外请根据具体算子按需包含对应的可选头文件。例如若使用SoftmaxV2算子则需额外包含 ops_proto_nn.h。#include ops_proto_legacy.h #include ops_proto_nn.h对于自定义算子需要包括自定义算子的原型定义头文件头文件所在路径为“${INSTALL_DIR}/opp/vendors/vendor_name/op_proto/inc”。其中${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例安装后文件默认存储路径为/usr/local/Ascend/cann。创建算子实例。使用REG_OP宏注册算子类型后会自动生成算子类型构造函数explicit OpType(const char* name)相当于定义了一个op::xxx的Class开发者include该原型头文件实例化该Class构建Graph。在构建Graph时可直接传算子名称作为入参例如auto softmax op::SoftmaxV2(softmax)注意图中的算子名称必须唯一。设置算子输入。算子原型中定义了算子的输入名称、输入类型以及算子支持的数据类型。根据输入类型可将算子输入分为可选输入、必选输入和动态输入。对于可选输入、必选输入和动态输入需要通过不同的接口设置。设置算子必选输入和可选输入通过“set_input_输入名称”设置例如auto softmax op::SoftmaxV2(softmax) // 创建SoftmaxV2算子实例 .set_input_x(bias_add_3); // 设置SoftmaxV2算子输入为bias_add_3设置算子动态输入通过“create_dynamic_input_输入名称”创建动态输入、“set_dynamic_input_输入名称”设置动态输入示例请参考定义动态多输入算子AddN。设置算子属性。算子原型中定义了算子的属性名称、属性类型、属性支持的数据类型、属性的默认值及取值范围。根据属性类型可将算子属性分为必选属性REQUIRED_ATTR一定要在算子定义时设置属性值和可选属性ATTR不设置算子对象的属性值时使用默认值。对于必选属性和可选属性都可以通过“set_attr_属性名称”接口设置例如auto maxpool1 op::MaxPool(MaxPool1) .set_input_x(tanh1) .set_attr_ksize({1, 1, 2, 1}) // 设置ksize属性值 .set_attr_strides({1, 1, 2, 1}) // 设置strides属性值 .set_attr_padding(SAME); // 设置padding属性值算子连接边表达算子之间的连边分为数据边和控制边。数据边用于指定算子的输入控制边用于控制算子的执行顺序。数据边表达。对于前一个算子只有一个输出可以通过“set_input_输入名称”接口传入前一个算子的名称。auto bias_add_3 op::BiasAdd(bias_add_3) .set_input_x(matmul_2) .set_input_bias(bias_add_const_3) .set_attr_data_format(NCHW); auto softmax op::SoftmaxV2(Softmax) .set_input_x(bias_add_3);如果前一个算子有多个输出则需要传入上一个算子的名称和输出名称或者传入上一个算子的名称和输出索引。传入上一个算子的名称和输出名称auto data op::Data(data); auto unique op::Unique(unique).set_input_x(data); auto softplus op::Softplus(softplus).set_input_x(unique, y); // 创建softplus算子设置输入为unique算子的y输出 auto sqrt op::Sqrt(sqrt).set_input_x(unique, idx); // 创建sqrt算子设置输入为unique算子的idx输出传入上一个算子的名称和输出索引auto data op::Data(data); auto unique op::Unique(unique).set_input_x(data); auto softplus op::Softplus(softplus).set_input_x(unique, 0); // 创建softplus算子设置输入为unique算子的第一个输出 auto sqrt op::Sqrt(sqrt).set_input_x(unique, 1); // 创建sqrt算子设置输入为unique算子的第二个输出控制边表达。如果图中某个算子的执行依赖于图中其他算子执行完如下图所示如果需要控制先执行Sqrt再执行Softplus则需要调用AddControlInput接口对Softplus算子增加控制边。代码示例auto data op::Data(data); auto unique op::Unique(unique).set_input_x(data); auto sqrt op::Sqrt(sqrt).set_input_x(unique, idx); auto softplus op::Softplus(softplus).set_input_x(unique, y).AddControlInput(sqrt);创建Graph实例完成算子定义后需要创建Graph实例并在Graph中设置输入算子、输出算子主要过程为包含所需的头文件。#include graph.h创建Graph对象。Graph graph(IrGraph);相关接口请参考Graph。设置Graph输入和输出算子使用到的主要接口为设置Graph内的输入算子SetInputs设置Graph内的输出算子SetOutputs例如设置Graph的输入为Data算子输出为Softmax算子std::vectorOperator inputs{data}; // data为Data类型的算子对象 std::vectorOperator outputs{softmax}; // softmax为Softmax类型的算子对象 graph.SetInputs(inputs).SetOutputs(outputs);如果输入为多个Data算子需要保证inputs入参顺序和Data算子index属性指定的顺序保持一致否则后面生成模型时会报错。例如// 准备第一个输入数据 auto shape_data0 vectorint64_t({1,17,2,2}); TensorDesc desc_data0(ge::Shape(shape_data0), FORMAT_ND, DT_FLOAT); auto data0 op::Data(data0).set_attr_index(0) ; // 创建data0算子index属性为0 data0.update_input_desc_x(desc_data0); // 设置算子输入描述 data0.update_output_desc_y(desc_data0); // 设置算子输出描述 // 准备第二个输入数据 auto shape_data1 vectorint64_t({1,5,2,2}); TensorDesc desc_data1(ge::Shape(shape_data1), FORMAT_ND, DT_FLOAT); auto data1 op::Data(data1).set_attr_index(1) ; // 创建data1算子index属性为1 data1.update_input_desc_x(desc_data1); // 设置算子输入描述 data1.update_output_desc_y(desc_data1); // 设置算子输出描述 // 设置Graph输入算子 std::vectorOperator inputs{data0, data1};[!NOTE]说明在构图过程中如果Tensor的shape维度和format维度数量不一致按照如下表格中的规则理解当前维度 例如shape只有1维为[16]format为4维比如NHWC该场景下可以理解为shape的1维为C轴其他轴需要补维补维后格式为[1,1,1,16] shape为2维[16,16]format为4维比如NHWC该场景下可以理解为shape的2维为HW轴其他轴需要补维补维后格式为[1,16,16,1]。该说明不适用于Ascend 950PR/Ascend 950DT。|实际维度数|format|维度理解为| |--|--|--| |1|NCHWNHWCHWCNCHWNNDHWCNCDHWDHWCNDHWNC|C| |2|NCHW|CH| |2|NHWC|HW| |2|HWCN|CN| |2|CHWN|WN| |2|NDHWC|WC| |2|NCDHW|HW| |2|DHWCN|CN| |2|DHWNC|NC| |3|NCHW|CHW| |3|NHWC|HWC| |3|HWCN|WCN| |3|CHWN|HWN| |3|NDHWC|HWC| |3|NCDHW|DHW| |3|DHWCN|WCN| |3|DHWNC|WNC| |4|NDHWC|DHWC| |4|NCDHW|CDHW| |4|DHWCN|HWCN| |4|DHWNC|HWNC|【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。