算子工程创建

  1. 编写算子的原型定义json文件,用于生成算子开发工程。json文件的配置参数详细说明请参考表1

    例如,AddCustom算子的json文件命名为add_custom.json,文件内容如下:
    [
        {
            "op": "AddCustom",
            "input_desc": [
                {
                    "name": "x",
                    "param_type": "required",
                    "format": [
                        "ND",
                        "ND",
                        "ND"
                    ],
                    "type": [
                        "fp16",
                        "float",
                        "int32"
                    ]
                },
                {
                    "name": "y",
                    "param_type": "required",
                    "format": [
                        "ND",
                        "ND",
                        "ND"
                    ],
                    "type": [
                        "fp16",
                        "float",
                        "int32"
                    ]
                }
            ],
            "output_desc": [
                {
                    "name": "z",
                    "param_type": "required",
                    "format": [
                        "ND",
                        "ND",
                        "ND"
                    ],
                    "type": [
                        "fp16",
                        "float",
                        "int32"
                    ]
                }
            ]
        }
    ]
    例如,ReduceMaxCustom算子(包含属性)的json文件命名为reduce_max_custom.json,文件内容如下:
    [
        {
            "op": "ReduceMaxCustom",
            "input_desc": [
                {
                    "name": "x",
                    "param_type": "required",
                    "format": ["ND"],
                    "type": ["float16"]
                }
            ],
            "output_desc": [
                {
                    "name": "y",
                    "param_type": "required",
                    "format": ["ND"],
                    "type": ["float16"]
                },
                {
                    "name": "idx",
                    "param_type": "required",
                    "format": ["ND"],
                    "type": ["int32"]
                }
            ],
            "attr": [                                                                   
                {
                    "name": "reduceDim",
                    "param_type": "required",
                    "type": "int"
                },
                {
                    "name": "isKeepDim",
                    "param_type": "optional",
                    "type": "int",
                    "default_value": 1
                }
            ]
        }
    ]
    表1 json文件配置参数说明

    配置字段

    类型

    含义

    是否必选

    op

    -

    字符串

    算子的Operator Type。

    input_desc

    -

    列表

    输入参数描述。

    name

    字符串

    算子输入参数的名称。

    param_type

    字符串

    参数类型:

    • required
    • optional
    • dynamic

    未配置默认为required。

    format

    列表

    针对类型为tensor的参数,配置为tensor支持的数据排布格式。

    包含如下取值:

    ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。

    说明:

    format与type需一一对应。

    type

    列表

    算子参数的类型。

    取值范围:float, half, float16 (fp16), float32 (fp32), int8, int16, int32, int64, uint8, uint16, uint32, uint64, qint8, qint16, qint32, quint8, quint16, quint32, bool, double, string, resource, complex64, complex128, bf16, numbertype, realnumbertype, quantizedtype, all, BasicType, IndexNumberType等。

    说明:
    • 不同计算操作支持的数据类型不同,详细请参见《算子开发接口》。
    • format与type需一一对应。

    output_desc

    -

    列表

    输出参数描述。

    name

    字符串

    算子输出参数的名称。

    param_type

    字符串

    参数类型:

    • required
    • optional
    • dynamic

    未配置默认为required。

    format

    列表

    针对类型为tensor的参数,配置为tensor支持的数据排布格式。

    包含如下取值:

    ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。

    format与type需一一对应。

    type

    列表

    算子参数的类型。

    取值范围:float, half, float16 (fp16), float32 (fp32), int8, int16, int32, int64, uint8, uint16, uint32, uint64, qint8, qint16, qint32, quint8, quint16, quint32, bool, double, string, resource, complex64, complex128, bf16, numbertype, realnumbertype, quantizedtype, all, BasicType, IndexNumberType等。

    说明:
    • 不同计算操作支持的数据类型不同,详细请参见《算子开发接口》。
    • format与type需一一对应。

    attr

    -

    列表

    属性描述。

    name

    字符串

    算子属性参数的名称。

    param_type

    字符串

    参数类型:

    • required
    • optional

    未配置默认为required。

    type

    字符串

    算子参数的类型。

    包含如下取值:

    int、bool、float、string、list_int、list_float等。

    default_value

    -

    默认值。

    • json文件可以配置多个算子,json文件为列表,列表中每一个元素为一个算子。
    • 若input_desc或output_desc中存在相同name参数,则后一个会覆盖前一参数。
    • input_desc,output_desc中的type需按顺序一一对应匹配,format也需按顺序一一对应匹配。

      例如,第一个输入x的type配置为[“int8”,“int32”],第二个输入y的type配置为[“fp16”,“fp32”],输出z的type配置为[“int32”,“int64”],最终这个算子支持输入(“int8”,“fp16”)生成int32,或者(“int32”,“fp32”)生成int64,即输入和输出的type是垂直对应的,类型不能交叉。

    • input_desc,output_desc中的type与format需一一对应匹配,数量保持一致。type的数据类型为以下取值("numbertype"、"realnumbertype"、"quantizedtype"、"BasicType"、"IndexNumberType"、"all")时,需识别实际的type数量是否与format数量保持一致,若数量不一致,创建工程会收到报错提示,同时format按照type的个数进行补齐,继续生成算子工程。若type的取值为基本数据类型(如:“int32”),且与format无法一一对应时,创建工程会收到报错提示,并停止运行。
    • json文件可对“attr”算子属性进行配置,具体请参考编写原型定义文件

  2. 生成算子的开发工程。

    以生成AddCustom的算子工程为例,进入msopgen工具所在目录执行如下命令,参数说明请参见表2

    ./msopgen gen -i {*.json} -f {framework type} -c {Compute Resource} -lan cpp -out {Output Path}

    表2 参数说明

    参数名称

    参数描述

    是否必选

    gen

    用于生成算子开发交付件。

    -i,--input

    算子原型定义文件(.json)路径,可配置为绝对路径或者相对路径。工具执行用户需要有此路径的可读权限。

    -f,--framework

    框架类型。

    • TensorFlow框架,参数值:tf或者tensorflow
    • Caffe框架,参数值:caffe
    • PyTorch框架,参数值:pytorch
    • MindSpore框架,参数值:ms或者mindspore
    • ONNX框架,参数值:onnx
    说明:

    所有参数值大小写不敏感。

    -c,--compute_unit

    算子使用的计算资源。

    配置格式为:ai_core-{soc version},ai_core与{soc version}之间用中划线“-”连接。

    请根据实际昇腾AI处理器版本进行选择。

    说明:
    • 如果无法确定具体的<soc_version>,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的<soc_version>值为Ascendxxxyy
    • 基于同系列的AI处理器型号创建的算子工程,其基础功能(基于该工程进行算子开发、编译和部署)通用。

    -out,--output

    生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。

    若不配置,则默认生成在执行命令的当前路径。

    -m,--mode

    生成交付件模式。

    • 0:创建新的算子工程,若指定的路径下已存在算子工程,则会报错退出。
    • 1:在已有的算子工程中追加算子。

    默认值:0。

    -op,--operator

    配置算子的类型,如:Conv2DTik。

    若不配置此参数,当算子原型定义文件中存在多个算子时,工具会提示用户选择算子。

    -lan,--language

    算子编码语言。

    • cpp:基于Ascend C编程框架,使用C/C++编程语言进行开发。
    • py:基于DSL和TIK算子编程框架,使用Python编程语言进行开发。

    默认值:py。

    示例:

    1. 进入msopgen工具所在目录创建算子工程,执行如下命令:
      ./msopgen gen -i json_path/add_custom.json -f tf -c ai_core-{Soc Version} -lan cpp -out ./output_data
      • -i:指定算子原型定义文件add_custom.json所在路径。
      • -c:参数中{Soc Version}为昇腾AI处理器的型号。
      • -lan:参数cpp代表算子基于Ascend C编程框架,使用C/C++编程语言开发。
    2. 选择算子(可选):
      • 若输入add_custom.json文件只有一个算子原型定义或使用-op参数指定算子类型请跳过此步骤。
      • 若输入add_custom.json文件中包含多个原型定义,且没有使用-op参数指定算子类型工具会提示输入选择的算子序号,选择算子。

        工具会提示输入选择的算子序号,输入:1。

        There is more than one operator in the .json file:  
        1 Op_1
        2 Op_2
        Input the number of the op: 1

        当命令行提示:Generation completed,则完成Op_1算子工程的创建。Op_1为文件中"op"的值。

  3. 命令执行完后,会在指定目录下生成算子工程目录,工程中包含算子实现的模板文件,编译脚本等。

    算子工程目录生成在 -out 所指定的目录下:./output_data,目录结构如下所示:
    output_data
    ├── build.sh         // 编译入口脚本
    ├── cmake 
    │   ├── config.cmake
    │   ├── util        // 算子工程编译所需脚本及公共编译文件存放目录
    ├── CMakeLists.txt   // 算子工程的CMakeLists.txt
    ├── CMakePresets.json // 编译配置项
    ├── framework        // 算子插件实现文件目录,单算子模型文件的生成不依赖算子适配插件,无需关注
    ├── op_host                      // host侧实现文件
    │   ├── add_custom_tiling.h    // 算子tiling定义文件
    │   ├── add_custom.cpp         // 算子原型注册、shape推导、信息库、tiling实现等内容文件
    │   ├── CMakeLists.txt
    ├── op_kernel                   // kernel侧实现文件
    │   ├── CMakeLists.txt   
    │   ├── add_custom.cpp        // 算子代码实现文件 
    ├── scripts                     // 自定义算子工程打包相关脚本所在目录

  4. 可选:在算子工程中追加算子。若需要在已存在的算子工程目录下追加其他自定义算子,命令行需配置“-m 1”参数。

    进入msopgen工具所在目录执行如下命令:

    ./msopgen gen -i json_path/**.json -f tf -c ai_core-{Soc Version} -out ./output_data -m 1
    • -i:指定算子原型定义文件add_custom.json所在路径。
    • -c:参数中{Soc Version}为昇腾AI处理器的型号。

    在算子工程目录下追加**.json中的算子。MindSpore算子工程不能够添加非MindSpore框架的算子。