昇腾 vNPU 虚拟化

需要把单张昇腾 NPU 静态切分成多张 vNPU 给多个 pod 使用,配置 device-plugin 并验证时阅读

部署安装 / GPU与异构算力
昇腾AscendvNPUNPU虚拟化NPU切分910B3npu-smicreate-vnpuvir05_1c_16gvnpu-modepresetVirtualDevicevolcanoTypedevice-pluginMindX DLASCEND_VNPU_SPECStorch_npu

昇腾 vNPU 虚拟化(静态切分)

参考文档:https://www.hiascend.com/document/detail/zh/mindx-dl/500/AVI/cpaug/cpaug_018.html

本文档以 NPU 910B3 卡为例。

平台侧:config.pyGPU_RESOURCEvnpu 对应 huawei.com/Ascend910-5c.1cpu.16g(见 myapp/config.py:1247),需根据自己静态虚拟化所产生的 vNPU 规格调整该资源名。

主机设置静态虚拟 NPU

设置虚拟化模式

本命令只支持在物理机执行,取值为 0 或 1(如果是在虚拟机内划分 vNPU,不需要执行本命令)。

  • 0:虚拟化实例功能(容器模式),适用于将 vNPU 挂载到容器。
  • 1:虚拟化实例功能(虚拟机模式),适用于将 vNPU 挂载到虚拟机。
npu-smi info -t vnpu-mode      # 查看当前虚拟化模式
npu-smi set -t vnpu-mode 0     # 虚拟化模式修改为容器模式

添加虚拟卡

创建虚拟 NPU,不同卡型号模板不同:

npu-smi set -t create-vnpu -i 0 -c 0 -f --help   # 查看模板

其中 -i 卡号、-c 芯片号、-f 模板。

模板列表

可以根据名称来确定 vNPU 模板名对应的配置:

模板配置

# 创建一张 1c16G 的 vnpu,这是 1/4 的切分颗粒度,可切分 4 张,执行 4 次此命令
npu-smi set -t create-vnpu -i 0 -c 0 -f vir05_1c_16g

创建结果

设置恢复状态:配置 vNPU 恢复状态。该参数用于设备重启时保存 vNPU 配置信息,重启后 vNPU 配置依然有效:

npu-smi set -t vnpu-cfg-recover -d 1

查看 vnpu 创建信息:

npu-smi info -t info-vnpu -i 0 -c 0

查看信息

销毁 vnpu:

# -v 为 vnpu id,可在「查看 vnpu 创建信息」中查到
npu-smi set -t destroy-vnpu -i -c 0 -v xxx

销毁

注意:如果使用 MindX DL 动态虚拟化功能,则不需要提前创建 vNPU,MindX DL 运行任务时会自动按配置要求调用接口创建 vNPU。

注意:Ascend Docker Runtime 使用 vNPU,既可以先通过 npu-smi 工具创建 vNPU 再挂载到容器;也可以在拉起容器时直接通过 ASCEND_VISIBLE_DEVICESASCEND_VNPU_SPECS 参数,从物理芯片上虚拟化出多个 vNPU 并挂载至容器。参考:https://www.hiascend.com/document/detail/zh/mindx-dl/500/AVI/cpaug/cpaug_015.html

修改 device 插件信息

在 device-plugin 容器的 args 中添加 -volcanoType=false -presetVirtualDevice=true

containers:
- image: swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0
  name: device-plugin-01
  resources:
    requests:
      memory: 500Mi
      cpu: 500m
    limits:
      memory: 500Mi
      cpu: 500m
  command: [ "/bin/bash", "-c", "--"]
  args: [ "device-plugin -useAscendDocker=true -volcanoType=false -presetVirtualDevice=true -logFile=/var/log/mindx-dl/devicePlugin/devicePlugin.log -logLevel=0" ]
  securityContext:
    privileged: true
    readOnlyRootFilesystem: true

查看 node 是否有 vNPU 资源

kubectl describe node $nodename

节点资源

查看节点是否有 vir05_1c_16g 的资源。

启动 PyTorch 测试

使用昇腾 PyTorch 镜像测试是否可以在 pod 中看到并使用 vNPU。

注意:一个 pod 只能占用一张 vNPU 卡。

创建测试 pod:

测试 pod

kubectl apply -f pod.yaml

测试占用卡是否成功:

# 如果有 libgomp1 报错
apt-get update && apt-get install -y libgomp1

source /usr/local/Ascend/ascend-toolkit/set_env.sh
import torch
import torch_npu

# 创建 NPU 张量
a = torch.randn(3, 3).npu()
b = torch.randn(3, 3).npu()

# 矩阵乘法
c = torch.matmul(a, b)
print(c)

# 将结果移回 CPU
c_cpu = c.cpu()
print(c_cpu)

import torch
# import torch_npu  # torch_npu 2.5.1 及以后版本可以不用手动导包
x = torch.randn(2, 2).npu()
y = torch.randn(2, 2).npu()
z = x.mm(y)
print(z)

测试结果

最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki