使用 Kueue 管理 Ascend NPU 配额
本页介绍如何使用 Alauda Build of Kueue 来管理由 Ascend Device Plugin(作为 NPU Operator 的一部分提供)暴露的 Ascend NPU 资源配额。Kueue 将 huawei.com/Ascend910 以及类似的 device-plugin 资源视为普通的可计数资源,因此用于 CPU、内存和 Nvidia GPU 的相同 ClusterQueue / ResourceFlavor / LocalQueue 模型可以直接沿用。
前提条件
- 你已经安装了
Alauda Build of Kueue集群插件。 - 你已经安装了
Alauda Build of NPU Operator集群插件,并在部署表单中启用了 Driver、Ascend Device Plugin 和 Ascend Docker Runtime 组件(默认情况下它们是启用的)。这三个开关决定了集群是否会将huawei.com/Ascend910(或huawei.com/Ascend310P)作为 Ascend 节点上的可调度扩展资源暴露出来。有关完整操作步骤以及各部署表单开关的含义,请参见 安装 NPU Operator 。 - Ascend Device Plugin 正在报告节点上的 NPU 容量,例如
kubectl describe node <ascend-node>在Capacity和Allocatable下都显示huawei.com/Ascend910: <N>。 - Alauda Container Platform Web CLI 已与集群建立通信。
操作步骤
1. 识别 NPU 节点标签
ResourceFlavor 通过 spec.nodeLabels 选择配额适用的节点池。NPU Operator 会为其管理的每个节点添加以下标签——请选择最适合你的集群的标签:
本页后续示例使用 accelerator: huawei-Ascend910。
2. 创建 Kueue 对象
创建一个绑定到 NPU 节点池的 ResourceFlavor、一个声明 NPU 配额的 ClusterQueue,以及一个供用户提交 Job 的命名空间中的 LocalQueue。
nodeLabels:将该 flavor 限制为由 NPU Operator 标记为 Ascend 910 的节点。请替换为与你的集群相匹配的标签(参见上表)。coveredResources:将 device-plugin 资源与 CPU 和内存一起列出,以便在准入决策中对三者进行统一计量。nominalQuota:队列可在任意时刻发放的 NPU 卡总数。请将其设置为等于或低于该 flavor 所选择节点上的可分配 NPU 之和。
使用 kubectl apply -f <filename>.yaml 应用该清单。
3. 通过队列提交 NPU Job
添加 kueue.x-k8s.io/queue-name 标签,并在容器的 resources 块中请求 NPU。Kueue 内置的 batch/job 集成会以挂起状态创建 Job,并且只会在配额检查通过后解除挂起。
queue-name标签:将 Job 路由到你上面创建的LocalQueue。suspend: true:这是 Kueue 暂存 Job 直到配额可用所必需的。准入后,Kueue 会将其改回false。- NPU 请求:使用
huawei.com/Ascend910(或huawei.com/Ascend910B4等),以匹配节点上的 Ascend Device Plugin 报告的资源名称。request 和 limit 必须相等——这是一个扩展资源。
4. 观察准入
向一个 nominalQuota 为 2 的队列提交两个这样的 Job,每个 Job 请求 2 个 NPU。
第一个 Job 会被准入,并以 Pod 的形式运行;该 Pod 会从 Ascend Device Plugin 获得 /dev/davinci* 设备和 ASCEND_VISIBLE_DEVICES。第二个 Job 会保持 Suspended,其 Workload 会报告配额不足:
查看被保留的 Workload 可以更明确地看到原因:
status.conditions 字段会报告配额不足:
当第一个 Job 完成或被删除后,Kueue 会自动准入被保留的 Workload,解除第二个 Job 的挂起状态,并由 Ascend Device Plugin 将释放的 NPU 设备分配给其 Pod。
注意事项
ClusterQueue中针对huawei.com/Ascend910的nominalQuota是独立于节点Allocatable进行强制限制的。如果Allocatable低于该配额(例如因为 device plugin 将某些芯片标记为不健康),即使 Pod 已被准入,也仍可能在 kube-scheduler 层处于Pending,并显示Insufficient huawei.com/Ascend910。请确保nominalQuota≤ 所选节点上的Allocatable之和。- 相同模式也适用于 device plugin 暴露的其他 Ascend 资源名称(
huawei.com/Ascend910B4、huawei.com/Ascend310P等)。按需将它们添加到coveredResources和容器的resources块中。 - Kueue 的其他功能——公平共享、cohort、gang scheduling、preemption——都可以直接用于 NPU 资源,无需额外配置。