☰
昇腾驱动从零上手:一套完整的环境搭建、编译安装与避坑实操
2026/11/4 1:54:47 网站建设 项目流程

昇腾驱动从零上手:一套完整的环境搭建、编译安装与避坑实操

【免费下载链接】driver本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。项目地址: https://gitcode.com/cann/driver

当昇腾卡装进机器,而你的训练任务却卡死在设备初始化这一步,多半是少了一个关键角色——CANN 的驱动模块(driver)。它是 CANN 软件栈里最贴近硬件的一层:负责基础驱动加载、设备资源管理和调度,让昇腾 910B、910_93、950 这些 AI 处理器真正"可用"。本文带你从零把驱动跑起来,再讲清楚它内部的分工和几个高频问题。

昇腾驱动一键安装步骤

整个上手流程分五步,按顺序执行即可。

  1. 安装编译依赖。根据发行版选择对应命令,核心是内核头文件、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
  1. 获取源码。克隆仓库到本地:
git clone https://gitcode.com/cann/driver cd driver
  1. 编译并打包。--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。

  1. 安装驱动。--full执行完整安装:
./Ascend-hdk-ascend910b-driver-<version>_<os_version>-<arch>.run --full
  1. 确认加载。安装后查看内核日志,确认驱动相关模块没有报错:
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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询