昇腾驱动从零上手:一套完整的环境搭建、编译安装与避坑实操
【免费下载链接】driver本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。项目地址: https://gitcode.com/cann/driver
当昇腾卡装进机器,而你的训练任务却卡死在设备初始化这一步,多半是少了一个关键角色——CANN 的驱动模块(driver)。它是 CANN 软件栈里最贴近硬件的一层:负责基础驱动加载、设备资源管理和调度,让昇腾 910B、910_93、950 这些 AI 处理器真正"可用"。本文带你从零把驱动跑起来,再讲清楚它内部的分工和几个高频问题。
昇腾驱动一键安装步骤
整个上手流程分五步,按顺序执行即可。
- 安装编译依赖。根据发行版选择对应命令,核心是内核头文件、cmake 和基础编译工具链:
# OpenEuler 环境 yum install -y tar net-tools kernel-headers-$(uname -r) kernel-devel-$(uname -r) openssl-devel pkg-config patch yum install -y gcc gcc-c++ g++ cmake make libffi libffi-devel binutils binutils-devel elfutils elfutils-devel elfutils-libelf-devel # Ubuntu 环境 apt install -y tar net-tools linux-headers-$(uname -r) gcc g++ cmake make libffi-dev libssl-dev pkg-config patch- 获取源码。克隆仓库到本地:
git clone https://gitcode.com/cann/driver cd driver- 编译并打包。
--pkg表示生成可分发的 run 安装包,--soc指定目标芯片(支持ascend910b、ascend910_93、ascend950,950 的 UB 形态可加--ube):
bash build.sh --pkg --soc=ascend910b编译产物会落在build_out目录,文件名形如Ascend-hdk-ascend910b-driver-<version>_<os_version>-<arch>.run。
- 安装驱动。
--full执行完整安装:
./Ascend-hdk-ascend910b-driver-<version>_<os_version>-<arch>.run --full- 确认加载。安装后查看内核日志,确认驱动相关模块没有报错:
dmesg三层架构:一次请求如何从用户代码走到芯片
driver 仓库的代码分成三层,各层职责不同。与其背定义,不如顺着"一次设备管理请求"的流向看:
| 层级 | 职责 | 你在其中的位置 |
|---|---|---|
| DCMI 层(达芬奇卡管理接口层) | 设备配置、状态查询、复位控制等管理接口,是工具与上层应用接触驱动的第一道门 | 写管理程序、调用 DCMI 接口时在这里 |
| HAL 层(硬件抽象层) | 屏蔽底层硬件差异,向上提供内存管理、通信、调度等统一接口 | 关注内存、RoCE、设备管理等通用能力时在这里 |
| SDK-driver 层(驱动软件开发套件层) | 更底层的驱动实现,对接内核与芯片 | 涉及内核适配、虚拟化等深度开发时在这里 |
数据流向大致是:上层应用或管理工具通过 DCMI 接口发出请求,HAL 层将其翻译为硬件无关的通用操作,最终由 SDK-driver 层落地到具体芯片。三层解耦后,新增芯片型号主要动的是底层,上层的接口调用基本不用改。
核心机制深挖:SVM 内存管理
SVM(Shared Virtual Memory)是平台内的内存管理核心模块,也是理解 driver 最值得先看的部分。它管三类事:
- 申请与释放:通过
halMemAlloc/halMemFree管理设备内存,halMemcpy负责主机与设备之间的数据搬运。 - 设备间内存共享:让多块卡访问同一块内存,减少显式拷贝,提升多卡协作效率。
- VMM 虚拟内存管理:先一次性申请好虚拟地址和物理地址,需要时再动态建立映射关系。可以类比成"先圈好一整片地,随用随建",比"随用随买地皮"更能压制内存碎片。
典型的申请与拷贝流程是:先halMemAlloc拿到 Host 侧内存,再halMemAlloc拿到 Device 侧内存,最后用halMemcpy把数据同步过去。
如果你要动手扩展 DCMI 接口,路径也很直接:在src/ascend_hal/dmc/dsmi/dsmi_common/dsmi_common_interface.c里新增接口实现,再到pkg_inc/dsmi_common_interface.h里补上声明,重新编译驱动包即可。DCMI 接口样例演示了这套完整过程。
代码地图:只需记住几条关键路径
build.sh:入口编译脚本,--pkg、--soc、-k(指定内核路径)都从它发起。src/ascend_hal/:HAL 层源码,SVM、RoCE、dms、hdc 等模块都在这里。src/sdk_driver/:SDK-driver 层源码,内核适配代码在kernel_adapt子目录。pkg_inc/:对外提供的头文件,接口声明改这里。examples/:接口使用样例,DCMI 与设备管理用例从这里起步。
🛠️ 避坑手册:遇到这个报错,这样做
场景一:安装 run 包时报 "set username and usergroup, HwHiAiUser:HwHiAiUser"
- 症状:执行
--full安装时提示设置用户名和用户组失败,安装中断。 - 可能原因:系统里还没有
HwHiAiUser用户组,安装包无法完成权限初始化。 - 操作:先建组再建用户,然后重新执行安装命令:
groupadd HwHiAiUser useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash场景二:编译时提示/lib/modules/xxx/build: No Such file or directory
- 症状:
bash build.sh --pkg --soc=ascend910b在 cmake 阶段直接失败,driver 编译提示内核头文件缺失。 - 可能原因:当前系统没有安装与运行内核版本匹配的 kernel-headers 包,或者你用的是另一套内核的源码树。
- 操作:装上匹配的头文件,或用
-k显式指定内核路径:
apt install -y linux-headers-$(uname -r) # 或指定内核路径 bash build.sh --pkg --soc=ascend910b -k /path/to/kernel场景三:应用行为异常,怀疑驱动有问题,但不知道从哪查起
- 症状:任务运行异常、设备状态不对,需要驱动侧日志定位。
- 可能原因:问题细节只记录在内核日志或驱动维测日志里,控制台看不到。
- 操作:先看内核日志,再导出驱动侧完整日志,重点看时间戳目录下的
slog/host/host_kernel.log:
dmesg /usr/local/Ascend/driver/tools/msnpureport -f ls -la ./时间戳/slog/host/host_kernel.log场景四:想在用户态程序里直接调用驱动 API
- 症状:拿到 driver 源码后尝试链接调用,发现没有面向用户的 API 入口。
- 可能原因:这是设计如此——昇腾 Driver 当前不直接对外开放 API 接口。
- 操作:基于昇腾 AI 应用或框架使用 ACL 接口来间接使用驱动能力;需要查询设备管理功能时,参考 DCMI 接口文档。
进阶资源
- 端到端教程(搭建环境、编译部署、源码开发、调试):QUICKSTART
- 源码编译与安装部署问题汇总:FAQ
- 提交代码前读一遍:贡献指南
CANN/driver 把设备管理、内存管理和调度这些"脏活"收进了一个分层清晰的开源仓库。先跑通上面的五步,再按自己的方向深入某一层,就是使用它最顺的路径。
【免费下载链接】driver本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。项目地址: https://gitcode.com/cann/driver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考