自动实现NPU虚拟化(算力切分)
在CCE中,通过CCE AI套件(Ascend NPU)插件的ascend-vnpu-manager组件可以实现节点池粒度的NPU虚拟化,以生成虚拟NPU(vNPU),从而实现资源的高效利用。启用NPU虚拟化功能后,系统会根据配置中指定的模板,对节点池内的NPU芯片进行自动切分,从而实现标准化、批量化的虚拟化部署。
前提条件
- 集群中已安装CCE AI套件(Ascend NPU)插件,且版本在2.1.63以上,具体安装步骤请参见CCE AI套件(Ascend NPU)。
- NPU节点上已安装NPU驱动,且驱动版本在23.0.1及以上。
- 卸载原有NPU驱动,具体步骤请参见NPU驱动卸载。
- 进入固件与驱动,选择对应产品型号,下载23.0.1及以上版本的驱动安装包(软件包格式为run)。
- 下载安装包后,请阅读用户必读了解NPU安装相关限制和要求,并参考安装驱动(适用于.run格式)中的步骤进行安装。
约束与限制
仅Snt3P3和Snt9B3芯片支持使用ascend-vnpu-manager进行虚拟化管理。

Snt9B3的虚拟化能力处于实验性阶段,模型算子的覆盖范围仍在不断完善。为保障模型算子的正常运行,建议您在部署前进行任务兼容性验证。如果经过验证,任务可以在Snt9B3的vNPU上运行,则可以使用CCE的算力切分管理能力进行NPU虚拟化配置的应用、更改与销毁。
配置NPU虚拟化
开启NPU虚拟化功能前,需要将对应节点池中的NPU负载排空,具体请参见节点排水。
- 登录CCE控制台,单击集群名称进入集群,在左侧选择“配置中心”。
- 切换至“异构资源配置”页签,开启“NPU虚拟化”,仅支持配置节点池级别的NPU虚拟化。
- 在“NPU虚拟化配置 ”中单击“添加”,并配置以下参数。参数配置完成后,系统将根据“虚拟化实例组合”对节点池中的NPU芯片进行自动切分。
某条配置删除后,不会触发对应节点上的管理动作,只有在虚拟化实例组合新增和更改的时候才会触发。即删除某条配置后,该节点池的vNPU资源配置并未消失,需要在虚拟化实例组合更换为all-disabled才能将该节点的vNPU配置删除。
表1 NPU虚拟化配置 参数
说明
节点池
请选择需要虚拟化的节点池,暂不支持对default节点池进行配置。
芯片类型
请选择需要进行虚拟化的芯片类型,目前仅支持对昇腾Snt3P3和昇腾Snt9B3类型的芯片进行虚拟化。
虚拟化实例组合
CCE已提供多种NPU虚拟化模板组合,可以根据需求选择不同的组合,以满足使用要求。进行节点池的虚拟化实例组合的更改前,请先将对应节点池中的NPU与vNPU负载排空。
将鼠标悬浮于组合名称之上,可以查看对应的模板名称和数量等信息。例如,all-disabled表示不进行NPU虚拟化,all-7vir01表示将节点池中的对应类型的NPU芯片皆切分成7个模板为vir01的vNPU。关于NPU虚拟化模板的更多信息,请参见NPU虚拟化模板。
如果您需要为多个节点池和NPU芯片配置NPU虚拟化,请单击“添加”,继续添加。
- 上述配置完成后,在页面右下角单击“确认配置”。在“确认配置”的弹窗中,单击“保存”。保存后,CCE AI套件(Ascend NPU)插件将自动在符合条件的节点中部署ascend-vnpu-manager组件。该组件将自动监听global-vnpu-configs(ConfigMap)的内容变化,并根据内容触发vNPU管理动作。
- NPU虚拟化配置完成后,您可以通过ascend-vnpu-manager的日志验证NPU虚拟化是否配置成功。
在左侧导航栏中选择“插件中心”,在右侧找到CCE AI套件(Ascend NPU)插件,单击“插件详情”,切换至“实例列表”,找到对应节点的ascend-vnpu-manager的Pod实例。在右侧操作列单击“更多 > 日志”。
- 若日志中存在以下信息,则说明当前节点NPU虚拟化配置成功。
图1 验证NPU虚拟化是否成功
- 若日志中存在“Error: error applying VNPU configuration: failed to apply func on device1, err: NPU1 has VNPU in use ...”等信息,则说明节点已存在NPU负载或vNPU负载,NPU虚拟化无法配置,您可以通过以下方式进行解决:
在对应节点中清空NPU负载或vNPU负载后,删除对应的ascend-vnpu-manager的Pod实例。待该ascend-vnpu-manager的Pod实例重启且状态变为运行中后,当前节点的NPU虚拟化功能将正常使用。
- 若日志中存在以下信息,则说明当前节点NPU虚拟化配置成功。
使用vNPU
您可以采取两种方式为容器指定vNPU资源,即控制台方式和kubectl命令行方式。
- 登录CCE控制台,单击集群名称进入集群。在左侧导航栏单击“工作负载”,右上角单击“创建工作负载”。
- 在“容器配置 > 基本信息 >NPU配额”中选择算力拆分,在虚拟化模板的下拉列表中选择需要的虚拟化模板。此处虚拟化模板名称为“Ascend-芯片类型-虚拟化实例模板”,例如ascend-310-vir01表示昇腾Snt3芯片中以vir01为模板的vNPU。选择模板后,CCE将按照虚拟化模板为容器分配vNPU资源。
表2 虚拟化模板 参数
说明
虚拟化模板
提供已配置模板未配置模板,具体如下:
- 已配置:在“配置中心 > 异构资源配置”中已配置的虚拟化模板,可以直接使用。
- 未配置:在“配置中心 > 异构资源配置”中暂未配置的虚拟化模板,无法直接使用。如果选择未配置模板,工作负载将因资源不足而创建失败。此时,请在“NPU虚拟化配置 ”中配置相关模板,具体操作请参见配置NPU虚拟化。配置完成后,该负载将自动调度成功。
- 其他参数请参考创建工作负载进行配置。参数配置完成后,在右下角单击“创建工作负载”。待工作负载变为运行中后,则表示创建成功。
在创建vNPU之后,工作负载可以通过YAML格式申请vNPU资源,从而实现资源的高效管理和灵活配置。如果需要使用Volcano调度器,则需要安装1.12.1及以上版本的Volcano调度器插件。
- 依次执行以下命令,创建工作负载,并申请一个vir02模板的vNPU资源。
- 执行以下命令,创建名为vnpu-worker的YAML文件。
vim vnpu-worker.yaml
文件内容如下,容器中只支持申请NPU资源或者vNPU资源,二者不可以同时使用。
使用vNPU资源时,需确保该vNPU资源已存在。如果该vNPU资源未创建,则会报错,例如“0/2 nodes are available: 2 Insufficient huawei.com/ascend-310-2c”。
kind: Deployment apiVersion: apps/v1 metadata: name: vnpu-test namespace: default spec: replicas: 1 selector: matchLabels: app: vnpu-test template: metadata: labels: app: vnpu-test spec: schedulerName: kube-scheduler # 该工作负载需要使用volcano调度器时,则需要安装volcano插件,且版本在1.12.1及以上 containers: - name: container-0 image: nginx:latest resources: limits: cpu: 250m huawei.com/ascend-310-2c: '1' # 表示申请的vNPU资源,固定为1 memory: 512Mi requests: cpu: 250m huawei.com/ascend-310-2c: '1' # 固定为1 memory: 512Mi
- 容器只支持申请一个vNPU资源,因此requests和limits里的vNPU资源数量固定为1。
- 指定的vNPU资源请在节点中提前创建,且保证资源充足。当vNPU资源不足时,会出现类似“0/2 nodes are available: 2 Insufficient huawei.com/ascend-310-2c.”的报错。
- huawei.com/ascend-310-2c表示申请vNPU资源名称,不同产品和模板对应的vNPU资源名称不同,具体映射关系如下:
表3 vNPU资源名称 产品类型
虚拟化模板
vNPU资源名称
Atlas推理系列产品(8个AI Core)
vir01
huawei.com/ascend-310-1c
vir02
huawei.com/ascend-310-2c
vir02_1c
huawei.com/ascend-310-2c.1cpu
vir04
huawei.com/ascend-310-4c
vir04_3c
huawei.com/ascend-310-4c.3cpu
vir04_3c_ndvpp
huawei.com/ascend-310-4c.3cpu.ndvpp
vir04_4c_dvpp
huawei.com/ascend-310-4c.4cpu.dvpp
Ascend训练系列产品(30或32个AI Core)
vir16
huawei.com/ascend-1980-16c
vir08
huawei.com/ascend-1980-8c
vir04
huawei.com/ascend-1980-4c
vir02
huawei.com/ascend-1980-2c
vir10_3c_32g
huawei.com/ascend-1980-10c.3cpu.32g
vir05_1c_16g
huawei.com/ascend-1980-5c.1cpu.16g
- 执行以下命令,创建上述工作负载。
kubectl apply -f vnpu-worker.yaml
回显结果如下:
deployment/vnpu-test created
- 执行以下命令,查看Pod是否运行成功。
kubectl get pod | grep vnpu-test
回显结果如下,则说明工作负载中的Pod运行成功。
vnpu-test-6658cd795b-rx76t 1/1 Running 0 59m
- 执行以下命令,创建名为vnpu-worker的YAML文件。
- 执行以下命令,登录容器内部。
kubectl -n default exec -it vnpu-test-6658cd795b-rx76t -c container-0 -- /bin/bash
- 在容器内依次执行以下命令,查看vNPU是否挂载成功。
- 执行以下命令,配置环境变量,用于指定动态链接库的搜索路径,确保在运行与NPU相关的应用时,系统能够正确加载所需的动态库文件。
export LD_LIBRARY_PATH=/usr/local/HiAI/driver/lib64:/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64
- 执行以下命令,查看容器挂载的NPU信息,以确认是否成功挂载vNPU资源。
npu-smi info
由回显结果可知,该容器已挂载设备ID为104的NPU卡中的vNPU,且虚拟化模板为vir02。
+--------------------------------------------------------------------------------------------------------+ | npu-smi 24.1.rc2.3 Version: 24.1.rc2.3 | +-------------------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===============================+=================+======================================================+ | 104 xxx | OK | NA 54 0 / 0 | | 0 0 | 0000:00:0D.0 | 0 445 / 5381 | +===============================+=================+======================================================+ +-------------------------------+-----------------+------------------------------------------------------+ | NPU Chip | Process id | Process name | Process memory(MB) | +===============================+=================+======================================================+ | No running processes found in NPU 104 | +===============================+=================+======================================================+
- 执行以下命令,配置环境变量,用于指定动态链接库的搜索路径,确保在运行与NPU相关的应用时,系统能够正确加载所需的动态库文件。
关闭NPU虚拟化
相关文档
如果需要对NPU相关指标进行监控,请参见NPU监控。