编译

工具准备

安装必要的工具:

  • git
  • docker > 20.10
  • helm

下载代码

git clone https://gitcode.com/openFuyao/vNPU.git
cd vNPU
git submodule update --init --recursive

启动构建

cd vNPU/ci
# 使用默认参数构建,镜像版本号默认为1.0.0
sh build.sh
# 指定镜像版本号为1.1.1
sh build.sh 1.1.1

# 构建产物在vNPU/output下

在线部署

前置条件

  1. 已准备Kubernetes集群。
  2. 已以root用户安装昇腾HDK驱动。

操作步骤

  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 charts/yaml/namespace.yaml
  4. 通过helm chart部署npu-client-update、npu-device-plugin、xpu-exporter:helm install vxpu oci://cr.openfuyao.cn/charts/vxpu --version 0.0.0-latest
  5. 先使用root用户在主机OS上创建日志目录/var/log/volcano-admission、/var/log/volcano-controller、/var/log/volcano-scheduler,再通过charts/yaml/volcano-deployment.yaml部署volcano:kubectl apply -f charts/yaml/volcano-deployment.yaml
  6. 参考昇腾官方文档开启设备共享模式。对于910b芯片,HDK驱动25.5.0及以上版本才支持共享模式。例如,设置设备0所有芯片的容器共享模式为使能:npu-smi set -t device-share -i 0 -d 1

离线部署

前置条件

  1. 已准备Kubernetes集群。
  2. 已以root用户安装昇腾HDK驱动。

操作步骤

  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 charts/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,再通过charts/yaml/volcano-deployment.yaml部署volcano:kubectl apply -f charts/yaml/volcano-deployment.yaml

  7. 参考昇腾官方文档开启设备共享模式。对于910b芯片,HDK驱动25.5.0及以上版本才支持共享模式。例如,设置设备0所有芯片的容器共享模式为使能:npu-smi set -t device-share -i 0 -d 1

设置节点切分模式

vNPU支持软切分和硬切分两种切分模式,可按节点粒度设置切分模式。节点默认为软切分模式。通过Helm部署npu-device-plugin服务时可通过values.yaml或Helm命令行参数设置节点切分模式。

例如,在values.yaml中设置节点切分模式,然后通过Helm部署。

vnpuNodeMode:
  worker1:  # 节点名
    mode:"hard"  # 节点切分模式,hard|soft,默认为soft
  worker2:
    mode:"soft"

或者通过Helm命令行参数设置。例如:

helm upgrade --install vxpu ./vxpu-1.0.0.tgz -n xpu --set vnpuNodeMode.worker1.mode="hard"

Pod使用NPU

配置说明

业务Pod只需声明所需的vNPU资源,无需修改业务代码,vNPU的调度器和device plugin负责自动调度Pod到合适的节点合适的NPU设备上并挂载设备。

支持Pod设置切分模式,按照vNPU的数量、AICore、显存申请资源等。

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  annotations:
    huawei.com/vnpu-mode: "hard"  # 切分模式
    huawei.com/vnpu-hard-aicpu-level: "low" # 硬切分模式AI CPU分配策略
    huawei.com/vnpu-soft-scheduler-policy: "elastic"  # 软切分算力调度模式
spec:
    schedulerName: volcano  # 指定调度器名称为volcano
    containers:
        resources:
          limits:
            huawei.com/vnpu-number: 1  # 必选,vnpu数量。
            huawei.com/vnpu-cores: 5  # 可选,容器可使用的aicore使用率
            huawei.com/vnpu-memory.1Gi: 8 # 可选,容器可使用的显存
          requests:
            huawei.com/vnpu-number: 1  # 和limits配置相同
            huawei.com/vnpu-cores: 5   # 和limits配置相同
            huawei.com/vnpu-memory.1Gi: 8  # 和limits配置相同

配置说明:

配置项 功能 取值说明
huawei.com/vnpu-mode 配置切分模式 soft: 软切分
hard: 硬切分
可选,如果不设置,则由调度器自动选择
huawei.com/vnpu-hard-aicpu-level 配置硬切分模式AICPU分配策略 low: 低配
high: 高配
可选,默认为low
huawei.com/vnpu-soft-scheduler-policy 软切分算力调度模式 fixed-share: 固定配额
elastic: 弹性模式
best-effort: 争抢模式
可选,默认为fixed-share
spec.schedulerName 指定调度器名称 必须为volcano
huawei.com/vnpu-number vnpu数量 必选。取值范围:1 ~ 单节点物理设备总数。如果大于1,表示分配整卡。如果是软/硬切分,则只能为1。
huawei.com/vnpu-cores aicore使用率 可选。单位为1%。不配置则默认为100。对于软切分,fixed-share和elastic策略取值范围为1~100;对于best-effort策略,取值范围为0~100。对于硬切分,取值范围为1~100。
huawei.com/vnpu-memory.1Gi 显存大小 可选。单位为1Gi。对于软切分,不配置则默认表示使用单卡显存总量,不允许配置为0。对于硬切分,无需配置。

软切分算力调度模式说明:

模式名称 特点描述
固定配额模式(fixed-share) 各vNPU按配比严格执行时间片。 a. 若有暂未分配的vNPU资源,则在最后一个vNPU时间片消耗完时,睡眠一段时间。此时NPU将闲置空转。 b. 某vNPU上无任务运行,仍会按照给定比例消耗完该vNPU的时间片。
弹性模式(elastic) 由于固定配额模式可能出现NPU资源浪费,在此模式下,在各vNPU按配比执行时间片的基础上,为提高卡资源利用率,优化了调度逻辑。 a. 最后一个vNPU时间片消耗完,马上将NPU使用权释放给下一个vNPU,跳过睡眠逻辑。 b. 在某vNPU上无任务运行,则直接跳过未消耗完的时间片,切换至另一个vNPU。 c. 时间片借用机制:正在执行的vNPU在识别到卡资源空闲的情况下,允许其他vNPU借用该时间片内浪费的资源,使卡上资源不被浪费,进而提升整卡利用率。
争抢模式(best-effort) vNPU之间自行争抢NPU资源,该模式的资源利用率最高,但无法保证vNPU的QoS。

配置样例

例如,Pod使用软切分固定配额模式,声明1个vNPU,50%的AICore,8G显存:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  annotations:
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:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  annotations:
    huawei.com/vnpu-soft-scheduler-policy: "best-effort" 
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

使用硬切分,申请50%的AICore:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  annotations:
    huawei.com/vnpu-mode: "hard"
    huawei.com/vnpu-hard-aicpu-level: "low"
spec:
    schedulerName: volcano
    containers:
        resources:
          limits:
            huawei.com/vnpu-number: 1  
            huawei.com/vnpu-cores: 50  # AI Core百分比
          requests:
            huawei.com/vnpu-number: 1
            huawei.com/vnpu-cores: 50

Pod声明使用两张整卡:

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  annotations:
spec:
    schedulerName: volcano
    containers:
        resources:
          limits:
            huawei.com/vnpu-number: 2 
          requests:
            huawei.com/vnpu-number: 2

vNPU指标监控

xpu-exporter支持采集vNPU相关的监控指标对接Prometheus实现对NPU资源的精细化监控,NPU整卡指标可安装昇腾MindCluster的NPU Exporter采集。

vNPU支持采集的指标:

指标名 说明 label
xpu_vnpu_mode vNPU的切分模式 nodeName,nodeIp,npuUUid
xpu_vnpu_soft_scheduler_policy vNPU的软切分调度模式,硬切分不涉及 nodeName,nodeIp,npuUUid
xpu_vnpu_mem_util 每个vnpu的内存使用率 npuUUid,nodeName,nodeIp,podUid,cntrName,vnpuId,vnpuCoreLimit,vnpuMemLimit
xpu_vnpu_num 每个NPU卡上分配的vnpu数量 nodeName,nodeIp,npuUUid
xpu_vnpu_pod_num 每个NPU上分配了vnpu的pod数量 nodeName,nodeIp,npuUUid