npucheck功能
功能介绍
npucheck功能表示CPU孪生调试时对Kernel运行过程中的OP指令进行内存检测,涉及的指令分类如表表1所示,用户根据检测信息进行算子问题定位和排查。
- 该功能仅在CPU孪生调试场景下开启,其他场景不支持。
- 该功能暂不支持与PRINTF/DumpTensor/DumpAccChkPoint/assert打印功能同时开启。
OP指令类别 |
指令说明 |
npucheck检测内容 |
---|---|---|
OP_DMA |
DMA(Direct Memory Access)数据搬运类指令。负责在Global Memory和Local Memory之间搬运数据,包含搬运单元MTE2(Memory Transfer Engine,数据搬入单元)指令,MTE3(数据搬出单元)指令等。 |
|
OP_VEC |
vector向量相关操作指令。 |
根据vector指令配置,检测内存读、写、多核踩踏合法性。 |
OP_CUBE |
cube矩阵相关操作指令。 |
根据cube指令配置,检测内存读、写、多核踩踏合法性。 |
OP_SETFLAG |
set同步指令。 |
|
OP_WAITFLAG |
wait同步指令。 |
配合OP_SETFLAG指令,检测set/wait配对校验。 |
Ascend C Buffer操作指令 |
包括tbuff的alloc、free、pers、init操作指令。 |
使用未初始化内存、重复释放内存、内存泄漏等异常操作的校验。 |
使用方法(命令行)
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} --npucheck false... {其他参数}
开启npucheck功能后,结果文件详细说明参见产物说明。
使用方法(API)
参考CPU孪生调试 > 使用方法(API)步骤,实例化CpuOptions时,默认开启npucheck功能。如需关闭该功能,示例代码如下:
# 调用CPU编译运行接口前,关闭npucheck cpu_options = ascendebug.CpuOptions(npucheck=False)
开启npucheck功能后,结果文件详细说明参见产物说明。
产物说明
npucheck功能开启后,终端会屏显检测到的异常信息,同时将算子OP指令详细信息保存在${root}/${work_dir}/cpu/build/npuchk目录,其中${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
文件名为auto_gen_${op_kernel_type}_kernel_${block_num}_${sblock_num}_${kernel_type}_npuchk.log,其中${op_kernel_type}是算子核函数名,${block_num}是block编号,${sblock_num}是子block编号,${kernel_type}是核类型标识(如cub、vec)。记录的OP指令信息内容示例如下:
### copy_ubuf_to_gm((__gm__ void*)0x7f75ef657fe0, (__ubuf__ void*)0x7f75c3358010, (uint8_t)0, (uint16_t)1, (uint16_t)4, (uint16_t)0, (uint16_t)0); [MTE3] [RECV_INST] copy_ubuf_to_gm type 0 [MTE3] [EXECUTE] copy_ubuf_to_gm type 0 [MTE3] read data 0x7f75c3358010 0x80 B type UB [MTE3] checking synced queue [MTE3] [CHECK_DATA] 0x7f75c3358010 0x80 B type UB [MTE3] [ErrorRead2] on read 0x7f75c3358010 0x80 B
若检测到内存异常信息,npu_chk_res.log会显示检测到的异常信息,示例如下:
---------------------- ERROR STATISTICS ---------------------- 1, ErrorRead4, 读取地址非32字节对齐 1, ErrorRead2, [可疑问题]读取无效数据:读取的内存部分/全部从未被写过,读取的数据可能是无效数据 1, ErrorRead1, 非法内存读取数据: 整段内存未经过AscendC框架的alloc_buf申请或者已free 1, ErrorWrite4, 写入地址非32字节对齐 1, ErrorWrite1, 非法内存写入数据: 未经过AscendC框架的alloc_buf申请过或者已经free了 1, ErrorRead3, 读取越界, 长度超出经AscendC框架的alloc_buf申请实际有效的数据(开始/结尾)
全量的异常检测上报信息字段说明参见表2。
对于ErrorRead1、ErrorRead3、ErrorRead4、ErrorWrite1、ErrorWrite2、ErrorWrite4、ErrorLeak、ErrorFree、ErrorBuffer1异常,直接屏显异常信息,同时退出当前进程。用户可根据auto_gen_${op_kernel_type}_kernel_${block_num}_${sblock_num}_${kernel_type}_npuchk.log文件分析原因。
ERROR标识 |
异常可能得原因 |
---|---|
ErrorRead1 |
非法内存读取数据:整段内存未经过Ascend C框架的alloc_buf申请或者已经free。 |
ErrorRead2 |
[可疑问题]读取无效数据:读取的内存部分/全部从未被写过,读取的数据可能是无效数据。 |
ErrorRead3 |
读取越界,长度超出经Ascend C框架的alloc_buf申请实际有效的数据(开始/结尾)。 |
ErrorRead4 |
读取地址非32字节对齐。 |
ErrorWrite1 |
非法内存写入数据:未经过Ascend C框架的alloc_buf申请或者已经free。 |
ErrorWrite2 |
写入越界,长度超出经Ascend C框架的alloc_buf申请实际有效的数据(开始/结尾)。 |
ErrorWrite3 |
[可疑问题]重复写入,前一次写入的内存没有被读取走,重复写入。 |
ErrorWrite4 |
写入地址非32字节对齐。 |
ErrorSync1 |
写入存在同步问题,pipe内缺少pipe barrier/pipe间缺少set/wait。 |
ErrorSync2 |
读取存在同步问题,pipe内缺少pipe barrier/pipe间缺少set/wait。 |
ErrorSync3 |
set/wait使用不配对,缺少set或者wait。 |
ErrorSync4 |
出现set/wait的eventID重复,比如mte2: set0/set0,vector: wait0/wait0。 |
ErrorLeak |
内存泄露,存在申请内存未释放问题,详细见auto_gen_${op_kernel_type}_kernel_${block_num}_${sblock_num}_${kernel_type}_npuchk.log。 |
ErrorFree |
内存重复释放,调用free_buf释放过,再次调用free_buf。 |
ErrorBuffer0 |
tensor内存未使用Ascend C框架的bufInit。 |
ErrorBuffer1 |
tensor的que类型与初始化时不一致。 |
ErrorBuffer2 |
VECIN/VECOUT/VECCALC的操作不合规。 |
ErrorBuffer3 |
tensor的操作内存不合法,可能原因是内存未alloc/内存越界。 |