npu_check【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools概述Ascend C Tools提供的孪生调试分为debug功能和npu check功能debug功能包含诸如是否合法使用接口参数校验等在此之上npu check提供了内存检查、内存生命周期管理、内存地址依赖管理、同步事件管理等功能。需要注意的是只有当debug阶段正常退出及未有ASSERT校验npu check才会输出完整的校验日志及分析。环境准备请参考快速入门完成环境准备使用方法基于Ascend C编程语言开发的算子通过cpu_debug在CPU域执行时npu check工具会同步对算子实现进行的检查算子的执行过程和检索到的Error以*_npuchk.log文件的形式保存在CPU域算子可执行文件执行路径下npuchk文件夹内。通过执行以下命令一键式生成检查结果。# 未指定log文件自动在当前路径下搜索log文件其中git_clone_path为本代码仓克隆路径 python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py # 指定log文件 python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py npuchk/xxx_npuchk.log检测到Error命令行执行完毕后失败结果打屏。例如错误码ErrorRead3及相关失败信息如下[V] [ErrorRead3] on read 0x7f328c11b010 0x800B Rule读取越界长度超出经Ascend C框架的alloc_buf申请实际有效的数据开始/结尾 ### vadd((__ubuf__ half*)7f328c11b810, (__ubuf__ half*)0xf328c11b010, (__ubuf__*)0x7f328c11b410, (uint8_t)1, (uint8_t)1, (uint8_t)1, (uint8_t)1, (uint8_t)8, (uint8_t)8, (uint8_t)8); ---------------------- ERROR STATISTICS ---------------------- 1 ErrorRead3读取越界长度超出经Ascend C框架的alloc_buf申请实际有效的数据开始/结尾未检测到Error命令执行完毕无打屏。若检测到Error可在log中查看详细的执行过程。根据日志信息划分为以下几个功能点。异常检测npu check对内存读写、指令同步、Tensor操作的合法性进行检测常见的失败类型及对应字段如下ErrorRead1:非法内存读取数据整段内存未经过Ascend C框架的AllocTensor申请或已被FreeTensor。ErrorRead2:[可疑问题]读取无效数据读取的内存部分/全部从未被写过读取的数据可能是无效数据。ErrorRead3:读取越界长度超出Ascend C框架的AllocTensor申请实际有效的数据开始/结尾。ErrorRead4:读取地址非32字节对齐。ErrorWrite1:非法内存写入数据未经过Ascend C框架的AllocTensor申请或已被FreeTensor。ErrorWrite2:写入越界长度超出经Ascend C框架的AllocTensor申请实际有效的数据开始/结尾。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/set0vector:set0/wait0。ErrorLeak:内存泄漏存在申请内存未释放问题。ErrorFree:内存重复释放调用free_buf释放过再次调用free_buf。ErrorBuffer0:tensor内存未使用Ascend C框架的InitBuffer进行初始化。ErrorBuffer1:tensor的que类型与初始化时不一致。ErrorBuffer2:VECIN/VECOUT/VECCALC的操作不合规。ErrorBuffer3:tensor的操作内存不合法可能原因内存未分配/内存越界。ErrorBuffer4:TBufPool资源池未使用Ascend C框架的InitBufPool接口初始化。EnQue/DeQue错误场景检查对于VECIN/VECOUT/VECCALC类型的Tensor判断Tensor出现在搬运/计算指令时是否处于正确的状态以保证同步的正确性对于异常的状态会在日志中记录。GM内存多核踩踏检查基于GM全局内存的管理机制记录每个核操作的GM地址范围发现多核写入地址范围有重叠的情况记录错误支持Atomic add场景下对于重叠地址不记录错误。使用示例下面以add为示例介绍在调用CPU调测API并使用gdb/printf对算子核函数进行调试之后开发者可以基于生成的log文件使用npu check工具检查Kernel源码的实现逻辑。步骤1:构造错误用例在add_custom代码的CopyIn函数中加入如下FreeTensor操作。AscendC::LocalTensorhalf xLocal inQueueX.AllocTensorhalf(); AscendC::LocalTensorhalf yLocal inQueueY.AllocTensorhalf(); // 此处增加以下一行代码来构造错误示例 inQueueX.FreeTensor(xLocal); // 剩余代码保持不变 AscendC::DataCopy(xLocal, xGm[progress * TILE_LENGTH], TILE_LENGTH); AscendC::DataCopy(yLocal, yGm[progress * TILE_LENGTH], TILE_LENGTH); inQueueX.EnQue(xLocal); inQueueY.EnQue(yLocal);在这里进行FreeTensor会导致非法内存写入数据。步骤2:使用cpu debug生成log文件参考cpu_debug执行以下命令编译生成CPU域的算子可执行文件add_custom_x_x_npuchk.log文件保存在执行路径中新建的build文件夹下npuchk文件夹中。mkdir -p build cd build; cmake .. -DSOC_VERSION${SOC_VERSION}; make -j python3 ../scripts/gen_data.py ./add python3 ../scripts/verify_result.py output_z.bin golden.bin步骤3:找到对应的log文件进行检查由于用例为多核用例每个核都会生成一个相应的log文件以0核为例生成log文件为add_custom_0_0_vec_npuchk.log执行如下命令进行检查。python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py npuchk/add_custom_0_0_vec_npuchk.log若不指定xxx_npuchk.log脚本将会自动检索路径下的以“_npuchk.log”为后缀的文件进行检查。此时查看log文件可以看到执行时npu check日志记录的堆栈信息。步骤4:根据打屏信息判断错误类型示例用例出现错误会出现如下信息。----------------------ERROR STATISTICS---------------------- 1ErrorBuffer2VECIN/VECOUT/VECCALC的操作不合规 1ErrorWrite1非法内存写入数据未经过Ascend C框架的alloc_buf申请或已经free此时可根据上方异常检测部分判断错误类型。【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN/asc-tools NPU检查工具
npu_check【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools概述Ascend C Tools提供的孪生调试分为debug功能和npu check功能debug功能包含诸如是否合法使用接口参数校验等在此之上npu check提供了内存检查、内存生命周期管理、内存地址依赖管理、同步事件管理等功能。需要注意的是只有当debug阶段正常退出及未有ASSERT校验npu check才会输出完整的校验日志及分析。环境准备请参考快速入门完成环境准备使用方法基于Ascend C编程语言开发的算子通过cpu_debug在CPU域执行时npu check工具会同步对算子实现进行的检查算子的执行过程和检索到的Error以*_npuchk.log文件的形式保存在CPU域算子可执行文件执行路径下npuchk文件夹内。通过执行以下命令一键式生成检查结果。# 未指定log文件自动在当前路径下搜索log文件其中git_clone_path为本代码仓克隆路径 python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py # 指定log文件 python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py npuchk/xxx_npuchk.log检测到Error命令行执行完毕后失败结果打屏。例如错误码ErrorRead3及相关失败信息如下[V] [ErrorRead3] on read 0x7f328c11b010 0x800B Rule读取越界长度超出经Ascend C框架的alloc_buf申请实际有效的数据开始/结尾 ### vadd((__ubuf__ half*)7f328c11b810, (__ubuf__ half*)0xf328c11b010, (__ubuf__*)0x7f328c11b410, (uint8_t)1, (uint8_t)1, (uint8_t)1, (uint8_t)1, (uint8_t)8, (uint8_t)8, (uint8_t)8); ---------------------- ERROR STATISTICS ---------------------- 1 ErrorRead3读取越界长度超出经Ascend C框架的alloc_buf申请实际有效的数据开始/结尾未检测到Error命令执行完毕无打屏。若检测到Error可在log中查看详细的执行过程。根据日志信息划分为以下几个功能点。异常检测npu check对内存读写、指令同步、Tensor操作的合法性进行检测常见的失败类型及对应字段如下ErrorRead1:非法内存读取数据整段内存未经过Ascend C框架的AllocTensor申请或已被FreeTensor。ErrorRead2:[可疑问题]读取无效数据读取的内存部分/全部从未被写过读取的数据可能是无效数据。ErrorRead3:读取越界长度超出Ascend C框架的AllocTensor申请实际有效的数据开始/结尾。ErrorRead4:读取地址非32字节对齐。ErrorWrite1:非法内存写入数据未经过Ascend C框架的AllocTensor申请或已被FreeTensor。ErrorWrite2:写入越界长度超出经Ascend C框架的AllocTensor申请实际有效的数据开始/结尾。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/set0vector:set0/wait0。ErrorLeak:内存泄漏存在申请内存未释放问题。ErrorFree:内存重复释放调用free_buf释放过再次调用free_buf。ErrorBuffer0:tensor内存未使用Ascend C框架的InitBuffer进行初始化。ErrorBuffer1:tensor的que类型与初始化时不一致。ErrorBuffer2:VECIN/VECOUT/VECCALC的操作不合规。ErrorBuffer3:tensor的操作内存不合法可能原因内存未分配/内存越界。ErrorBuffer4:TBufPool资源池未使用Ascend C框架的InitBufPool接口初始化。EnQue/DeQue错误场景检查对于VECIN/VECOUT/VECCALC类型的Tensor判断Tensor出现在搬运/计算指令时是否处于正确的状态以保证同步的正确性对于异常的状态会在日志中记录。GM内存多核踩踏检查基于GM全局内存的管理机制记录每个核操作的GM地址范围发现多核写入地址范围有重叠的情况记录错误支持Atomic add场景下对于重叠地址不记录错误。使用示例下面以add为示例介绍在调用CPU调测API并使用gdb/printf对算子核函数进行调试之后开发者可以基于生成的log文件使用npu check工具检查Kernel源码的实现逻辑。步骤1:构造错误用例在add_custom代码的CopyIn函数中加入如下FreeTensor操作。AscendC::LocalTensorhalf xLocal inQueueX.AllocTensorhalf(); AscendC::LocalTensorhalf yLocal inQueueY.AllocTensorhalf(); // 此处增加以下一行代码来构造错误示例 inQueueX.FreeTensor(xLocal); // 剩余代码保持不变 AscendC::DataCopy(xLocal, xGm[progress * TILE_LENGTH], TILE_LENGTH); AscendC::DataCopy(yLocal, yGm[progress * TILE_LENGTH], TILE_LENGTH); inQueueX.EnQue(xLocal); inQueueY.EnQue(yLocal);在这里进行FreeTensor会导致非法内存写入数据。步骤2:使用cpu debug生成log文件参考cpu_debug执行以下命令编译生成CPU域的算子可执行文件add_custom_x_x_npuchk.log文件保存在执行路径中新建的build文件夹下npuchk文件夹中。mkdir -p build cd build; cmake .. -DSOC_VERSION${SOC_VERSION}; make -j python3 ../scripts/gen_data.py ./add python3 ../scripts/verify_result.py output_z.bin golden.bin步骤3:找到对应的log文件进行检查由于用例为多核用例每个核都会生成一个相应的log文件以0核为例生成log文件为add_custom_0_0_vec_npuchk.log执行如下命令进行检查。python3 ${git_clone_path}/asc-tools/npuchk/ascendc_npuchk_report.py npuchk/add_custom_0_0_vec_npuchk.log若不指定xxx_npuchk.log脚本将会自动检索路径下的以“_npuchk.log”为后缀的文件进行检查。此时查看log文件可以看到执行时npu check日志记录的堆栈信息。步骤4:根据打屏信息判断错误类型示例用例出现错误会出现如下信息。----------------------ERROR STATISTICS---------------------- 1ErrorBuffer2VECIN/VECOUT/VECCALC的操作不合规 1ErrorWrite1非法内存写入数据未经过Ascend C框架的alloc_buf申请或已经free此时可根据上方异常检测部分判断错误类型。【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考