CPU孪生调试功能

功能介绍

  • 当用户需要快速进行代码逻辑调试,可优先选择算子CPU调测。使用通用的打印、gdb调测手段,快速定位代码问题。
  • 在NPU板端上板运行之前,可优先选择算子CPU调测初步定位算子精度问题,提高算子NPU上板成功率。

CPU孪生调试主要基于用户输入生成编译所需的二进制bin文件,然后自动执行算子编译和运行,该阶段支持的调测项如表1所示。

表1 CPU调测功能列表

功能名称

功能说明

自动精度比对

若用户配置了标杆数据(golden数据),工具会自动将实际调测运行结果与标杆数据进行精度比对。

printf/PRINTF功能

支持屏显打印Scalar数据,如常量、字符串等信息,功能与NPU上板打印类似,不再赘述,具体参考printf/PRINTF功能

DumpTensor功能

支持dump Tensor数据,功能和产物与NPU上板dump功能类似,不再赘述,具体参考DumpTensor功能

DumpAccChkPoint功能

支持dump偏移位置的Tensor数据,功能和产物与NPU上板dump功能类似,不再赘述,具体参考DumpAccChkPoint功能

assert功能

支持屏显打印断言,其功能与NPU上板assert类似,不再赘述,具体参考assert功能

npucheck功能

通过--npucheckCpuOptions.npucheck开启,提供CPU内存校验和异常检测功能。

使用方法(命令行)

通过命令行进行CPU调测的关键步骤如下,详细样例参考核函数CPU孪生调试

  1. 完成环境搭建,并准备好输入/标杆数据文件。
  2. 执行如下命令进行CPU调测,这里仅提供关键参数项示例,其他参数请参考CPU调测参数按需设置。

    ascendebug kernel --backend cpu --json-file ${op_config_json_file} --repo-type ${repo_type} --chip-version ${chip_version} --core-type ${core_type} --install-path ${cann_install_path} --work-dir ${work_dir} ... {其他参数}

    CPU调测涉及的所有参数可通过ascendebug kernel -hascendebug kernel --help查看。

  3. 查看结果文件,详细说明参见产物说明

使用方法(API)

通过API进行CPU调测的关键步骤如下,详细样例参考核函数CPU孪生调试

  1. 完成环境搭建,并准备好输入/标杆数据文件。

    核函数直调工程场景下,需提前配置好核函数源码信息OpKernelInfo

  2. 构建算子信息。调用DebugOp类里input系列接口(如tensor_input、custom_input等),设置算子的输入、输出、属性值等信息。
  3. 创建调试对象并初始化工作空间。调用create_op_executor接口,创建调试对象op_executor,用户可传入${work_dir}参数手动设置工作空间。
  4. (可选)参考Tiling调测功能 > 使用方法(API)章节,调用Tiling调测接口生成Tiling Info文件。

    本步骤仅适用于没有Tiling Info文件的场景,需调用Tiling调测API生成Tiling Info。

  5. 调用编译运行接口,在CPU上仿真运行核函数,完成输出数据精度比对。

    1. 通过CpuOptions设置CPU编译和运行相关的功能,如npucheck功能。
    2. 根据不同场景调用对应的CPU编译接口。

  6. 查看结果文件,详细说明参见产物说明

产物说明

无论是命令行方式或API方式,CPU调测结果存放在${root}/${work_dir}/cpu路径下,其中${root}表示当前操作路径,${work_dir}表示调测工作空间,默认为/debug_workspace/${op_type}目录,${op_type}为算子名。目录结构示例如下:

├ ${op_type}                    // 算子名
├── cpu
│   ├── build               // 存放CPU编译生成的中间文件
│       ├── xxx_cpu         // CPU编译生成的算子可执行程序
│       ├── npuchk          // npucheck结果存放路径
│           ├── auto_gen_${op_kernel_type}_kernel_${block_num}_${sblock_num}_${kernel_type}_npuchk.log
│           ├── npu_chk_res.log
│   ├── output               // 存放CPU编译运行的输出文件及精度比对结果
│       ├── y.bin           // 运行输出原始数据
│       ├── y.txt           // 精度比对结果文件
│   ├── src                 // 存放CPU编译生成的临时代码文件
│       ├── CMakeLists.txt
│       ├── data_definition.txt
│       ├── add_custom_main.cpp
│       ├── add_custom_tiling.h 
│       ├── _gen_kernel_${op_type}.cpp
│   ├── dump               // dump文件落盘目录
│       ├── PARSER_${timestamp}
│           ├── dump_data    
│               ├──0                     // core number
│                   ├──index_1           // index是dump接口的desc唯一标识值
│                       ├──core_0_index_1_loop_0.bin
│                       ├──core_0_index_1_loop_0.txt