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

昇腾NPU的DRA调度插件

分支9Tags3

Ascend DRA Driver for NPUs

概述

npu-dra-plugin是昇腾NPU的Kubernetes动态资源分配(Dynamic Resource Allocation,DRA)驱动插件。插件自动发现节点上的昇腾NPU设备并上报至集群,业务Pod通过ResourceClaim声明所需资源后,由调度器完成设备匹配与分配,实现从资源申请到设备注入的全流程自动化管理。

功能特性

  • 多种资源分配模式
    • 整卡分配:将一张完整NPU独占分配给业务Pod,独享全部算力与显存。
    • 硬切分:基于固定模板将整卡切分为多个vNPU实例,按aiCore+aiCPU精确匹配模板,提供硬件级隔离。
    • 软切分:基于vCANN-RT运行时劫持库实现软件虚拟化,按memCapacity+coreCapacity灵活配额共享物理NPU,支持弹性(elastic)、固定份额(fixed-share)、尽力而为(best-effort)三种调度策略。
  • 精细化设备调度
    • 基于Kubernetes原生DRA调度,通过DeviceClass结合CEL表达式筛选设备。
    • 支持NUMA亲和、HCCS环网拓扑、芯片型号、PCIe信息等设备属性作为调度约束。
    • 支持多芯片混合调度,多型号NPU共存于同一集群,按业务需求匹配设备。
  • 极简使用
    • 业务Pod通过ResourceClaim声明式申请算力,无需修改业务代码。
    • 通过CDI(容器设备接口)自动将设备注入容器。
    • 提供Helm Chart一键部署。
  • 多芯片支持:支持昇腾910B、910C、310P系列芯片的自动发现与上报。

约束和限制

  1. 910C必须设置为单die模式方可使用切分能力(双die模式下设备可上报但容器内不可用)。
  2. 硬切分依赖ascend-docker-runtime创建vNPU设备,硬切分Pod需配置runtimeClassName: ascend。
  3. 软切分依赖vCANN-RT劫持库(可通过Helm的vcannrtInstaller自动安装),每个物理NPU最多支持63个vNPU实例。
  4. 各芯片与切分模式的支持矩阵、HDK/CANN版本配套要求,详见用户手册。

快速开始

环境要求

  • Kubernetes v1.34及以上(需启用DynamicResourceAllocation及DRAConsumableCapacity特性门控,推荐v1.34.3)。
  • 容器运行时containerd v1.7.0及以上(推荐v2.1.1)。
  • 昇腾NPU硬件及对应版本驱动(推荐不低于25.5.x)。

各切分模式的前置条件(910C单die配置、ascend-docker-runtime安装、vCANN-RT劫持库安装等)参见用户手册的“前提条件”章节。

构建

默认使用OCI仓中的官方镜像部署。如需基于源码自行构建(自定义修改、内部镜像仓等场景):

# 克隆代码仓库(按需切换到指定版本分支)
git clone https://gitcode.com/openFuyao/npu-dra-plugin.git
cd npu-dra-plugin/Ascend-npu-dra-plugin

# 构建容器镜像(镜像名称可自定义,需已安装Docker)
docker build -f build/Dockerfile -t ascend-npu-dra-plugin:latest .

构建完成后,将镜像推送到内部镜像仓,并在Helm的values.yaml中修改npuDraPlugin.image相关配置后部署。

部署

通过Helm Chart一键部署:

# 拉取Chart并按需修改values.yaml(镜像地址、节点NPU切分模式等)
helm pull oci://cr.openfuyao.cn/charts/npu-dra-driver --version latest
tar xzf npu-dra-driver-*.tgz

# 部署
helm install npu-dra-driver oci://cr.openfuyao.cn/charts/npu-dra-driver --version latest -f npu-dra-driver/values.yaml

# 验证:每个NPU节点上均有npu-dra-plugin Pod且状态为Running
kubectl get pods -n npu-dra-driver

# 验证:设备已上报为ResourceSlice
kubectl get resourceslices

Pod使用NPU

业务Pod只需通过ResourceClaim声明所需的vNPU资源,调度器自动将Pod调度到合适的节点合适的NPU设备上并挂载设备。

例如,Pod使用软切分,申请4Gi显存、50%的AICore:

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: npu-soft-vnpu
spec:
  spec:
    devices:
      requests:
      - name: npu
        exactly:
          deviceClassName: elastic.npu.huawei.com
          capacity:
            requests:
              memCapacity: 4Gi
              coreCapacity: 50

使用硬切分,按aiCore+aiCPU匹配固定模板:

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: npu-hard-vnpu
spec:
  spec:
    devices:
      requests:
      - name: npu
        exactly:
          deviceClassName: hard.npu.huawei.com
          capacity:
            requests:
              aiCore: 5
              aiCPU: 1

申请整卡,无需指定capacity:

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: npu-full
spec:
  spec:
    devices:
      requests:
      - name: npu
        exactly:
          deviceClassName: full.npu.huawei.com

更多使用方法(Helm详细配置、CEL设备筛选、FAQ)请参考用户手册。

相关文档

贡献与支持

贡献指南

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

  • 访问GitCode仓库:https://gitcode.com/openFuyao/npu-dra-plugin.git
  • 提交拉取请求(Pull Request),并附详细的功能说明或问题修复描述。
  • 提交问题(Issue),反馈使用过程中遇到的Bug或功能需求。

支持渠道

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