UT(Unit Test:单元测试)是开发人员进行单算子运行验证的手段之一,主要目的是:
测试类的详细定义可参见CANN软件安装后文件存储路径下的“python/site-packages/op_test_frame/ut/ascendc_op_ut.py”文件。
编写算子实现代码的UT Python测试用例,计算出算子执行结果,并取回结果和预期结果进行比较,来测试算子逻辑的正确性。
# 导入UT测试类,可根据算子类型选择使用哪个测试类 from op_test_frame.ut.ascendc_op_ut import AscendcOpUt from op_test_frame.common import precision_info # 针对Atlas 训练系列产品、Atlas 推理系列产品,配置样例如下: platforms = ["Ascendxxxyy",] //需按照实际使用的型号配置 # 实例化UT测试用例,ut_case为UT测试框架关键字,不可修改;add_custom为算子的Type ut_case = AscendcOpUt('add_custom') # 返回期望数据 def calc_expect_func_infer(x, y, z): z = x.get("value") + y.get("value") return [z, ] # 添加测试用例,input和output为算子的输入和输出描述,case_name为测试用例的名称,请根据实际进行编辑 ut_case.add_precision_case(platforms, {'params': [ {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'input', 'shape': [8, 2048], 'distribution': 'normal', 'value_range': [-10, 10]}, {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'input', 'shape': [8, 2048], 'distribution': 'normal', 'value_range': [-10, 10]}, {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'output', 'shape': [8, 2048]}], "case_name": 'add_custom_1', "calc_expect_func": calc_expect_func_infer, "precision_standard": precision_info.PrecisionStandard(0.005, 0.005) }) # 若定义多个用例,定义多个ut_case.add_precision_case函数 ut_case.add_precision_case(platforms, {'params': [ {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'input', 'shape': [8, 2048], 'distribution': 'normal', 'value_range': [-10, 10]}, {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'input', 'shape': [8, 2048], 'distribution': 'normal', 'value_range': [-10, 10]}, {'dtype': 'float16', 'format': 'ND', 'ori_format': 'ND', 'ori_shape': [8, 2048], 'param_type': 'output', 'shape': [8, 2048]}], "case_name": 'add_custom_2', "calc_expect_func": calc_expect_func_infer, "precision_standard": precision_info.PrecisionStandard(0.005, 0.005) })
测试用例“params”中字段和字段取值范围需根据算子实现文件入口参数确定。输入的“ori_shape”和“ori_format”字段为可选字段,但若使用参数校验修饰器检验参数,“ori_shape”和“ori_format”字段必选。
若要与期望数据进行结果的比对,请使用add_precision_case接口。
例如:“input”的format支持的类型个数2,则“output”的format支持的类型个数也需要为2。
所有“input”中的dtype、shape、distribution和value_range的取值个数也需要保持一致。
{ "params": [ { "shape": (32, 64), "ori_shape": (32, 64), "format": "ND", "ori_format": "ND", "dtype": "float16", "param_type": "input" }, { "shape": (32, 64), "ori_shape": (32, 64), "format": "ND", "ori_format": "ND", "dtype": "float16", "param_type": "output" } ], "case_name": "test_add_case_1", "calc_expect_func": np_add #一个函数 "precision_standard": precision_info.PrecisionStandard(0.001, 0.001) #可选字段 }
参数 |
值 |
---|---|
params |
该字段在测试用例运行时透传给算子接口。该字段中的参数应与算子接口的参数顺序一致。
|
case_name |
测试用例的名称,可选参数。若不设置,测试框架会自动生成用例名称,生成规则如下: test_{op_type}_auto_case_name_{case_count} 例如: test_Add_auto_case_name_1 |
calc_expect_func |
期望结果生成函数。 |
precision_standard |
自定义精度标准,取值为:(rtol, atol, Max_atol)。
说明:
若不配置此字段,按照如下默认精度与期望数据进行比对:
|
. ${install_path}/set_env.sh
cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin ./op_ut_run --case_files=xx/test_add_custom_impl.py --data_path=./data --simulator_data_path=./model --simulator_lib_path=/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/simulator --simulator_mode=ca --soc_version=Ascend910xx --case_name=add_custom_1 --ascendc_op_path=xx/add_custom.cpp --block_dim=8
如果无法确定具体的<soc_version>,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的<soc_version>值为Ascendxxxyy。
├──{model} //默认目录或自定义数据存放目录 │ └── ca //simulator_mode配置为ca时生成此目录 │ └── add_custom //根据op_type生成 │ └── add_custom_pre_static_test_Add_auto_case_name_1 //以{op_type}_pre_static_test_{case_name}命名的目录下存放的dump文件 │ ├── core0_bank_conflict_log.dump │ ├── core0_biu_log.dump │ ├── core0_biu_rd_data_log.dump │ ├── core0_bp_log.dump │ ├── core0_buffer_log.dump │ ├── core0_cube_log.dump │ ├── core0_fmd_log.dump │ ├── core0_hwts_log.dump │ ├── core0_icache_log.dump │ ├── core0_instr_log.dump │ ├── core0_issque_log.dump │ ├── core0_lsu_log.dump │ ├── core0_mte_biu_req_log.dump │ ├── core0_mte_status_log.dump │ ├── core0_rd_buffer_log.dump │ └── pv //simulator_mode配置为pv时生成此目录 │ └── add_custom ///根据op_type生成 │ └──add_custom_pre_static_test_Add_auto_case_name_1 //以{op_type}_pre_static_test_{case_name}命名的目录下存放的dump文件 │ ├── core0_biu_log.dump │ ├── core0_biu_wr_log.dump │ ├── core0_buf_log.dump │ ├── core0_cube_log.dump │ ├── core0_hwts_log.dump │ ├── core0_instr_popped_log.dump │ ├── core0_l0a_rd_log.dump │ ├── core0_l0b_wr_log.dump │ ├── core0_l0c_rd_log.dump │ ├── core0_l0c_wr_log.dump │ ├── core0_l1_rd_log.dump │ ├── core0_l1_wr_log.dump │ ├── core0_mte_log.dump │ ├── core0_scalar_buf_rd_log.dump │ ├── core0_ub_rd_log.dump
cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin ./msopgen sim -c core0 -d xx/{model}/ca/add_custom/add_custom_pre_static_add_custom -out ./output_data -subc cubecore0
可以在Chrome浏览器中输入“chrome://tracing”地址,将获取到的dump2trace_core0.json文件拖到空白处打开,通过键盘上的快捷键(w:放大,s:缩小,a:左移,d:右移)进行查看,如下图所示,关键字段如表2所示。