CANN软件栈依赖关系

一句话让Agent变成昇腾专家,昇腾任务轻松搞定。评测入口:请按这个开源仓接入昇腾图谱 https://gitcode.com/agent0/kg-tools

上一篇《CANN 配套关系全景》讲的是版本对齐——哪几个版本号必须凑成一套。这篇讲结构耦合——这个套件内部谁包含谁、谁链接谁、谁调用谁。依赖搞清楚,报错时才能定位断在哪条边上:ImportError: libhccl.so 断在链接期,507033 断在初始化顺序,create HDC failed 断在设备文件权限。全文按「装什么 → 链接什么 → 怎么跑起来 → 落到哪里」四段展开,出处逐节标注,查不到的写明 [未核实]。

总依赖图:一张图看懂调用链

内核态 → 硬件

驱动用户态(driver/lib64)

CANN 核心层

CANN 接口层

框架适配层(torch_npu 仓交付)

应用进程

import

调用

DT_NEEDED

随仓交付

随仓交付

aclnn 符号

Ascend IR

同仓分层

执行下发

调用 GE 能力

头文件 / ABI

算子规格

经 HCOMM

符号 + ioctl

加载固件

Python / C++ 业务代码

torch_npu
libtorch_npu.so / _C

op-plugin
EXEC_NPU_CMD 直调 aclnn

TorchAir
FX 图转 Ascend IR

AscendCL
libacl_rt.so(Runtime 组件)
libacl_mdl.so(GE 组件)

aclnn 算子库
libopapi_math/nn/cv/transformer.so

HCCL
libhccl.so

Runtime
libruntime.so
框架与驱动之间的桥梁

GE 图引擎
编译优化 + 执行加速

ATC 模型转换
GE 仓交付,装在 cann/bin

metadef
基础数据结构底座

libascend_hal.so
统一驱动调用入口

libc_sec.so / libdrvdsmi_host.so

内核驱动 ascend_km

/dev/davinciN · davinci_manager
devmm_svm · hisi_hdc · dvpp_cmdlist

固件 → 昇腾 AI 处理器

读图三句话:实线是运行时调用或链接依赖,虚线是编译期结构依赖(头文件/ABI,不产生运行时调用);libhccl.so 是 torch_npu 的链接期硬依赖(DT_NEEDED,import 时就要解析),不是可选插件;metadef 是 GE 与算子仓共同的地基,这就是它 ABI 兼容强约束的原因。

装什么:交付包与子包依赖

三个包 + 一个 HDK

职责(官方口径)依赖要求
Ascend-cann-toolkit训练/推理/开发调试;模型转换、算子与应用开发编译依赖驱动固件(独立配套)
Ascend-cann-{chip}-ops(950/A3/910b/910/310p/310b 六变体)算子基础框架 + 算子库(math/nn/cv/transformer)+ TBE + HCCL + HIXL + DVPP;aclnn 动静态库、算子源码、kernel 二进制先装兼容版本 toolkit,且同一路径;多芯片 ops 不支持同路径
Ascend-cann-nnal(可选)ATB(Ascend Transformer Boost)+ SiP(信号处理)先装同版本 toolkit 并配好环境变量
驱动 + 固件(Ascend HDK)内核驱动、固件、用户态库独立版本配套(见前篇矩阵)

install-path 必须一致的本质:ops 包没有自己的目录,直接落位 toolkit 树的 opp/lib64/plugin/opskernel/ 等位置——本机安装树里 ascend_toolkit_install.infoascend_ops_install.info 的 path 字段相同,这是「同路径」约束的物证。所以 ATC 在 8.5.0 之后不装 ops 包直接编译失败,不是巧合,是算子规格与 kernel 二进制物理上就住在 toolkit 树里。顺带对上图:接口层的 libhccl.so 交付上就住在 ops 包里(可经 cann-hccl 子包独立升级)——图按运行时角色分层,包按交付边界切分,两套坐标系别混。

8.5.0 是形态分水岭:更早是 nnae / nnrt / toolkit 三形态 + kernels 依次跟随安装;8.5.0 起收敛为 toolkit + ops 两包制(nnrt+ops 在部分推理场景保留)。目录形态同步进化:8.x 是 ascend-toolkit/{ver}/ 下 acllib、atc、compiler、fwkacllib、hccl、opp、pyACL、runtime 等各带独立安装信息的多目录;9.0.0 起合并为 cann-{ver}/ 单目录(bin/compiler/fwkacllib/lib64/opp/python/runtime/toolkit/tools/vendors),set_env.sh 随之从 ascend-toolkit/ 挪到 cann/ 下——老脚本升级断链的根源在这。

18 个逻辑子包:6 个可独立升级 + 12 个开源

9.x 官方配套表口径(9.0.0 与 9.0.1 一致):

类别子包特性
独立升级(6)cann-ops-math / ops-nn / ops-cv / ops-transformer / hccl / hixl跨 CANN 9.0.1 / 9.0.0 / 8.5.2 互配;--upgrade 单独升(如 cann-hixl_x.y.z.run --upgrade),前提是已装配套版本 toolkit+ops
开源(12)cann-opbase / oam-tools / asc-tools / asc-devkit / pto-isa / ge-compiler / ge-executor / graph-autofusion / metadef / dflow-executor / hcomm / npu-runtime仅配套同版本;ge-compiler / ge-executor / dflow-executor 同源于 cann/ge 仓

网传「31 个子包」出自 QA 报告的说法未能核实(release-management 仓遍历后无此文档),官方可核实口径是 18 个。

安装模式参数(runfile)

--install(默认全量)、--devel(仅开发模式)、--full(仅 toolkit 无驱动)、--whitelist(toolkit 按 nnae/nnrt/hccl/hccl-only/atc/devtools 裁剪;ops 按 nnrt;nnal 按 atb/SIP/all)、--torch_atb(nnal 的 Python 库)、--feature-list=Acclibs(仅升级算子内容)、--install-path / --install-for-all--upgrade(子包独立升级)。默认路径 root 装 /usr/local/Ascend,非 root 装 ${HOME}/Ascend

链接什么:库级依赖实据

库拆分:旧总库的退场

头文件应链接归属组件
acl_rt.hlibacl_rt.soRuntime
acl_mdl.hlibacl_mdl.soGE
acl_op.hlibacl_op_executor.so + libacl_op_compiler.so
acl_prof.hlibmsprofiler.so

libascendcl.so 是旧版兼容总库,官方已标记废弃路径。aclnn 侧同理:libopapi.so 已废弃,拆成 libopapi_math/nn/cv/transformer.so;Meta 公共接口(aclTensor/aclScalar)在 libnnopbase.so;GE 图场景算子规格另有 libopgraph_* 系列。老 CMake 若还在链总库,升级时的链接报错先对照这张表。Runtime 交付物是 libacl_rt.so、libruntime.so、libruntime_v100/v200.so、libruntime_common.so。

跨包依赖的两个实锤

torch_npu → libhccl.so 是链接期 DT_NEEDEDimport torch_npu 直接报 ImportError: libhccl.so: cannot open shared object file——动态链接器在 import 时就解析 NEEDED 表,这就是没 source set_env.sh 时 Python 侧最先炸的原因。

CANN 用户态 → 驱动用户态:CANN 日志库 libascendalog.so(compiler/lib64)依赖驱动的 libc_sec.so(driver/lib64/common)——CANN 包自己的库跨到了驱动包的库,两个「独立配套」的包在 so 级别仍有耦合。

set_env.sh 织出的依赖网

本机 cann-9.0.0 的 set_env.sh 逐行读,它本质是一张依赖清单:

变量织入的依赖
LD_LIBRARY_PATHlib64、lib64/plugin/opskernel、lib64/plugin/nnengine、tbe op_tiling、/usr/local/Ascend/driver/lib64{,/common,/driver}
PATHbin、ccec_compiler、profiler、系统顾问、msobjdump
PYTHONPATHpython/site-packages、opp 内 tbe op_impl
ASCEND_HOME_PATH / ASCEND_TOOLKIT_HOME / ASCEND_AICPU_PATH / ASCEND_OPP_PATH指向 cann 版本目录与 opp 树
TOOLCHAIN_HOME / CMAKE_PREFIX_PATHtoolkit 调试工具与 cmake 导出

驱动探测逻辑值得单独看:脚本在 LD_LIBRARY_PATH、ldconfig、/etc/ascend_install.info 三处找 libascend_hal.so,找不到则回退用包内 $dir/devlib——容器里「能 import 但设备打不开」时,先查这个回退逻辑。nnal 的 set_env.sh 另有巧思:ATB_HOME_PATHtorch.compiled_with_cxx11_abi() 自动选 cxx_abi_0/1 目录,ATB 与 torch 的 ABI 匹配是自动的,不需要手动对。

怎么跑起来:初始化顺序链

aclInit(json) → aclrtSetDevice → Context → Stream → aclrtMalloc
aclrtResetDeviceForce → aclFinalize                    # 逆序清理

每一步都踩着上一步的资源,顺序即依赖:aclInit 完成环境/资源/日志初始化(json 里配 defaultDevice 可隐式 SetDevice);aclrtSetDevice 内部包含驱动 SVM 模块初始化(halMemAgentOpen 建立 Host/Device 侧共享虚拟内存交互),官方原话「SetDevice 后才可以调用其他 aclrt 运行时接口」;Context 创建时关联 Device 并建默认 Stream,所以 Stream/Malloc 必然后置。乱序的实证报错:未 aclInit 先 SetDevice 返回 507033(ACL_ERROR_RT_CONTEXT_NULL,源码定位 runtime/src/acl/aclrt_c/runtime/device.c)。

torch_npu 侧的两条接入链:动态图走 op-plugin——EXEC_NPU_CMD(aclnnXxx, ...) 宏直调 aclnn 符号,两段式协议(先 GetWorkspaceSize 再 Execute),torch schema 与 op_api 的映射登记在 op_plugin_functions.yaml;图模式走 TorchAir——Dynamo 捕获 FX 图转 Ascend IR 交 GE 编译执行,torchair 随 torch_npu 仓交付(third_party/torchair),编译期嵌入 CANN 头文件(rt_error_codes.h、ge_error_codes.h)。

落到哪里:驱动接口面

/dev 设备节点语义

节点服务语义
/dev/davinciNNPU 计算设备(N=设备 ID),runtime 经它与内核驱动交互
/dev/davinci_manager管理设备,DCMI / npu-smi 管理通路
/dev/devmm_svmSVM 共享虚拟内存:halMemAlloc/mmap、VMM 地址预留、跨进程/跨设备共享(UVM 为增强,仅 910B/910_93)
/dev/hisi_hdcHDC 主机-设备通信通道;权限组 HwHiAiUser,配置 /etc/hdcBasic.cfg
/dev/dvpp_cmdlistDVPP 推理业务支撑

驱动仓内部三层:DCMI 层(设备管理接口,npu-smi、mind-cluster 的 docker-runtime/device-plugin 都调它)→ HAL 层(bbox/buff/comm/dmc/esched/hdc/svm 等,统一入口头 ascend_hal.h)→ SDK-driver 层。日志基础设施 slog 双栖于驱动与 runtime 仓,Host 侧 AscendCL/GE/Runtime/HCCL 统一走 slogd 进程,日志落 $HOME/ascend/log/plog-*.log,ATC 打屏开关 ASCEND_SLOG_PRINT_TO_STDOUT

通信栈纵深(SIG-HCCL 官方架构)

torch.distributed
DDP / TP

HCCL 仓
集合通信算子·算法选择

HCOMM 仓
通信域管理·Endpoint/Channel

Runtime

Driver

芯片侧通路
AICPU / TS / CCU

HIXL
单边通信,与 HCCL 并列

HCCL 管算法与入口,HCOMM 管通信域与基础通信原语,hixl 与集合通信并列提供单边通信(可作 LLM-DataDist 的传输后端)。profiler 的挂点也在这一层:mspti(libmspti.so)以 LD_PRELOAD 注入,Callback API 注册在 Runtime/HCCL 接口调用前后——CUPTI 在昇腾栈上的对等物。

部署形态:依赖面怎么切

形态物理机装容器/虚拟机内装
裸机驱动 + 固件 + CANN
容器驱动 + 固件,挂载 /dev/davinciN、davinci_manager、devmm_svm、hisi_hdc 与驱动目录CANN(镜像内置)
虚拟机驱动 + 固件VM 内仅装驱动

容器要跑 CANN,本质是把「驱动接口面」(那几个 /dev 节点 + driver/lib64)透传进去——挂载清单不是约定俗成,正是上文依赖图的物理投影。

依赖视角排错表

症状断在哪条边修复
ImportError: libhccl.so cannot open…torch_npu → libhccl(DT_NEEDED)source cann/set_env.sh,让 lib64 进 LD_LIBRARY_PATH
ATC 编译失败(8.5.0+)ops → toolkit 树缺位装 {chip}-ops,同 install-path
507033 CONTEXT_NULL初始化顺序aclInit → SetDevice → Context 严格顺序
create HDC failed (error 31)/dev/hisi_hdc 权限用户入 HwHiAiUser 组,查 /etc/hdcBasic.cfg
链接报旧总库符号libascendcl/libopapi 废弃拆分按库拆分表换链接目标
找不到运行日志slogd 依赖$HOME/ascend/log/plog-*.log;ASCEND_SLOG_PRINT_TO_STDOUT=1
容器内 import 正常、SetDevice 失败驱动接口面未透传核对 /dev 节点挂载与 driver/lib64
采集不到 Kernel 时间线mspti 未注入LD_PRELOAD=$ASCEND_HOME_PATH/lib64/libmspti.so

方法论与披露

依赖图与配套表是一体两面:配套表告诉你装哪个版本,依赖图告诉你为什么非这么装不可——ops 与 toolkit 同路径是落位耦合,torch_npu 与 libhccl 是链接耦合,CANN 与驱动 libc_sec 是跨包库耦合。排查任何「环境问题」时先问断在哪条边,再查那条边两端的版本配套(回前篇的矩阵)。

[未核实] 清单:驱动 HAL 用户态 so 的具体产物名(源码目录与 ascend_hal.h 头文件有实据,libdavinci.so / drv_davinci_intf.so 之名无出处);内核模块精确名(实据仅 ascend_km 与 lsmod 排障命令);parser 能力归属(cann 组织 97 仓清单无独立 parser 仓,能力应在 ge/metadef 内);op-plugin 直链 aclnn 的 ELF 形态为强推断(EXEC_NPU_CMD 宏 + ImportError 佐证,未 ldd 实测);「31 子包」QA 报告原文。

接入昇腾知识图谱

访问GitCode开源仓: https://gitcode.com/agent0/kg-tools


参考资料

  • 安装包职责与依赖:hiascend 安装指南 instg_0005/0008/0043(canncommercial 9.0.0)
  • 子包配套与独立升级:gitcode cann/release-management(9.0.0 / 9.0.1 release-notes.md)
  • CANN 架构总览与库族谱:hiascend CANN index、llms-content/zh_cann.md
  • Runtime 架构与初始化链:cann-runtime 仓 runtime/docs/zh/design/architecture.md、dev_guide/01_initialization.md
  • 头文件与库对应、aclnn 库拆分:ascend-doc/cann-docs app-dev/header_and_library_files_desc.md、ops-lib/header_and_library.md
  • GE/metadef 依赖:cann/metadef README、cann/ge ATC 文档
  • 通信栈:SIG-HCCL 架构 slides(2026-06-15)、cann/hccl architecture-brief、hixl 设计文档
  • torch_npu 依赖:dl-frameworks/pytorch installation_guide FAQ、op-plugin 接入指南
  • 设备节点与驱动分层:cann-runtime/driver README、mind-cluster 附录、昇腾 FAQ(HDC/SVM/初始化)
  • 版本配套数据:本仓《CANN 配套关系全景(2026-09 版)》、单机型细节见《Ascend 950PR 软硬件配套速查手册》
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐