fix where cores=100 can’t be submitted
第四范式vGPU调度器满足了所有你对于管理GPU集群所需要的能力,包括:
GPU 共享: 每个任务可以只占用一部分显卡,多个任务可以共享一张显卡
可限制分配的显存大小: 你现在可以用显存来分配GPU,vGPU调度器会确保任务使用的显存不会超过分配数值
虚拟显存: 你可以超额使用显存,并将内存当作显存的交换区使用
无侵入: vGPU调度器兼容nvidia官方插件的显卡分配方式,所以安装完毕后,你不需要修改原有的任务文件就可以使用vGPU的功能。
k8s vGPU scheduler 在保留4pd-k8s-device-plugin(4paradigm/k8s-device-plugin)插件功能的基础上,添加了调度模块,以实现多个GPU节点间的负载均衡。k8s vGPU scheduler在原有显卡分配方式的基础上,可以进一步根据显存和算力来切分显卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器可以安全的共享同一张物理GPU,提高GPU的利用率。此外,插件还可以对显存做虚拟化处理(使用到的显存可以超过物理上的显存),运行一些超大显存需求的任务,或提高共享的任务数,可参考性能测试报告。
以下步骤要在所有GPU节点执行。这份README文档假定GPU节点已经安装NVIDIA驱动和nvidia-docker套件。
nvidia-docker
注意你需要安装的是nvidia-docker2而非nvidia-container-toolkit。因为新的--gpus选项kubernetes尚不支持。安装步骤举例:
nvidia-docker2
nvidia-container-toolkit
--gpus
# 加入套件仓库 $ 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 runtime做为你的docker runtime预设值。我们将编辑docker daemon的配置文件,此文件通常在/etc/docker/daemon.json路径:
/etc/docker/daemon.json
{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } }
如果 runtimes 字段没有出现, 前往的安装页面执行安装操作 nvidia-docker
runtimes
最后,你需要将所有要使用到的GPU节点打上gpu=on标签,否则该节点不会被调度到
$ kubectl label nodes {nodeid} gpu=on
首先使用helm添加我们的vgpu repo
helm repo add vgpu-charts https://4paradigm.github.io/k8s-vgpu-scheduler
随后,使用下列指令获取集群服务端版本
kubectl version
在安装过程中须根据集群服务端版本(上一条指令的结果)指定调度器镜像版本,例如集群服务端版本为1.16.8,则可以使用如下指令进行安装
$ helm install vgpu vgpu-charts/vgpu --set scheduler.kubeScheduler.imageTag=v1.16.8 -n kube-system
你可以修改这里的配置来定制安装
通过kubectl get pods指令看到 vgpu-device-plugin 与 vgpu-scheduler 两个pod 状态为Running 即为安装成功
vgpu-device-plugin
vgpu-scheduler
$ kubectl get pods -n kube-system
NVIDIA vGPUs 现在能透过资源类型nvidia.com/gpu被容器请求:
nvidia.com/gpu
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: containers: - name: ubuntu-container image: ubuntu:18.04 command: ["bash", "-c", "sleep 86400"] resources: limits: nvidia.com/gpu: 2 # 请求2个vGPUs nvidia.com/gpumem: 3000 # 每个vGPU申请3000m显存 (可选,整数类型) nvidia.com/gpucores: 30 # 每个vGPU的算力为30%实际显卡的算力 (可选,整数类型)
如果你的任务无法运行在任何一个节点上(例如任务的nvidia.com/gpu大于集群中任意一个GPU节点的实际GPU数量),那么任务会卡在pending状态
pending
现在你可以在容器执行nvidia-smi命令,然后比较vGPU和实际GPU显存大小的不同。
nvidia-smi
调度器部署成功后,监控默认自动开启,你可以通过
http://{nodeip}:{monitorPort}/metrics
来获取监控数据,其中monitorPort可以在Values中进行配置,默认为31992
注意 节点上的vGPU状态只有在其使用vGPU后才会被统计
只需要更新helm repo,并重新启动整个Chart即可自动完成更新,最新的镜像会被自动下载
$ helm uninstall vgpu -n kube-system $ helm repo update $ helm install vgpu vgpu -n kube-system
$ helm uninstall vgpu -n kube-system
调度策略为,在保证显存和算力满足需求的GPU中,优先选择任务数最少的GPU执行任务,这样做可以使任务均匀分配到所有的GPU中
在测试报告中,我们一共在下面五种场景都执行了ai-benchmark 测试脚本,并汇总最终结果:
测试内容
测试结果:
测试步骤:
$ kubectl apply -f benchmarks/ai-benchmark/ai-benchmark.yml
$ kubectl logs [pod id]
虚拟显存
vGPU的显存总和可以超过GPU实际的显存,这时候超过的部分会放到内存里,对性能有一定的影响。
以上框架均通过测试。
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
OpenAIOS vGPU scheduler for Kubernetes
目录
简介
第四范式vGPU调度器满足了所有你对于管理GPU集群所需要的能力,包括:
GPU 共享: 每个任务可以只占用一部分显卡,多个任务可以共享一张显卡
可限制分配的显存大小: 你现在可以用显存来分配GPU,vGPU调度器会确保任务使用的显存不会超过分配数值
虚拟显存: 你可以超额使用显存,并将内存当作显存的交换区使用
无侵入: vGPU调度器兼容nvidia官方插件的显卡分配方式,所以安装完毕后,你不需要修改原有的任务文件就可以使用vGPU的功能。
k8s vGPU scheduler 在保留4pd-k8s-device-plugin(4paradigm/k8s-device-plugin)插件功能的基础上,添加了调度模块,以实现多个GPU节点间的负载均衡。k8s vGPU scheduler在原有显卡分配方式的基础上,可以进一步根据显存和算力来切分显卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器可以安全的共享同一张物理GPU,提高GPU的利用率。此外,插件还可以对显存做虚拟化处理(使用到的显存可以超过物理上的显存),运行一些超大显存需求的任务,或提高共享的任务数,可参考性能测试报告。
使用场景
安装要求
快速入门
GPU节点准备
以下步骤要在所有GPU节点执行。这份README文档假定GPU节点已经安装NVIDIA驱动和
nvidia-docker
套件。注意你需要安装的是
nvidia-docker2
而非nvidia-container-toolkit
。因为新的--gpus
选项kubernetes尚不支持。安装步骤举例:你需要在节点上将nvidia runtime做为你的docker runtime预设值。我们将编辑docker daemon的配置文件,此文件通常在
/etc/docker/daemon.json
路径:最后,你需要将所有要使用到的GPU节点打上gpu=on标签,否则该节点不会被调度到
Kubernetes开启vGPU支持
首先使用helm添加我们的vgpu repo
随后,使用下列指令获取集群服务端版本
在安装过程中须根据集群服务端版本(上一条指令的结果)指定调度器镜像版本,例如集群服务端版本为1.16.8,则可以使用如下指令进行安装
你可以修改这里的配置来定制安装
通过kubectl get pods指令看到
vgpu-device-plugin
与vgpu-scheduler
两个pod 状态为Running 即为安装成功运行GPU任务
NVIDIA vGPUs 现在能透过资源类型
nvidia.com/gpu
被容器请求:如果你的任务无法运行在任何一个节点上(例如任务的
nvidia.com/gpu
大于集群中任意一个GPU节点的实际GPU数量),那么任务会卡在pending
状态现在你可以在容器执行
nvidia-smi
命令,然后比较vGPU和实际GPU显存大小的不同。监控vGPU使用情况
调度器部署成功后,监控默认自动开启,你可以通过
来获取监控数据,其中monitorPort可以在Values中进行配置,默认为31992
更新
只需要更新helm repo,并重新启动整个Chart即可自动完成更新,最新的镜像会被自动下载
卸载
调度策略
调度策略为,在保证显存和算力满足需求的GPU中,优先选择任务数最少的GPU执行任务,这样做可以使任务均匀分配到所有的GPU中
性能测试
使用场景
性能测试
在测试报告中,我们一共在下面五种场景都执行了ai-benchmark 测试脚本,并汇总最终结果:
测试内容
测试结果:
测试步骤:
功能
实验性功能
虚拟显存
vGPU的显存总和可以超过GPU实际的显存,这时候超过的部分会放到内存里,对性能有一定的影响。
已知问题
开发计划
测试
以上框架均通过测试。
反馈和参与
作者