跳到主要内容

Volcano Device Plugin

官方文档:

注意: 本文档仅供参考。

1. 前置条件

运行 Volcano 设备插件的先决条件列表如下:

2. 快速入门

2.1 准备您的GPU节点

以下步骤需要在所有 GPU 节点上执行。本说明文档假设您已安装 NVIDIA 驱动程序和 nvidia-docker。

请注意,您需要安装的是 nvidia-docker2 软件包,而不是 nvidia-container-toolkit 软件包。这是因为--gpusKubernetes 尚未支持这些新选项。例如:

# Add the package repositories
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

您需要在节点上将 NVIDIA 运行时设置为默认运行时。我们将编辑 Docker 守护进程配置文件,该文件通常位于/etc/docker/daemon.json

{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}

如果runtimes尚未安装,请前往nvidia-docker的安装页面。

2.2 配置

您需要在 volcano-scheduler configMap 中启用 vgpu:

kubectl edit cm -n volcano-system volcano-scheduler-configmap

对于 Volcano v1.9 及更高版本,请使用以下配置映射。

kind: ConfigMap
apiVersion: v1
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
data:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: deviceshare
arguments:
deviceshare.VGPUEnable: true # enable vgpu
deviceshare.SchedulePolicy: binpack # scheduling policy. binpack / spread
- name: predicates
- name: proportion
- name: nodeorder
- name: binpack

2.3 共享模式

Volcano-vgpu 支持两种设备共享方式:HAMi-coredynamia-mig。一个节点可以使用HAMi-core,或Dynamic-mig。支持异构部署(节点的一部分使用 HAMi-core,另一部分使用 Dynamic-mig)。

简要介绍这两种模式:

HAMi-core 是由 HAMi 社区提供的用户层资源隔离器,适用于所有类型的 GPU。

Dynamic-mig 是一种硬件资源隔离器,适用于 Ampere 架构或更高版本的 GPU。

下表显示了汇总信息:

模式隔离需要 MIG GPU注解核心/内存控制推荐用于
HAMI-core软件(VCUDA)是的一般工作量
动态 MIG硬件是的是的MIG控制对绩效要求高的工作

您可以通过调整配置来设置共享模式并自定义安装。

2.4 在 Kubernetes 中启用 GPU 支持

在所有要使用的 GPU 节点上启用此选项后,您可以通过部署以下 Daemonset 在集群中启用 GPU 支持:

kubectl create -f volcano-vgpu-device-plugin.yml

2.5 请确认环境已准备就绪

检查节点状态,如果volcano.sh/vgpu-number包含在可分配资源中则没问题。

kubectl get node {node name} -oyaml
...
capacity:
volcano.sh/vgpu-memory: "89424"
volcano.sh/vgpu-number: "10" # vGPU resource

2.6 运行 VGPU 作业

可以通过在 resource.limit 中设置 "volcano.sh/vgpu-number"、"volcano.sh/vgpu-cores" 和 "volcano.sh/vgpu-memory" 来请求 VGPU。

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod1
annotations:
volcano.sh/vgpu-mode: "hami-core" # (Optional, 'hami-core' or 'mig')
spec:
schedulerName: volcano
containers:
- name: cuda-container
image: nvidia/cuda:9.0-devel
command: ["sleep"]
args: ["100000"]
resources:
limits:
volcano.sh/vgpu-number: 2 # requesting 2 gpu cards
volcano.sh/vgpu-memory: 3000 # (optinal)each vGPU uses 3G device memory
volcano.sh/vgpu-cores: 50 # (optional)each vGPU uses 50% core
EOF

您可以使用容器内的 nvidia-smi 来验证设备内存。

警告: 如果您在使用 NVIDIA 镜像的设备插件时未请求 GPU,则机器上的所有 GPU 都将暴露在您的容器内。容器使用的虚拟 GPU 数量不能超过该节点上的 GPU 数量。 您可以通过分配注解来指定此任务的模式volcano.sh/vgpu-mode;否则,两种模式均可用。

3. 监视器

volcano-scheduler-metrics 记录每个 GPU 使用情况和限制,访问以下地址获取这些指标。

curl {volcano scheduler cluster ip}:8080/metrics

您还可以通过访问以下地址来收集节点上的GPU 利用率GPU 内存使用情况pod 的 GPU 内存限制pod 的 GPU 内存使用情况指标:

curl {volcano device plugin pod ip}:9394/metrics