show_kernel_debug_data:CANN Ascend C Kernel 侧调试信息离线解析工具实战指南 show_kernel_debug_dataCANN Ascend C Kernel 侧调试信息离线解析工具实战指南【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools本指南围绕 CANN asc-tools 仓库中的show_kernel_debug_data工具展开介绍如何在算子 Kernel 侧启用 Dump 配置把AscendC::DumpTensor、AscendC::printf/PRINTF、ascend_assert、AscendC::PrintTimeStamp等调试接口产出的 bin 文件离线解析为可读文本、Tensor 数值文件与时间戳 CSV。读完本文你将掌握该工具的两种调用方式命令行与 Python API、Dump 配置项的完整语义以及其底层 bin 文件格式与解析原理并能够结合仓库自带的 Add 算子样例完成一次生成 → 解析 → 核对的完整调试闭环。工具定位为什么需要离线解析在 Ascend C 编程中开发者经常在算子 Kernel 内部通过AscendC::DumpTensor打印张量片段、通过AscendC::printf/PRINTF输出格式化日志、通过ascend_assert做断言、通过AscendC::PrintTimeStamp记录打点时间戳。这些调试信息在设备侧以二进制形式落盘无法直接阅读。show_kernel_debug_data正是为这一场景提供的离线解析工具它把保存下来的 bin 文件转换为可读的文本与结构化文件帮助用户在 Host 侧核对 Kernel 内部中间结果与执行时序。该工具的完整说明见仓库文档 docs/04_show_kernel_debug_data_en.md其 Python 实现位于 utils/show_kernel_debug_data/show_kernel_debug_data/ 目录下官方样例位于 examples/01_show_kernel_debug_data/。第一步配置 Dump产出 Kernel 侧调试信息解析的前提是先把 Kernel 侧调试信息落盘。Dump 功能通过 ACL 的 aclInit 内容如下{ dump:{ dump_kernel_data:all, dump_path:../output } }dump_kernel_data导出数据类型该参数指定要导出的调试数据类型多种类型用逗号分隔。当前支持的类型如下取值说明all导出下述所有调试类型的输出数据printf导出AscendC::printf/PRINTF调试产生的输出数据tensor导出AscendC::DumpTensor调试产生的输出数据assert导出ascend_assert调试产生的输出数据timestamp导出通过AscendC::PrintTimeStamp获取的时间戳信息dump_pathDump 数据保存路径启用 Kernel 调试信息 Dump 功能时dump_path必须配置绝对路径与相对路径均支持。除配置文件外还可以通过环境变量ASCEND_DUMP_PATH与ASCEND_WORK_PATH指定 Dump 存储路径。Dump 文件存储路径的优先级如下ASCEND_DUMP_PATH ASCEND_WORK_PATH 配置文件中的 dump_path即环境变量ASCEND_DUMP_PATH优先其次是ASCEND_WORK_PATH最后才是 acl 配置文件中的dump_path。命令行方式使用工具安装完成后可直接在终端使用show_kernel_debug_data bin_file_path [output_path]参数说明参数必选/可选说明bin_file_path必选Kernel 侧调试信息的保存路径支持 bin 文件或目录。目录模式下会递归收集目录下所有.bin文件并一起解析。output_path可选解析结果的保存路径例如/output_dir。缺省时默认为当前命令行工作目录。目录不存在时工具会自动创建。命令行入口实现在 utils/show_kernel_debug_data/show_kernel_debug_data/main.py其调用execute_parse()完成参数解析与解析调度dump_parser.py两个位置参数时分别解析为bin_file_path与output_path单个参数且为-h/--help时打印帮助信息并返回 0单个其他参数时视作bin_file_pathoutput_path取当前工作目录os.getcwd()其余情况打印帮助信息并抛出参数非法异常。因此在终端执行show_kernel_debug_data -h可随时查看用法说明这也是仓库样例中校验工具环境是否就绪的标准做法。底层对输入输出路径的校验从源码dump_parser.py可以看到解析前会做如下检查输入路径不存在、既不是文件也不是目录时抛出RuntimeError输入与输出路径若包含非 ASCII 字符如中文会提示可能引起编码问题建议使用纯 ASCII 路径输出路径已存在但非目录时报错不存在时通过os.makedirs(..., exist_okTrue)自动创建通过_collect_bin_files收集.bin文件单文件模式直接返回该文件目录模式使用glob递归匹配**/*.bin并排序dump_parser.py收集不到任何.bin文件时抛出异常。Python API 方式使用show_kernel_debug_data同时以 Python 包形式提供 API便于集成到调试脚本或自动化流程中。API 说明如下项目内容函数原型def show_kernel_debug_data(bin_file_path: str, output_path: str ./) - None函数说明获取 Kernel 侧调试信息并将其解析为可读文件。参数INbin_file_pathKernel 侧调试信息保存路径支持 bin 文件或目录字符串类型。output_path解析结果保存路径字符串类型默认取调用脚本所在目录目录不存在时自动创建。参数OUTNA返回值NA约束无调用示例from show_kernel_debug_data import show_kernel_debug_datashow_kernel_debug_data(./input/dump_workspace.bin)API 的核心实现在 utils/show_kernel_debug_data/show_kernel_debug_data/init.py先完成与命令行一致的路径校验与.bin文件收集随后根据输入是文件还是目录选择解析策略目录模式调用_make_parser_output_dir生成一个带时间戳的PARSER_时间戳输出目录把parser.log写入该目录并逐个解析收集到的 bin 文件单文件模式直接对该文件调用parse_dump_bin。需要注意的是虽然函数签名没有返回值返回None但输入非法、路径不存在、目录中无.bin文件等场景会抛出RuntimeError调用方应做好异常捕获。完整实战用 Add 算子走一遍生成 → 解析闭环仓库提供了可直接运行的官方样例 examples/01_show_kernel_debug_data/基于 Add 算子z x y演示 Kernel 侧调试信息的生成与解析全流程详细步骤见其说明文档 examples/01_show_kernel_debug_data/README_en.md。支持的软硬件环境产品CANN 软件版本Ascend 950PR / Ascend 950DT CANN 9.1.0Atlas A3 训练系列产品 / Atlas A3 推理系列产品 CANN 9.0.0Atlas A2 训练系列产品 / Atlas A2 推理系列产品 CANN 9.0.0样例结构examples/01_show_kernel_debug_data ├── CMakeLists.txt // 编译工程文件 ├── acl.json // Dump 配置文件 ├── add.asc // Ascend C 算子实现 调用样例 └── README_en.md // 样例说明文档Kernel 侧如何埋点样例 Kernel 实现在 examples/01_show_kernel_debug_data/add.asc 的Compute阶段通过三类调试接口产出数据// DumpTensor 输出输入/输出 Tensor 片段第二个参数 desc 分别为 0/1/2 AscendC::DumpTensor(xLocal[64], 0, 16); AscendC::DumpTensor(yLocal[64], 1, 16); AscendC::DumpTensor(zLocal[64], 2, 16); if (progress 0) { // PrintTimeStamp 打点时间戳 AscendC::PrintTimeStamp(65577); // printf 与 PRINTF 打印格式化日志 AscendC::printf(fmt string int: %d\n, 0x123); AscendC::PRINTF(fmt string int: %d\n, 0x123); float a 3.14; AscendC::printf(fmt string float: %f\n, a); AscendC::PRINTF(fmt string float: %f\n, a); }其中DumpTensor的desc参数作为该次打印的标识索引0、1、2 分别对应xLocal、yLocal、zLocal解析结果将按该索引分目录存放。Host 侧通过aclInit(../acl.json)加载 Dump 配置add.asc运行后按配置把 bin 文件写入output目录。编译运行先按 docs/00_quick_start.md 配置 CANN 环境变量source ${install_path}/cann/set_env.sh其中${install_path}为 CANN 包安装目录未指定安装目录时默认安装至/usr/local/Ascend。接着确认工具可用show_kernel_debug_data -h在样例根目录编译并执行mkdir -p build output cd build; cmake -DCMAKE_ASC_ARCHITECTURESdav-2201 ..;make -j; ./demoCMAKE_ASC_ARCHITECTURES编译选项决定 NPU 架构可选值与对应产品如下选项可选值说明CMAKE_ASC_ARCHITECTURESdav-2201默认、dav-3510dav-2201对应 Atlas A2/A3 训练与推理系列产品dav-3510对应 Ascend 950PR/Ascend 950DT该选项在 examples/01_show_kernel_debug_data/CMakeLists.txt 中定义并转换为编译参数--npu-arch${CMAKE_ASC_ARCHITECTURES}。执行成功后终端输出[Success] Case accuracy is verification passed.此时output目录下会生成 Kernel 调试信息 bin 文件例如output └── 202xxxxxxxxxxx ├── asc_kernel_data_xxx.bin ├── ... └── asc_kernel_data_xxx.bin解析调试数据在build目录下执行目录模式递归解析output下所有 bin 文件mkdir -p dump_info_output show_kernel_debug_data ../output dump_info_output终端可观察到如下打印信息log file saves to ./dump_info_output/PARSER_20251022074515310995/parser.log write dump workspace result: ./dump_info_output/PARSER_20251022074515310995/dump_data block.0 begin fmt string int: 291 fmt string int: 291 fmt string float: 3.140000 fmt string float: 3.140000 block.0 end ... block.7 begin fmt string int: 291 fmt string int: 291 fmt string float: 3.140000 fmt string float: 3.140000 block.7 end fmt string int: 291正是 Kernel 侧0x123的十进制展开fmt string float: 3.140000对应3.14且printf与PRINTF各打印一次与 add.asc 中的埋点一一对应block.0到block.7分别对应 8 个核。解析结果目录解读dump_info_output └── PARSER_20251022074515310995 ├── dump_data │ ├── 0 │ │ ├── asc_kernel_data_aiv_0_index_0_loop_0.bin │ │ ├── asc_kernel_data_aiv_0_index_0_loop_0.txt │ │ └── time_stamp_core_0.csv │ ├── 1 │ ├── ... │ └── index_dtype.json └── parser.log各要素含义如下PARSER_时间戳每次目录模式解析都会新建一个带 UTC 时间戳的结果目录dump_parser.py避免覆盖历史结果dump_data下的0、1、...、7分别对应 8 个核的打印信息index_n前缀对应DumpTensor第二个参数descn即样例中的xLocal0、yLocal1、zLocal2loop_n后缀同一desc在循环中被多次打印时的序号.bin与.txt成对出现前者是原始 Tensor 数据后者是解析出的可读数值time_stamp_core_id.csv该核的PrintTimeStamp打点时间戳index_dtype.json记录每个desc索引对应的数据类型parser.log本次解析的运行日志。深入原理bin 文件格式与解析流程工具不仅能开箱即用其源码也完整揭示了 dump bin 的二进制组织方式有助于排查异常数据或扩展格式支持。核心解析逻辑集中在 utils/show_kernel_debug_data/show_kernel_debug_data/dump_parser.py。两种 bin 封装格式legacy 与 fifoparse_dump_bindump_parser.py通过读取文件头部的 magic 自动识别格式legacy workspace 格式块头BlockInfo使用iiiiiiQ布局total_size、block_id、block_num、remain_size、magic_num、reserved、dump_addrmagic 为0x5AA5BCCD文件按 1MB 块对齐组织fifo/ringbuf 格式块头FifoBlockInfo使用IIIIHHIQ6I布局magic 为0xAE86并通过flag字段区分核类型0aic、1aiv、2simt见_core_type_from_fifo_flag。文件名为asc_kernel_data_core_type_core_id_...时直接取文件名中的核类型与核 ID否则从块头解析。TLV 数据单元与调试类型每个核的数据由连续的 TLV 单元组成TLV头部为tag(uint32) length(uint32)value为负载dump_parser.py。tag取值为DumpType枚举tag含义解析结果SCALAR_TYPE(1)printf/PRINTF格式化日志可读字符串TENSOR_TYPE(2)DumpTensor张量数据原始.bin 数值.txtSHAPE_TYPE(3)张量 shape 信息用于还原多维结构ASSERT_TYPE(4)ascend_assert断言信息可读字符串META_TYPE(5)元信息核数、核类型等可读字符串TIME_STAMP(6)PrintTimeStamp打点CSV 行SIMT_PRINTF_TYPE(0xF0E00F0E) /SIMT_ASSERT_TYPE(0xF0F00F0F)SIMT 场景的打印与断言按线程归并的文本张量数值如何还原DumpTensor的负载由DumpMessageHeaderaddr、data_type、desc、buffer_id、position、reserved 共 6 个 int32加原始数据组成。解析器依据data_type查表dump_parser.py选择对应的struct解包格式data_type类型解包格式0float32f1float16e2int8b3int32i4uint8B6int16h7uint16H8uint32I9int64q10uint64Q27bfloat16H经decode_bfloat16特殊转换结合SHAPE_TYPE提供的维度信息_write_dump_tensor_value会把一维数值序列按 shape 拼成带嵌套[]的多维文本当 dump 元素数与 shape 期望数不一致时会在日志中给出警告并以-占位缺失值dump_parser.py。printf 格式化串如何还原PrintStruct从负载中读取格式串逐占位符解析参数dump_parser.py支持%d/%i、%ld、%f/%F、%lf/%LF、%x/%X、%s、%p、%u等占位符%p会被替换为0x%x以适配 Python 格式化%s通过偏移量定位字符串内容%f会自动探测是否为 8 字节 double。最终以fmt % tuple(args)拼出与 Kernel 侧一致的可读日志。SIMT 场景的FifoSimtPrintStruct额外携带 block/thread 索引解析结果按线程 ID 归并输出到asc_kernel_data_simt_core_id_thread_线程号.txt。时间戳 CSVTimeStampInfo以desc_id(u32) rsv(u32) sys_cycle(u64) pc_ptr(u64)布局记录打点。解析器把desc_id通过TimeStampId枚举映射为可读打点标识如TIME_STAMP_TPIPE、TIME_STAMP_TILING_DATA等并生成带表头打点标识, Cycle, Cycle间隔, PC指针的 CSVdump_parser.py其中Cycle间隔列便于直接观察相邻打点之间的周期开销用于性能定位。日志与调试解析过程的日志由 utils/show_kernel_debug_data/show_kernel_debug_data/dump_logger.py 管理屏幕输出仅显示 WARNING 及以上级别详细日志写入结果目录下的parser.log。日志级别由环境变量ASCEND_GLOBAL_LOG_LEVEL控制0DEBUG、1INFO、2WARNING、3ERROR缺省为3。当解析结果与预期不符时可设置ASCEND_GLOBAL_LOG_LEVEL1重跑以获取 INFO 级过程信息如每个核写入的目录、每个 TLV 的 tag 等。另外解析前DumpBinFile._pre_process会检查 CANN 安装路径由环境变量ASCEND_HOME_PATH指定下是否存在operator_cmp/compare/msaccucmp.py若存在会先调用msaccucmp.py convert -d bin -t bin -out 临时目录对 dump 文件做预处理转换存在.space.*.bin产物时优先解析转换结果以兼容部分场景下设备侧落盘格式的差异。常见问题与使用建议解析前先确认 Dump 已使能若output目录为空或解析时报 does not contain any .bin file请核对 acl.json 中dump_kernel_data与dump_path是否生效并注意ASCEND_DUMP_PATH、ASCEND_WORK_PATH环境变量优先级高于配置文件中的dump_path。多文件场景用目录模式将整目录传给bin_file_path即可一次解析所有.bin每个文件的结果都会写入同一个PARSER_时间戳目录便于批量核对多核输出。路径建议使用纯 ASCII源码对非 ASCII 路径会显式报错请避免在输入输出路径中使用中文等非 ASCII 字符。核对index_dtype.json当.txt数值看起来不对时先查看dump_data/index_dtype.json确认每个desc对应的数据类型是否与 Kernel 侧DumpTensor的张量类型一致。区分loop与indexindex对应DumpTensor的desc标识loop对应同一标识在循环中的第几次打印二者结合才能准确定位某一次具体的张量快照。小结show_kernel_debug_data为 Ascend C Kernel 侧调试提供了完整的离线闭环通过 acl 配置使能 Dump在 Kernel 内用DumpTensor/printf/assert/PrintTimeStamp埋点再借助命令行或 Python API 把 bin 数据解析为可读文本、带 shape 的多维数值文件与时间戳 CSV。结合 dump_parser.py 的源码与 Add 算子样例开发者既可以快速上手也能深入理解其二进制格式为算子精度与性能问题定位提供可靠依据。【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考