ST测试用例生成工具

MindSpore框架算子ST测试用例生成工具目前只支持Atlas 训练系列产品

功能描述

算子ST测试用例生成工具有如下功能:
  • 根据算子实现和算子信息文件(*_impl.py)生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
  • 根据算子测试用例定义文件生成ST测试数据及测试用例执行代码,在硬件环境上执行算子测试用例。

工具说明

通过可执行文件“msopst”进行ST测试,其功能和安装路径如下。

表1 msopst文件介绍

文件名

功能

路径

msopst

ST测试工具。

CANN软件安装后文件存储路径中的“python/site-packages/bin”

使用前提

使用方法

ST测试用例生成工具的使用方法如下:

  1. 进入msopst工具所在目录,执行如下命令,测试用例生成工具会基于**_impl.py文件内的配置信息,生成算子测试用例定义的json文件。

    ./msopst create -i {**_impl.py} -out {output path}

    其他可选参数请参见表2

    表2 参数说明

    参数名称

    参数描述

    是否必选

    create

    用于生成算子测试用例定义文件(*.json)。

    -i,--input

    工具的输入。

    此处需输入算子实现和算子信息文件路径(.py文件),可配置为绝对路径或者相对路径。

    算子实现和算子信息文件(.py文件)实现请参见MindSpore教程>自定义算子

    -out,--output

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

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

    例如进入msopst工具所在目录,执行如下命令:

    ./msopst create -i OpInfoDefine/square_impl.py -out ./output

    -i 参数请修改为square_impl.py文件的实际路径。

    命令执行成功后,会在当前路径的output目录下生成算子测试用例定义文件:Square_case_timestamp.json。

  2. 1生成的json文件为模板文件,不满足直接作为ST测试用例生成输入的要求,所以用户需要参考此步骤,修改算子测试用例定义文件(*.json),构造测试用例,以满足ST测试覆盖的范围。

    算子测试用例定义文件(*.json)样例如下所示:

    [
        {
            "case_name": "Test_Square_001",    //测试用例名称
            "st_mode": "ms_python_train",      //MindSpore框架测试模式
            "op": "Square",                    // 算子的Type,唯一
            "input_desc": [                    // 算子的输入描述
                {
                   "name":"x"
                    "type": [                  // 输入数据支持的数据类型
                        "float32",
                        "float16"
                    ],
                    "shape": [],               // 输入tensor的shape,用户需要自行修改
                    "data_distribute": [
                        "uniform"
                    ],
                    "value_range": [           // 输入数据值的取值范围
                        [
                            0.1,
                            1.0
                        ]
                    ]
                }
            ],
            "output_desc": [                  // 算子的输出描述
                {
                    "name":"y"
                    "type": [                 // 输出数据支持的数据类型
                        "float32",
                        "float16"
                    ],
                    "shape": []               // 输出tensor的shape,用户需要自行修改
                }
            ]
        }
    ]

    当算子实现和算子信息文件中input参数支持dynamic时,用户可以添加多个“input_desc”字段作为动态输入。

    表3 MindSpore算子测试用例定义json文件

    参数

    说明

    case_name

    -

    必选。

    String类型。

    测试用例的名称。

    st_mode

    -

    必选。

    String类型。

    ST测试模式,其值为:"ms_python_train",表示Mindspore的算子工程。

    fuzz_impl

    -

    可选。

    String类型。

    若用户需要生成大量测试用例,可利用fuzz测试参数生成脚本辅助生成。此种场景下,用户需要手工添加此字段,配置fuzz测试参数生成脚本的绝对路径或者相对路径:函数名。

    说明:

    不建议用户调用其它用户目录下的fuzz测试参数生成脚本,以避免提权风险。

    fuzz_case_num

    -

    可选。

    int类型。

    若添加fuzz_impl参数的情况下,需要手工添加此字段,配置利用fuzz测试参数生成脚本生成测试用例数量,范围为1-2000。

    op

    -

    必选。

    String类型。

    算子的类型。

    不允许为空。

    input_desc

    -

    必选。

    算子输入描述。

    须知:

    所有input_desc中参数取值的个数都要一致,否则测试用例生成会失败。

    例如:input1的format支持的类型个数2,则input2的format支持的类型个数也需要为2。

    同理,所有inputx中的type、shape、data_distribute和value_range的取值个数也需要保持一致。

    -

    name

    可选。

    输入参数名称。

    -

    type

    必选。

    String或者String的一维数组。

    输入数据支持的数据类型。

    • bool
    • int8
    • uint8
    • int16
    • uint16
    • int32
    • int64
    • uint32
    • uint64
    • float16/fp16/half
    • float32/float
    • double
    • UNDEFINED:预留,当type配置为该值,则format必须配置为“RESERVED”,代表算子的此输入可选。
    • fuzz

    -

    shape

    int类型。

    一维或者二维数组或“fuzz”。

    输入tensor支持的形状或“fuzz”。

    -

    data_distribute

    必选。

    String或者String的一维数组。

    使用哪种数据分布方式生成测试数据,支持的分布方式有:
    • uniform:返回均匀分布随机值
    • normal:返回正态分布(高斯分布)随机值
    • beta:返回Beta分布随机值
    • laplace:返回拉普拉斯分布随机值
    • triangular:返回三角形分布随机值
    • relu:返回均匀分布+Relu激活后的随机值
    • sigmoid:返回均匀分布 + sigmoid激活后的随机值
    • softmax:返回均匀分布 + softmax激活后的随机值
    • tanh:返回均匀分布 + tanh激活后的随机值
    • fuzz

    -

    value_range

    必选。

    int类型或者float类型。

    一维或者二维数组或“fuzz”。

    取值范围,不能为空。

    为[min_value, max_value]且min_value <=max_value。

    -

    value

    可选。

    String或者tensor数组或“fuzz”。

    若用户需要指定输入数据时,可通过增加此字段进行配置。有如下两种配置方式:
    • 直接输入tensor数据,如tensor的值为[1,2,3,4]。

      "value": [1,2,3,4]

    • 输入二进制数据文件的路径,如数据文件为test.bin时。

      "value": "../test.bin"

      二进制数据bin文件需用户自己准备。可以输入绝对路径,也可以输入测试用例定义文件的相对路径。

    • 配置为“fuzz”,用户需定义fuzz脚本及fuzz_branch方法作为value数据生成的主方法。
      说明:

      若用户添加了“value”字段,“data_distribute”和“value_range”字段将会被忽略。同时需要保证“format”,"type","shape"字段的值与“value”数据一致。

    output_desc

    -

    必选。

    算子输出描述。

    须知:

    output_desc中参数取值的个数都要与input_desc一致,否则测试用例生成会失败。

    例如:inputx的format支持的类型个数2,则output的format支持的类型个数也需要为2。

    -

    name

    可选。

    String类型。

    输入参数名称。

    -

    type

    必选。

    String或者String的一维数组。

    输出数据支持的数据类型。

    • bool
    • int8
    • uint8
    • int16
    • uint16
    • int32
    • int64
    • uint32
    • uint64
    • float16/fp16/half
    • float32/float
    • double
    • UNDEFINED:预留,当type配置为该值,则format必须配置为“RESERVED”,代表算子的此输入可选。
    • fuzz

    -

    shape

    必选。

    int类型。

    一维或者二维数组或“fuzz”。

    输出tensor支持的形状或“fuzz”。

    attr

    -

    -

    -

    name

    若配置attr,则为必选。

    String类型。

    属性的名称,不为空。

    -

    type

    若配置attr,则为必选。

    String类型。

    属性支持的类型。

    • bool
    • int
    • float
    • string
    • list_bool
    • list_int
    • list_float
    • list_string
    • list_list_int

    -

    value

    若配置attr,则为必选,且不允许为null。

    String类型。

    属性值,根据type的不同,属性值不同。

    • bool: true/false
    • int: 10
    • float: 1.0
    • string: “NCHW”
    • list_bool: [false, true]
    • list_int: [1, 224, 224, 3]
    • list_float: [1.0, 0.0]
    • list_string: [“str1”, “str2”]
    • list_list_int: [[1, 3, 5, 7], [2, 4, 6, 8]]
    • fuzz

    后续执行msopst run xxx命令时,会根据此json文件生成算子测试数据及测试用例,生成的测试用例的个数等于“data_distribute”、“shape”、“type”与“value_range”的取值个数的乘积。

  3. 若用户需要自动生成大量测试用例,请参考此步骤用实现fuzz测试参数生成脚本(.py)并配置测试用例定义文件(.json)。

    1. 实现fuzz测试参数生成脚本。该脚本可以自动生成测试用例定义文件中input_desc、output_desc、attr内除了name的任何参数。
      下面以随机生成shape参数为例,创建一个fuzz_shape.py供用户参考。该示例会随机生成一个1-4维,每个维度取值范围在1-64的shape参数,用于ST测试。
      1. 导入脚本所需依赖。
        import random
      2. 实现fuzz_branch()方法,若用户自定义随机生成待测试参数的方法名,需要在算子测试用例定义文件中fuzz_impl字段配置自定义方法。
        def fuzz_branch():
        
            # 生成测试参数shape值
            dim = random.randint(1, 4)
            x_shape_0 = random.randint(1, 64)
            x_shape_1 = random.randint(1, 64)
            x_shape_2 = random.randint(1, 64)
            x_shape_3 = random.randint(1, 64)
            if dim == 1:
                shape = [x_shape_0]
            if dim == 2:
                shape = [x_shape_0, x_shape_1]
            if dim == 3:
                shape = [x_shape_0, x_shape_1, x_shape_2]
            if dim == 4:
                shape = [x_shape_0, x_shape_1, x_shape_2, x_shape_3]
        
            # 用字典数据结构返回shape值,将生成的shape值返回给input_desc的x1、x2和output_desc的y的shape参数。其中x1、x2、y测试用例定义文件输入、输出的name。
            return {"input_desc": {"x": {"shape": shape}},
                    "output_desc": {"y": {"shape": shape}}}
        • 该方法生成测试用例定义文件input_desc、output_desc、attr内除了name的任何参数参数,用户可自定义实现参数的生成方法,以满足算子测试的需求。
        • 该方法的返回值为字典格式,将该方法生成的参数值以字典的方式赋值给算子进行st测试。返回的字典结构与测试用例定义文件中参数结构相同。
    2. 配置测试用例定义文件。
      1. 添加“fuzz_impl”字段,值为“fuzz生成测试参数的脚本的相对路径或绝对路径:函数名”,如:“conv2d_fuzz.py:fuzz_branch”若自定义的随机生成待测试参数的方法,请将fuzz_branch配置为自定义方法名,若不配置默认使用 fuzz_branch方法。
      2. 添加“fuzz_case_num”字段,值为利用fuzz脚本生成多少条测试用例,如:2000。
      3. 将需要自动生成的参数的值设为"fuzz"。
      [
          {
             "case_name": "Test_Square_001",    //测试用例名称
              "st_mode": "ms_python_train",      //MindSpore框架测试模式
              "op": "Square",                    // 算子的Type,唯一
              "fuzz_impl": "./fuzz_shape.py:fuzz_branch",   //配置fuzz测试参数生成脚本路径:函数名
              "fuzz_case_num": 2000,   //配置自动生成参数数量值为1-2000
               "input_desc": [            // 算子的输入描述
                    {                     //算子的第一个输入
                      "name": "x",
                      "type": [
                          "float16"  //删除多余值,保留一个与自动生成shape参数相匹配的值
                      ],
                      "shape":"fuzz",     // 修改自定生成参数的值为“fuzz”
                      "data_distribute": [
                          "uniform"
                      ],
                      "value_range": [
                          [
                              0.1,
                              1.0
                          ]
                      ],				
              "output_desc": [                       //算子的输出描述,必选,含义同输入tensor描述
                  {
                      "name": "y",
                      "type": [
                          "float16"         //删除多余值,保留一个与自动生成shape参数相匹配的值
                      ],
                      "shape":"fuzz",        //  修改自定生成参数的值为“fuzz”
          }
      ]
      • 测试用例定义文件中参数为“fuzz”的输入、输出或属性需要有“name”参数,若没有请手动添加“name”参数,如: "name": "y"。
      • 若测试用例定义文件中存在参数值为“fuzz”的情况下,其他各参数取值需唯一,并且与fuzz测试参数生成脚本生成的参数不矛盾。

  4. 运行算子测试用例定义文件。

    进入msopst工具所在目录,执行如下命令生成测试用例并运行,参数说明请参见表4

    ./msopst run -i {**.json}  -soc {Soc Version} -out {output path}
    表4 参数说明

    参数名称

    参数描述

    是否必选

    run

    用于执行算子网络的AscendCL测试用例。

    -i,--input

    工具的输入。

    此处需要输入算子测试用例定义文件(*.json)的路径,可配置为绝对路径或者相对路径。

    此处的json文件为执行msopst create命令后的输出,算子测试用例定义文件的详细说明请参见表3

    -soc,--soc_version

    此参数仅适用于输入命令为run时的场景。

    配置为昇腾AI处理器的类型。

    说明:

    如果无法确定具体的<soc_version>,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的<soc_version>值为Ascendxxxyy

    -out,--output

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

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

    -c,--case_name

    此参数仅适用于输入命令为run时的场景。

    • 配置为需要执行的case的名字,若需要同时运行多个case,多个case之间使用逗号分隔。
    • 若配置为“all”,或者不配置此参数,代表执行所有case。

    -d,--device_id

    设备ID,设置运行ST测试的芯片ID。用户根据使用的AI芯片ID填写。

    若未设置此参数,默认为:0。

    例如进入msopst工具所在目录,执行如下命令:

    ./msopst run -i xx/Square_case_timestamp.json -soc {Soc Version} -out ./output

    -i 需修改为Square_case_timestamp.json的实际路径。

    命令执行完成后,会屏显打印测试用例执行结果,会在-out指定的目录下生成时间戳目录,时间戳目录下将生成以算子的OpType命名的存储测试用例代码的文件夹,目录结构如下所示:
    {time_stamp}
    ├── run                           // 测试用例执行相关文件存储目录
    │   ├── out     
    │        └── test_data         //测试数据相关文件存储目录
    │           ├── CMakeLists.txt
    │           ├── data                //构造的测试数据
    │               ├── expect          //期望生成数据,目前为空
    │               └── Test_xxxx.bin      //测试数据的二进制文件
    ├── src           
    │   ├── CMakeLists.txt    
    │   ├── kernel_meta              
    │           ├── xxx.info
    │           ├── xxx.json               
    │           └── xxx.o              
    │   ├──pycache       
    │           └── xxx.pyc  
    │   ├── pytest.ini             //pytest配置
    │   ├── test_{op_name}.py         //用例测试脚本