ACK マネージドクラスター Pro で GPU コンピューティングジョブをデプロイする際に、スケジューリング属性ラベル (排他、共有、トポロジー対応など) と GPU モデルラベル (カードモデルスケジューリング用) を GPU ノードに割り当てることで、リソース使用率を最適化し、ワークロードを正確にスケジューリングできます。
スケジューリングラベルの概要
GPU スケジューリングラベルは、GPU モデルとリソース割り当てポリシーを識別し、きめ細かなリソース管理と効率的なスケジューリングを実現します。
|
スケジューリングモード |
ラベル値 |
ユースケース |
|
排他スケジューリング (デフォルト) |
|
モデルトレーニングやハイパフォーマンスコンピューティング (HPC) など、GPU 全体への排他的なアクセスを必要とするパフォーマンスクリティカルなタスク向けです。 |
|
共有スケジューリング |
|
GPU の使用率を向上させ、マルチテナントや推論など、複数の軽量タスクが同時に実行されるシナリオに最適です。
|
|
|
|
|
|
トポロジー対応スケジューリング |
|
単一ノード内の物理的な GPU トポロジーに基づいて、最適な GPU の組み合わせを Pod に自動的に割り当てます。GPU 間の通信レイテンシーに敏感なタスクに最適です。 |
|
カードモデルスケジューリング |
これらのラベルをカードモデルスケジューリングと併用して、GPU ジョブの GPU メモリ容量と GPU カードの総数を設定します。
|
特定の GPU モデルを持つノードにジョブをスケジューリングしたり、特定のモデルのノードを回避したりできます。 |
スケジューリング機能の有効化
1 つのノードで一度に有効にできる GPU スケジューリングモード (排他、共有、またはトポロジー対応) は 1 つだけです。あるモードを有効にすると、他のスケジューリングモードが報告する拡張リソースは自動的に 0 に設定されます。
排他スケジューリング
ノードに GPU スケジューリングラベルがない場合、排他スケジューリングが デフォルト モードになります。このモードでは、単一の GPU カードが Pod の最小割り当て単位となります。
他の GPU スケジューリングモードを有効にしている場合、ラベルを削除するだけでは排他スケジューリングは復元されません。復元するには、ラベル値を手動で ack.node.gpu.schedule: default に変更する必要があります。
共有スケジューリング
共有スケジューリングは ACK マネージドクラスター Pro でのみ利用可能です。詳細については、「制限事項」をご参照ください。
-
ack-ai-installerコンポーネントのインストールACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
クラウドネイティブ AI コンポーネントセット ページで、デプロイ をクリックします。クラウドネイティブ AI コンポーネントセット ページで、[スケジューリングポリシー拡張 (バッチタスクスケジューリング、GPU 共有、トポロジー対応 GPU スケジューリング)] を選択します。
cGPU サービスがサポートするコンピューティングスケジューリングポリシーの設定方法については、「cGPU コンポーネントのインストールと使用」をご参照ください。
-
クラウドネイティブ AI コンポーネントセット ページで、クラウドネイティブ AI コンポーネントセットのデプロイ をクリックします。
クラウドネイティブ AI コンポーネントセット ページのコンポーネントリストで、[ack-ai-installer] コンポーネントがインストールされていることを確認します。
-
共有スケジューリングの有効化
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側メニューで、 を選択します。
-
[ノードプール] ページで、[ノードプールの作成] をクリックし、ノードラベルを設定してから 注文の確認 をクリックします。
他の設定はデフォルト値のままにできます。ノードラベルのユースケースについては、「スケジューリングラベルの概要」をご参照ください。
-
基本的な共有スケジューリングの設定
ノードラベル (Labels) の追加アイコン
をクリックし、キー を ack.node.gpu.scheduleに設定し、ラベル値としてcgpu、core_mem、share、またはmps(MPS Control Daemon コンポーネントのインストール が必要です) のいずれかを選択します。 -
マルチカード共有スケジューリングの設定
ノードに複数の GPU カードがあり、リソース割り当てを最適化したい場合は、基本的な共有スケジューリングに加えて、さらにマルチカード共有スケジューリングを設定できます。
ノードラベル (Labels) の追加アイコン
をクリックし、キー を ack.node.gpu.placementに設定し、ラベル値としてbinpackまたはspreadのいずれかを選択します。
-
-
-
共有スケジューリングの確認
cgpu/share/mps<NODE_NAME> を対象ノードの名前に置き換えて、次のコマンドを実行し、
cgpu、share、またはmps共有スケジューリングが有効になっていることを確認します。kubectl get nodes <NODE_NAME> -o yaml | grep "aliyun.com/gpu-mem"出力例:
aliyun.com/gpu-mem: "60"aliyun.com/gpu-memフィールドの値がゼロ以外の場合、cgpu、share、またはmps共有スケジューリングが有効になっていることを意味します。core_mem<NODE_NAME>を対象ノードの名前に置き換えて、次のコマンドを実行し、core_mem共有スケジューリングが有効になっていることを確認します。kubectl get nodes <NODE_NAME> -o yaml | grep -E 'aliyun\.com/gpu-core\.percentage|aliyun\.com/gpu-mem'出力例:
aliyun.com/gpu-core.percentage:"80" aliyun.com/gpu-mem:"6"aliyun.com/gpu-core.percentageとaliyun.com/gpu-memフィールドの両方がゼロ以外の場合、core_mem共有スケジューリングが有効になっていることを意味します。binpack共有 GPU のGPU リソースクエリツールを使用し、次のコマンドを実行して、ノード上の GPU リソース割り当てを確認します。
kubectl inspect cgpu出力例:
NAME IPADDRESS GPU0(Allocated/Total) GPU1(Allocated/Total) GPU2(Allocated/Total) GPU3(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.0.2.109 192.0.2.109 15/15 9/15 0/15 0/15 24/60 -------------------------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 24/60 (40%)出力は、GPU0 が完全に割り当てられ (15/15)、GPU1 が部分的に割り当てられている (9/15) ことを示しています。このことから、1 つの GPU を完全に満たしてから次のリソースを割り当てる
binpack戦略が有効であることがわかります。spread共有スケジューリングのGPU リソースクエリツールを使用し、次のコマンドを実行して、ノード上の GPU リソース割り当てを確認します。
kubectl inspect cgpu出力例:
NAME IPADDRESS GPU0(Allocated/Total) GPU1(Allocated/Total) GPU2(Allocated/Total) GPU3(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.0.2.109 192.0.2.109 4/15 4/15 0/15 4/15 12/60 -------------------------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 12/60 (20%)出力は、割り当てられたリソースが GPU0 で 4/15、GPU1 で 4/15、GPU3 で 4/15 であることを示しています。これは、Pod を異なる GPU に分散させることを優先するスケジューリングポリシーと一致しており、
spreadポリシーが有効になったことを示しています。
トポロジー対応スケジューリング
トポロジー対応スケジューリングは ACK マネージドクラスター Pro でのみ利用可能です。詳細については、「システムコンポーネントのバージョン要件」をご参照ください。
-
トポロジー対応スケジューリングの有効化
<NODE_NAME> を対象ノードの名前に置き換えて、次のコマンドを実行し、ノードにラベルを追加してトポロジー対応 GPU スケジューリングを明示的に有効にします。
kubectl label node <NODE_NAME> ack.node.gpu.schedule=topologyノードでトポロジー対応 GPU スケジューリングを有効にすると、そのノードはトポロジー非対応の GPU ワークロードをサポートしなくなります。排他スケジューリングを復元するには、
kubectl label node <NODE_NAME> ack.node.gpu.schedule=default --overwriteコマンドを実行してラベルを変更します。 -
トポロジー対応スケジューリングの確認
<NODE_NAME> を対象ノードの名前に置き換えて、次のコマンドを実行し、ノードで
topology対応スケジューリングが有効になっていることを確認します。kubectl get nodes <NODE_NAME> -o yaml | grep aliyun.com/gpu出力例:
aliyun.com/gpu: "2"aliyun.com/gpuフィールドが 0 でない場合、topology対応スケジューリングが有効になっています。
カードモデルスケジューリング
指定した GPU モデルのノードにジョブをスケジューリングするか、特定のモデルを回避します。
-
GPU カードモデルの表示
次のコマンドを実行して、クラスター内のノードの GPU カードモデルをクエリします。
NVIDIA_NAME フィールドは GPU カードモデルを示します。
kubectl get nodes -L aliyun.accelerator/nvidia_name期待される出力は、次のようになります:
NAME STATUS ROLES AGE VERSION NVIDIA_NAME cn-shanghai.192.XX.XX.176 Ready <none> 17d v1.26.3-aliyun.1 Tesla-V100-SXM2-32GB cn-shanghai.192.XX.XX.177 Ready <none> 17d v1.26.3-aliyun.1 Tesla-V100-SXM2-32GB -
カードモデルスケジューリングの有効化
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
ジョブ ページで、YAML のリソースの作成 をクリックします。次の例を使用してアプリケーションを作成し、カードモデルスケジューリングを有効にします。
カードモデルの指定
GPU カードモデルスケジューリングラベルを使用して、アプリケーションが特定のカードモデルを持つノードで実行されるようにします。
コード
aliyun.accelerator/nvidia_name: "Tesla-V100-SXM2-32GB"内のTesla-V100-SXM2-32GBを、ノードの実際のカードモデルに置き換えてください。ジョブが作成された後、左側メニューから を選択します。Pod リストに、一致するノードへ正常にスケジューリングされたサンプル Pod が表示されます。これにより、GPU カードモデルラベルに基づくスケジューリングが正しく機能していることを確認できます。
カードモデルの除外
GPU カードモデルスケジューリングラベルをノードアフィニティおよびアンチアフィニティと組み合わせて使用し、アプリケーションが特定のカードモデルで実行されないようにします。
values: - "Tesla-V100-SXM2-32GB"内のTesla-V100-SXM2-32GBを、ノードの実際のカードモデルに置き換えてください。ジョブが作成された後、アプリケーションはラベルキーが
aliyun.accelerator/nvidia_nameで、値がTesla-V100-SXM2-32GBのノードにはスケジューリングされませんが、他のカードモデルを持つ GPU ノードにはスケジューリングできます。