昇腾 k8s vnpu配置
参考文档: https://www.hiascend.com/document/detail/zh/mindx-dl/500/AVI/cpaug/cpaug_018.html
此文档实现为NPU910B3卡
主机设置静态虚拟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模板名对应的配置
npu-smi set -t create-vnpu -i 0 -c 0 -f vir05_1c_16g
# 创建一张1c16G的vnpu,这是1/4之一的切分颗粒度,可以切分4张,执行4次此命令
设置恢复状态:配置vNPU恢复状态。该参数用于设备重启时,设备能够保存vNPU配置信息,重启后,vNPU配置依然有效。
npu-smi set -t vnpu-cfg-recover -d 1
查看vnpu创建信息
npu-smi info -t info-vnpu -i 0 -c 0
销毁vnpu
npu-smi set -t destroy-vnpu -i -c 0 -v xxx
# -v 为vnpu id 可以在查看nvpu创建信息中查看nvpu id为多少
注意: 如果使用MindX DL动态虚拟化功能,则不需要提前创建vNPU,MindX DL运行任务时自动按照配置要求调用接口创建vNPU。
注意:Ascend Docker Runtime使用vNPU,既可以先通过npu-smi工具创建vNPU,再将vNPU挂载到容器中;也可以在拉起容器时,直接通过ASCEND_VISIBLE_DEVICES和ASCEND_VNPU_SPECS参数从物理芯片上虚拟化出多个vNPU并挂载至容器
https://www.hiascend.com/document/detail/zh/mindx-dl/500/AVI/cpaug/cpaug_015.html#ZH-CN_TOPIC_0000001841176769__section514441719341
修改device插件信息
args中添加 -volcanoType=false -presetVirtualDevice=true
containers:
- image: swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-k8sdeviceplugin:v6.0.0name: device-plugin-01resources:requests:memory: 500Micpu: 500mlimits:memory: 500Micpu: 500mcommand: [ "/bin/bash", "-c", "--"]args: [ "device-plugin -useAscendDocker=true -volcanoType=false -presetVirtualDevice=true -logFile=/var/log/mindx-dl/devicePlugin/devicePlugin.log -logLevel=0" ]securityContext:privileged: truereadOnlyRootFilesystem: true
查看node是否有nvpu资源
kubectl describe node $nodename
查看节点是否有 vir05_1c_16g的资源
启动pytorch测试
使用昇腾pytorch镜像测试是否可以看到pod中vnpu和使用vnpu
注意:一个pod只能占用一张vnpu卡
创建测试pod。
kubectl apply -f pod.yaml
测试占用卡是否成功
# 如果有libgomp1报错
apt-get update && apt-get install -y libgomp1source /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_npu2.5.1及以后版本可以不用手动导包
x = torch.randn(2, 2).npu()
y = torch.randn(2, 2).npu()
z = x.mm(y)print(z)