目录
为什么要有队列组件
AI任务队列调度是云原生MLOps中必备的功能。由于原生Kubernetes无法支持机器学习、并行计算等特殊场景的任务调度,因此出现了Kueue和Volcano这些调度组件。举例来说,tensorflow分布式训练中需要一个参数服务器和多个worker功能配合执行,就需要同时保证这n个pod正常执行或者等待,kubernetes原生的调度器是无法做到这些的,需要有队列组件配合tensorflow对应的operator共同来完成该作业。
队列设计
Kueue队列设计
Kueue队列中分为Cluster Queue和Local Queue,Cluster Queue通过Resource Flavor来进行资源范围的选定,可以为同一个Kubernetes集群设置多个Cluster Queue,将集群进行多维度异构划分,下图的用户组队列可以类比为Cluter Queue;每个Cluster Queue中可以定义多个Local Queue,Local Queue中定义命名空间将用户进行划分,下图的用户队列可以类比为命名空间,相当于每个用户属于一个Local Queue(用户队列),每个Local Queue又受他所属的Cluster Queue资源的限制。
Volcano队列设计
Volcano只能对整个Kubernetes集群中的所有资源进行队列限制,无法根据节点标签对资源进行硬隔离,如下图所示,Volcano中的Queue只能对资源大小进行限制,任务会被调度到任一节点上。每个用户属于一个Queue。
队列资源申请
两种队列组件都支持通过资源类别和大小进行队列的定义。
Kueue资源申请
apiVersion: kueue.x-k8s.io/v1beta1kind: ClusterQueue
metadata:
name: cluster-queue
spec:
namespaceSelector: {} # Available to all namespaces
queueingStrategy: BestEffortFIFO # Default queueing strategy
resourceGroups:
- coveredResources: ["cpu", "memory", "nvidia.com/gpu"]
flavors:
- name: "default-flavor"
resources:
- name: "cpu"
nominalQuota: 10
- name: "memory"
nominalQuota: 10Gi
- name: "nvidia.com/gpu"
nominalQuota: 2
Volcano资源申请
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: test
spec:
weight: 1
reclaimable: false
capability:
cpu: 2
nvidia.com/gpu: 2
对比总结
相同点
1、都支持队列资源的划分
不同点
1、Kueue具备多租户的概念,Volcano不具备此功能
2、Kueue可以用命名空间隔离队列资源,Volcano不具备此功能
3、Volcano支持多种调度策略,Kueue目前应该支持的调度策略较少
4、Kueue是谷歌背书,Volcano是华为背书
5、两者资源借用的方式不同,原理类似
6、Volcano只有一层队列,Kueue有两个层级的队列
7、从代码更新的角度看Kueue社区更加活跃
8、Volcano还支持GPU共享、工作流等功能,功能更加丰富
参考
如果大家关注MLOps相关的技术,欢迎大家点赞收藏关注👏👏👏