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 以降である必要があります。
ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[Kube スケジューラ] コンポーネントを見つけ、[構成] をクリックして [Kube スケジューラパラメータ] ページに移動し、[enableReservation] パラメータを [true] に設定して、[OK] をクリックします。
(オプション) ステップ 1: ack-kube-queue を使用してジョブをキューイングし、クォータを管理する
マルチクラスタ Fleet では、ElasticQuotaTree を使用してクォータを管理し、キューを構成できます。 これは、マルチユーザーシナリオで多数のジョブをキューイングするのに役立ちます。
次のサンプルコードは、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
Fleet インスタンスで次のコマンドを実行して、ElasticQuotaTree と Kube Queue によって作成されたキューを表示します。
kubectl get queue -n kube-queue
予期される出力:
NAME AGE root-child-2-v5zxz 15d root-kdzw7 15d
ステップ 2: マルチクラスタスケジューリング用の PyTorchJob を送信する
Fleet インスタンスで PropagationPolicy を送信し、カスタムポリシーをギャングに設定します。
ギャングスケジューリングポリシーのみを使用する
ギャングスケジューリング機能を使用する場合は、送信された
PropagationPolicy
でcustomSchedulingType=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 とギャングスケジューリングを使用する
送信された
PropagationPolicy
でcustomSchedulingType=Gang
パラメータを指定し、.Spec.Suspension.Scheduling
をtrue
に設定する必要があります。 これにより、ジョブをキューに追加してスケジューリングできます。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
次のサンプルコードは、Fleet インスタンスで PyTorchJob を送信する方法の例を示しています。
ステップ 3: ジョブステータスを表示する
Fleet インスタンスで次のコマンドを実行して、PyTorchJob のステータスをクエリします。
kubectl get pytorchjob
予期される出力:
NAME STATE AGE pytorch-test Created 3m44s
Fleet インスタンスで次のコマンドを実行して、PyTorchJob がスケジュールされている関連付けられたクラスタを確認します。
kubectl describe pytorchjob pytorch-test
予期される出力:
Normal ScheduleBindingSucceed 4m59s default-scheduler バインディングは正常にスケジュールされました。 結果: {cfxxxxxx:0,[{master 1} {worker 2}]}
Fleet インスタンスで次のコマンドを実行して、関連付けられたクラスタ内の PyTorchJob のステータスをクエリします。
kubectl amc get pytorchjob -M
予期される出力:
NAME CLUSTER STATE AGE ADOPTION pytorch-test cfxxxxxx Running 6m23s Y
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
Fleet インスタンスで次のコマンドを実行して、関連付けられたクラスタ内の PyTorchJob の詳細を表示します。
kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml