昇腾NPU的DRA调度插件
当前访问频次受限,请登录后继续访问
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系列芯片的自动发现与上报。
约束和限制
- 910C必须设置为单die模式方可使用切分能力(双die模式下设备可上报但容器内不可用)。
- 硬切分依赖
ascend-docker-runtime创建vNPU设备,硬切分Pod需配置runtimeClassName: ascend。 - 软切分依赖vCANN-RT劫持库(可通过Helm的
vcannrtInstaller自动安装),每个物理NPU最多支持63个vNPU实例。 - 各芯片与切分模式的支持矩阵、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)请参考用户手册。
相关文档
- NPU DRA插件用户手册:安装部署、三种资源分配模式使用方法、常见问题等完整内容。
- Kubernetes DRA官方文档:DRA机制背景。
贡献与支持
贡献指南
欢迎开发者参与项目优化与迭代,如需贡献代码,请通过以下方式提交:
- 访问GitCode仓库:https://gitcode.com/openFuyao/npu-dra-plugin.git
- 提交拉取请求(Pull Request),并附详细的功能说明或问题修复描述。
- 提交问题(Issue),反馈使用过程中遇到的Bug或功能需求。
支持渠道
如在驱动部署、使用过程中遇到问题,请在GitCode项目页面打开Issue,我们会及时响应并提供技术支持。 感谢您的使用与反馈,助力Ascend DRA驱动持续优化!