Ascend device plugin 是用来支持在 HAMi 和 volcano 中调度昇腾 NPU 设备,支持以下两种模式:
支持基于虚拟化模板的显存切分,系统会自动使用最小可用模板。详细信息请参阅 template。
实现了基于 libvnpu.so 拦截和 limiter 令牌调度的软切分机制,能够实现精细化的资源共享。详细信息请参阅 hami-vnpu-core。
注意 1: hami-vnpu-core 目前只支持 ARM 平台。
注意 2: hami-vnpu-core 目前只支持 HAMi 调度器。
hami-vnpu-core 软切分要求:
- Ascend 驱动版本:≥ 25.5
- 芯片模式:在昇腾芯片上开启
device-share模式以支持虚拟化。
开启 device-share 模式
npu-smi set -t device-share -i id -d value 用于设置指定设备的所有芯片的容器共享模式。
参数说明
| 类型 | 描述 |
|---|---|
| id | 设备 ID。通过 npu-smi info -l 命令查出的 NPU ID 即为设备 ID。 |
| value | 容器使能状态:分为禁用、使能。默认禁用。 0:禁用 1:使能 |
更新子模块:
git submodule update --init --recursivemake alldocker buildx build -t $IMAGE_NAME .kubectl label node {ascend-node} ascend=onkubectl apply -f https://raw.githubusercontent.com/Project-HAMi/ascend-device-plugin/main/ascend-runtimeclass.yaml该 ConfigMap 用于全局配置,包括 resourceName、模式、模板等。
- 在
vnpus下设置hamiVnpuCore: true,所有节点会向调度器声明基于hami-vnpu-core的软切分能力(可被hami-device-node-config按节点覆盖)。
kubectl apply -f https://raw.githubusercontent.com/Project-HAMi/ascend-device-plugin/main/ascend-device-configmap.yaml注意: 如果该 ConfigMap 已存在,可跳过此步骤。
hami-device-node-config 用于对集群中特定节点的 hami-vnpu-core 进行启用或覆盖。节点级配置的优先级高于全局 vnpus.hamiVnpuCore 开关。
kubectl apply -f https://raw.githubusercontent.com/Project-HAMi/ascend-device-plugin/main/ascend-device-node-configmap.yamlkubectl apply -f https://raw.githubusercontent.com/Project-HAMi/ascend-device-plugin/main/ascend-device-plugin.yaml如果要在 HAMi 中使用昇腾 NPU,在部署 HAMi 时设置 devices.ascend.enabled 为 true 会自动部署 ConfigMap 和 ascend-device-plugin。参考 https://github.com/Project-HAMi/HAMi/blob/master/charts/hami/README.md#huawei-ascend
如果需要 HAMi 为申请 ascend 资源的 Pod 自动添加 runtimeClassName 配置(默认关闭),则应该在 HAMi 的 values.yaml 文件中配置 devices.ascend.runtimeClassName 为一个非空字符串,并且与 RuntimeClass 资源名称保持一致。例如:
devices:
ascend:
runtimeClassName: ascend如果要独占整卡或者申请多张卡只需要设置对应的 resourceName 即可。如果多个任务要共享同一张卡,需要将 resourceName 设置为 1,并且设置对应的 ResourceMemoryName。
HAMi 与 vNPU 模式说明: 只有为 Pod 配置了注解 huawei.com/vnpu-mode: hami-core 时,设备插件才会按 软切分(libvnpu / hami-vnpu-core 的挂载与环境变量)处理。未添加该注解的任务仍走 原有 vNPU 方案(虚拟化模板与 ASCEND_VNPU_SPECS 等)。两种路径不同。当集群里 Ascend 节点 只有 面向软切分的部署或调度预期(例如节点均按 hami-vnpu-core 配置、工作负载预期都使用软切分)时,未设置 vnpu-mode=hami-core 的任务可能一直处于 Pending,因为其仍按旧版 vNPU 申请与分配逻辑,可能与当前节点暴露的资源或调度匹配方式不一致。
...
containers:
- name: npu_pod
...
resources:
limits:
huawei.com/Ascend910B: "1"
# 如果不指定显存大小,就会使用整张卡
huawei.com/Ascend910B-memory: "4096"更多示例请参阅 examples
需要 软切分 时请显式加上下文中的注解;不加则仍为 模板硬切分 vNPU(与上一节「在 HAMi 中使用」中的说明一致)。
apiVersion: v1
kind: Pod
metadata:
name: ascend-soft-slice-pod
annotations:
huawei.com/vnpu-mode: 'hami-core' # 添加该注解的走 hami-vnpu-core 软切分
spec:
containers:
- name: npu_pod
...
resources:
limits:
huawei.com/Ascend910B3: "1" # 请求 1 块物理 NPU
huawei.com/Ascend910B3-memory: "28672" # 请求 28Gi 显存
huawei.com/Ascend910B3-core: "40" # 请求 40% 的算力软切分机制支持在单个 Pod 中申请多个虚拟设备。在进行多卡并行推理(如使用 vLLM)时,--gpu-memory-utilization 的值不能大于"容器总显存上限"占"所选卡物理显存总和"的比例。
示例:使用 vLLM 开启 2 卡张量并行 (TP=2)
假设单块物理卡显存为 64Gi,计划在 2 块卡上各使用 32Gi(总计 64Gi):
apiVersion: v1
kind: Pod
metadata:
name: vllm-npu-2card
annotations:
huawei.com/vnpu-mode: 'hami-core' # 启用 hami-vnpu-core 软切分
spec:
containers:
- name: vllm-container
image: vllm-ascend:latest
command: ["/bin/sh", "-c"]
args:
- |
vllm serve /model/Qwen3-0.6B \
--host 0.0.0.0 \
--port 8002 \
--enforce-eager \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.5 # 关键参数:总申请显存 64Gi / 总物理显存 128Gi = 0.5
resources:
limits:
huawei.com/Ascend910B3: "2" # 申请 2 块虚拟设备进行并行计算
huawei.com/Ascend910B3-memory: "65536" # 容器可用的总显存上限(2 卡合计 64GiB)
huawei.com/Ascend910B3-core: "50"在 volcano 中使用时需要提前部署好 volcano,更多信息请参考这里
apiVersion: v1
kind: Pod
metadata:
name: ascend-pod
spec:
schedulerName: volcano
containers:
- name: ubuntu-container
image: swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-pytorch:24.0.RC1-A2-1.11.0-ubuntu20.04
command: ["sleep"]
args: ["100000"]
resources:
limits:
huawei.com/Ascend310P: "1"
huawei.com/Ascend310P-memory: "4096"