ST测试用例生成工具
MindSpore框架算子ST测试用例生成工具目前只支持Atlas 训练系列产品。
功能描述
- 根据算子实现和算子信息文件(*_impl.py)生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
- 根据算子测试用例定义文件生成ST测试数据及测试用例执行代码,在硬件环境上执行算子测试用例。
工具说明
通过可执行文件“msopst”进行ST测试,其功能和安装路径如下。
文件名 |
功能 |
路径 |
---|---|---|
msopst |
ST测试工具。 |
CANN软件安装后文件存储路径中的“python/site-packages/bin”。 |
使用前提
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。执行命令参考如下,以下示例均为root或非root用户默认安装路径,请以实际安装路径为准。
# 以root用户安装toolkit包 . /usr/local/Ascend/ascend-toolkit/set_env.sh # 以非root用户安装toolkit包 . ${HOME}/Ascend/ascend-toolkit/set_env.sh
- 此工具当前仅支持同时安装开发环境与运行环境的场景。
- 安装mindspore框架并配置环境变量,安装方法参见MindSpore官网。
export mindspore_op_path=/home/username/AscendProject/operator export PYTHONPATH=${mindspore_op_path}/mindspore/impl:${mindspore_op_path}/op_proto:$PYTHONPATH
mindspore_op_path请修改为MindSpore算子工程目录。
- 安装pytest测试框架。
pip3 install pytest
- AI CPU算子执行ST测试前,用户需要将算子工程编译完成后生成的动态链接库libcust_aicpu_kernels.so文件拷贝至MindSpore安装路径的lib目录下。so文件所在路径为执行算子工程编译生成build_out目录下的“makepkg/op_impl/custom/cpu/aicpu_kernel/custom_impl”。
例如,当MindSpore安装在“/usr/local/python3.7.5/lib/python3.7/site-packages/mindspore”时,so文件需要拷贝至“/usr/local/python3.7.5/lib/python3.7/site-packages/mindspore/lib”下。
使用方法
ST测试用例生成工具的使用方法如下:
- 进入msopst工具所在目录,执行如下命令,测试用例生成工具会基于**_impl.py文件内的配置信息,生成算子测试用例定义的json文件。
./msopst create -i {**_impl.py} -out {output path}
其他可选参数请参见表2。
表2 参数说明 参数名称
参数描述
是否必选
create
用于生成算子测试用例定义文件(*.json)。
是
-i,--input
工具的输入。
此处需输入算子实现和算子信息文件路径(.py文件),可配置为绝对路径或者相对路径。
是
-out,--output
生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。
若不配置,则默认生成在执行命令的当前路径。
否
例如进入msopst工具所在目录,执行如下命令:
./msopst create -i OpInfoDefine/square_impl.py -out ./output
-i 参数请修改为square_impl.py文件的实际路径。
命令执行成功后,会在当前路径的output目录下生成算子测试用例定义文件:Square_case_timestamp.json。
- 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]。
- 输入二进制数据文件的路径,如数据文件为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”的取值个数的乘积。
- 若用户需要自动生成大量测试用例,请参考此步骤用实现fuzz测试参数生成脚本(.py)并配置测试用例定义文件(.json)。
- 实现fuzz测试参数生成脚本。该脚本可以自动生成测试用例定义文件中input_desc、output_desc、attr内除了name的任何参数。
下面以随机生成shape参数为例,创建一个fuzz_shape.py供用户参考。该示例会随机生成一个1-4维,每个维度取值范围在1-64的shape参数,用于ST测试。
- 导入脚本所需依赖。
import random
- 实现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测试。返回的字典结构与测试用例定义文件中参数结构相同。
- 导入脚本所需依赖。
- 配置测试用例定义文件。
- 添加“fuzz_impl”字段,值为“fuzz生成测试参数的脚本的相对路径或绝对路径:函数名”,如:“conv2d_fuzz.py:fuzz_branch”若自定义的随机生成待测试参数的方法,请将fuzz_branch配置为自定义方法名,若不配置默认使用 fuzz_branch方法。
- 添加“fuzz_case_num”字段,值为利用fuzz脚本生成多少条测试用例,如:2000。
- 将需要自动生成的参数的值设为"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测试参数生成脚本生成的参数不矛盾。
- 实现fuzz测试参数生成脚本。该脚本可以自动生成测试用例定义文件中input_desc、output_desc、attr内除了name的任何参数。
- 运行算子测试用例定义文件。
进入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处理器的类型。
可从Ascend-cann-toolkit安装目录/ascend-toolkit/latest/bin/data/platform_config目录下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为{Soc Version}。
是
-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 //用例测试脚本