算子UT测试

简介

UT(Unit Test:单元测试)是开发人员进行单算子运行验证的手段之一,主要目的是:

测试类的详细定义可参见CANN软件安装后文件存储路径下的“python/site-packages/op_test_frame/ut/ascendc_op_ut.py”文件。

约束说明

生成UT测试用例定义文件

编写算子实现代码的UT Python测试用例,计算出算子执行结果,并取回结果和预期结果进行比较,来测试算子逻辑的正确性。

在算子工程UT测试目录下的test_add_custom_impl.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)
})
  1. 首先导入UT测试类,用户可根据算子类型自行选择使用哪个UT测试类。
  2. 实例化测试用例,AscendcOpUt的使用方法可参见AscendcOpUt测试类定义
  3. 如有调用add_precision_case接口,可参考add_precision_case接口在test_add_custom_impl.py文件进行“calc_expect_func”参数配置。
  4. 添加测试用例。

    测试用例“params”中字段和字段取值范围需根据算子实现文件入口参数确定。输入的“ori_shape”“ori_format”字段为可选字段,但若使用参数校验修饰器检验参数,“ori_shape”“ori_format”字段必选。

    若要与期望数据进行结果的比对,请使用add_precision_case接口

    • “ori_format”“ori_shape”为可选字段,不带此字段时,默认Tensor的实现format和shape与原始format和shape一致。
    • “format”“dtype”“shape”的数量需保持一致,配置的“shape”需要和“format”相匹配。
    • “output”中参数取值的个数都要与“input”一致,否则测试用例生成会失败。

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

    • 一个算子所有“input”中参数取值的个数都要一致,否则测试用例生成会失败。

      所有“input”中的dtype、shape、distribution和value_range的取值个数也需要保持一致。

AscendcOpUt测试类定义

add_precision_case接口

执行UT测试用例

  1. 已参考环境准备,完成驱动和CANN软件的安装,配置CANN软件所需基本环境变量。

    . ${install_path}/set_env.sh

  2. 使用op_ut_run工具运行算子实现文件的UT测试用例。

    进入op_ut_run工具所在目录执行如下命令,详细参数说明请参见表2
    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
    • root用户安装toolkit包默认路径为“/usr/local/Ascend”,请根据实际环境进行替换。
    • --case_files:指定test_*_impl.py测试用例定义文件所在路径,请根据实际修改。
    • --data_path:指定保存测试用例数据.bin文件所在路径,请根据实际修改。
    • --simulator_data_path:指定生成dump数据文件的目录。
    • --simulator_lib_path:指定配置仿真环境运行依赖所在路径。
    • --simulator_mode:指定测试用例的运行环境,可配置为pv(Simulator Function,即功能仿真环境)或ca(Simulator Performance,即性能仿真环境)。
    • --soc_version:昇腾AI处理器的版本。

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

    • --case_name:测试用例test_add_custom_impl.py文件中“case_name”对应的配置。
    • --ascendc_op_path:指定*.cpp算子实现文件所在路径,请根据实际修改,可参考实现样例
    • --block_dim:指定算子核函数运行所需的核数,默认值为“1”。

  3. 执行完成后,屏显信息显示此次用例运行的情况,如图1所示。

    图1 运行结果

  4. 查看生成的dump文件,目录结构示例如下:

    ├──{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

查看算子仿真流水图

  1. 已获取可供解析的dump文件,具体可参见步骤4
  2. 使用msopgen工具生成算子仿真流水图文件。

    进入msopgen工具所在目录执行如下命令,详细参数说明请参见表1
    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
    • root用户安装toolkit包默认路径为“/usr/local/Ascend”,请根据实际环境进行替换。
    • -c:指定待解析dump文件的core id,如core0
    • -d:指定在性能仿真环境(即“simulator_mode”参数设置为ca)生成的dump文件所在路径,请根据实际修改。
    • -out:指定目录下生成算子仿真流水图文件dump2trace_core0.json。
    • -subc:指定待解析dump文件的subcore id,如文件名为core0.cubecore0.instr_log.dump,“cubecore0”即为subcore id。(仅Atlas A2训练系列产品需配置该参数)

  3. 查看算子仿真流水图。

    可以在Chrome浏览器中输入“chrome://tracing”地址,将获取到的dump2trace_core0.json文件拖到空白处打开,通过键盘上的快捷键(w:放大,s:缩小,a:左移,d:右移)进行查看,如下图所示,关键字段如表2所示。

    图2 dump2trace_core0.json文件
    表2 字段说明

    字段名

    字段含义

    VECTOR

    向量运算单元。

    SCALAR

    标量运算单元。

    MTE1

    数据搬运流水,数据搬运方向为:L1 ->{L0A/L0B, UBUF}。

    MTE2

    数据搬运流水,数据搬运方向为:{DDR/GM, L2} ->{L1, L0A/B, UBUF}。

    MTE3

    数据搬运流水,数据搬运方向为:UBUF -> {DDR/GM, L2, L1}。

    FLOWCTRL

    控制流指令。

    CUBE

    矩阵乘运算单元。

    ICmiss

    未命中icache。