安装华为昇腾 (Ascend) 驱动
本文介绍在 Linux NPU 节点上安装华为昇腾驱动、固件及 Ascend Docker Runtime 的步骤,以便 Kube AI Hub 集群能够调度昇腾 NPU 工作负载。请在 KubeKey 创建集群之前于所有 NPU 工作节点上完成本节操作。
前提条件
- 节点配备华为昇腾 NPU(如 910C、910B、310P / 310P48,以实际硬件为准)
- 具有
root或sudo权限 - 已完成 时间同步配置
- 已准备与 NPU 型号、操作系统及架构匹配的驱动、固件与 runtime 安装包
安装顺序
备注
- 首次安装:按 驱动 → 固件 顺序执行
- 覆盖安装或升级:按 固件 → 驱动 顺序执行
安装介质
| 类型 | 文件名示例 |
|---|---|
| NPU 驱动 | Ascend-hdk-{model}-npu-driver_{version}_linux-{arch}.run |
| NPU 固件 | Ascend-hdk-{model}-npu-firmware_{version}.run |
| Ascend Docker Runtime | Ascend-docker-runtime_{version}_linux-{arch}.run |
将 {model}、{version}、{arch} 替换为实际值(如 910b、x86_64)。
下载地址:
创建运行用户
昇腾驱动安装要求存在 HwHiAiUser 用户:
sudo groupadd HwHiAiUser 2>/dev/null || true
sudo useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 2>/dev/null || true
安装依赖
RHEL / CentOS / Rocky 等:
sudo yum install -y dkms gcc make kernel-headers-$(uname -r) kernel-devel-$(uname -r)
Ubuntu / Debian:
sudo apt-get update
sudo apt-get install -y dkms gcc make linux-headers-$(uname -r)
安装 NPU 驱动
赋予执行权限并校验安装包:
chmod +x Ascend-hdk-{model}-npu-driver_{version}_linux-{arch}.run
./Ascend-hdk-{model}-npu-driver_{version}_linux-{arch}.run --check
输出 OK 表示包完整。执行安装:
sudo ./Ascend-hdk-{model}-npu-driver_{version}_linux-{arch}.run --full
安装 NPU 固件
chmod +x Ascend-hdk-{model}-npu-firmware_{version}.run
./Ascend-hdk-{model}-npu-firmware_{version}.run --check
sudo ./Ascend-hdk-{model}-npu-firmware_{version}.run --full
确认固件版本与安装包一致:
/usr/local/Ascend/driver/tools/upgrade-tool --device_index -1 --component -1 --version
验证驱动
npu-smi info
能正常输出 NPU 信息即表示驱动安装成功。
硬切分前置:AVI 与模板
整卡调度不依赖 vNPU 模板。若要按显存硬切分,请在物理机上启用昇腾虚拟化实例(AVI)容器模式,并确认该卡实际支持的模板名。
# 0 = docker / 容器模式
npu-smi set -t vnpu-mode -d 0
npu-smi info -t vnpu-mode
# 期望:vnpu-mode : docker
npu-smi info -m
npu-smi info -t template-info -i <NPU_ID> -c <CHIP_ID>
template-info 必须带 -i / -c(ID 来自 npu-smi info -m)。省略参数时部分驱动会报「不支持」,并不代表 AVI 未开。
Atlas A3(910C)训练卡与推理卡的模板名不同。集群默认按训练卡配置(vir06_1c_16g / vir12_3c_32g)。若查询结果是 vir05_1c_16g / vir10_3c_32g,安装 HAMi 后必须改 ConfigMap,步骤见 昇腾 NPU 使用。
安装 Ascend Docker Runtime
必须安装 Ascend Docker Runtime。集群默认将 runtimeClassName: ascend 注入 NPU Pod,由该 runtime 挂载设备节点与驱动库。未安装时,容器内无法使用 NPU,npu-smi 也会失败。
校验并安装 runtime 包:
chmod +x Ascend-docker-runtime_{version}_linux-{arch}.run
./Ascend-docker-runtime_{version}_linux-{arch}.run --check
sudo ./Ascend-docker-runtime_{version}_linux-{arch}.run --install
配置 containerd
编辑 /etc/containerd/config.toml,确认 runtime 指向 Ascend Docker Runtime。在 [plugins."io.containerd.runtime.v1.linux"] 段中设置:
[plugins."io.containerd.runtime.v1.linux"]
no_shim = false
runtime = "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime"
runtime_root = ""
shim = "containerd-shim"
shim_debug = false
备注
containerManager 为 containerd,请在创建集群前完成上述配置;集群创建后修改需重启 containerd 并可能影响已有 Pod。重启 containerd 使配置生效:
sudo systemctl daemon-reload
sudo systemctl restart containerd
KubeKey / containerd 1.7 的 CRI 还要用 名为 ascend 的 runtime,RuntimeClass 的 handler 才能对上。在 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] 下增加(不要改掉已有的 runc):
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.ascend]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.ascend.options]
BinaryName = "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime"
SystemdCgroup = true
纯 NPU 节点可以把 default_runtime_name 设为 ascend;NVIDIA 和昇腾混部时保持 runc,只给 NPU Pod 使用 RuntimeClass。
改完后再次 sudo systemctl restart containerd。
创建 RuntimeClass
集群里必须有名为 ascend 的 RuntimeClass,否则 Pod 会报 RuntimeClass "ascend" not found。HAMi 的 ascend-device-plugin 子 Chart 默认会创建;若没有,手动执行:
kubectl apply -f - <<'EOF'
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: ascend
handler: ascend
EOF
kubectl get runtimeclass ascend
handler 必须等于 containerd 里 runtimes. 后面的名字(ascend)。
验证清单
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 固件版本 | upgrade-tool --device_index -1 --component -1 --version |
与安装包版本一致 |
| NPU 驱动 | npu-smi info |
显示 NPU 设备信息 |
| AVI(硬切分) | npu-smi info -t vnpu-mode |
vnpu-mode : docker |
| vNPU 模板 | npu-smi info -t template-info -i <NPU_ID> -c <CHIP_ID> |
训练卡为 vir06* / vir12*,推理卡为 vir05* / vir10* |
| Ascend Docker Runtime | ls /usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime |
文件存在且可执行 |
containerd CRI 名为 ascend 的 runtime |
grep -A6 'runtimes.ascend' /etc/containerd/config.toml |
存在且 BinaryName 指向 Ascend Docker Runtime |
| RuntimeClass | kubectl get runtimeclass ascend |
NAME=ascend,HANDLER=ascend |
| containerd | systemctl status containerd |
active (running) |
故障排查
--check 校验失败
- 重新下载安装包,确认传输过程中未损坏
- 确认安装包与硬件型号、操作系统架构匹配
npu-smi 无输出或报错
- 确认驱动与固件安装顺序正确(首次安装:驱动 → 固件)
- 确认
HwHiAiUser用户已创建 - 检查内核头文件是否与当前内核一致:
uname -r
容器无法使用 NPU
- 确认
/etc/containerd/config.toml中runtime路径正确 - 确认已重启 containerd
- 查阅昇腾官方文档确认 CANN/驱动版本与容器镜像兼容
- 集群创建后的整卡 / 硬模板申请见 昇腾 NPU 使用
- 硬切分 Pod 立刻失败、日志含
create-vnpu:对照template-info与 ConfigMap 模板名是否同为训练或同为推理