vNPU_4984:基于 CANN ACL 与 volcano 的昇腾 NPU 虚拟化项目

vNPU项目基于CANN ACL Runtime API劫持技术和volcano调度器实现NPU虚拟化,提升资源利用率

Branch1Tags1

vNPU

概述

vNPU项目基于CANN ACL Runtime API劫持技术和volcano调度器实现昇腾NPU用户态虚拟化(软切分),支持多容器共享设备的同时具备显存和AICore资源的隔离能力,提升资源利用率。

NPU软切分主要目的是为了弥补昇腾原生NPU虚拟化实例特性(硬切分)的一些限制:

  1. 切分精度更细,软切分最多支持1切20,从而支持更多容器共享一张卡。
  2. 切分更灵活,AICore和显存资源支持独立切分比例,而硬切分基于固定模板切分资源,AICore和显存只能同比例切分。
  3. 不依赖硬件,适用范围广。

关键特性

  1. 支持NPU切分,一张NPU卡最多可切分为20个vNPU。AICore切分粒度最小5%,显存切分粒度最小1Gi。
  2. 支持AICore和显存隔离。ACore为时分复用,非严格隔离,算力隔离波动约小于整卡的10%。显存严格隔离。
  3. NPU资源调度策略支持binpack,尽量将任务分配到同一个NPU上。
  4. 支持只限制显存,不限制AICore,每个容器可独立设置。
  5. 支持采集vNPU相关监控指标上报对接Prometheus。
  6. 支持整卡调度,同一节点部分容器使用整卡,部分容器使用vNPU。
  7. 支持硬切分,同一集群部分节点使用硬切分,部分节点使用软切分。
  8. (规划中)支持资源超分和优先级调度。

使用方法

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

约束和限制

  1. 当前限制一个容器最多只能申请一个vNPU。
  2. 当前限制一个容器只能有一个进程可以使用vNPU。
  3. 只支持切分和限制AICore及显存容量,不支持AI CPU、VPC、VDEC、JEPGD等核的切分控制。
  4. 暂不支持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下

安装

  1. 部署Ascend Docker Runtime,建议使用7.2.RC1+版本。以7.2.RC1版本为例,详细部署方式请参考昇腾官方文档

  2. 为需要部署vnpu组件的节点增加label:kubectl label node {nodename} huawei.com/vnpu=ready

  3. 创建xpu Namespace:kubectl apply -f install/yaml/namespace.yaml

  4. 导入镜像包。以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
    
  5. 通过helm chart部署npu-client-update、npu-device-plugin、xpu-exporter:helm upgrade --install vxpu vxpu-1.0.0.tgz -n xpu --wait

  6. 先使用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

  7. 参考昇腾官方文档开启设备共享模式。对于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版本,最新版本待规划。

Introduction

vNPU项目基于CANN ACL Runtime API劫持技术和volcano调度器实现NPU虚拟化,提升资源利用率

Customize my domain