昇腾社区首页
中文
注册
开发者
下载

通过ES构建Graph

功能介绍

使用ES构建Graph,整体流程分为如下四个步骤:

其中:

  1. 创建图构建器:初始化图构建器实例,用于提供构图所需的上下文、工作空间及构建相关方法。
  2. 添加起始节点:起始节点指无输入依赖的节点,通常包括图的输入(如Data节点)和权重常量(如Const节点)。
  3. 添加中间节点:中间节点为具有输入依赖的计算节点,通常由用户构图逻辑生成,并通过已有节点作为输入连接。
  4. 设置图输出:明确图的输出节点,作为计算结果的终点。

构图过程中,主要涉及两个对象, 以C++为例:

  • Graph:表示最终构建完成的计算图,是构图的目标产物。
  • EsGraphBuilder:构图辅助类,提供节点添加、连接、属性设置等方法,并记录构图过程的中间状态。EsGraphBuilder仅在构图阶段存在,用于承载中间构建信息,是APP构图时直接操作的对象。在构图完成后,其内部状态被封装为Graph实例返回,EsGraphBuilder本身及其相关资源被释放。

构建Graph实例

以下是使用C、C++、Python三种语言实现ES构图的实例,以构造一个“两个输入求和”计算图为例:

  • C代码示例
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    #include "es_math_ops_c.h"                        // Add算子所在的聚合头文件,里面包含了所有算子的头文件合集以及图构建器等基础结构的头文件
    // 1. 创建图构建器(EsCGraphBuilder)
    EsCGraphBuilder *builder = ("graph_name");
    // 2. 添加起始节点
     *data0 = (builder, 0); // 添加第1个输入节点
    EsCTensorHolder *data1 = EsCreateInput(builder, 1); // 添加第2个输入节点
    // 3. 添加中间节点
    EsCTensorHolder *add = EsAdd(data0, data1);        // 添加加法计算节点(不再需要显式传入builder)
    // 4. 设置图输出
    EsSetOutput(add, 0);                                // 将add节点设置为图的第1个输出
    // 5. 完成构图,返回最终图对象
    EsGraph *graph = (builder); // 获取构建完成的图
    // 6.释放builder及其管理的过程资源
    (builder);
    
  • CPP代码示例
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    #include "es_math_ops.h"                            // Add算子所在的聚合头文件,里面包含了所有算子的头文件合集以及图构建器等基础结构的头文件
    namespace ge {
    namespace es {
    // 1. 创建图构建器(EsGraphBuilder)
     builder("graph_name");
    // 2. 添加2个输入节点
     [data0, data1] = builder.<2>();
    // 3. 添加中间节点,C++中,加减乘除等常用运算符被重载,可以直接使用
    EsTensorHolder add = data0 + data1;
    // 4. 设置图输出
    builder.(add, 0);
    // 5. 完成构图,获取构造好的Graph对象,builder中的资源随析构而销毁
    std::unique_ptr<ge::Graph> graph = builder.();
    }
    }
    
  • Python代码示例:

    使用Python代码构图之前,需要先安装生成ES构图API(可选)中生成的whl包,安装示例如下:

    1
    pip3 install {OUTPUT_PATH}/whl/es_math-1.0.0-py3-none-any.whl
    
    构图示例代码如下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    from ge.es import GraphBuilder
    from ge.es.math import Add
    # 1. 创建图构建器(EsBuilder)
    builder = GraphBuilder("graph_name")
    # 2. 添加 2 个输入节点
    data0, data1 = builder.create_inputs(2)
    # 3. 添加中间节点 Python中,加减乘除等常用运算符被重载,可以直接使用
    add = data0 + data1
    # 4. 设置图输出
    builder.set_output(add, 0)
    # 5. 完成构图,返回最终图对象
    graph = builder.build_and_reset()
    

源码仓还给出了如下各种场景的ES构图样例,供用户参考:

表1 ES构图sample

特性

获取链接

备注

控制边场景的ES构图

C++代码示例

Python代码示例

参见README执行相关操作。

控制算子场景的ES构图

C++代码示例

Python代码示例

动态输入场景的ES构图

C++代码示例

Python代码示例

动态输出场景的ES构图

C++代码示例

Python代码示例

设置普通属性的ES构图

C++代码示例

Python代码示例

普通输入的ES构图

C++代码示例

Python代码示例

操作符重载的ES构图

C++代码示例

Python代码示例

可选输入场景的ES构图

C++代码示例

Python代码示例

私有属性场景的ES构图

C++代码示例

Python代码示例

transformer场景(部分片段)的ES构图

C++代码示例

Python代码示例

自定义ES API并构图

单击custom_es_api获取样例,参见README执行相关操作。

-