ST测试用例生成工具(推理)
功能描述
- 根据算子信息定义文件(*.ini)生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
- 根据算子测试用例定义文件生成ST测试数据及测试用例执行代码,在硬件环境上执行算子测试用例。
工具准备
工具存储路径:Toolkit安装路径下的“toolkit/python/site-packages/bin/msopst”。
使用前提
- 使用此工具生成算子测试用例前,需要已将要测试的算子部署到算子库中。
- 由于此工具会根据测试用例定义文件将需要测试的算子转换为单算子的om文件,并推送到硬件环境执行,所以此工具当前仅支持开发环境与运行环境合设的场景。
- 配置环境变量:
export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export PYTHONPATH=${install_path}/toolkit/python/site-packages:$PYTHONPATH
install_path请修改为Toolkit的实际安装路径。
命令格式
在工具所在路径下执行如下命令:
- 生成算子测试用例定义文件:
python3.7.5 msopst create -i {operator define file} -out {output path} -m {pb file} -q
- 生成测试用例并执行
python3.7.5 msopst run -i {operator testcase define file} -soc {Soc Version} -out {output path} -c {case name}
msopst工具也可以直接./msopst执行。
参数说明
参数名称 |
参数描述 |
适用场景 |
是否必选 |
---|---|---|---|
{create,run,mi} |
输入命令,有以下几种取值:
|
create/run |
是 |
-i |
create/run |
是 |
|
-soc |
此参数仅适用于输入命令为run时的场景。 配置为昇腾AI处理器的类型。 可从ATC安装路径的atc/data/platform_config目录下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为Soc Version。 |
run |
是 |
-out |
生成文件所在路径,可配置为绝对路径或者相对于工具执行所在目录的相对路径。 需要为实际存在路径且工具执行用户具有可读写权限。 若不配置,则默认生成在执行命令的当前路径。 |
create/run |
否 |
-m |
此参数仅适用于输入命令为create时的场景。 配置为tensorflow模型文件的路径,可配置为绝对路径或者相对于工具执行所在目录的相对路径。 若配置此参数,工具会从tensorflow模型文件中获取首层算子的shape信息,并自动dump出算子信息定义文件中算子的shape、dtype以及属性的value值,如果dump出的值在算子信息定义文件所配置的范围内,则会自动填充到生成的算子测试用例定义文件中;否则会报错。 须知:
若配置此参数,系统中需要安装1.15版本的tensorflow。 |
create |
否 |
-q |
开启静态模式,不进行人机交互,使用默认获取数据进行工具的执行。 当前版本仅针对-m参数生效。 若不配置-q参数,则会提示用户修改获取到的模型中的首层shape信息。 若配置了-q参数,则不会提示用户更改首层shape信息。 |
create,且添加了-m参数 |
否 |
-c |
此参数仅适用于输入命令为run时的场景。
|
run |
否 |
使用样例
ST测试用例生成工具的使用方法如下:
- 在工具所在路径下执行如下命令,测试用例生成工具会基于ini文件内的配置信息,生成算子测试用例定义的json文件。
python3.7.5 msopst create -i {**.ini} -out {output path}
其他可选参数请参见参数说明。
例如:
python3.7.5 msopst create -i OpInfoDefine/conv2d.ini -out output
命令执行成功后,会在当前路径的output目录下生成算子测试用例定义文件:Conv2D_case_timestamp.json。
- 1生成的json文件为模板文件,不满足直接作为ST测试用例生成输入的要求,所以用户需要参考此步骤,,修改算子测试用例定义文件(*.json),构造测试用例,以满足ST测试覆盖的范围。
算子测试用例定义文件(*.json)样例如下所示:
[ { "case_name":"Test_Conv2D_001" //测试用例名称 "op": "Conv2D", // 算子的Type,唯一 "input_desc": [ // 算子的输入描述 { //算子的第一个输入 "format": [ //用户在此处配置待测试的输入tensor的排布格式 "ND", "NCHW" ], "type": [ // 输入数据支持的数据类型 "float", "float16" ], "shape": [8,512,7,7], // 输入tensor的shape,用户需要自行修改 "data_distribute": [ //生成测试数据时选择的分布方式 "uniform" ], "value_range": [ // 输入数据值的取值范围 [ 0.1, 1.0 ] ] }, { //算子的第二个输入 "format": [ "ND", "NCHW" ], "type": [ "float", "float16" ], "shape": [512,512,3,3], "data_distribute": [ "uniform" ], "value_range": [ [ 0.1, 1.0 ] ] } ], "output_desc": [ //必选,含义同输入tensor描述 { "format": [ "ND", "NCHW" ], "type": [ "float" "float16" ] "shape": [8,512,7,7], } ], "attr": [ // 算子的属性,可选 { "name": "strides", //属性的名称 "type": "list_int", // 属性的支持的类型 "value": [1,1,1,1] // 属性值,跟type的类型对应,用户需要自行修改 } { "name": "pads", "type": "list_int", "value": [1,1,1,1] }, { "name": "dilations", "type": "list_int", "value": [1,1,1,1] } ] } ]
表15-5 算子测试用例定义json文件参数
说明
类型
是否必选
case_name
测试用例的名称。
String类型
是
op
算子的类型。
不允许为空。
String类型
是
input_desc
算子输入描述。
须知:所有input_desc中参数取值的个数都要一致,否则测试用例生成会失败。
例如:input1的format支持的类型个数2,则intput2的format支持的类型个数也需要为2。
同理,所有inputx中的type、shape、data_distribute和value_range的取值个数也需要保持一致。
是
format
输入tensor数据的排布格式,不允许为空。
支持如下数据排布格式:
- NCHW
- NHWC
- ND:表示支持任意格式。
- NC1HWC0:华为自研的5维数据格式。其中,C0与微架构强相关,该值等于cube单元的size,例如16;C1是将C维度按照C0切分:C1=C/C0, 若结果不整除,最后一份数据需要padding到C0。
- FRACTAL_Z:卷积的权重的格式。
- FRACTAL_NZ:华为自研的分形格式,在cube单元计算时,输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为(H1*W1)个分形,按照column major排布,形状如N字形;每个分形内部有(H0*W0)个元素,按照row major排布,形状如z字形。考虑到数据排布格式,将NW1H1H0W0数据格式称为Nz格式。其中,H0,W0表示一个分形的大小,示意图如下所示:
String或者String的一维数组
是
type
输入数据支持的数据类型。
- bool
- int8
- uint8
- int16
- uint16
- int32
- int64
- uint32
- uint64
- float16
- float
String或者String的一维数组
是
shape
输入tensor支持的形状。
int类型。
一维或者二维数组。
是
data_distribute
使用哪种数据分布方式生成测试数据,支持的分布方式有:- uniform:返回均匀分布随机值
- normal:返回正态分布(高斯分布)随机值
- beta:返回Beta分布随机值
- laplace:返回拉普拉斯分布随机值
- triangular:返回三角形分布随机值
- relu:返回均匀分布+Relu激活后的随机值
- sigmoid:返回均匀分布 + sigmoid激活后的随机值
- softmax:返回均匀分布 + softmax激活后的随机值
- tanh:返回均匀分布 + tanh激活后的随机值
String或者String的一维数组
是
value_range
取值范围,不能为空。
为[min_value, max_value]且min_value <=max_value。
int类型或者float类型。
一维或者二维数组。
是
output_desc
算子输出描述。
须知:output_desc中参数取值的个数都要与input_desc一致,否则测试用例生成会失败。
例如:inputx的format支持的类型个数2,则output的format支持的类型个数也需要为2。
是
format
输出tensor数据的排布格式,不允许为空。
支持如下数据排布格式:
- NCHW
- NHWC
- ND:表示支持任意格式。
- NC1HWC0:华为自研的5维数据格式。其中,C0与微架构强相关,该值等于cube单元的size,例如16;C1是将C维度按照C0切分:C1=C/C0, 若结果不整除,最后一份数据需要padding到C0。
- FRACTAL_Z:卷积的权重的格式。
- FRACTAL_NZ:华为自研的分形格式,在cube单元计算时,输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为(H1*W1)个分形,按照column major排布,形状如N字形;每个分形内部有(H0*W0)个元素,按照row major排布,形状如z字形。考虑到数据排布格式,将NW1H1H0W0数据格式称为Nz格式。其中,H0,W0表示一个分形的大小,示意图如下所示:
String或者String的一维数组
是
type
输出数据支持的数据类型。
- bool
- int8
- uint8
- int16
- uint16
- int32
- int64
- uint32
- uint64
- float16
- float
String或者String的一维数组
是
shape
输出tensor支持的形状。
int类型。
一维或者二维数组。
是
attr
否
name
属性的名称,不为空。
String
若配置attr,则为必选
type
属性支持的类型。
- bool
- int
- float
- string
- list_bool
- list_int
- list_float
- list_string
- list_list_int
String
若配置attr,则为必选
value
属性值,根据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]]
String
若配置attr,则为必选,且不允许为null。
后续执行python3.7.5 msopst run xxx命令时,会根据此json文件生成算子测试数据及测试用例,生成的测试用例的个数等于“data_distribute”、“format”、“shape”、“type”与“value_range”的取值个数的乘积。
- 根据算子测试用例定义文件执行生成对应的单算子网络测试用例。
- 配置环境变量。
网络测试用例执行时会进行如下操作:
- 根据算子测试用例定义文件通过ATC工具转换为单算子模型文件。
- 使用AscendCL接口加载单算子模型文件并执行。
所以需要配置ATC工具执行以及AscendCL应用编译运行所需环境变量,如下所示:- ATC执行所需环境变量如下所示,此处只描述必选环境变量,环境变量详细解释请参考《ATC工具使用指南》中的转换样例。
export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export PATH=${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${install_path}/opp
install_path为ATC与OPP组件的安装路径。
- AscendCL应用编译运行所需环境变量如下所示:
export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64/stub export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64:$LD_LIBRARY_PATH
/home/HwHiAiUser/Ascend/ascend-toolkit/latest为ACLlib安装路径,/usr/local/Ascend为driver安装包的安装路径,请根据实际情况替换。
- 执行如下命令生成测试用例并执行。
python3.7.5 msopst run -i {**.json} -soc Ascend310 -out {output path}
--o指定的目录下若已存在对应算子的文件夹,则命令执行会报错并提示指定目录下已存在对应算子文件夹。
命令执行完成后,会屏显打印测试用例执行结果,并会在--o指定的目录下生成以算子的OpType命名的存储测试用例代码的文件夹,目录结构如下所示:
├── build │ ├── intermediates //编译产生中间文件 │ └── xxx │ ├── CMakeLists.txt // 编译规则文件 │ ├── inc // 测试用例代码所用头文件 │ └── common.h │ └── op_execute.h │ └── op_runner.h │ └── op_test_desc.h │ └── op_test.h ├── run // 测试用例执行相关文件存储目录 │ ├── out │ └── kernel_meta │ └── main // 算子测试用例执行的可执行文件 │ └── op_models // 单算子的离线模型文件 │ ├── xx.om │ └── result_files │ ├── result.txt │ ├── Test_xxx_output_x.bin // 运行测试用例生成的结果数据的二进制文件 │ └── test_data //测试数据相关文件存储目录 │ ├── config │ └── acl_op.json // 用于构造单算子模型文件的算子描述文件 │ └── acl.json //用于进行~acl初始化,请勿修改此文件 │ ├── data //构造的测试数据 │ └──Test_xxxx.bin //测试数据的二进制文件 ├── src │ ├── CMakeLists.txt // 编译规则文件 │ ├── common.cpp // 公共函数,读取二进制文件函数的实现文件 │ ├── main.cpp // 初始化算子测试用例并执行用例 │ ├── op_execute.cpp //针对单算子调用的AscendCL接口进行了封装 │ ├── op_runner.cpp //加载单算子模型文件进行执行的接口进行了封装 │ ├── op_test.cpp //定义了算子的测试类 │ ├── op_test_desc.cpp //对算子测试用例信息的加载和读入 │ ├── testcase.cpp //测试用例的定义文件
- 配置环境变量。