參考文檔: 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)