すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Fleet インスタンスで Kube Queue を使用し、ギャングスケジューリングを使用して PyTorchJob をスケジュールする

最終更新日:Jun 05, 2025

PyTorch は、モデル開発者がマルチマシンおよびマルチ GPU 分散トレーニングジョブを実装するのに役立つ、広く使用されている機械学習フレームワークです。 Kubernetes では、PyTorchJob を使用して PyTorch フレームワーク内で機械学習ジョブを送信できます。 このトピックでは、Kube Queue を使用して Fleet インスタンス上のジョブを管理する方法と、Fleet インスタンスにリソースを割り当てるときにギャングスケジューリング機能を使用する方法について説明します。

アーキテクチャ

マルチマシンおよびマルチ GPU 分散トレーニングを実装し、トレーニングジョブのポッドが期待どおりに実行されるようにするには、ワークロードはスケジューリング中にギャングスケジューリングセマンティクスに準拠する必要があります。 トレーニングジョブのすべてのワークロードが実行されているか、ワークロードが実行されていない必要があります。 Fleet インスタンスは、Kube Queue と ACK スケジューラを使用して、複数のクラスタにわたる PyTorchJob のスケジューリングを実装し、PyTorchJob で宣言されたギャングセマンティクスがスケジューリング中に維持されるようにします。

前提条件

  • クラウドネイティブ AI スイートがサブクラスタにインストールされています。 [Arena] のみデプロイする必要があります。

  • Resource Access Management (RAM) ポリシー AliyunAdcpFullAccess が RAM ユーザーにアタッチされています。 詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

  • AMC コマンドラインツールがインストールされています。 詳細については、「AMC を使用する」をご参照ください。

  • (オプション) クラスタでリソース予約が有効になっている場合、Fleet インスタンスはリソース予約を使用して、Fleet インスタンスのスケジューリング結果がサブクラスタのスケジューリング結果と同じになるようにします。 クラスタでリソース予約が無効になっている場合、Fleet インスタンスは、サブクラスタ内のすべてのノードの残りのリソースの合計数と必要なリソースの合計数を比較することにより、リソースを評価し、ジョブをスケジュールします。 次のセクションでは、リソース予約を有効にする方法について説明します。

    説明

    リソース予約を有効にするには、クラスタの Kubernetes バージョンが 1.28 以降であり、スケジューラバージョンが 6.8.0 以降である必要があります。

    1. ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスタ] をクリックします。

    2. [クラスタ] ページで、管理するクラスタを見つけて名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

    3. [アドオン] ページで、[Kube スケジューラ] コンポーネントを見つけ、[構成] をクリックして [Kube スケジューラパラメータ] ページに移動し、[enableReservation] パラメータを [true] に設定して、[OK] をクリックします。

(オプション) ステップ 1: ack-kube-queue を使用してジョブをキューイングし、クォータを管理する

マルチクラスタ Fleet では、ElasticQuotaTree を使用してクォータを管理し、キューを構成できます。 これは、マルチユーザーシナリオで多数のジョブをキューイングするのに役立ちます。

  1. 次のサンプルコードは、ElasticQuotaTree を送信する方法の例を示しています。

    クラスタ管理者は、Fleet インスタンスで ElasticQuotaTree を送信してジョブキューを構成できます。 この例では、default 名前空間のクォータが構成されており、合計 10000 CPU、10000 GiB メモリ、10000 GPU、および 1 ジョブが含まれています。

    apiVersion: scheduling.sigs.k8s.io/v1beta1
    kind: ElasticQuotaTree
    metadata:
      name: elasticquotatree # 単一の ElasticQuotaTree のみがサポートされています。
      namespace: kube-system # エラスティッククォータグループは、kube-system 名前空間にグループを作成した場合にのみ有効になります。
    spec:
      root:
        name: root # ルートの最大リソース量は、ルートの最小リソース量と等しくなければなりません。
        max:
          cpu: 999900
          memory: 400000Gi
          kube-queue/max-jobs: 10000000000
          nvidia.com/gpu: 100000
        min:
          cpu: 999900
          memory: 400000Gi
          kube-queue/max-jobs: 10000000000
          nvidia.com/gpu: 100000
        children:
        - name: child-2
          max:
            # 一度にデキューできるジョブは 1 つだけです。
            kube-queue/max-jobs: 1
            cpu: 10000
            nvidia.com/gpu: 10000
            memory: 10000Gi
          namespaces: # 名前空間を構成します。
            - default
  2. Fleet インスタンスで次のコマンドを実行して、ElasticQuotaTree と Kube Queue によって作成されたキューを表示します。

    kubectl get queue -n kube-queue

    予期される出力:

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

ステップ 2: マルチクラスタスケジューリング用の PyTorchJob を送信する

  1. Fleet インスタンスで PropagationPolicy を送信し、カスタムポリシーをギャングに設定します。

    ギャングスケジューリングポリシーのみを使用する

    ギャングスケジューリング機能を使用する場合は、送信された PropagationPolicycustomSchedulingType=Gang パラメータを指定する必要があります。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # デフォルトの名前空間は `default` です。
    spec:
      propagateDeps: true
      # ジョブの実行に失敗した場合にジョブを再スケジュールします。
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # ギャングスケジューリングを使用します。
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob

    ElasticQuotaTree とギャングスケジューリングを使用する

    送信された PropagationPolicycustomSchedulingType=Gang パラメータを指定し、.Spec.Suspension.Schedulingtrue に設定する必要があります。 これにより、ジョブをキューに追加してスケジューリングできます。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # デフォルトの名前空間は `default` です。
    spec:
      suspension:
        scheduling: true
      propagateDeps: true
      # ジョブの実行に失敗した場合にジョブのスケジュールを解除します。
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # ギャングスケジューリングを使用します。
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob
  2. 次のサンプルコードは、Fleet インスタンスで 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

ステップ 3: ジョブステータスを表示する

  1. Fleet インスタンスで次のコマンドを実行して、PyTorchJob のステータスをクエリします。

    kubectl get pytorchjob

    予期される出力:

    NAME           STATE     AGE
    pytorch-test   Created   3m44s
  2. Fleet インスタンスで次のコマンドを実行して、PyTorchJob がスケジュールされている関連付けられたクラスタを確認します。

    kubectl describe pytorchjob pytorch-test

    予期される出力:

     Normal   ScheduleBindingSucceed  4m59s                   default-scheduler                   バインディングは正常にスケジュールされました。 結果: {cfxxxxxx:0,[{master 1} {worker 2}]}
  3. Fleet インスタンスで次のコマンドを実行して、関連付けられたクラスタ内の PyTorchJob のステータスをクエリします。

    kubectl amc get pytorchjob -M

    予期される出力:

    NAME           CLUSTER    STATE     AGE     ADOPTION
    pytorch-test   cfxxxxxx   Running   6m23s   Y
  4. Fleet インスタンスで次のコマンドを実行して、ポッドのステータスをクエリします。

    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. Fleet インスタンスで次のコマンドを実行して、関連付けられたクラスタ内の PyTorchJob の詳細を表示します。

    kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml