样例使用指导

1、功能描述

本样例使用动态输入算子进行构图,旨在帮助构图开发者快速理解动态输入的定义和使用

2、目录结构

cpp/
├── src/
|   └── CMakeLists.txt           // CMake构建文件
|   └── es_showcase.h            // 头文件
|   └── make_concatv2_graph.cpp  // sample文件
├── CMakeLists.txt               // CMake构建文件
├── main.cpp                     // 程序主入口
├── README.md                    // README文件
├── run_sample.sh                // 执行脚本
├── utils.h                      // 工具文件

3、使用方法

3.1、准备cann包

  • 通过安装指导 环境准备正确安装toolkitops
  • 设置环境变量 (假设包安装在/usr/local/Ascend/)
source /usr/local/Ascend/cann/set_env.sh 

3.2、编译和执行

1.2.1 生成 es 接口与构建图进行DUMP

只需运行下述命令即可完成清理、生成接口、构图和DUMP图:

bash run_sample.sh

当前 run_sample.sh 的行为是:先自动清理旧的 build,构建 sample并默认执行sample dump 。当看到如下信息,代表执行成功:

[Success] sample 执行成功,pbtxt dump 已生成在当前目录。该文件以 ge_onnx_ 开头,可以在 netron 中打开显示

1.2.2 输出文件说明

执行成功后会在当前目录生成以下文件:

ge_onnx_*.pbtxt - 图结构的protobuf文本格式,可用netron查看

1.2.3 构建图并执行

基本的图构建和dump功能外,esb_sample支持构建图并实际执行计算。

bash run_sample.sh -t sample_and_run

该命令会:

  1. 自动生成ES接口
  2. 编译sample程序
  3. 生成dump图、运行图并输出计算结果

执行成功后会看到:

[Success] sample_and_run 执行成功,pbtxt和data输出dump 已生成在当前目录

可通过data文件查看计算结果

3.3、日志打印

可执行程序执行过程中如果需要日志打印来辅助定位,可以在bash run_sample.sh之前设置如下环境变量来让日志打印到屏幕

export ASCEND_SLOG_PRINT_TO_STDOUT=1 #日志打印到屏幕
export ASCEND_GLOBAL_LOG_LEVEL=0 #日志级别为debug级别

1.4、图编译DUMP图

可执行程序执行过程中,如果需要DUMP图来辅助定位图编译流程,可以在 bash run_sample.sh -t sample_and_run 之前设置如下环境变量来DUMP图到执行路径下

export DUMP_GE_GRAPH=2 

4、核心概念介绍

4.1、构图步骤如下:

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

4.2、动态输入

概念说明: 动态输入是指某些算子的输入个数不固定;例如 ConcatV2 和 AddN 算子,该算子为动态多输入算子

ConcatV2 算子的原型如下所示,ES 构图生成的API是ConcatV2(),支持在 C、C++ 中使用

    REG_OP(ConcatV2)
      .DYNAMIC_INPUT(x, TensorType({BasicType(), DT_BOOL, DT_STRING}))
      .INPUT(concat_dim, TensorType::IndexNumberType())
      .OUTPUT(y, TensorType({BasicType(), DT_BOOL, DT_STRING}))
      .ATTR(N, Int, 1)
      .OP_END_FACTORY_REG(ConcatV2)

其对应的函数原型为:

  • 函数名:ConcatV2(C++)或 EsConcatV2(C)
  • 参数:共 3 个,依次为 x, concat_dim, N
  • 返回值:输出 y

C API中:

EsCTensorHolder *EsConcatV2(EsCTensorHolder **x, int64_t x_num, EsCTensorHolder *concat_dim, int64_t N);

C++ API:

EsTensorHolder ConcatV2(const std::vector<EsTensorHolder> &x, const EsTensorLike &concat_dim, int64_t N = 1);

注: 1.使用TensorLike类型表达输入,以支持实参可以直接传递数值的情况 2.使用默认参数表达IR原型中的可选属性