Article

Ascend 910C 算力卡 Kubernetes 接入实践指南

  • 今天
机器人
摘要
lomtom

介绍

在 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 PluginKubernetes 设备插件,负责扫描节点上的 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

安装驱动

驱动安装包提供了设备识别、资源管理以及用户态接口能力。

  1. 环境检查:执行安装包,检查系统环境是否满足要求。
./Atlas-A3-hdk-npu-driver_25.2.3_linux-aarch64.run --check
  1. 执行安装:使用 --full 参数进行完整安装,--install-for-all 使所有用户均可使用。
./Atlas-A3-hdk-npu-driver_25.2.3_linux-aarch64.run \
--full --install-for-all
  1. 编译内核模块:安装过程中,系统会提示输入内核源码路径,需要根据当前内核版本指定。
# 按提示操作
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.runcruntime_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 镜像

在部署前,需要提前准备相关镜像。对于离线环境,通常需要事先完成 pulltagpush 到私有镜像仓库的过程。

# 拉取 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:

  1. Ascend 驱动与固件安装指南 🔗
  2. Ascend Docker Runtime 用户指南 🔗
  3. MindCluster 开源项目 🔗
  4. Volcano 调度器官方文档 🔗
Copyright

本文为原创内容,欢迎分享与引用,请保留作者与原文链接。

文章标题

Ascend 910C 算力卡 Kubernetes 接入实践指南

作者

lomtom

发布方式

原创发布

原文链接 https://lomtom.cn/ascend-910c-k8s-guide
More Reads