asc-devkit 是 CANN 开发者工具包的入口——它是一个命令行工具,也是一套 IDE 插件,还打包了所有开发所需的脚本和模板。定位类似于 NVIDIA 的 nsys(性能分析)+ nvcc(编译器封装)+ 项目脚手架工具,合在一起的统一入口。
三个核心子工具
asc-devkit/ ├── asc-cli # 命令行工具:项目创建/编译/运行/调试 ├── asc-vscode # VSCode 插件:语法高亮/调试面板/性能分析 └── asc-templates # 项目模板:kernel/ACL推理/算子测试/性能分析asc-cli:一条命令创建项目
不用手动创建 CMakeLists.txt、配置环境变量、设置编译参数。asc-cli 一条命令搞定。
# 创建算子开发项目asc create--type=kernel--name=my_first_kernelcdmy_first_kernel tree# my_first_kernel/# ├── kernel/# │ └── my_kernel.cpp # 算子代码模板# ├── host/# │ └── main.cpp # host 端入口# ├── test/# │ └── test_my_kernel.cpp # 单元测试模板# ├── CMakeLists.txt # CMake 配置(自动填充)# └── ascend.json # 项目元数据# 编译asc build--target=my_first_kernel# 背后等价于:# cmake . -DCMAKE_TOOLCHAIN_FILE=/path/to/ascend.cmake# make -j# 运行asc run my_first_kernel1024# 背后等价于:# ./build/my_first_kernel 1024三种项目模板覆盖主流场景:
| 模板类型 | 生成内容 | 适用场景 |
|---|---|---|
kernel | kernel.cpp + host/main.cpp + CMakeLists.txt | 开发新算子 |
inference | 模型加载 + ACL 推理 + 前后处理 | 模型推理部署 |
test | 算子单元测试框架 + 覆盖率配置 | 算子测试 |
VSCode 插件的调试面板
asc-vscode 最核心的功能是 NPU 远程调试面板——在 VSCode 里设置断点,可以停在 NPU 上的 kernel 代码里。
// .vscode/launch.json(asc create 自动生成){"version":"0.2.0","configurations":[{"name":"Ascend Kernel Debug","type":"ascend","request":"launch","program":"${workspaceFolder}/build/my_first_kernel","args":["1024"],"device":0,"kernel":"my_kernel","breakpoints":{"host":["main.cpp:42"],"kernel":["my_kernel.cpp:15","my_kernel.cpp:28"]},"env":{"ASCEND_DEVICE_ID":"0","ASCEND_LOG_LEVEL":"DEBUG"}}]}调试面板提供三个视图:
┌─────────────────────────────────────────────┐ │ NPU Debugger Panel │ ├─────────────────────────────────────────────┤ │ 🔍 Kernel State │ │ Name: my_kernel │ │ Status: RUNNING │ │ AI Core: 0 │ │ │ │ 📊 L1 Cache(实时) │ │ local_a: [0x7f00_0000] size=4096B │ │ local_b: [0x7f00_1000] size=4096B │ │ │ │ 🎯 Vector Pipeline │ │ Stage 1 [===================================================================================] 100%│ │ Stage 2 [=========================================================== ] 65% │ │ │ │ 🧠 Variables(断点处快照) │ │ local_a[0..3] = [1.0, 2.0, 3.0, 5.0] │ │ local_b[0..3] = [0.5, 1.0, 1.5, 2.5] │ └─────────────────────────────────────────────┘调试面板能把 L1 缓存里的数据直接读出来展示——这是传统 CPU 调试器做不到的。
踩坑一:asc build 的 CMake 缓存污染
asc build 会在项目目录创建build/目录并缓存 CMake 变量。如果用 asc build 构建了一次 Release 版本,然后又手动cmake -DCMAKE_BUILD_TYPE=Debug切换模式——CMake 缓存里的旧变量会覆盖新参数,实际编译的还是 Release。
错误操作序列:
asc build# 第一次:默认 Release,CMake 缓存写了 CMAKE_BUILD_TYPE=Release# 想切 Debug:手动改 CMake 参数cmake-DCMAKE_BUILD_TYPE=Debug build/make-j# 问题:CMakeCache.txt 里 CMAKE_BUILD_TYPE 已经是 Release# cmake 不会覆盖已存在的 cache 变量# 实际编译出来仍然是 Release(断言全被编译器删掉)正确做法:用asc build --rebuild清缓存后重新构建。
asc build--rebuild--build-type=Debug# asc build --rebuild 会先删掉 build/ 目录再重建 CMake 配置踩坑二:远程调试的 kernel 断点有效条件
NPU 上的断点不是在所有 kernel 上都有效。断点依赖编译时插入的调试符号——而 Release 模式下编译器删掉了符号信息。
断点有效条件:
| 条件 | 有效 | 无效 |
|---|---|---|
| 编译模式 | -DCMAKE_BUILD_TYPE=Debug | Release/RelWithDebInfo |
| kernel 代码 | 在 L1 里有变量名字段 | 编译器优化掉变量名 |
| 多核并行 | 单核 kernel | 多核(断点触发顺序不可控) |
| Pipeline 阶段 | 计算阶段(COMPUTE) | SDMA 搬运阶段(异步 DMA) |
最常见的问题是:Release 模式编译的 kernel 设置断点后 VSCode 显示no debug info——需要--rebuild --build-type=Debug重新构建。
踩坑三:asc-templates 的模板路径硬编码
asc create从asc-templates目录读取模板。如果把 asc-devkit 整体移动了位置,asc create 找不到模板路径。
错误现象:
asc create--type=kernel--name=my_kernel# Error: Cannot find template 'kernel' in /opt/asc-devkit/asc-templates/# 但 asc-devkit 安装在 /usr/local/asc-devkit/模板路径硬编码在编译时的INSTALL_PREFIX里。安装到/usr/local/后,asc create 仍然去/opt/asc-devkit/找模板。
修复方法:设置环境变量。
exportASC_TEMPLATE_PATH=/usr/local/asc-devkit/asc-templates asc create--type=kernel--name=my_kernel# 现在从 /usr/local/ 读取模板或者改~/.asc-config.json:
{"template_path":"/usr/local/asc-devkit/asc-templates","cache_dir":"~/.cache/asc-devkit","default_build_type":"Release","default_device":0}asc-devkit 把一个 NPU 开发者从零到第一个编译运行通过的 kernel 的时间,从 1-2 天压缩到了不到 30 分钟。但它的价值不是为了省时间——是消除了「环境变量设对了没有」「CMake 版本兼容了没有」「头文件路径引对了没有」这类跟算子开发无关的心智负担。