组调度(Gang)
组调度(Gang)满足了调度过程中“All or nothing”的调度需求,避免Pod的任意调度导致集群资源的浪费,主要应用于AI、大数据等多任务协作场景。启用该能力后,可以解决分布式训练任务之间的资源忙等和死锁等痛点问题,大幅度提升整体训练性能。
前提条件
- 已创建v1.19及以上版本的集群,详情请参见创建Standard集群。
- 已安装Volcano插件,详情请参见Volcano调度器。
组调度介绍
Gang调度策略是volcano-scheduler的核心调度算法之一,它满足了调度过程中的“All or nothing”的调度需求,避免Pod的任意调度导致集群资源的浪费。具体算法是,观察Job下的Pod已调度数量是否满足了最小运行数量,当Job的最小运行数量得到满足时,为Job下的所有Pod执行调度动作,否则,不执行。
基于容器组概念的Gang调度算法十分适合需要多进程协作的场景。AI场景往往包含复杂的流程,Data Ingestion、Data Analysts、Data Splitting、Trainer、Serving、Logging等,需要一组容器进行协同工作,就很适合基于容器组的Gang调度策略。MPI计算框架下的多线程并行计算通信场景,由于需要主从进程协同工作,也非常适合使用Gang调度策略。容器组下的容器高度相关也可能存在资源争抢,整体调度分配,能够有效解决死锁。在集群资源不足的场景下,Gang的调度策略对于集群资源的利用率的提升是非常明显的。
配置组调度策略
安装Volcano后,您可通过“配置中心 > 调度配置”选择开启或关闭Gang调度能力,默认开启。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“配置中心”,在右侧选择“调度配置”页签。
- 在“AI任务性能增强调度”配置中,选择是否开启“组调度 (Gang) ”。
启用该能力后,可增强集群业务的吞吐量,提高业务运行性能。
- 修改完成后,单击“确认配置”。
- 配置完成后,可以在工作负载或Volcano Job中使用Gang调度能力。
- 创建工作负载使用Gang调度能力
- 首先创建PodGroup,需指定minMember和minResources信息如下:
apiVersion: scheduling.volcano.sh/v1beta1 kind: PodGroup metadata: name: pg-test1 spec: minMember: 3 minResources: cpu: 3 memory: 3Gi
- minMember:归属于当前PodGroup的一组Pod满足minMember数量时,才会被统一调度。
- minResources:集群空闲资源满足minResources要求时,该组Pod才会被统一调度。
- 创建工作负载时,通过schedulerName指定Volcano调度器,并通过annotation指定其归属的PodGroup,如下:
apiVersion: apps/v1 kind: Deployment metadata: name: podgroup-test labels: app: podgroup-test spec: replicas: 6 selector: matchLabels: app: podgroup-test template: metadata: annotations: scheduling.k8s.io/group-name: pg-test1 labels: app: podgroup-test spec: schedulerName: volcano containers: - name: test image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] resources: requests: cpu: 500m limits: cpu: 500m
- schedulerName:设置为volcano,表示使用Volcano调度该工作负载。
- scheduling.k8s.io/group-name:指定上一步中创建的PodGroup,示例为pg-test1。
- 首先创建PodGroup,需指定minMember和minResources信息如下:
- 创建Volcano Job使用Gang调度能力
创建Volcano Job时,仅需要指定minAvailable数量和schedulerName为volcano即可,Volcano调度器会自动创建并管理PodGroup,示例如下:
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: vcjob spec: schedulerName: volcano minAvailable: 2 tasks: - replicas: 4 name: "test" template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: requests: cpu: "1" restartPolicy: OnFailure
- 创建工作负载使用Gang调度能力