编译
工具准备
安装必要的工具:
- 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下
在线部署
前置条件
- 已准备Kubernetes集群。
- 已以root用户安装昇腾HDK驱动。
操作步骤
- 部署Ascend Docker Runtime,建议使用7.2.RC1+版本。以7.2.RC1版本为例,详细部署方式请参考昇腾官方文档。
- 为需要部署vnpu组件的节点增加label:
kubectl label node {nodename} huawei.com/vnpu=ready。 - 创建xpu Namespace:
kubectl apply -f charts/yaml/namespace.yaml。 - 通过helm chart部署npu-client-update、npu-device-plugin、xpu-exporter:
helm install vxpu oci://cr.openfuyao.cn/charts/vxpu --version 0.0.0-latest。 - 先使用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。 - 参考昇腾官方文档开启设备共享模式。对于910b芯片,HDK驱动25.5.0及以上版本才支持共享模式。例如,设置设备0所有芯片的容器共享模式为使能:
npu-smi set -t device-share -i 0 -d 1。
离线部署
前置条件
- 已准备Kubernetes集群。
- 已以root用户安装昇腾HDK驱动。
操作步骤
-
部署Ascend Docker Runtime,建议使用7.2.RC1+版本。以7.2.RC1版本为例,详细部署方式请参考昇腾官方文档。
-
为需要部署vnpu组件的节点增加label:
kubectl label node {nodename} huawei.com/vnpu=ready。 -
创建xpu Namespace:
kubectl apply -f charts/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,再通过charts/yaml/volcano-deployment.yaml部署volcano:
kubectl apply -f charts/yaml/volcano-deployment.yaml。 -
参考昇腾官方文档开启设备共享模式。对于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 |