npu-dra-plugin:基于昇腾NPU的DRA调度插件项目

昇腾NPU的DRA调度插件

分支4Tags2

Ascend DRA Driver for NPUs

该驱动专为昇腾NPU设备设计,基于Kubernetes Dynamic Resource Allocation(DRA)机制,提供NPU资源的全生命周期管理,核心功能如下:

  • 支持昇腾NPU设备的自动资源发现与集群上报,实时同步设备状态。
  • 支持昇腾910B、910C、310P系列芯片。
  • 支持通过DeviceClass结合通用表达式语言(CEL),实现NPU设备的精细化筛选。
  • 支持通过ResourceClaim/ResourceClaimTemplate完成资源申请,实现业务Pod与ResourceSlice的精准绑定,保障资源高效分配。
  • 支持硬切分(固定模板VNPU)功能(仅支持910B),可将整卡按模板切分为多个vNPU实例供不同业务Pod使用。
  • 适用环境:Kubernetes 1.34 或更高版本(需提前启用动态资源分配DRA功能)。 有关DRA启用的详细操作,请参考Kubernetes官方文档:https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#enabling-dynamic-resource-allocation。

一、概述

Dynamic Resource Allocation(DRA)是Kubernetes中用于灵活管理专用设备(如NPU、GPU、TPU)的核心机制,其核心优势在于将资源配置与调度权限开放给第三方设备供应商,打破传统设备插件的局限性,实现资源的精细化、灵活化分配。 如需深入了解DRA核心概念与原理,可参考以下官方文档:

二、组件说明

Ascend DRA驱动仅包含一个核心组件(ascend-npu-dra-kubeletplugin),部署简单、维护便捷,以DaemonSet形式部署在集群所有搭载昇腾NPU的节点上(使用硬切分功能时需以主机进程方式部署,详见3.2节),核心职责包括:

  • 设备发现:自动扫描节点上的昇腾NPU设备(基于DCMI或sysfs方式),并向kubelet上报设备详情。
  • 资源调度:响应ResourceClaim请求,完成NPU资源的分配与释放,确保资源高效利用。
  • 硬切分功能:支持910B芯片的硬切分(固定模板VNPU)创建与删除,实现NPU资源的细粒度切分与回收。硬切分功能需以主机进程方式部署。
  • CDI注入:为运行NPU任务的容器注入CDI配置,保障容器能够正常访问NPU设备。
  • 健康检查:实时监控NPU设备运行状态,及时上报设备异常,保障业务稳定性。

三、功能特性

3.1 NPU资源管理

  • 自动设备发现:通过DCMI(设备管理接口)或sysfs文件系统,自动识别节点上的昇腾NPU设备,无需手动配置设备信息。
  • 多芯片支持:支持昇腾910B、910C、310P系列芯片的自动发现与资源上报,适配不同型号的NPU硬件环境。
  • 灵活资源分配:基于DRA机制,支持按业务需求灵活分配NPU资源,适配不同算力需求的工作负载。
  • CDI规范兼容:通过CDI(容器设备接口)向容器注入设备访问配置,确保容器与NPU设备的兼容性,简化容器部署流程。
  • Bus-Id设备识别:自动获取NPU设备的Bus-Id信息,作为设备唯一标识,避免设备混淆,提升资源分配准确性。

3.2 硬切分(固定模板VNPU)

硬切分功能支持将910B整卡按固定模板切分为多个vNPU实例,实现NPU资源的细粒度分配与复用。

基本约束

  • 仅支持昇腾910B系列芯片,910C和310P暂不支持硬切分。
  • 使用硬切分功能时,驱动不能以DaemonSet方式部署,必须以主机进程方式启动。原因是硬切分的操作接口只能在主机上执行,容器内无法调用。
  • 需在启动时通过--enable-hard-vnpu参数开启硬切分开关。

使用流程

  1. 启动驱动时开启硬切分开关(--enable-hard-vnpu)。
  2. 在ResourceClaim中通过DeviceClass申请所需内存大小(memCapacity),驱动会根据申请的内存自动匹配最合适的VNPU模板。例如申请10Gi内存:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: npu-claim-template
  namespace: ascend-dra
spec:
  spec:
    devices:
      requests:
        - name: npu
          exactly:
            deviceClassName: npu.huawei.com
            capacity:
              requests:
                memCapacity: 10000   # 申请约10Gi内存,自动匹配vir10_3c_16g模板
  1. 调度器根据容量消费(ConsumedCapacity.memCapacity)完成分配。
  2. 驱动在Pod创建阶段自动通过DCMI接口创建VNPU实例,并通过CDI将VNPU设备挂载到容器。
  3. Pod删除时,驱动自动通过DCMI接口销毁对应的VNPU实例,释放资源。

910B 内存申请与模板自动映射

申请内存范围 自动匹配模板 实际分配
≤ 8Gi vir05_1c_8g 8G / 1 AI Core
8Gi ~ 16Gi vir10_3c_16g 16G / 3 AI Core

四、使用指南

以下为Ascend DRA驱动的完整部署与使用步骤,需严格按照顺序执行,确保驱动正常运行。

4.1 安装依赖项

使用Ascend DRA驱动前,需确保集群环境满足以下依赖条件,推荐使用openFuyao社区推荐版本,提升兼容性:

  • Kubernetes:1.34 或更高版本,且已启用DRA功能(推荐版本:v1.34.3)。
  • 容器运行时:containerd v1.7.0 及以上版本(推荐版本:v2.1.1)。
  • 硬件与驱动:集群节点已安装昇腾NPU硬件,且已部署对应版本的昇腾NPU驱动(确保驱动与硬件型号匹配)。

4.2 构建镜像

4.2.1 克隆代码仓库

克隆openFuyao社区的NPU DRA插件仓库,切换至指定版本分支:

  git clone -b release-1.0.x https://gitcode.com/openFuyao/npu-dra-plugin.git
  cd npu-dra-plugin

4.2.2 驱动配置参数说明

驱动支持通过以下参数进行自定义配置,适配不同集群环境,默认值可满足大多数场景需求:

  • --cdi-root:CDI规范文件的存储目录(默认值:/etc/cdi)。
  • --device-profile:设备配置文件类型(可选值:gpu / npu,默认值:npu)。
  • --driver-name:DRA驱动名称(需与后续DeviceClass配置保持一致)。
  • --kubelet-registrar-directory-path:Kubelet注册目录(用于插件与kubelet通信)。
  • --kubelet-plugins-directory-path:Kubelet插件目录(插件部署路径)。
  • --enable-hard-vnpu:是否启用硬切分功能(仅支持910B)。

4.2.3 构建容器镜像

进入驱动目录,执行以下命令构建容器镜像(可根据实际需求修改镜像名称和标签):

# 进入驱动源码目录
cd Ascend-npu-dra-plugin
# 构建镜像(镜像名称可自定义,如ascend-npu-dra-plugin:v1.0.0)
docker build -f build/Dockerfile -t ascend-npu-dra-plugin:latest .

4.2.4 构建主机进程二进制(适用于硬切分场景)

使用硬切分功能时,驱动需以主机进程方式运行。在昇腾NPU主机上直接编译驱动二进制(需安装Go 1.24+、GCC、昇腾NPU驱动):

cd Ascend-npu-dra-plugin
go build -o npu-dra-plugin ./cmd/ascend-npu-dra-kubeletplugin

4.3 部署驱动组件

驱动组件通过Kubernetes资源清单部署,需先修改清单中的镜像地址,确保与步骤2中构建的镜像一致,再执行部署命令。

4.3.1 DaemonSet方式部署(适用于不使用硬切分的场景)

# 部署DRA Kubelet插件(DaemonSet)
kubectl apply -f manifests/ascend-npu-dra-kubeletplugin-daemonset-template.yaml
# 部署NPU DeviceClass(用于设备筛选)
kubectl apply -f manifests/npu-deviceclass-template.yaml

4.3.2 主机进程方式部署(适用于需要使用硬切分功能的场景)

若需使用硬切分功能(仅910B支持),驱动必须以主机进程方式运行,不能使用DaemonSet部署。这是因为硬切分的操作接口只能在主机上执行(通过DCMI封装调用),容器内无法调用。

主机进程方式部署步骤:

  1. 按照4.2.4节在昇腾NPU主机上编译驱动二进制。
  2. 在主机上直接启动驱动进程,需额外传入--enable-hard-vnpu参数:
# 在主机上直接启动驱动(硬切分模式)
./npu-dra-plugin \
  --node-name=<节点名称> \
  --device-profile=npu \
  --driver-name=npu.huawei.com \
  --kubelet-registrar-directory-path=/var/lib/kubelet/plugins_registry \
  --kubelet-plugins-directory-path=/var/lib/kubelet/plugins \
  --cdi-root=/etc/cdi \
  --healthcheck-port=-1 \
  --enable-hard-vnpu=true \
  --kubeconfig=/root/.kube/config      
  1. 执行以下命令,创建命名空间
kubectl create namespace ascned-dra
  1. 执行以下命令,部署NPU DeviceClass:
kubectl apply -f manifests/npu-deviceclass-template.yaml

4.4 运行工作负载

驱动部署完成后,可通过示例清单提交工作负载,验证驱动是否正常工作:

kubectl apply -f manifests/test-resourceclaimtemplate-pod-template.yaml

提交后,可通过后续“相关操作”中的命令,验证资源分配是否成功。

五、相关操作

以下命令用于查询DRA相关自定义资源(CR)信息,帮助排查驱动运行状态和资源分配情况。

5.1 查询ResourceSlice

ResourceSlice用于存储NPU设备详情,通过以下命令查询:

# 查询集群中所有ResourceSlice
kubectl get resourceslices

# 查询指定ResourceSlice的详细信息(含设备属性、容量等)
kubectl get resourceslices <resourceslice_name> -o yaml

此时可以查看所有发现设备信息,这些信息可用于CEL表达式进行设备筛选,示例如下。

apiVersion: resource.k8s.io/v1
kind: ResourceSlice
metadata:
  creationTimestamp: "2026-02-27T01:55:37Z"
  generateName: master-npu.huawei.com-
  generation: 1
  name: master-npu.huawei.com-9gv8l
  ownerReferences:
  - apiVersion: v1
    controller: true
    kind: Node
    name: master
    uid: 6ef76e72-da36-44e3-b9c3-93f44684a859
  resourceVersion: "2225369"
  uid: 0c1b399e-4fa8-4279-93f8-b92a1faeff6f
spec:
  devices:
  - attributes:
      chipName:
        string: 910B4
      numaNode:
        int: 6
      physicalId:
        int: 0
      topologyGroup:
        string: ring-0
    capacity:
      memCapacity:
        value: 32Gi
    name: npu-0
  driver: npu.huawei.com
  nodeName: master
  pool:
    generation: 1
    name: master
    resourceSliceCount: 1

5.2 查询DeviceClass

DeviceClass用于定义NPU设备类别,通过以下命令查询:

kubectl get deviceclasses

5.3 查询ResourceClaim

ResourceClaim用于记录资源申请情况,需指定命名空间查询:

kubectl get resourceclaims -n <namepspace>

六、贡献与支持

6.1 贡献指南

欢迎开发者参与驱动优化与迭代,如需贡献代码,请通过以下方式提交:

6.2 支持渠道

如在驱动部署、使用过程中遇到问题,请在GitCode项目页面打开Issue,我们会及时响应并提供技术支持。 感谢您的使用与反馈,助力Ascend DRA驱动持续优化!

项目介绍

昇腾NPU的DRA调度插件

定制我的领域