指导用户使用msopst工具生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
msopst工具根据待测算子信息库定义文件(.ini)生成算子ST测试用例定义文件,在算子工程文件中算子信息库定义文件路径如下所示。
├── cpukernel //AI CPU算子文件目录
│ ├── CMakeLists.txt
│ ├── impl //算子代码实现文件目录
│ │ ├── xx_kernels.cc
│ │ └── xx_kernels.h
│ ├── op_info_cfg
│ │ ├── xx_kernel
│ │ ├── xx.ini //算子信息库定义文件
│ └── toolchain.cmake
├── tbe //TBE算子文件目录
│ ├── CMakeLists.txt
│ ├── impl //算子代码实现文件目录
│ └── xx.py //算子代码实现文件
│ ├── op_info_cfg //算子信息库文件目录
│ └── ai_core
│ ├── {Soc Version} //昇腾AI处理器类型
│ ├── xx.ini //算子信息库定义文件
ini文件在TBE算子工程下的路径为:“tbe/op_info_cfg/ai_core/{Soc Version}/xx.ini”,{Soc Version}为昇腾AI处理器的类型。
ini文件在AI CPU算子工程下的路径为:“cpukernel/op_info_cfg/aicpu_kernel/xx.ini”。
若进行AI CPU自定义算子ST测试,请不要改变算子工程的目录结构。因为该工具会根据算子信息库定义文件所在算子工程的目录找到算子原型定义文件,并根据算子原型定义文件生成算子测试用例定义文件。
./msopst create -i {operator define file} -out {output path} -m {pb file} -q
参数名称 |
参数描述 |
是否必选 |
---|---|---|
create |
用于生成算子测试用例定义文件(*.json)。 |
是 |
-i,--input |
算子信息库定义文件路径(*.ini文件),可配置为绝对路径或者相对路径。 说明:输入的算子信息库定义文件(*.ini)仅能包含一个算子的定义。 |
是 |
-out,--output |
生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。 若不配置,则默认生成在执行命令的当前路径。 |
否 |
-m,--model |
配置为TensorFlow模型文件的路径,可配置为绝对路径或者相对路径。 若配置此参数,工具会从TensorFlow模型文件中获取首层算子的shape信息,并自动dump出算子信息库定义文件中算子的shape、dtype以及属性的value值,如果dump出的值在算子信息库定义文件所配置的范围内,则会自动填充到生成的算子测试用例定义文件中;否则会报错。
须知:
若配置此参数,系统中需要安装1.15或2.6.5版本的TensorFlow。 |
否 |
-q,--quiet |
当前版本仅针对-m参数生效,代表是否进行人机交互。 若不配置-q参数,则会提示用户修改获取到的模型中的首层shape信息。 若配置了-q参数,则不会提示用户更改首层shape信息。 |
否 |
示例:
以add算子为例,进入msopst工具所在目录,执行如下命令:
./msopst create -i OpInfoDefine/add.ini -out ./output
请将OpInfoDefine更换为算子信息库定义文件所在路径,请参见步骤1。
命令执行成功后,会在当前路径的output目录下生成算子测试用例定义文件:Add_case_timestamp.json。
[ { "case_name":"Test_Add_001", "error_threshold":[0.1,0.1], "st_mode":"pt_python_train", "run_torch_api":"torch.square", "op": "Add", "input_desc": [ { "name": "x1", "format": [ "ND" ], "type": [ "int32", "float", "float16" ], "shape": [32,16], "data_distribute": [ "uniform" ], "value_range": [ [ 0.1, 1.0 ] ] }, { "name": "x2", "format": [ "ND" ], "type": [ "int32", "float", "float16" ], "shape": [32,16], "data_distribute": [ "uniform" ], "value_range": [ [ 0.1, 1.0 ] ] } ], "output_desc": [ { "name": "y", "format": [ "ND" ], "type": [ "int32", "float", "float16" ], "shape": [32,16] } ] } ]
测试用例定义文件其他配置项及说明。
用户可基于如上模板进行修改,“*.json”文件支持的全量字段说明如下表所示。不同场景下的测试用例定义文件的样例可参见测试用例定义文件配置样例。
参数 |
说明 |
|
---|---|---|
case_name |
- |
必选。 String类型。 测试用例的名称。 |
op |
- |
必选。 String类型。 算子的类型。不允许为空。 |
error_threshold |
- |
可选。 配置自定义精度标准,取值为含两个元素的列表:"[threshold1,threshold2]"
取值范围为:"[0.0,1.0]"。
说明:
若测试用例json文件和执行msopst命令时均配置该参数,以执行msopst命令时配置的精度标准进行比对。若均未配置,则以执行msopst命令时默认精度标准[0.01,0.05]进行比对。 |
st_mode |
- |
可选。 String类型。 ST测试模式,其值为:"ms_python_train",表示Mindspore的算子工程(仅Atlas 训练系列产品支持);"pt_python_train",表示PyTorch框架下的算子工程。 Atlas 200/300/500 推理产品不支持此参数配置。 |
run_torch_api |
- |
可选。 配置torch_api调用算子的接口,其值为:"torch.square",“square”为接口名称,请根据实际情况配置。 Atlas 200/300/500 推理产品不支持此参数配置。 |
expect |
- |
可选。 用户期望的测试结果状态。属性支持以下两种类型,默认值为“success”。
在统计结果中,依据STCaseReport中的status和expect是否一致统计,一致则统计至“success count”,不一致则统计至“failed count”。 |
fuzz_impl |
- |
可选,String类型。 若用户需要生成大量测试用例,可利用fuzz测试参数生成脚本辅助生成。此种场景下,用户需要手工添加此字段,配置fuzz测试参数生成脚本的绝对路径或者相对路径:函数名,fuzz测试参数生成脚本的实现方法请参见4。
说明:
不建议用户调用其它用户目录下的fuzz测试参数生成脚本,以避免提权风险。 |
fuzz_case_num |
- |
可选。 int类型。 在添加了“fuzz_impl”参数的情况下,需要手工添加此字段,配置利用fuzz测试参数生成脚本生成测试用例数量,范围为1~2000。 |
input_desc |
- |
必选。 算子输入描述。
须知:
所有input_desc中参数取值的个数都要一致,否则测试用例生成会失败。 例如:input1的format支持的类型个数2,则input2的format支持的类型个数也需要为2。 同理,所有inputx中的type、shape、data_distribute和value_range的取值个数也需要保持一致。 |
- |
name |
可选。 算子为动态多输入场景时,“name”为必选配置,请配置为算子信息库中“inputx.name”参数的名称+编号,编号从“0”开始,根据输入的个数按照0,1,2......,依次递增。 例如,算子信息文件中指定的输入个数为4个,则input_desc中需要配置4个输入描述,name分别为“xxx0”、"xxx1"、“xxx2”、“xxx3”,其中xxx为输入参数的名称。 动态多输入场景的配置示例可参见•若算子的输入个数不确定(动态多输入场景)。 |
- |
format |
必选。 String或者String的一维数组。 输入tensor数据的排布格式,不允许为空。
常见的数据排布格式如下:
|
- |
ori_format |
可选。 String或者String的一维数组,支持以下两种取值: |
- |
type |
必选。 String或者String的一维数组。 输入数据支持的数据类型。
输入数据类型为复数场景的配置示例可参见•若算子的输入输出类型为复数,测试用例定义文件如...。 |
- |
shape |
必选。
需要注意,配置的shape需要与format相匹配。 |
- |
ori_shape |
可选。 若不配置此字段,默认算子实现的shape与原始shape一致。 |
- |
typical_shape |
可选。
|
- |
shape_range |
可选。 |
- |
is_const |
可选。 bool类型。
输入为常量的配置示例可参见•若算子的某个输入为常量,测试用例定义文件如下所...。 |
- |
data_distribute |
必选。 String或者String的一维数组。
使用哪种数据分布方式生成测试数据,支持的分布方式有:
|
- |
value_range |
必选。 |
- |
value |
可选。 String或者tensor数组。
若用户需要指定输入数据时,可通过增加“value”字段进行配置。有如下两种配置方式:
|
output_desc |
- |
必选。 算子输出描述。
须知:
output_desc中参数取值的个数都要与input_desc一致,否则测试用例生成会失败。 例如:inputx的format支持的类型个数2,则output的format支持的类型个数也需要为2。 |
- |
name |
可选。String类型。 输出参数名称。 算子为动态多输出场景时,“name”为必选配置,请配置为算子信息库中“outputx.name”参数的名称+编号,编号从“0”开始,根据输出的个数按照0,1,2......,依次递增。 例如,算子信息文件中指定的输出个数为4个,则output_desc中需要配置4个输出描述,name分别为“xxx0”、"xxx1"、“xxx2”、“xxx3”,其中xxx为输出参数的名称。 |
- |
format |
必选。 String或者String的一维数组。 输出tensor数据的排布格式,不允许为空。 支持如下数据排布格式:
|
- |
ori_format |
可选。 String或者String的一维数组。
若不配置此字段,默认算子实现的format与原始format相同。 |
- |
type |
必选。 String或者String的一维数组或“fuzz”。 输出数据支持的数据类型。
|
- |
shape |
必选。 |
- |
ori_shape |
可选。 若不配置此字段,默认算子实现的shape与原始shape一致。 |
attr |
- |
可选。 |
- |
name |
若配置attr,则为必选。 String类型。 属性的名称,不为空。 |
- |
type |
若配置attr,则为必选。 String类型。 属性支持的类型。
|
- |
value |
若配置attr,则为必选。 属性值,根据type的不同,属性值不同。
|
calc_expect_func_file |
- |
可选。 String类型。 算子期望数据生成函数对应的文件路径及算子函数名称,如:"/home/teste/test_*.py:function" 其中,/home/teste/test_*.py为算子期望数据生成函数的实现文件,function为对应的函数名称。
须知:
不建议用户调用其它用户目录下的期望数据生成脚本,以避免提权风险。 |
import numpy as np
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随机生成x1、x2的value fuzz_value_x1 = np.random.randint(1, 10, size=shape) fuzz_value_x2 = np.random.randint(1, 10, size=shape) # 用字典数据结构返回shape值,将生成的shape值返回给input_desc的x1、x2和output_desc的y的shape参数。其中x1、x2、y测试用例定义文件输入、输出的name。 return {"input_desc": {"x1": {"shape": shape,"value": fuzz_value_x1}, "x2": {"shape": shape,"value": fuzz_value_x2}}, "output_desc": {"y": {"shape": shape}}}
详细的参数说明可参见表2。
算子测试用例定义文件的示例如下所示:
[ { "case_name":"Test_Add_001", "op": "Add", "fuzz_impl": "./fuzz_shape.py:fuzz_branch", //配置fuzz测试参数生成脚本路径:函数名 "fuzz_case_num": 2000, //配置生成测试用例数量 "input_desc": [ // 算子的输入描述 { //算子的第一个输入 "name": "x1", "format": [ "ND" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "type": [ "float16" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "shape":"fuzz", // 修改自动生成参数的值为“fuzz” "data_distribute": [ "uniform" ], "value_range": [ [ 0.1, 1.0 ] ], "value": "fuzz" { //算子的第二个输入 "name": "x2", "format": [ "ND" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "type": [ "float16" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "shape":"fuzz", // 修改自动生成参数的值为“fuzz” "data_distribute": [ "uniform" ], "value_range": [ [ 0.1, 1.0 ] ], "value": "fuzz" } ], "output_desc": [ //算子的输出描述,必选,含义同输入tensor描述 { "name": "y", "format": [ "ND" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "type": [ "float16" //删除多余值,保留一个与自动生成shape参数相匹配的值 ], "shape":"fuzz" // 修改自动生成参数的值为“fuzz” } ]
在Python文件中实现算子期望数据生成函数,文件目录和文件名称可自定义,如“/home/teste/test_add_st.py”。
例如Add算子的期望数据生成函数实现如下:
def calc_expect_func(x1, x2, y): res = x1["value"] + x2["value"] return [res, ]
用户需根据开发的自定义算子完成算子期望数据生成函数。测试用例定义文件中的全部Input、Output、Attr的name作为算子期望数据生成函数的输入参数,若Input是可选输入,请将该输入指定默认值传参。
例如,某算子输入中的x3为可选输入时,定义该算子的期望数据生成函数如下。
def calc_expect_func(x1, x2, x3=None, y=None)
[ { "case_name":"Test_Add_001", "op": "Add", "calc_expect_func_file": "/home/test/test_add_st.py:calc_expect_func", //配置生成算子期望输出数据的实现文件 "input_desc": [...] ... ... } ]