Ascend 910C 算力卡 Kubernetes 接入实践指南
- 今天
介绍
在 Kubernetes 集群中接入 Ascend 910C 算力卡,并不是简单的“安装驱动 + 部署插件”两步操作。整个过程涉及底层设备识别、容器运行时适配、Kubernetes 资源上报,以及 AI 任务调度策略等多个环节的协同工作。
对于 AI 训练集群、算力平台和私有云场景而言,只有将这些组件按正确顺序完成安装和联调,才能让 Ascend NPU 以标准化资源的方式被 Kubernetes 管理,并最终被训练任务稳定使用。
本文基于实际部署过程,整理 Ascend 910C 算力卡在 Kubernetes 集群中的完整接入流程,重点覆盖以下内容:
- 驱动与固件安装
- 容器运行时适配
- Kubernetes 组件部署
- NPU 资源验证
- Volcano 插件的高级定制编译
在 Kubernetes 中使用 Ascend NPU,需要一个完整的组件栈来协同工作,各组件职责如下:
| 组件 | 作用 |
|---|---|
| 驱动 (Driver) | 提供内核态支持,负责 PCle 设备识别、NPU 资源管理与用户态 API 交互,是所有能力的基石。 |
| 固件 (Firmware) | 烧录在 NPU 芯片内部的微码,控制芯片的低层逻辑与运行行为。 |
| Ascend Docker Runtime | 容器运行时 (containerd) 的 shim 层,负责在容器启动时挂载 NPU 设备、注入环境变量,使容器能够访问宿主机 NPU 资源。 |
| Device Plugin | Kubernetes 设备插件,负责扫描节点上的 NPU 数量,向 kubelet 注册 huawei.com/Ascend910 资源,并在 Pod 调度时完成资源分配。 |
| Volcano | 增强型 Kubernetes 调度器,支持 Gang 调度、拓扑感知等高级调度能力,是 AI 训练任务的关键组件。 |
| MindX DL | 昇腾深度学习组件,提供多节点训练管理、节点间通信管理等功能。 |
从职责划分上看,这套链路可以理解为:
- 驱动/固件解决“宿主机是否识别 NPU”
- Runtime 解决“容器是否可见 NPU”
- Device Plugin 解决“Kubernetes 是否感知 NPU 资源”
- Volcano 和 MindX DL 解决“任务如何正确调度和使用 NPU”
安装 910C 驱动与固件
驱动和固件安装是整个接入过程的起点。只有宿主机先正确识别 Ascend 910C,后续的容器运行时适配、设备插件注册和任务调度才有意义。
同时,这一步对安装顺序要求严格:
- 首次安装:驱动 → 固件
- 覆盖/升级安装:固件 → 驱动
若驱动与固件版本不匹配,将导致 npu-smi 无法执行、Device Plugin 启动失败、Pod 无法分配 NPU 等问题。驱动和固件需联系官方获取。
创建运行用户
Ascend 驱动要求使用专用用户组运行,避免权限问题。
groupadd HwHiiAUser
useradd -g HwHiiAUser \
-d /home/HwHiiAUser \
-m HwHiiAUser \
-s /bin/bash
安装驱动
驱动安装包提供了设备识别、资源管理以及用户态接口能力。
- 环境检查:执行安装包,检查系统环境是否满足要求。
./Atlas-A3-hdk-npu-driver_25.2.3_linux-aarch64.run --check
- 执行安装:使用
--full参数进行完整安装,--install-for-all使所有用户均可使用。
./Atlas-A3-hdk-npu-driver_25.2.3_linux-aarch64.run \
--full --install-for-all
- 编译内核模块:安装过程中,系统会提示输入内核源码路径,需要根据当前内核版本指定。
# 按提示操作
Do you want to try build driver after input kernel absolute path? [y/n] y
Please input your kernel absolute path or input [Q/q] to exit: /lib/modules/`uname -r`/build
这里的关键点在于:驱动安装并不只是拷贝文件,还涉及与当前宿主机内核版本匹配的模块编译过程。如果内核头文件或源码路径不正确,后续即使安装完成,设备也可能无法正常识别。
安装固件
固件用于控制 NPU 芯片内部逻辑,是硬件正常工作的必要组成部分。
./Atlas-A3-hdk-npu-firmware_7.7.0.10.220.run --full
固件安装相对直接,但要注意其版本必须与驱动版本保持兼容。
重启节点
驱动和固件安装完成后,必须重启节点才能加载生效。
reboot
重启后,使用 npu-smi info 命令验证,若能看到 NPU 卡信息,则表示驱动与固件安装成功。
容器运行时配置
即使宿主机已经识别 NPU,默认的 containerd 仍然无法直接让容器访问 Ascend 设备。 因此,还需要安装 Ascend Docker Runtime,并修改 containerd 配置,使其具备 NPU 设备挂载和环境注入能力。
可以把这一步理解为: 驱动解决“主机看得见 NPU”,Runtime 解决“容器用得上 NPU”。
安装 Ascend Docker Runtime
该 runtime 负责挂载 NPU 设备、注入环境变量,为容器提供 NPU 访问能力。(需要先更新 containerd 配置)
# 1. 检查环境
./Ascend-docker-runtime_6.0.0.SPC1_linux-aarch64.run --check
# 2. 执行安装,指定安装场景为 containerd
./Ascend-docker-runtime_6.0.0.SPC1_linux-aarch64.run --install --install-scene=containerd
安装完成后,runtime 二进制文件位于 /usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime。
更新 containerd 配置
编辑 /etc/containerd/config.toml,新增 Ascend runtime 的定义,并可选地将其设为默认。
配置重点有两个:
-
新增 Ascend Runtime 的运行时定义,并指定其二进制路径:在
plugins下增加io.containerd.runtime.v1.linux配置段,runtime路径指向刚才安装的二进制文件。 -
修改
plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc中runtime_type固定为io.containerd.runtime.v1.linux,
[plugins]
[plugins."io.containerd.runtime.v1.linux"]
shim = "containerd-shim"
runtime = "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime"
runtime_root = ""
no_shim = false
shim_debug = true
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "pause:3.3"
max_container_log_line_size = -1
disable_apparmor = true
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runtime.v1.linux"
runtime_engine = ""
runtime_root = ""
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
systemdCgroup = true
配置完成后,重启 containerd 使其生效:
systemctl restart containerd
纯容器测试(可选)
在正式部署 Kubernetes 组件前,建议先做一次纯容器层验证。这一步的意义在于:快速判断问题是在 Runtime 层,还是在 Kubernetes 层。
ctr -n k8s.io run --rm \
--runtime io.containerd.runtime.v1.linux \
-t \
--env ASCEND_VISIBLE_DEVICES=0,1 \
swr.cn-east-3.myhuaweicloud.com/lomtom-common/ubuntu:22.04 \
ubuntu \
bash
若能成功进入容器并执行 npu-smi info 看到 NPU 卡,则证明 runtime 配置正确。
Kubernetes 组件部署
当宿主机和容器运行时都已验证通过后,就可以开始部署 Kubernetes 侧组件。核心组件包括:
- Volcano
- Ascend Device Plugin
- MindX DL
准备 Kubernetes 镜像
在部署前,需要提前准备相关镜像。对于离线环境,通常需要事先完成 pull、tag、push 到私有镜像仓库的过程。
# 拉取 Volcano 组件镜像
nerdctl pull swr.cn-east-3.myhuaweicloud.com/lomtom-common/vc-scheduler:v1.9.0
nerdctl pull swr.cn-east-3.myhuaweicloud.com/lomtom-common/vc-controller-manager:v1.9.0
# 拉取 Ascend 组件镜像
nerdctl pull swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0
nerdctl pull swr.cn-south-1.myhuaweicloud.com/ascendhub/noded:v7.2.RC1
nerdctl pull swr.cn-south-1.myhuaweicloud.com/ascendhub/clusterd:v6.0.RC2
创建 MindX 日志目录
MindX DL 组件会输出运行日志,如果目录不存在将导致 Pod 进入 CrashLoopBackOff 状态。
mkdir -p /var/log/mindx-dl/devicePlugin
mkdir -p /var/log/mindx-dl/volcano-controller
mkdir -p /var/log/mindx-dl/volcano-scheduler
mkdir -p /var/log/mindx-dl/noded
mkdir -p /var/log/mindx-dl/clusterd
chmod 777 -R /var/log/mindx-dl/
安装 Volcano
Volcano 是 AI 场景下常用的增强型调度器,支持 Gang 调度和拓扑感知调度。在 Ascend NPU 场景中,它的作用并不仅仅是替代默认调度器,而是为多卡、多节点训练任务提供更合理的资源调度能力。
默认 Volcano 使用的 NPU 插件名称可能不匹配,需要手动调整配置,将插件名修改为:
关键配置:在 volcano-scheduler 的 ConfigMap 中,将插件名称修改为 volcano-npu_v6.0.0。
# volcano-scheduler.conf
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
enableNodeOrder: false
- name: gang
enableNodeOrder: false
- name: conformance
enableNodeOrder: false
- name: volcano-npu_v6.0.0 # 关键:指定 NPU 插件
安装 Volcano:
kubectl apply -f https://raw.gitcode.com/Ascend/mind-cluster/raw/master/component/ascend-for-volcano/build/volcano-v1.9.0.yaml
标记 master 节点(如果调度器需要运行在 master 上):
kubectl label node master masterselector=dls-master-node
安装 Device Plugin
Device Plugin 的职责是扫描宿主机上的 NPU,并向 kubelet 注册对应资源。只有完成这一步,Kubernetes 才能真正感知节点上可分配的 Ascend 资源。
kubectl apply -f https://raw.gitcode.com/Ascend/mind-cluster/raw/master/component/ascend-device-plugin/build/ascendplugin-volcano.yaml
标记算力节点,使调度器能够识别:
kubectl label node master accelerator=huawei-Ascend910
部署 MindX DL
MindX DL 用于支撑多节点训练、拓扑感知调度等高级能力,是 Ascend 集群场景中的上层能力组件。
kubectl create ns mindx-dl
kubectl apply -f https://raw.gitcode.com/Ascend/mind-cluster/raw/master/component/noded/build/noded.yaml
kubectl apply -f https://raw.gitcode.com/Ascend/mind-cluster/raw/master/component/clusterd/build/clusterd.yaml
标记 worker 节点:
kubectl label node worker workerselector=dls-worker-node
注意:如果 clusterd 使用的 ClusterRole 中缺少 leases 相关权限,需要手动补充,否则相关组件可能无法正常工作。
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pods-clusterd-role
rules:
- ....
- ....
- apiGroups: ["coordination.k8s.io"]
resources: ["leases"]
verbs: ["get", "create", "update", "watch"]
验证与测试
部署 NPU 测试应用
在所有组件安装完成后,可以通过一个申请 2 张 Ascend 910C 的 Deployment 进行验证。
关键配置:
schedulerName: volcano:指定使用 Volcano 调度器。huawei.com/schedule_policy: "chip2-node16":注解,指定调度策略(如芯片亲和性)。resources.limits: huawei.com/Ascend910: "2":申请 2 张 NPU 卡。注意:910C卡数量通常需要为 2 的整数倍,因为910C 为按组的调度。
apiVersion: apps/v1
kind: Deployment
metadata:
name: npu
annotations:
"huawei.com/schedule_policy": "chip2-node16"
spec:
replicas: 1
selector:
matchLabels:
run: npu
template:
metadata:
labels:
run: npu
name: npu
spec:
containers:
- command:
- sh
- -c
args:
- sleep 1d
image: swr.cn-east-3.myhuaweicloud.com/lomtom-common/ubuntu:22.04
imagePullPolicy: IfNotPresent
name: npu
resources:
limits:
cpu: "8"
huawei.com/Ascend910: "2"
memory: 16Gi
requests:
cpu: "8"
huawei.com/Ascend910: "2"
memory: 16Gi
securityContext:
privileged: false
schedulerName: volcano
部署后,进入 Pod 执行 npu-smi info 验证 NPU 是否可见。
kubectl exec -it <pod-name> -- bash
npu-smi info
如果能够看到 NPU 芯片信息以及进程列表,则表示 Ascend 910C 已经成功接入 Kubernetes,并且容器侧可以正常使用 NPU。
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
npu-75d46bdf8b-j79nz 1/1 Running 0 8m13s
[root@master ~]# kubectl exec -it npu-75d46bdf8b-j79nz -- bash
root@npu-75d46bdf8b-j79nz:/# npu-smi info
+------------------------------------------------------------------------------------------------+
| npu-smi 25.2.3 Version: 25.2.3 |
+---------------------------+---------------+----------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page)|
| Chip Phy-ID | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) |
+===========================+===============+====================================================+
| 0 Ascend910 | OK | 164.3 43 0 / 0 |
| 0 0 | 0000:9D:00.0 | 0 0 / 0 3100 / 65536 |
+------------------------------------------------------------------------------------------------+
| 0 Ascend910 | OK | - 41 0 / 0 |
| 1 1 | 0000:9F:00.0 | 0 0 / 0 2873 / 65536 |
+===========================+===============+====================================================+
+---------------------------+---------------+----------------------------------------------------+
| NPU Chip | Process id | Process name | Process memory(MB) |
+===========================+===============+====================================================+
| No running processes found in NPU 0 |
+===========================+===============+====================================================+
高级:编译自定义 Volcano 插件
在标准组件无法满足需求时,例如:
- 需要自定义调度策略
- 需要修改拓扑算法
- 需要适配新的硬件场景
可以进一步编译自定义 Volcano 插件。
克隆代码
# clone
GOPATH=/root/go
cd $GOPATH
# 克隆 mind-cluster 仓库(包含 Ascend 插件)
git clone https://gitcode.com/Ascend/mind-cluster
# 克隆 Volcano 官方仓库
mkdir -p $GOPATH/src/volcano.sh/
cd $GOPATH/src/volcano.sh/
git clone -b release-1.9 https://github.com/volcano-sh/volcano.git
编译插件与镜像
使用官方提供的构建脚本,可以快速生成包含自定义插件的 Volcano 镜像。
# 启动编译容器
docker run --rm -it --net host -v /root/go:/root/go swr.cn-east-3.myhuaweicloud.com/lomtom-common/golang:1.21 bash
# 在容器内执行编译
GOPATH=/root/go
cp -r $GOPATH/mind-cluster/component/ascend-for-volcano $GOPATH/src/volcano.sh/volcano/pkg/scheduler/plugins/ascend-volcano-plugin
cd $GOPATH/src/volcano.sh/volcano/pkg/scheduler/plugins/ascend-volcano-plugin/build
chmod +x build.sh
CGO_ENABLED=1 GOPATH=/root/go ./build.sh v1.9.0
# 构建镜像
GOPATH=/root/go
cd $GOPATH/src/volcano.sh/volcano/pkg/scheduler/plugins/ascend-volcano-plugin/output
# 可选:修改基础镜像源
# sed -i 's/alpine:latest/swr.cn-east-3.myhuaweicloud.com\/lomtom-common\/alpine:3.20/g' Dockerfile-scheduler
docker build -t volcanosh/vc-scheduler:v1.9.0-$(git rev-parse --short HEAD) . -f Dockerfile-scheduler
# 替换volcano镜像(注意镜像tag)
kubectl set image -n volcano-system deployment/vc-scheduler vc-scheduler=volcanosh/vc-scheduler:v1.9.0-$(git rev-parse --short HEAD)
device-plugin
# 编译device-plugin
docker run --rm -it --net host -v /root/go:/root/go swr.cn-east-3.myhuaweicloud.com/lomtom-common/golang:1.21 bash
GOPATH=/root/go
cd $GOPATH/mind-cluster/component/ascend-device-plugin/build
chmod +x build.sh
./build.sh
# 构建device-plugin镜像
GOPATH=/root/go
cd $GOPATH/mind-cluster/component/ascend-device-plugin/output
docker build -t swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0-$(git rev-parse --short HEAD) .
docker save swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0-$(git rev-parse --short HEAD) -o /root/ascend-k8sdeviceplugin:v6.0.0.tar
# 替换device-plugin镜像(注意镜像tag)
kubectl set image -n kube-system ds/ascend-device-plugin-daemonset-910 device-plugin-01=swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0
Depencies:
本文为原创内容,欢迎分享与引用,请保留作者与原文链接。
Ascend 910C 算力卡 Kubernetes 接入实践指南
lomtom
原创发布