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

Container Service for Kubernetes:マルチクラスター PyTorchJob の優先度ベースのスケジューリング

最終更新日:Dec 13, 2025

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

アーキテクチャ

マルチマシンおよびマルチ GPU の分散トレーニングを実装し、トレーニングジョブの Pod が期待どおりに実行されるようにするには、ワークロードがスケジューリング中にギャングスケジューリングのセマンティクスに準拠する必要があります。トレーニングジョブのすべてのワークロードが実行されているか、どのワークロードも実行されていないかのどちらかでなければなりません。Fleet インスタンスは、Kube Queue と ACK Scheduler を使用して、複数のクラスターにまたがる 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 Scheduler を見つけ、[設定] をクリックして [Kube Scheduler パラメーター] ダイアログボックスに移動し、enableReservation パラメーターを true に設定してから、[OK] をクリックします。

(オプション) 手順1:ack-kube-queue を使用したジョブのキューイングとクォータ管理

マルチクラスターフリート内でクォータ管理とキュー設定に 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 # Elastic Quota グループは、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 を送信し、カスタムポリシーを Gang に設定します。

    Gang スケジューリングポリシーのみの使用

    ギャングスケジューリング機能を使用する場合、送信する 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                   Binding has been scheduled successfully. Result: {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 インスタンスで次のコマンドを実行して、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. Fleet インスタンスで次のコマンドを実行して、関連クラスター内の PyTorchJob の詳細を表示します。

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