
# 组调度（Gang）
组调度（Gang）满足了调度过程中"All or nothing"的调度需求，避免Pod的任意调度导致集群资源的浪费，主要应用于AI、大数据等多任务协作场景。启用该能力后，可以解决分布式训练任务之间的资源忙等待和死锁等痛点问题，大幅度提升整体训练性能。
#### 前提条件
- 已创建v1.19及以上版本的集群，详情请参见[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)。
- 已安装Volcano插件，详情请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
 
#### 组调度介绍
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控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
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
     ```
     
   
   
   
   
 
