目录
提供ListAndWatch获取设备信息(kubelet会调用)
Volcano Device plugin核心流程图
本质逻辑是共享GPU mem
- 不是mem硬隔离
- 也不是将GPU虚拟化为多个vGPU(这种vGPU是资源隔离的)
获取node上的GPU信息
通过nvml获取设备信息
-
设备数量
-
每个设备的MEM
向kubelet注册
ResourceName:例如volcano.sh/gpu-memory
kubelet会给node打标volcano.sh/gpu-memory = 虚拟设备的数量
Device Plugin给node打标
如果是gpu-memory模式,则打标
node.status.capacity
volcano.sh/gpu-number = 物理GPU数量
(gpu-number模式是device plugin打标,gpu-memory模式下,将资源注册到kubelet后,volcano.sh/gpu-memory这个标是kubelet打的)
提供ListAndWatch获取设备信息(kubelet会调用)
GPU mem一份是1M,在software上将GPU分成若干虚拟GPU
-
若是GPU mem共享(向kubelet注册的ResourceName=volcano.sh/gpu-memory),就将虚拟GPUs推给kubelet(注意是虚拟GPU设备,因一般以1M为一份,所以数量也就代表了mem的大小,这里是多张卡的总虚拟设备数)
-
虚拟GPU的ID=真实id-虚拟id
-
-
若是GPU number也即独享,就将物理GPU信息推给kubelet
提供Allocate(kubelet调用)
Device Plugin的Allocate重点是做一些pre工作,如生成配置等,返回给kubelet,然后kubelet带着这些配置调用docker,docker再调用docker runtime
参考ContainerAllocateResponse,Allocate会返回如下信息:
-
Envs
-
Mounts
-
Devices
-
Annotations
kubelet访问Device Plugin的Allocate接口,带入的参数是deviceIDs
并没有实际分配GPU资源
Volcano Device Plugin行为
-
获取所有pending的pod
-
找到需要分配GPU mem的pod
-
找到pod的Annotation里的volcano.sh/gpu-index(格式1,2,3,4,5,这个是kubelet分配的gpu的index)
-
更新pod的Annotation,volcano.sh/gpu-assigned = true(表示已分配)
-
生成ContainerAllocateResponse
-
Envs:(会设置到pod内)
-
NVIDIA_VISIBLE_DEVICES:
-
VOLCANO_GPU_ALLOCATED:实际申请的GPU mem大小
-
VOLCANO_GPU_MEMORY_TOTAL:GPU原始显存
-
-
实际的Allocate是Nvidia device plugin做的
Nvidia device plugin监听需要申请GPU资源的pod,然后做操作
Volcano Scheduler
维护node上的资源信息
-
获取node的status信息
-
找到capacity
-
volcano.sh/gpu-memory 多张卡的总mem
-
volcano.sh/gpu-number
-
-
每张卡创建一个Device,对应的mem=gpu-memory/gpu-number取的平均值
-
每个device对应一个pod list,记录device的资源被使用的情况
调度
-
遍历每个Device,计算Device上剩余的gpu-memory
-
找到符合要求的其中一个Device(ID排序取第一个)
-
为pod增加Annotation:volcano.sh/gpu-index = 找到的Device的ID