更新时间:2024-08-17 GMT+08:00

组调度(Gang)

组调度(Gang)满足了调度过程中“All or nothing”的调度需求,避免Pod的任意调度导致集群资源的浪费,主要应用于AI、大数据等多任务协作场景。启用该能力后,可以解决分布式训练任务之间的资源忙等待和死锁等痛点问题,大幅度提升整体训练性能。

前提条件

组调度介绍

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调度能力,默认开启。

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“配置中心”,在右侧选择“调度配置”页签。
  3. “AI任务性能增强调度”配置中,选择是否开启“组调度 (Gang) ”

    启用该能力后,可增强集群业务的吞吐量,提高业务运行性能。

  4. 修改完成后,单击“确认配置”
  5. 配置完成后,可以在工作负载或Volcano Job中使用Gang调度能力。

    • 创建工作负载使用Gang调度能力
      1. 首先创建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才会被统一调度。
      2. 创建工作负载时,通过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。
    • 创建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