第一次接触 CANN 开发时,我花了一整天配环境——装驱动、装 Toolkit、装第三方依赖、配环境变量。后来发现 asc-devkit 可以省掉大半时间。
asc-devkit 是 CANN 社区维护的开发环境工具包。它提供了一套 Docker 镜像和初始化脚本,包含编译 C++ 推理代码需要的全部工具链和 CANN 头文件。
asc-devkit 是什么
asc-devkit 不是一个单独的软件包,它是一个"开发环境定义"——通过 Dockerfile 和 shell 脚本告诉你:在昇腾开发需要装哪些东西、怎么装、装完后怎么验证。
它解决了三个问题:
- 环境一致性——团队所有人用同一个 Docker 镜像,不会因为 Ubuntu 版本或 GCC 版本不同导致编译错误
- 开箱即用——镜像预装了 CANN Toolkit、cmake、g++、Python、ONNX 工具链
- 快速迭代——只需要拉一次镜像,后续更新 CANN Toolkit 版本也只需要换镜像 tag
快速搭建开发环境
第一步:拉取镜像
dockerpull cann/asc-devkit:8.0第二步:启动容器(挂载代码目录和 NPU 设备)
dockerrun-it--rm\--nameascend_dev\--device=/dev/davinci0\--device=/dev/davinci_manager\--device=/dev/hisi_hdc\-v/usr/local/Ascend:/usr/local/Ascend:ro\-v/path/to/your/project:/workspace\cann/asc-devkit:8.0设备映射说明:
/dev/davinci0:NPU 设备节点(多卡时映射 davinci0-davinci7)/dev/davinci_manager:NPU 管理设备/dev/hisi_hdc:调试通道
第三步:验证环境
# 检查 CANN 版本cat/usr/local/Ascend/ascend-toolkit/latest/version.cfg# 检查 NPU 状态npu-smi info# 编译一个简单的推理程序cd/workspace cmake-Bbuild cmake--buildbuild全部完成后,开发环境就绪。从拉取镜像到编译通过,通常 10-15 分钟。
编译工具链
asc-devkit 镜像预装了完整的编译工具链:
- CANN 头文件和动态库:
/usr/local/Ascend/ascend-toolkit/latest/include和/usr/local/Ascend/ascend-toolkit/latest/lib64 - CMake:预配置了
FindACL.cmake,自动找到 AscendCL 的头文件和库路径 - GCC 9.3:跟 CANN Toolkit 测试用的编译器版本一致
CMake 项目的典型CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(infer_demo) # asc-devkit 预配置了 FindACL find_package(ACL REQUIRED) add_executable(infer_main src/main.cpp) target_link_libraries(infer_main ${ACL_LIBRARIES})不需要手写头文件路径和库路径。
推理项目如何初始化
asc-devkit 镜像目录下有一个初始化脚本,帮你搭建推理项目骨架:
# 初始化一个基础的推理项目python /opt/asc-devkit/init_project.py--namemy_infer生成的目录结构:
my_infer/ ├── CMakeLists.txt # 预配置了 ACL 依赖 ├── src/ │ ├── main.cpp # 推理入口 │ └── model.cpp # 模型加载和推理 ├── include/ │ └── model.h ├── model/ # 放 OM 模型文件 ├── data/ # 放输入数据 └── build/ # 编译输出初始化后直接cmake -B build && cmake --build build,编译出可执行文件,放入 OM 模型和数据后就能跑推理。
常见踩坑
问题 1:Docker 内找不到 NPU 设备。
检查宿主机的npu-smi info是否正常工作。如果宿主机能看到 NPU 但 Docker 内看不到,检查--device映射是否正确——需要映射/dev/davinci_manager和/dev/davinci0(或多卡时全部 davinci 设备)。
问题 2:运行时找不到libascendcl.so。
确认环境变量LD_LIBRARY_PATH是否包含/usr/local/Ascend/ascend-toolkit/latest/lib64。asc-devkit 的 Dockerfile 已经把它加进了.bashrc,但如果用户切换了 shell 或手动覆盖了LD_LIBRARY_PATH,需要重新 source。
exportLD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/lib64:$LD_LIBRARY_PATH问题 3:镜像内 GCC 版本跟项目不兼容。
asc-devkit 默认 GCC 9.3。如果项目用了 C++17 甚至 C++20 的特性,先确认 GCC 9.3 是否支持。如果需要更高版本 GCC,在 Dockerfile 基础上安装:
FROM cann/asc-devkit:8.0 RUN apt-get update && apt-get install -y g++-11问题 4:npu-smi info报错驱动版本不匹配。
asc-devkit 镜像中的 CANN Toolkit 版本需要跟宿主机上的 NPU 驱动版本匹配。检查驱动版本:
npu-smi info# 查看 Driver Version如果版本不匹配,拉取对应版本的 asc-devkit 镜像。
怎么选 asc-devkit 版本
| 用途 | 推荐镜像 tag | CANN 版本 |
|---|---|---|
| 推理部署 | cann/asc-devkit:8.0 | 8.0 |
| 算子开发 | cann/asc-devkit:8.0-dev | 8.0 + Ascend C SDK |
| 训练开发 | cann/asc-devkit:8.0-train | 8.0 + torch_npu |
| 最新开发版 | cann/asc-devkit:nightly | 持续集成最新版 |
推理部署用:8.0。需要写 Ascend C 算子时用:8.0-dev。需要 PyTorch 训练时用:8.0-train。
asc-devkit 仓库
Ascend C 算子开发指南
asc-devkit 的其他实用功能
asc-devkit 镜像还内置了一些开发辅助工具:
- profiler:
msprof工具,采集算子的执行时间、DDR 访问量和 NPU 利用率 - dump 工具:
gdb+ CANN 的 DUMP 工具,定位推理结果异常的算子是哪个 - ATC 缓存:镜像缓存了常见模型的 ATC 转换中间文件,第一次转换后二次加载不用重新编译
开发流程建议:在 asc-devkit 容器内调试代码和做性能分析,确认无误后把编译好的可执行文件和 OM 模型部署到生产环境。生产环境不一定需要 asc-devkit——只要 CANN Runtime 和动态库就够了。
在 asc-devkit 上做一步编译验证
asc-devkit 镜像内置了一个快速验证脚本:
# 编译并运行一个简单的版本校验程序/opt/asc-devkit/verify.sh# 输出示例:# CANN Toolkit: 8.0.0.alpha001# NPU Driver: 23.0.rc1# Compiler: g++ 9.3.0# ACL library: found# NPU device: available (0)# Verification: PASSED验证通过说明开发环境配置正确。如果验证失败,脚本会输出缺失的组件和修复建议——省掉手动排查环境问题的时间。
总结
asc-devkit 是接触昇腾开发的推荐起点。拉一个镜像、挂载项目目录、启动容器——开发环境就绪了。不需要手工装驱动、配环境变量、解决 GCC 版本冲突。当开发环境出问题时,删掉容器重建一个就恢复如初——这在排查"我本地能编但服务器编不过"这类问题时极其实用。
总结
asc-devkit 降低了昇腾开发的入门门槛。一个 Docker 镜像就能获得完整的开发环境——CANN Toolkit、编译工具链、项目模板、调试工具一应俱全。新团队成员加入时只需要docker pull+docker run两步就能开始开发,不再需要花半天时间手工配环境。
参考仓库
asc-devkit 开发工具包
CANN Skills 技能库