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 以降である必要があります。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
[アドオン] ページで Kube Scheduler を見つけ、[設定] をクリックして [Kube Scheduler パラメーター] ダイアログボックスに移動し、enableReservation パラメーターを true に設定してから、[OK] をクリックします。
(オプション) 手順1:ack-kube-queue を使用したジョブのキューイングとクォータ管理
マルチクラスターフリート内でクォータ管理とキュー設定に 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 # 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: # 名前空間を設定します。 - defaultFleet インスタンスで次のコマンドを実行して、ElasticQuotaTree と Kube Queue によって作成されたキューを表示します。
kubectl get queue -n kube-queue予想される出力:
NAME AGE root-child-2-v5zxz 15d root-kdzw7 15d
手順2:マルチクラスター スケジューリングのための PyTorchJob の送信
Fleet インスタンスで PropagationPolicy を送信し、カスタムポリシーを Gang に設定します。
Gang スケジューリングポリシーのみの使用
ギャングスケジューリング機能を使用する場合、送信する
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: PyTorchJobElasticQuotaTree とギャングスケジューリングの使用
送信する
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 3m44sFleet インスタンスで次のコマンドを実行して、PyTorchJob がどの関連クラスターにスケジュールされているかを確認します。
kubectl describe pytorchjob pytorch-test予想される出力:
Normal ScheduleBindingSucceed 4m59s default-scheduler Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]}Fleet インスタンスで次のコマンドを実行して、関連クラスター内の PyTorchJob のステータスをクエリします。
kubectl amc get pytorchjob -M予想される出力:
NAME CLUSTER STATE AGE ADOPTION pytorch-test cfxxxxxx Running 6m23s YFleet インスタンスで次のコマンドを実行して、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 7m16sFleet インスタンスで次のコマンドを実行して、関連クラスター内の PyTorchJob の詳細を表示します。
kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml