下载
中文
注册

Ascend Graph构图

GE提供了Ascend Graph相关接口,支持开发者基于算子原型构造可直接在昇腾平台运行的计算图,本节仅描述Ascend Graph构图的总体流程并对每个流程进行简要介绍。

  1. 基于算子原型构建Graph。

    每一个算子都会提供原型定义,规定了其在昇腾AI处理器上可运行的相关约束,包括算子的输入、输出、属性等,CANN内置算子的原型定义可参见算子清单,您也可以从“Ascend-cann-toolkit安装目录/ascend-toolkit/latest/opp/built-in/op_proto/inc”算子原型定义的头文件中获取。

    例如Add算子的原型定义如下:

    REG_OP(Add)
        .INPUT(x1, TensorType({DT_BOOL, DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_BF16, DT_INT16,
                               DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
                               DT_COMPLEX64, DT_STRING, DT_COMPLEX32}))
        .INPUT(x2, TensorType({DT_BOOL, DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_BF16, DT_INT16,
                               DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
                               DT_COMPLEX64, DT_STRING, DT_COMPLEX32}))
        .OUTPUT(y, TensorType({DT_BOOL, DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_BF16, DT_INT16,
                               DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
                               DT_COMPLEX64, DT_STRING, DT_COMPLEX32}))
        .OP_END_FACTORY_REG(Add)
    获取了算子原型定义后,开发者可以通过如下几个步骤完成Graph的创建。
    1. 根据算子原型创建算子实例,并设置其输入、输出与属性。

      如下是一个简单的Add算子实例创建的代码片段。

      #include "all_ops.h" 
      auto shape_data = vector<int64_t>({ 1,1,28,28 });
      TensorDesc desc_data(ge::Shape(shape_data), FORMAT_ND, DT_FLOAT16);
      
      // 创建Data算子的实例data
      auto data = op::Data("data");
      data.update_input_desc_x(desc_data);
      data.update_output_desc_y(desc_data);
      // 创建Add算子的实例add
      auto add = op::Add("add")
          .set_input_x1(data)
          .set_input_x2(data);
    2. 算子连接边表达。

      算子之间的连边分为数据边和控制边。其中数据边(set_input_输入名称)用于指定算子的输入,控制边(AddControlInput)用于控制算子的执行顺序。

      开发者需要根据图结构使用连接边和控制边完成图拓扑结构的构造。

    3. 创建Graph实例。

      定义完算子实例及相关拓扑结构后,需要创建Graph对象,并设置Graph内的输入算子和输出算子。

    至此,已经完成通过算子原型构造Ascend Graph的全部流程,关于更详细的各类算子的构图表达以及技巧可参见Ascend Graph开发指南中的通过算子原型构建Graph

  2. 编译运行Graph。
    构造好Graph后,开发者可通过如下步骤编译执行Graph(如下仅描述关键步骤及其接口)。
    1. 调用ge::GEInitialize接口进行系统初始化,申请系统资源。
    2. 创建session,并调用AddGraph接口加载Graph对象。
    3. 调用aclInit接口进行AscendCL资源初始化。
    4. 调用BuildGraph接口编译Graph。
    5. 指定运行的Device(aclrtSetDevice)、创建Stream(aclrtCreateStream)、申请内存(aclrtMallocHostaclrtMalloc),并将数据从Host传输到Device( aclrtMemcpy),进行图执行前准备。
    6. 调用RunGraphWithStreamAsync接口执行Graph,输出执行结果。
    7. 释放相关资源。
    以上为编译并异步执行Graph的全流程,当前GE还支持如下几种Graph的编译执行方式,此处不再详细介绍,开发者可参见Ascend Graph开发指南中的编译和运行Graph
    • 将Graph编译成适配昇腾平台的离线om模型,然后通过AscendCL接口加载om模型并推理。
    • 添加构造好的Graph,然后直接编译运行(调用RunGraph接口同步执行),得到图的执行结果。
    • 大模型场景下,将Graph编译为可分布式部署的离线om模型,并通过Ascend Graph接口加载执行模型。