CANN asc-tools昇腾算子调优工具链快速上手手把手实战:昇腾NPU Profiler数据采集、算子耗时分析与优化建议的完整可复现流程——从环境准备到AI Core算子时间线可视化的步步操作指
前言
在昇腾NPU算子开发与调优过程中,如何精准定位性能瓶颈、理解算子执行时序、分析Kernel执行效率,是每位开发者必须掌握的核心技能。CANN生态提供的asc-tools工具链,涵盖CPU Debug、NPU Check、msobjdump、show_kernel_debug_data、optype_collector等关键组件,为开发者提供了从功能验证到性能分析的完整调试能力。文章将以手把手实战的方式,详细演示asc-tools工具链的安装部署、CPU域孪生调试、算子ELF文件解析、Kernel调试信息获取以及OpType冲突检测的全流程操作,帮助开发者快速建立昇腾算子调优的方法论和实操能力。
asc-tools是CANN基于Ascend C编程语言推出的配套调试工具仓,其核心价值在于让开发者能够在算子部署到NPU之前,先行在CPU域完成功能与精度的基本验证,同时提供gdb调试、printf打印等传统调试手段,极大降低了算子开发的试错成本。对于已部署到NPU的算子,工具链提供了内存检查、多线程检查、内存生命周期管理、同步事件管理等深度分析能力,帮助开发者发现隐藏的逻辑缺陷。此外,msobjdump工具可解析算子ELF文件并提取关键元数据,show_kernel_debug_data工具可离线解析Kernel侧调试信息,optype_collector工具可检测自定义算子与内置算子之间的命名冲突,形成了覆盖算子开发全生命周期的工具矩阵。
文章假定读者已具备基本的Linux命令行操作能力和Ascend C编程基础,文中所有命令均经过实际验证,可直接复制执行。操作环境以Ubuntu二十二点零四系统为例,NPU型号以Atlas A二系列(对应dav-二二零一架构)为主,其他型号读者可根据实际情况调整参数。
环境准备与工具安装
asc-tools工具链的安装方式分为两种:基于CANN镜像的Docker容器化部署,以及源码编译安装。容器化部署适合快速体验,源码编译安装适合深度定制和向社区贡献代码。两种方式各有优劣,开发者可根据实际需求选择合适的安装路径。容器化部署的优势在于环境隔离性好、依赖管理清晰、可快速复制和迁移,适合初次接触asc-tools的开发者。源码编译安装的优势在于可以获取最新功能、支持本地修改调试、便于理解工具内部实现,适合有深度定制需求或计划向社区贡献代码的开发者。
容器化部署方案
若主机已安装NPU驱动和固件,且npu-smi info命令能够正常输出设备信息,可使用Docker容器快速构建开发环境。容器化部署的优势在于环境隔离性好、依赖管理清晰、可快速复制和迁移。从昇腾镜像仓库拉取预集成CANN的镜像,镜像仓库提供了多个版本的CANN镜像,开发者可根据项目需求选择合适的版本:
# WHY: 拉取CANN社区版镜像,镜像已预装CANN toolkit和ops包,避免手动安装依赖
# 注意:镜像文件较大(约十GB),下载时间约五至十分钟
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-beta.2-910b-ubuntu22.04-py3.11
启动容器时需挂载NPU设备节点,确保容器内可访问宿主机的NPU资源。容器启动参数较为复杂,每个参数都有特定作用,理解这些参数有助于排查容器内NPU访问问题:
# WHY: 容器需通过设备映射访问NPU硬件,--privileged赋予完整设备权限
# --device /dev/davinci0映射第零张NPU卡,多卡环境需追加多个--device参数
docker run --name asc-tools-env \
--ipc=host --net=host --privileged \
--device /dev/davinci0 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /home/user/workspace:/workspace \
-it bash
参数详解如下:–ipc=host参数让容器与宿主机共享IPC命名空间,这是NPU进程间通信(共享内存、信号量)正常工作的前提条件,没有此参数可能导致进程间通信失败。–net=host参数使容器使用宿主机网络栈,避免容器网络转发带来的通信延迟,这对于需要高性能网络通信的场景尤为重要。–privileged参数赋予容器完整的设备访问权限,这是NPU驱动正常工作的必要条件,没有此参数容器无法访问NPU硬件。–device参数系列将宿主机的NPU设备节点映射到容器内,其中davinci零对应系统中的第零张NPU卡,多卡环境需追加davinci一、davinci二等设备映射。
进入容器后,验证环境是否正常:
# WHY: 检查NPU设备状态,确认驱动加载成功
npu-smi info
# WHY: 检查CANN包安装信息,确认版本号与预期一致
cat /usr/local/Ascend/cann/$(uname -m)-linux/ascend_toolkit_install.info
若npu-smi info命令能够正常输出设备信息,包括NPU型号、固件版本、驱动版本等,说明NPU驱动加载成功。若输出为空或报错,需检查宿主机驱动安装是否正确,以及容器设备映射参数是否配置正确。
源码编译安装方案
若需要向asc-tools仓库贡献代码或深度定制工具功能,应采用源码编译安装方式。源码编译的优势在于可以获取最新功能、支持本地修改调试、便于理解工具内部实现。克隆仓库代码并进入代码目录:
# WHY: 克隆asc-tools仓库,包含CPU Debug、NPU Check等工具的完整源码
cd /workspace
git clone https://atomgit.com/cann/asc-tools.git
cd asc-tools
源码编译需要安装多项依赖工具,包括Python三点七及以上版本、GCC与G加加(版本范围为七点三至十四点x,且两个编译器版本需保持一致)、CMake三点一六及以上版本、ccache四点六点一及以上版本等。依赖安装可参考CANN软件安装指南中的依赖安装章节,该文档提供了各操作系统的详细安装步骤。
执行一键式编译安装脚本:
# WHY: build.sh脚本自动下载依赖、编译源码、生成run安装包
# 编译产物位于build_out目录,包含cann-asc-tools_<version>_linux-<arch>.run
bash build.sh --pkg
编译过程会下载asc-tools依赖的其他CANN开源仓,包括msot、mssanitizer、msopprof、msopgen、mskpp、mskl、msdebug等。若编译环境无法访问网络,需手动下载这些依赖仓库的压缩包并放置到指定目录,使用–cann_三rd_lib_path参数指定依赖路径。
编译完成后安装run包:
# WHY: 将asc-tools安装到CANN目录,覆盖原有Ascend C内容
# --pylocal参数确保Python模块安装到正确位置
cd build_out
./cann-asc-tools_<cann_version>_linux-<arch>.run --full --pylocal
配置环境变量:
# WHY: 使CANN工具链环境变量生效,包括asc-tools各组件的PATH设置
source /usr/local/Ascend/cann/set_env.sh
环境变量配置完成后,可在任意目录直接调用asc-tools提供的工具命令,无需进入工具安装目录。set_env.sh脚本会设置PATH、LD_LIBRARY_PATH、PYTHONPATH等多个环境变量,确保工具链各组件能够正常工作。
CPU Debug工具实战:孪生调试算子逻辑
CPU Debug是asc-tools的核心功能之一,它允许开发者在CPU域编译和运行Ascend C算子,借助gdb等常规调试工具进行断点调试、变量查看、调用栈分析等操作。这种孪生调试机制明显减少了NPU调试的门槛,让开发者能够使用熟悉的调试手段快速定位问题。
CPU Debug的工作原理是:bisheng编译器在CPU调试模式下会将Ascend C代码编译为CPU可执行程序,同时通过cpu_debug_launch.h头文件将核函数调用<<<>>>转义为普通函数调用。这样,算子逻辑在CPU上执行,开发者可以使用gdb设置断点、查看变量、单步执行等。CPU Debug为每个核函数启动独立的子进程,模拟NPU多核并行执行的环境。
修改源码启用CPU调试模式
在通过<<<>>>调用核函数的源文件中,添加条件编译头文件引用:
// WHY: bisheng编译器在CPU调试模式下通过该头文件转义<<<>>>核函数调用
// #ifdef确保该代码仅在CPU调试模式下生效,不影响NPU模式编译
#ifdef ASCENDC_CPU_DEBUG
#include "cpu_debug_launch.h"
#endif
该修改无需移除,在NPU模式下编译器会自动忽略该段代码。条件编译机制确保同一份源代码可同时支持CPU调试模式和NPU运行模式,开发者无需维护两套代码。这种设计体现了asc-tools对开发者体验的关注,让调试代码和生产代码可以共存。
编译CPU域可执行程序
以dav-二二零一架构(Atlas A二/A三系列)为例,编译命令如下。不同NPU架构需要指定不同的架构参数,否则会导致链接失败或运行时错误:
# WHY: CMAKE_ASC_RUN_MODE=cpu开启CPU域编译模式
# CMAKE_ASC_ARCHITECTURES指定NPU架构,决定CPU调试依赖库版本
# dav-2201对应Atlas A2/A3系列,dav-3510对应Ascend 950PR/Ascend 950DT
mkdir -p build && cd build
cmake -DCMAKE_ASC_RUN_MODE=cpu -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..
make -j$(nproc)
CMAKE_ASC_RUN_MODE参数是开启CPU调试模式的关键,设置为cpu时bisheng编译器会生成CPU域可执行程序。CMAKE_ASC_ARCHITECTURES参数指定NPU架构版本号,CMake会根据该值配置对应的CPU调试依赖库。不同NPU架构对应不同的CPU模拟库,设置错误会导致链接失败。
编译成功后,在build目录生成CPU域可执行程序(如./add),可直接在CPU上运行。运行前无需NPU设备,这为无NPU环境的开发者提供了算子功能验证的途径。CPU域可执行程序包含了完整的算子逻辑,开发者可以像调试普通C加加程序一样调试算子。
使用gdb调试核函数
CPU Debug通过为每个核函数启动独立子进程模拟NPU执行逻辑,因此gdb调试时需设置follow-fork-mode跟踪子进程。这是CPU Debug调试的关键设置,不理解这一点会导致无法在核函数内部设置断点:
# WHY: 启动gdb调试CPU域算子程序
gdb ./build/add
在gdb交互界面中设置调试参数:
# WHY: 设置gdb跟踪子进程模式,确保能进入核函数内部断点调试
# 若不设置该选项,gdb默认跟踪父进程,无法进入核函数
(gdb) set follow-fork-mode child
# WHY: 在核函数入口设置断点,Compute为常见核函数名,实际以代码为准
(gdb) break Compute
# WHY: 运行程序,触发断点
(gdb) run
# WHY: 单步执行,逐行调试算子逻辑
(gdb) next
# WHY: 查看当前变量值
(gdb) print variable_name
# WHY: 继续执行到下一个断点
(gdb) continue
# WHY: 查看调用栈,定位函数调用链路
(gdb) backtrace
set follow-fork-mode child是CPU Debug调试的关键设置。由于CPU Debug为每个核函数启动独立子进程,gdb默认跟踪父进程会导致无法进入核函数内部。设置child模式后,gdb会在fork创建子进程时自动切换到子进程,从而能够在核函数内部设置断点并调试。
gdb调试常用操作包括:break设置断点、run运行程序、next单步执行(不进入函数)、step单步执行(进入函数)、continue继续执行到下一个断点、print查看变量值、backtrace查看调用栈、info locals查看局部变量、info args查看函数参数、watch设置数据断点等。熟练掌握这些操作可以大幅提升调试效率。
切换回NPU模式运行
CPU调试完成后,清除build目录并重新配置cmake即可切回NPU模式:
# WHY: 清除CPU调试模式的编译产物,重新编译NPU模式
# 步骤1添加的#ifdef代码无需移除,NPU模式下编译器自动忽略
rm -rf build
mkdir -p build && cd build
cmake -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..
make -j$(nproc)
./add
切换到NPU模式时,只需移除CMAKE_ASC_RUN_MODE=cpu参数即可。条件编译机制确保源码中的#ifdef代码块在NPU模式下不会被编译,开发者无需手动删除或注释调试代码。这种设计让开发者可以在生产代码中保留调试支持代码,在需要时随时切换到调试模式。
NPU Check工具实战:深度检查算子实现逻辑
NPU Check工具在CPU Debug执行过程中同步对算子实现进行检查,检测内存读写异常、同步事件错误、资源泄漏等问题。检查结果以*_npuchk.log文件形式保存,开发者可离线分析。NPU Check是发现隐藏缺陷的利器,能够检测出运行时不报错但存在潜在风险的代码模式。
NPU Check的工作原理是:在CPU Debug执行过程中,工具会记录所有内存分配、释放、读写操作,以及同步事件操作。执行结束后,工具对这些记录进行分析,检测是否存在越界访问、内存泄漏、同步错误等问题。由于是在CPU域模拟执行,工具可以精确跟踪每一步操作的上下文信息。
执行CPU Debug生成检查日志
运行CPU域算子程序后,检查日志自动保存在执行路径的npuchk文件夹中:
# WHY: 运行CPU域算子,NPU Check自动记录执行过程和异常信息
# 多核算子会为每个核生成独立的log文件
./build/add
ls npuchk/
# 输出:add_custom_0_0_vec_npuchk.log add_custom_0_1_vec_npuchk.log ...
对于多核算子,每个核都会生成独立的检查日志文件,命名格式为<算子名><block_id><sub_block_id>_<向量类型>_npuchk.log。开发者可根据需要查看特定核的日志文件。多核场景下的日志分离设计有助于定位问题到具体的核。
解析检查日志
使用ascendc_npuchk_report.py脚本解析日志并输出异常统计:
# WHY: 解析npuchk日志文件,输出检测到的Error统计信息
# 不指定log文件时,脚本自动搜索当前目录下以"_npuchk.log"结尾的文件
python3 ${ASCEND_HOME}/tools/asc_tools/npuchk/ascendc_npuchk_report.py npuchk/add_custom_0_0_vec_npuchk.log
检测到Error时,命令行输出示例:
[V] [ErrorRead3] on read 0x7f328c11b010 0x800B
Rule:读取越界,长度超出经Ascend C框架的alloc_buf申请实际有效的数据(开始/结尾)
### vadd((__ubuf__ half*)7f328c11b810, (__ubuf__ half*)0xf328c11b010, ...);
---------------------- ERROR STATISTICS ----------------------
1, ErrorRead3,读取越界,长度超出经Ascend C框架的alloc_buf申请实际有效的数据(开始/结尾)
日志输出包含错误类型、错误描述、触发错误的代码上下文、错误统计等信息,帮助开发者快速定位问题根因。错误统计部分汇总了所有检测到的错误类型和数量,便于开发者了解问题的严重程度。
异常类型解读
NPU Check可检测的异常类型覆盖内存操作、同步事件、资源管理等多个维度。理解这些错误类型的含义,有助于开发者准确判断问题性质并采取针对性的修复措施。
内存读取类错误包括:ErrorRead一(非法内存读取,内存未通过AllocTensor申请或已被FreeTensor释放,这类错误通常意味着访问了野指针或已释放的内存)、ErrorRead二(读取无效数据,内存从未被写入,这类错误意味着读取了未初始化的内存,可能得到不确定的值)、ErrorRead三(读取越界,超出AllocTensor申请的有效范围,这类错误通常意味着数组下标越界或指针运算错误)、ErrorRead四(读取地址非三十二字节对齐,这类错误可能导致性能下降甚至硬件异常)。
内存写入类错误包括:ErrorWrite一(非法内存写入,内存未通过AllocTensor申请或已被释放)、ErrorWrite二(写入越界,超出AllocTensor申请的有效范围)、ErrorWrite三(重复写入,前一次写入的内存未被取走,这类错误可能导致数据覆盖)、ErrorWrite四(写入地址非三十二字节对齐)。
同步事件类错误包括:ErrorSync一(写入存在同步问题,pipe内缺少pipe barrier或pipe间缺少set/wait)、ErrorSync二(读取存在同步问题)、ErrorSync三(set/wait使用不配对,缺少set或者wait)、ErrorSync四(set/wait的eventID重复)。
资源管理类错误包括:ErrorLeak(内存泄漏,申请的内存未释放)、ErrorFree(内存重复释放)、ErrorBuffer零(tensor内存未使用InitBuffer初始化)、ErrorBuffer一(tensor的que类型与初始化时不一致)、ErrorBuffer二(VECIN/VECOUT/VECCALC的操作不合规)、ErrorBuffer三(tensor的操作内存不合法)、ErrorBuffer四(TBufPool资源池未使用InitBufPool接口初始化)。
msobjdump工具实战:解析算子ELF文件
msobjdump工具用于解析算子编译生成的ELF文件,提取kernel函数名称、版本号、调试开关状态、动态参数模式等元数据信息。ELF文件是算子编译的最终产物,其中嵌入了丰富的元数据,msobjdump工具让开发者能够便捷地查看这些信息。
ELF文件是Unix/Linux系统中的标准可执行文件格式,全称为Executable and Linkable Format。asc-tools编译生成的算子ELF文件除了包含可执行代码外,还包含Ascend专用的元数据段,如.ascend.meta段记录kernel函数名称、DEBUG段记录调试配置等。
解析ELF文件基本信息
# WHY: 解析ELF文件并输出关键元数据,包括kernel名称、版本、调试选项等
# 默认输出.ascend.meta、VERSION、DEBUG等常用字段
msobjdump --dump-elf ./build/kernel/add_custom.o
输出示例:
.ascend.meta.0: add_custom
VERSION: 1.0.0
DEBUG: debugBufSize=0, debugOptions=0
DYNAMIC_PARAM: 0
KERNEL_TYPE: AIC
CROSS_CORE_SYNC: USE_SYNC
.ascend.meta字段显示算子kernel函数名称,其中id是meta信息的索引值,多个kernel函数会有多个.ascend.meta.{id}是meta信息的索引值,多个kernel函数会有多个.ascend.meta.id是meta信息的索引值,多个kernel函数会有多个.ascend.meta.{id}段。VERSION字段显示版本号。DEBUG字段显示调试信息,包含debugBufSize(调试信息需要的内存空间)和debugOptions(调试开关状态)。DYNAMIC_PARAM字段显示是否启用动态参数,零表示关闭,一表示开启。KERNEL_TYPE字段显示kernel运行时core类型。CROSS_CORE_SYNC字段显示硬同步类型。
解析ELF文件详细信息
# WHY: --verbose参数开启全量打印,输出ELF Header、Section Headers、Symbol表等详细信息
# 用于深度分析ELF文件结构和符号依赖
msobjdump --dump-elf ./build/kernel/add_custom.o --verbose
–verbose参数会输出ELF文件的完整结构信息,包括ELF Header(文件头信息)、Section Headers(段表)、Program Headers(程序头表)、Symbol表(符号表)等。这些信息对于深度分析算子编译产物、排查链接问题等场景非常有用。
解压ELF文件
# WHY: 将ELF文件中嵌入的device信息文件解压到指定目录
# 用于提取kernel二进制或其他嵌入资源
msobjdump --extract-elf ./build/kernel/add_custom.o --out-dir ./extracted/
ELF文件中可能嵌入多个device信息文件,如kernel二进制、元数据配置等。–extract-elf命令将这些文件解压到指定目录,便于进一步分析。解压后的文件可用于逆向分析或调试信息提取。
获取ELF文件列表
# WHY: 列出ELF文件中包含的所有device信息文件
# 用于了解ELF文件的内部结构
msobjdump --list-elf ./build/kernel/add_custom.o
ELF文件字段说明
| 字段名 | 含义 | 必选 |
|---|---|---|
| .ascend.meta.${id} | 算子kernel函数名称 | 是 |
| VERSION | 版本号 | 是 |
| DEBUG | 调试信息(debugBufSize、debugOptions) | 否 |
| DYNAMIC_PARAM | 是否启用动态参数(零关闭/一开启) | 否 |
| KERNEL_TYPE | kernel运行时core类型 | 否 |
| CROSS_CORE_SYNC | 硬同步syncall类型 | 否 |
| BLOCK_NUM | 算子执行核数 | 否 |
| FUNCTION_ENTRY | 算子TilingKey值 | 否 |
DEBUG字段的debugOptions是一个位掩码,取值含义如下:零表示调试开关关闭,一表示通过DumpTensor或printf打印进行调试,二表示通过assert断言进行调试,四表示通过时间戳打点功能进行调试,八表示通过内存越界检测进行调试。多个选项可组合使用,例如debugOptions等于五表示同时启用了printf调试和时间戳打点。
show_kernel_debug_data工具实战:离线解析Kernel调试信息
show_kernel_debug_data工具用于离线解析通过AscendC::DumpTensor、AscendC::printf等接口保存的Kernel侧调试信息,将二进制文件转换为可读格式。该工具支持printf输出解析、Tensor数据导出、assert断言结果查看、时间戳分析等功能。
Kernel侧调试信息是算子在NPU上执行时产生的调试输出,包括printf打印的内容、DumpTensor导出的Tensor数据、assert断言的结果、时间戳打点信息等。这些信息以二进制格式保存,需要通过show_kernel_debug_data工具解析为可读格式。
配置Dump功能
在aclInit接口中配置dump_kernel_data参数启用Kernel侧调试信息Dump:
// WHY: dump_kernel_data指定导出数据类型,dump_path指定保存路径
// "all"导出printf、tensor、assert、timestamp所有类型数据
{
"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时间戳。多个类型可用英文逗号分隔,例如"printf,tensor"表示只导出printf和tensor类型数据。
dump_path参数指定Dump数据的保存路径,支持绝对路径和相对路径。除配置文件方式外,还可通过环境变量ASCEND_DUMP_PATH和ASCEND_WORK_PATH配置Dump存储路径,优先级为ASCEND_DUMP_PATH高于ASCEND_WORK_PATH高于配置文件中的dump_path。
解析调试信息
命令行方式:
# WHY: 解析bin文件或目录下的所有调试信息文件
# 第一个参数为调试信息路径,第二个参数可选指定输出目录
show_kernel_debug_data ./output/dump_workspace.bin ./parsed_output/
命令行方式支持解析单个bin文件或整个目录。若输入为目录,工具会递归收集所有.bin文件并统一解析。输出目录若不存在,工具会自动创建。
API方式:
# WHY: 在Python脚本中调用解析接口,便于集成到自动化流程
from show_kernel_debug_data import show_kernel_debug_data
# bin_file_path: 调试信息路径,支持bin文件或目录
# output_path: 解析结果保存路径,默认当前目录
show_kernel_debug_data("./output/dump_workspace.bin", "./parsed_output/")
API方式便于将调试信息解析集成到自动化测试流程中,实现调试数据的批量处理和分析。开发者可以编写脚本,在测试完成后自动解析调试信息并生成报告。
optype_collector工具实战:检测算子命名冲突
optype_collector工具用于采集CANN OPP包中的OpType信息,检测自定义算子与内置算子、不同自定义算子之间的命名冲突。OpType冲突会导致算子调用错误,在安装前检测可有效避免此类问题。
OpType是算子的类型标识符,用于在算子库中唯一标识一个算子。当自定义算子的OpType与内置算子或其他自定义算子的OpType相同时,会导致算子调用时选择错误的实现,产生不可预期的结果。optype_collector工具帮助开发者在安装自定义算子前检测这种冲突。
环境变量配置
# WHY: 配置CANN环境变量,使工具能定位内置算子包路径
source /usr/local/Ascend/cann/set_env.sh
# WHY: 可选,指定额外的自定义算子包路径
# 多个路径使用冒号分隔
export ASCEND_CUSTOM_OPP_PATH=/path/to/custom_opp1:/path/to/custom_opp2
ASCEND_CUSTOM_OPP_PATH环境变量用于指定额外的自定义算子包路径,多个路径使用系统路径分隔符(Linux为冒号)分隔。未设置该变量时,工具仍会扫描CANN安装目录下的vendors目录。
输出OpType清单
# WHY: 输出指定SoC的内置算子OpType清单
# {soc_version}替换为实际SoC名称,如Ascend910B1
optype_collector Ascend910B1 --builtin
# WHY: 输出指定SoC的自定义算子OpType清单
optype_collector Ascend910B1 --custom
# WHY: 输出内置算子和自定义算子的全部OpType清单
optype_collector Ascend910B1 --all
–builtin参数输出CANN内置算子的OpType清单,这些算子是CANN包自带的,覆盖了主流的深度学习算子。–custom参数输出自定义算子的OpType清单,这些算子是开发者或第三方厂商提供的。–all参数输出全部算子的OpType清单。SoC名称支持CANN支持的产品名称,如Ascend九一零B一、Ascend三一零P一等。
检测OpType冲突
# WHY: 检测自定义算子与内置算子、不同自定义算子之间的OpType重名冲突
# 返回值零表示无冲突,返回值一表示发现冲突
optype_collector --detect-conflicts Ascend910B1
冲突检测输出示例:
Scanning SoC: Ascend910B1
ASCEND_HOME_PATH: /usr/local/Ascend
ASCEND_CUSTOM_OPP_PATH: /path/to/custom_opp
Conflict detected:
OpType 'MyAdd' conflicts between:
- builtin: /usr/local/Ascend/cann/opp/built-in/op_impl/ai_core/tbe
- custom: /path/to/custom_opp/op_impl/ai_core/tbe
工具返回值零表示执行成功且未发现冲突,返回值一表示发现OpType重名冲突,返回值二表示参数错误、环境变量缺失、目标SoC包不存在等阻塞类错误。开发者可根据返回值判断是否可以继续安装自定义算子。
效率对比分析
以下表格对比了使用asc-tools工具链前后,算子开发调试效率的变化:
| 维度 | 优化前 | 优化后 | 提升来源 |
|---|---|---|---|
| 算子功能验证周期 | 需NPU环境部署,周期以小时计 | CPU域即时验证,周期以分钟计 | CPU Debug孪生调试机制 |
| 内存错误定位时间 | 依赖运行时崩溃信息,定位困难 | NPU Check自动检测并输出详细错误类型 | 内存生命周期管理与越界检测 |
| ELF元数据获取 | 需查阅编译文档或反汇编工具 | msobjdump一键解析输出关键信息 | ELF文件结构解析能力 |
| Kernel调试信息获取 | 需修改代码插桩,重新编译 | Dump配置即可输出调试数据 | DumpTensor或printf离线解析 |
| 算子命名冲突发现 | 安装时报错,排查耗时长 | optype_collector安装前预检 | OpType冲突检测机制 |
常见问题排查
CPU Debug编译报错
若编译时提示找不到cpu_debug_launch.h头文件,检查是否正确配置了CMAKE_ASC_RUN_MODE=cpu参数,以及CANN环境变量是否生效。可通过echo $ASCEND_HOME命令检查环境变量是否指向正确的CANN安装目录。若环境变量未设置或指向错误路径,需重新执行source命令配置环境变量。
NPU Check日志为空
若npuchk目录下无日志文件,确认算子程序是否正常执行完毕。NPU Check仅在debug阶段正常退出(无ASSERT校验失败)时输出完整日志。若程序在执行过程中触发ASSERT断言失败,NPU Check会提前终止,日志可能不完整。此时应先修复ASSERT触发的问题,再重新运行获取完整的检查日志。
msobjdump解析失败
若msobjdump提示文件格式错误,确认输入文件为bisheng编译器生成的算子ELF文件,而非通用ELF文件。通用ELF文件不包含.ascend.meta等Ascend专用段,msobjdump无法解析。可通过file命令查看文件类型,确认是否为正确的ELF文件。
show_kernel_debug_data解析无输出
若解析结果为空,检查dump_kernel_data配置是否正确,以及ASCEND_DUMP_PATH或dump_path路径是否有写入权限。可通过ls命令检查输出目录是否存在dump文件。若目录为空,说明Dump功能未正确配置或程序未正确调用调试输出接口。
结尾
文章详细介绍了CANN asc-tools工具链的安装部署和核心功能使用方法,涵盖CPU Debug孪生调试、NPU Check深度检查、msobjdump ELF解析、show_kernel_debug_data调试信息解析、optype_collector命名冲突检测等关键工具。通过手把手的实操演示,开发者可以快速掌握昇腾NPU算子调试与调优的基本流程,在实际项目中应用这些工具定位问题、优化性能。asc-tools工具链作为CANN生态的重要组成部分,持续为Ascend C算子开发者提供高效的调试支持,帮助开发者缩短开发周期、提升代码质量。
仓库地址:https://atomgit.com/cann/asc-tools
更多推荐



所有评论(0)