昇腾社区首页
中文
注册

如何通过FlowOperator构建FlowGraph

功能介绍

用户使用创建好的FlowOperator节点,创建一个FlowGraph实例,并在FlowGraph中设置输入、输出,从而完成Graph构建。

使用FlowOperator衍生接口定义节点

  1. 包含的头文件。
    1
    #include "flow_graph/data_flow.h"
    
  2. 创建FlowOperator实例。

    支持如下两种类型

    • FlowData
      1
      2
      auto data0 = dflow::FlowData("Data0", 0);
      auto data1 = dflow::FlowData("Data1", 1);
      
    • FlowNode
      1
      auto node0 = dflow::FlowNode("node0", 2, 1);
      

    注意:图中的data名称和node名称必须唯一

  3. 设置FlowOperator输入。

    只有FlowNode类型的FlowOperator才需要设置输入。

    设置FlowOperator输入:通过“SetInput”设置,例如:
    1
    2
    3
    auto node0 = dflow::FlowNode("node0", 2, 1)         // 创建FlowNode的FlowOperator实例
      .SetInput(0, data0)                               // 设置FlowNode第一个输入为data0
      .SetInput(1, data1);                              // 设置FlowNode第二个输入为data1
    

FlowOperator连接边表达

FlowOperator之间的连边为数据边。数据边用于指定FlowOperator的输入。数据边表达如下。

上图的示例代码和注释如下。

1
2
3
4
5
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的输出index=0。
auto node2 = dflow::FlowNode("flow_node2", 1, 1).SetInput(0, flow_node0, 1); // node0有两个输出,第二个输出作为node2的第一个输入,SetInput时需要传node0的输出index=1。

创建FlowGraph实例

完成FlowOperator后,需要创建FlowGraph实例,并在FlowGraph中设置输入FlowOperator、输出FlowOperator,主要过程为:

  1. 包含所需的头文件。
    1
    #include "flow_graph/data_flow.h"
    
  2. 创建FlowGraph对象。
    1
    dflow::FlowGraph flow_graph("flow_graph");
    

    相关接口请参考FlowGraph类

  3. 设置FlowGraph输入和输出节点,使用到的主要接口为:
    • 设置FlowGraph内的输入节点:SetInputs
    • 设置FlowGraph内的输出节点:SetOutputs
    • 如果作为输出节点的flownode存在多个输出,也可以指定该flownode的某个输出为模型输出SetOutputs

    如下例子是将整个node2的所有输出作为模型输出场景,如果需要设置部分节点部分输出为模型输出请参考SetOutputs

    1
    2
    3
    std::vector<FlowOperator> inputs{data0, data1};
    std::vector<FlowOperator> outputs{node2};
    flow_graph.SetInputs(inputs).SetOutputs(outputs);
    

    如果输入为多个FlowData节点,需要保证inputs入参顺序和FlowData节点index属性指定的顺序保持一致,否则后面生成模型时会报错。例如:

    1
    2
    3
    4
    5
    6
    // 准备第一个输入数据
    auto data0 = dflow::FlowData("Data0", 0);   // 创建data0节点,index属性为0
    // 准备第二个输入数据
    auto data1 = dflow::FlowData("Data1", 1);   // 创建data1节点,index属性为1
    // 设置FlowGraph输入节点
    std::vector<FlowOperator> inputs{data0, data1};