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--typekernel--namemy_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--targetmy_first_kernel# 背后等价于# cmake . -DCMAKE_TOOLCHAIN_FILE/path/to/ascend.cmake# make -j# 运行asc run my_first_kernel1024# 背后等价于# ./build/my_first_kernel 1024三种项目模板覆盖主流场景模板类型生成内容适用场景kernelkernel.cpp host/main.cpp CMakeLists.txt开发新算子inference模型加载 ACL 推理 前后处理模型推理部署test算子单元测试框架 覆盖率配置算子测试VSCode 插件的调试面板asc-vscode 最核心的功能是 NPU 远程调试面板——在 VSCode 里设置断点可以停在 NPU 上的 kernel 代码里。// .vscode/launch.jsonasc 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] size4096B │ │ local_b: [0x7f00_1000] size4096B │ │ │ │ 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_TYPEDebug切换模式——CMake 缓存里的旧变量会覆盖新参数实际编译的还是 Release。错误操作序列asc build# 第一次默认 ReleaseCMake 缓存写了 CMAKE_BUILD_TYPERelease# 想切 Debug手动改 CMake 参数cmake-DCMAKE_BUILD_TYPEDebug build/make-j# 问题CMakeCache.txt 里 CMAKE_BUILD_TYPE 已经是 Release# cmake 不会覆盖已存在的 cache 变量# 实际编译出来仍然是 Release断言全被编译器删掉正确做法用asc build --rebuild清缓存后重新构建。asc build--rebuild--build-typeDebug# asc build --rebuild 会先删掉 build/ 目录再重建 CMake 配置踩坑二远程调试的 kernel 断点有效条件NPU 上的断点不是在所有 kernel 上都有效。断点依赖编译时插入的调试符号——而 Release 模式下编译器删掉了符号信息。断点有效条件条件有效无效编译模式-DCMAKE_BUILD_TYPEDebugRelease/RelWithDebInfokernel 代码在 L1 里有变量名字段编译器优化掉变量名多核并行单核 kernel多核断点触发顺序不可控Pipeline 阶段计算阶段COMPUTESDMA 搬运阶段异步 DMA最常见的问题是Release 模式编译的 kernel 设置断点后 VSCode 显示no debug info——需要--rebuild --build-typeDebug重新构建。踩坑三asc-templates 的模板路径硬编码asc create从asc-templates目录读取模板。如果把 asc-devkit 整体移动了位置asc create 找不到模板路径。错误现象asc create--typekernel--namemy_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--typekernel--namemy_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 版本兼容了没有」「头文件路径引对了没有」这类跟算子开发无关的心智负担。
昇腾CANN asc-devkit:开发者工具包的核心能力和工程化实践
发布时间:2026/5/23 5:03:58
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--typekernel--namemy_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--targetmy_first_kernel# 背后等价于# cmake . -DCMAKE_TOOLCHAIN_FILE/path/to/ascend.cmake# make -j# 运行asc run my_first_kernel1024# 背后等价于# ./build/my_first_kernel 1024三种项目模板覆盖主流场景模板类型生成内容适用场景kernelkernel.cpp host/main.cpp CMakeLists.txt开发新算子inference模型加载 ACL 推理 前后处理模型推理部署test算子单元测试框架 覆盖率配置算子测试VSCode 插件的调试面板asc-vscode 最核心的功能是 NPU 远程调试面板——在 VSCode 里设置断点可以停在 NPU 上的 kernel 代码里。// .vscode/launch.jsonasc 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] size4096B │ │ local_b: [0x7f00_1000] size4096B │ │ │ │ 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_TYPEDebug切换模式——CMake 缓存里的旧变量会覆盖新参数实际编译的还是 Release。错误操作序列asc build# 第一次默认 ReleaseCMake 缓存写了 CMAKE_BUILD_TYPERelease# 想切 Debug手动改 CMake 参数cmake-DCMAKE_BUILD_TYPEDebug build/make-j# 问题CMakeCache.txt 里 CMAKE_BUILD_TYPE 已经是 Release# cmake 不会覆盖已存在的 cache 变量# 实际编译出来仍然是 Release断言全被编译器删掉正确做法用asc build --rebuild清缓存后重新构建。asc build--rebuild--build-typeDebug# asc build --rebuild 会先删掉 build/ 目录再重建 CMake 配置踩坑二远程调试的 kernel 断点有效条件NPU 上的断点不是在所有 kernel 上都有效。断点依赖编译时插入的调试符号——而 Release 模式下编译器删掉了符号信息。断点有效条件条件有效无效编译模式-DCMAKE_BUILD_TYPEDebugRelease/RelWithDebInfokernel 代码在 L1 里有变量名字段编译器优化掉变量名多核并行单核 kernel多核断点触发顺序不可控Pipeline 阶段计算阶段COMPUTESDMA 搬运阶段异步 DMA最常见的问题是Release 模式编译的 kernel 设置断点后 VSCode 显示no debug info——需要--rebuild --build-typeDebug重新构建。踩坑三asc-templates 的模板路径硬编码asc create从asc-templates目录读取模板。如果把 asc-devkit 整体移动了位置asc create 找不到模板路径。错误现象asc create--typekernel--namemy_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--typekernel--namemy_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 版本兼容了没有」「头文件路径引对了没有」这类跟算子开发无关的心智负担。