vNPU项目基于CANN ACL Runtime API劫持技术和volcano调度器实现NPU虚拟化,提升资源利用率
vNPU
概述
vNPU项目基于CANN ACL Runtime API劫持技术和volcano调度器实现昇腾NPU用户态虚拟化(软切分),支持多容器共享设备的同时具备显存和AICore资源的隔离能力,提升资源利用率。
NPU软切分主要目的是为了弥补昇腾原生NPU虚拟化实例特性(硬切分)的一些限制:
- 切分精度更细,软切分最多支持1切20,从而支持更多容器共享一张卡。
- 切分更灵活,AICore和显存资源支持独立切分比例,而硬切分基于固定模板切分资源,AICore和显存只能同比例切分。
- 不依赖硬件,适用范围广。
关键特性
- 支持NPU切分,一张NPU卡最多可切分为20个vNPU。AICore切分粒度最小5%,显存切分粒度最小1Gi。
- 支持AICore和显存隔离。ACore为时分复用,非严格隔离,算力隔离波动约小于整卡的10%。显存严格隔离。
- NPU资源调度策略支持binpack,尽量将任务分配到同一个NPU上。
- 支持只限制显存,不限制AICore,每个容器可独立设置。
- 支持采集vNPU相关监控指标上报对接Prometheus。
- 支持整卡调度,同一节点部分容器使用整卡,部分容器使用vNPU。
- 支持硬切分,同一集群部分节点使用硬切分,部分节点使用软切分。
- (规划中)支持资源超分和优先级调度。
使用方法
POD声明NPU资源
业务Pod只需声明所需的vNPU资源,vNPU的调度器和device plugin负责自动调度Pod到合适的节点合适的NPU设备上并挂载设备。
支持Pod按照vNPU的数量、AICore、显存申请资源。
spec:
schedulerName: volcano # 指定调度器名称为volcano
containers:
resources:
limits:
huawei.com/vnpu-number: 1 # 必选,vnpu数量。如果要限制AICore,则只能为1。使用整卡支持大于1。如果不配置,则不为该容器分配NPU资源。
huawei.com/vnpu-cores: 5 # 可选,容器可使用的aicore使用率,单位为5%,必须为5的倍数。不配置则默认为100,表示独占整卡。配置为0表示不限制,且其他容器也能共享同一张卡。
huawei.com/vnpu-memory.1Gi: 8 # 可选,容器可使用的显存,单位为1Gi。不配置则默认表示使用单卡显存总量。不允许配置为0。
requests:
huawei.com/vnpu-number: 1
huawei.com/vnpu-cores: 5
huawei.com/vnpu-memory.1Gi: 8
例如,Pod声明1个vNPU,50%的AICore,8G显存:
spec:
schedulerName: volcano
containers:
resources:
limits:
huawei.com/vnpu-number: 1
huawei.com/vnpu-cores: 50
huawei.com/vnpu-memory.1Gi: 8
requests:
huawei.com/vnpu-number: 1
huawei.com/vnpu-cores: 50
huawei.com/vnpu-memory.1Gi: 8
只限制显存为8G,不限制AICore:
spec:
schedulerName: volcano
containers:
resources:
limits:
huawei.com/vnpu-number: 1
huawei.com/vnpu-cores: 0
huawei.com/vnpu-memory.1Gi: 8
requests:
huawei.com/vnpu-number: 1
huawei.com/vnpu-cores: 0
huawei.com/vnpu-memory.1Gi: 8
Pod申明使用两张整卡:
spec:
schedulerName: volcano
containers:
resources:
limits:
huawei.com/vnpu-number: 2
requests:
huawei.com/vnpu-number: 2
约束和限制
- 当前限制一个容器最多只能申请一个vNPU。
- 当前限制一个容器只能有一个进程可以使用vNPU。
- 只支持切分和限制AICore及显存容量,不支持AI CPU、VPC、VDEC、JEPGD等核的切分控制。
- 暂不支持GE图引擎接口。
代码结构
- direct:劫持CANN runtime API,实现AICore和显存的隔离。
- volcano-xpu-plugin:volcano插件,实现NPU虚拟化资源调度。
- xpu-device-plugin:设备插件,实现NPU资源上报和分配。
- client_update:负责direct劫持库的部署。
- xpu-exporter:负责vNPU指标的上报。
- ci:编译构建脚本。
- install:vNPU组件部署相关的文件。
编译构建
工具准备
安装必要的工具:
- git
- gcc
- go
- cmake: version > 3.22.0
- make
- docker
- helm
下载代码
git clone https://gitcode.com/openFuyao/vNPU.git
cd vNPU
git submodule update --init --recursive
安装昇腾HDK驱动和CANN
NPU劫持库依赖HDK驱动和CANN的头文件及动态库。
版本要求:HDK推荐使用Ascend-hdk-910b-npu-driver_25.x.x或Ascend-hdk-310p-npu-driver_25.x.x,CANN推荐使用Ascend-cann-toolkit_8.x.x。
安装HDK驱动到指定目录,例如/usr/local/Ascend,然后设置环境变量:
export ENPU_ASCEND_DRIVER_PATH=/usr/local/Ascend
安装CANN Ascend-cann-toolkit包到指定目录,例如/opt/tmp/CANN/ascend-toolkit,然后执行source /opt/tmp/CANN/ascend-toolkit/set_env.sh设置环境变量ASCEND_TOOLKIT_HOME。
启动构建
cd vNPU/ci
# 使用默认参数构建,镜像版本号默认为1.0.0
sh build_xpu_package.sh
# 指定镜像版本号为1.1.1
sh build_xpu_package.sh 1.1.1
# 构建产物在vNPU/output下
安装
-
部署Ascend Docker Runtime,建议使用7.2.RC1+版本。以7.2.RC1版本为例,详细部署方式请参考昇腾官方文档。
-
为需要部署vnpu组件的节点增加label:
kubectl label node {nodename} huawei.com/vnpu=ready。 -
创建xpu Namespace:
kubectl apply -f install/yaml/namespace.yaml。 -
导入镜像包。以containerd本地镜像为例:
# 镜像包名称请以实际为准 ctr -n k8s.io images import acl_client_update-1.0.0-aarch64.tar ctr -n k8s.io images import npu_device_plugin-1.0.0-aarch64.tar ctr -n k8s.io images import xpu_exporter-1.0.0-aarch64.tar ctr -n k8s.io images import vc_controller_manager-1.9.0-aarch64.tar ctr -n k8s.io images import vc_scheduler-1.9.0-aarch64.tar ctr -n k8s.io images import vc_webhook_manager-1.9.0-aarch64.tar -
通过helm chart部署npu-client-update、npu-device-plugin、xpu-exporter:
helm upgrade --install vxpu vxpu-1.0.0.tgz -n xpu --wait。 -
先使用root用户在主机OS上创建日志目录/var/log/volcano-admission、/var/log/volcano-controller、/var/log/volcano-scheduler,再通过install/yaml/volcano-deployment.yaml部署volcano:
kubectl apply -f install/yaml/volcano-deployment.yaml。 -
参考昇腾官方文档开启设备共享模式。对于910b芯片,HDK驱动25.5.0及以上版本才支持共享模式。对于不支持共享模式的场景,需业务容器设置为特权容器。例如,设置设备0所有芯片的容器共享模式为使能:
npu-smi set -t device-share -i 0 -d 1。
FAQ
支持的NPU型号
vNPU理论上不依赖具体NPU型号,当前仅在310P和910B充分验证,其它NPU型号暂未验证。
支持的HDK和CANN版本
当前适配了HDK 25.x.x和CANN 8.5.0以下版本。
支持的volcano版本
当前支持volcano 1.9.0版本,最新版本待规划。