GE提供了Ascend Graph相关接口,支持开发者基于算子原型构造可直接在昇腾平台运行的计算图,本节仅描述Ascend Graph构图的总体流程并对每个流程进行简要介绍。
每一个算子都会提供原型定义,规定了其在昇腾AI处理器上可运行的相关约束,包括算子的输入、输出、属性等,CANN内置算子的原型定义可参见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)
#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);
算子之间的连边分为数据边和控制边。其中数据边(set_input_输入名称)用于指定算子的输入,控制边(AddControlInput)用于控制算子的执行顺序。
开发者需要根据图结构使用连接边和控制边完成图拓扑结构的构造。
至此,已经完成通过算子原型构造Ascend Graph的全部流程,关于更详细的各类算子的构图表达以及技巧可参见《Ascend Graph开发指南》中的通过算子原型构建Graph。