# 通过FlowOperator构建FlowGraph【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge什么是FlowOperatorFlowOperator是FlowGraph的节点基类衍生类有FlowData和FlowNode两种类型。什么是FlowDataFlowData是FlowGraph的输入节点。FlowData定义输入节点的名称和index。详细信息请参考FlowData类。什么是FlowNodeFlowNode是FlowGraph的计算节点。FlowNode定义了计算节点的名称、输入个数、输出个数FlowNode的实际计算逻辑由AddPp方法添加的ProcessPoint决定ProcessPoint可以是FunctionPp也可以是GraphPp。详细信息请参考FlowNode类。GraphPpGraphPp的主要函数原型包括如下。GraphPp(const char *pp_name, const Graphbuilder builder) // GraphPp构造函数。 GraphPp SetCompileConfig(const char *json_file) // 设置GraphPp的json配置文件路径和文件名。用于GraphPp和AscendGraph的映射。以Add功能为例介绍如何构建一个GraphPp。如下示例中Add有两个输入data0和data1GraphPp和AscendGraph的映射是通过GraphPp的构造方法里的BuildGraph参数传递的add_graph_config.json用于配置AscendGraph的编译信息。ge::Graph BuildGraph() { auto data0 op::Data(data0).set_attr_index(0); auto data1 op::Data(data1).set_attr_index(1); auto add op::Add(add).set_input_x1(data0).set_input_x2(data1); ge::Graph graph(Graph); graph.SetInputs({data0, data1}).SetOutputs({add}); return graph; } auto graph_pp dflow::GraphPp(graph_pp, BuildGraph) .SetCompileConfig(add_graph_config.json);FunctionPpFunctionPp的主要函数原型包括如下。FunctionPp(const char_t *pp_name) // FunctionPp构造函数。 FunctionPp SetCompileConfig(const char *json_file) // 用于FunctionPp和UDF的映射json_file里配置了UDF的编译信息。 FunctionPp SetInitParam(const char *attr_name, const ge::DataType value) // 设置FunctionPp的初始化参数。以Add功能为例介绍如何构建一个FunctionPp。如下示例中FunctionPp的名称叫func_ppFunctionPp的功能通过UDF实现FunctionPp和UDF的映射通过add_func_config.json来实现。[!NOTE]说明 UDF实现可以使用C也可以使用Python。auto function_pp dflow::FunctionPp(func_pp) .SetCompileConfig(add_func_config.json) .SetInitParam(out_type, ge::DT_UINT32);如何通过FlowOperator构建FlowGraph功能介绍用户使用创建好的FlowOperator节点创建一个FlowGraph实例并在FlowGraph中设置输入、输出从而完成Graph构建。使用FlowOperator衍生接口定义节点包含的头文件。#include flow_graph/data_flow.h创建FlowOperator实例。支持如下两种类型FlowDataauto data0 dflow::FlowData(Data0, 0); auto data1 dflow::FlowData(Data1, 1);FlowNodeauto node0 dflow::FlowNode(node0, 2, 1);注意图中的data名称和node名称必须唯一。设置FlowOperator输入。只有FlowNode类型的FlowOperator才需要设置输入。设置FlowOperator输入通过SetInput设置例如auto node0 dflow::FlowNode(node0, 2, 1) // 创建FlowNode的FlowOperator实例 .SetInput(0, data0) // 设置FlowNode第一个输入为data0 .SetInput(1, data1); // 设置FlowNode第二个输入为data1### FlowOperator连接边表达FlowOperator之间的连边为数据边。数据边用于指定FlowOperator的输入。数据边表达如下。上图的示例代码和注释如下。auto data0 dflow::FlowData(Data0, 0); auto data1 dflow::FlowData(Data1, 1); auto node0 dflow::FlowNode(flow_node0, 2, 2).SetInput(0, data0).SetInput(1, data1); // FlowData只有一个输出因此在作为FlowNode的输入时SetInput时不需要传FlowData的输出index。 auto node1 dflow::FlowNode(flow_node1, 1, 1).SetInput(0, flow_node0, 0); // node0有两个输出第一个输出作为node1的第一输入SetInput时需要传node0的输出index0。 auto node2 dflow::FlowNode(flow_node2, 1, 1).SetInput(0, flow_node0, 1); // node0有两个输出第二个输出作为node2的第一个输入SetInput时需要传node0的输出index1。创建FlowGraph实例完成FlowOperator后需要创建FlowGraph实例并在FlowGraph中设置输入FlowOperator、输出FlowOperator主要过程为包含所需的头文件。#include flow_graph/data_flow.h创建FlowGraph对象。dflow::FlowGraph flow_graph(flow_graph);相关接口请参考FlowGraph类。设置FlowGraph输入和输出节点使用到的主要接口为设置FlowGraph内的输入节点SetInputs。设置FlowGraph内的输出节点SetOutputs。如果作为输出节点的FlowNode存在多个输出也可以指定该FlowNode的某个输出为模型输出SetOutputsindex。如下例子是将整个node2的所有输出作为模型输出场景如果需要设置部分节点部分输出为模型输出请参考SetOutputsindexstd::vectorFlowOperator inputs{data0, data1}; std::vectorFlowOperator outputs{node2}; flow_graph.SetInputs(inputs).SetOutputs(outputs);如果输入为多个FlowData节点需要保证inputs入参顺序和FlowData节点index属性指定的顺序保持一致否则后面生成模型时会报错。例如// 准备第一个输入数据 auto data0 dflow::FlowData(Data0, 0); // 创建data0节点index属性为0 // 准备第二个输入数据 auto data1 dflow::FlowData(Data1, 1); // 创建data1节点index属性为1 // 设置FlowGraph输入节点 std::vectorFlowOperator inputs{data0, data1};【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考