赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 分布式云容器平台ACK One
  4. 操作指南
  5. 多集群舰队
  6. 作业分发
  7. 如何在舰队集群中使用KubeQueue并通过Gang调度PyTorchJob

如何在舰队集群中使用KubeQueue并通过Gang调度PyTorchJob

  • 作业分发
  • 发布于 2025-04-18
  • 2 次阅读
文档编辑
文档编辑

PyTorch是广泛应用的机器学习框架,能够帮助模型开发人员实现多机多卡分布式训练。在Kubernetes中,您可以通过PyTorchJob提交PyTorch框架下的机器学习任务。本文介绍如何在舰队集群中使用ACK Kube Queue进行任务管理及如何在舰队集群下发资源时声明Gang调度要求。

架构信息

在实现多机多卡分布式训练时,为确保训练负载的Pod能够正常运行,通常需要任务负载在调度时满足Gang调度语义(任务的所有工作负载必须全部运行或全部不运行)。舰队通过ACK Kube Queue以及ACK Scheduler实现了多集群中的PyTorchJob调度,并且能够在调度时保障PyTorchJob工作负载上声明的Gang语义。

image

前提条件

  • 子集群已安装云原生AI套件(仅需部署Arena)。

  • 已授予RAM用户AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授权。

  • 已安装AMC命令行工具。具体操作,请参见AMC命令行帮助。

  • (可选)当集群开启了资源预留时,舰队将使用资源预留保障舰队集群的调度结果与子集群一致。当集群未开启资源预留时,舰队集群采用比较子集群所有节点剩余资源之和与任务需求资源之和的方式进行资源评估以及任务调度。开启资源预留的方式如下。

    说明

    开启资源预留需要集群版本不低于1.28,且调度器版本不低于6.8.0。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表。

    2. 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理。

    3. 在组件管理页面,找到Kube Scheduler组件,单击配置进入参数配置页面,将enableReservation设置为true,然后单击确定。

步骤一:使用Kube Queue进行任务排队及配额管理(可选)

多集群舰队中通过ElasticQuotaTree进行配额管理以及队列配置,能够帮助您解决在多用户场景下大量任务的排队问题。

  1. 使用以下示例内容,提交ElasticQuotaTree。

    集群管理员可以在舰队中提交ElasticQuotaTree来配置任务队列。本示例将在default命名空间中设置配额,总共10000CPU、10000Gi内存、10000GPU以及1个任务。

    apiVersion: scheduling.sigs.k8s.io/v1beta1
    kind: ElasticQuotaTree
    metadata:
      name: elasticquotatree # 只支持单个ElasticQuotaTree。
      namespace: kube-system # 只有kube-system下才会生效。
    spec:
      root:
        name: root # Root节点的Max必须等于Min。
        max:
          cpu: 999900
          memory: 400000Gi
          kube-queue/max-jobs: 10000000000
          nvidia.com/gpu: 100000
        min:
          cpu: 9999
          memory: 40Gi
        children:
        - name: child-2
          max:
            # 限制同时只能出队一个任务。
            kube-queue/max-jobs: 1
            cpu: 10000
            nvidia.com/gpu: 10000
            memory: 10000Gi
          namespaces: # 配置对应的Namespace。
            - default
  2. 在舰队实例中执行以下命令,查看ElasticQuotaTree及KubeQueue创建的队列。

    kubectl get queue -n kube-queue

    预期输出:

    NAME                 AGE
    root-child-2-v5zxz   15d
    root-kdzw7           15d

步骤二:提交PyTorchJob进行多集群调度

  1. 在舰队实例中提交PropagationPolicy,并指定自定义策略为Gang。

    仅使用Gang调度策略

    在使用Gang调度能力时,需要在提交的PropagationPolicy中使用customSchedulingType=Gang的自定义调度策略。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # The default namespace is `default`.
    spec:
      propagateDeps: true
      # 申明任务运行失败时重新调度。
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # 声明使用Gang调度。
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob

    使用ElasticQuotaTree及Gang调度策略

    需要在提交的PropagationPolicy中使用customSchedulingType=Gang的自定义调度策略,并将.Spec.Suspension.Scheduling设置为true,表明需要进入Queue队列进行排队。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # The default namespace is `default`.
    spec:
      propagateDeps: true
      # 申明任务运行失败时重新调度。
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # 声明使用Gang调度。
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob
  2. 在舰队实例中使用以下示例内容,提交PyTorchJob。

    展开查看PyTorchJob示例YAML

    apiVersion: kubeflow.org/v1
    kind: PyTorchJob
    metadata:
      labels:
        app: pytorchjob
      name: pytorch-test
      namespace: default
    spec:
      cleanPodPolicy: None
      pytorchReplicaSpecs:
        Master:
          replicas: 1
          restartPolicy: Never
          template:
            metadata:
              labels:
                app: pytorchjob
              name: pytorch-test
            spec:
              schedulerName: default-scheduler
              containers:
              - command:
                - sh
                - -c
                - sleep 1h
                env:
                - name: NVIDIA_VISIBLE_DEVICES
                  value: void
                - name: gpus
                  value: "0"
                - name: workers
                  value: "8"
                image: registry-cn-hangzhou.ack.aliyuncs.com/acs/nginx
                imagePullPolicy: Always
                name: pytorch
                resources:
                  limits:
                    cpu: "3"
                  requests:
                    cpu: "10m"
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
                workingDir: /root
              volumes:
              - emptyDir:
                  medium: Memory
                  sizeLimit: 2Gi
                name: dshm
        Worker:
          replicas: 2
          restartPolicy: OnFailure
          # restartPolicy: Never
          template:
            metadata:
              labels:
                app: pytorchjob
              name: pytorch-test
            spec:
              containers:
              - command:
                - bash
                - -c
                - |
                  #!/bin/bash
                  #sleep 180
                  echo "$WORKER_INDEX"
                  #if [[ "$WORKER_INDEX" == "0" ]]
                  #then
                  #  exit -1
                  #fi
                  sleep 1h
                env:
                - name: WORKER_INDEX
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.labels['pytorch-replica-index']
                - name: NVIDIA_VISIBLE_DEVICES
                  value: void
                - name: gpus
                  value: "0"
                - name: workers
                  value: "8"
                image: registry-cn-hangzhou.ack.aliyuncs.com/acs/nginx
                imagePullPolicy: Always
                name: pytorch
                resources:
                  limits:
                    cpu: "2"
                  requests:
                    cpu: "2"
                    memory: "2Gi"
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
                workingDir: /root
              volumes:
              - emptyDir:
                  medium: Memory
                  sizeLimit: 2Gi
                name: dshm

步骤三:查看任务状态

  1. 在舰队实例中执行以下命令,查看PyTorchJob任务的状态。

    kubectl get pytorchjob

    预期输出:

    NAME           STATE     AGE
    pytorch-test   Created   3m44s
  2. 在舰队中执行以下命令,在事件中查看PyTorchJob任务调度至哪个关联集群。

    kubectl describe pytorchjob pytorch-test

    预期输出:

     Normal   ScheduleBindingSucceed  4m59s                   default-scheduler                   Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]}
  3. 在舰队中执行以下命令,查看关联集群中的PyTorchJob任务的状态。

    kubectl amc get pytorchjob -M

    预期输出:

    NAME           CLUSTER    STATE     AGE     ADOPTION
    pytorch-test   cfxxxxxx   Running   6m23s   Y
  4. 在舰队中执行以下命令,查看Pod状态。

    kubectl amc get pod -M   

    预期输出:

    NAME                    CLUSTER    READY   STATUS      RESTARTS   AGE
    pytorch-test-master-0   cfxxxxxx   1/1     Running     0          7m16s
    pytorch-test-worker-0   cfxxxxxx   1/1     Running     0          7m16s
    pytorch-test-worker-1   cfxxxxxx   1/1     Running     0          7m16s
  5. 在舰队中执行以下命令,查看关联集群中PyTorchJob任务的详情。

    kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml
相关文章

如何在舰队集群中使用KubeQueue并通过Gang调度PyTorchJob 2025-04-18 18:10

PyTorch是广泛应用的机器学习框架,能够帮助模型开发人员实现多机多卡分布式训练。在Kubernetes中,您可以通过PyTorchJob提交PyTorch框架下的机器学习任务。本文介绍如何在舰队集群中使用ACK Kube Queue进行任务管理及如何在舰队集群下发资源时声明Gang调度要求。 架

Spark作业的多集群调度与分发 2025-04-18 18:10

Apache Spark是一种专门用于大规模数据处理的计算引擎,广泛应用于数据分析和机器学习等场景。本文介绍如何通过ACK One舰队将Spark作业在多集群中进行调度和分发运行,帮助您提升多集群中空闲资源利用率。 工作原理

基于实际剩余资源的多集群Spark作业调度与分发 2025-04-18 18:10

如果您已经拥有多个正在运行在线服务的ACK集群,并希望在不影响这些服务的情况下,充分利用集群的空闲资源来运行Spark作业,您可以利用ACK One舰队的多集群Spark作业调度和分发能力来提高资源利用率。本文将介绍如何通过ACK One舰队和ACK Koordinator组件,根据各集群实际剩余资

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号