Container Service for Kubernetes (ACK) マネージドクラスター プロ版では、GPU ノードにスケジューリングラベルを割り当てることで、GPU リソースをワークロードに割り当てる方法を制御できます。これらのラベルを使用すると、排他アクセス、複数 Pod 間でのコンピュート共有、トポロジー対応の割り当て、またはハードウェアモデルベースのルーティングを設定でき、リソース使用率とワークロードの配置を詳細に制御できます。
スケジューリングラベルの概要
GPU スケジューリングラベルは、ノードのリソース割り当てポリシーを定義します。ノードは一度に 1 つの GPU スケジューリングモード (排他、共有、またはトポロジー対応) のみをサポートします。1 つのモードを有効にすると、他のすべてのモードの拡張リソースは自動的に 0 に設定されます。
4 つのスケジューリングモードは、コンピュートが隔離されているか、およびGPU メモリが隔離されているかという 2 つの主要な側面で異なります。モードを選択する際の出発点として、これらを参考にしてください。
| スケジューリングモード | ラベル | 利用シーン |
|---|---|---|
| 排他スケジューリング (デフォルト) | ack.node.gpu.schedule: default | GPU 全体を必要とするパフォーマンスクリティカルなワークロード (モデルトレーニング、ハイパフォーマンスコンピューティング (HPC) など)。 |
| 共有スケジューリング | ack.node.gpu.schedule: cgpu | 複数の軽量タスクの同時実行 (マルチテナンシー、推論など)。Alibaba Cloud cGPU テクノロジーに基づき、コンピュートを共有し、GPU メモリを隔離します。 |
ack.node.gpu.schedule: core_mem | Pod ごとにコンピュートと GPU メモリを隔離します。 | |
ack.node.gpu.schedule: share | コンピュートと GPU メモリを共有し、隔離は行いません。 | |
ack.node.gpu.schedule: mps | NVIDIA MPS 隔離テクノロジーと Alibaba Cloud cGPU テクノロジーを組み合わせ、コンピュートを共有し、GPU メモリを隔離します。 | |
| 配置ポリシー (マルチ GPU ノードでの共有スケジューリング用) | ack.node.gpu.placement: binpack | GPU 使用率の最大化やエネルギー消費の削減。1 つの GPU を完全に埋めてから次の GPU に移ります。デフォルト。 |
ack.node.gpu.placement: spread | 高可用性。単一カードの障害による影響を軽減するために、Pod を異なる GPU に分散させます。 | |
| トポロジー対応スケジューリング | ack.node.gpu.schedule: topology | GPU 間の通信レイテンシーに敏感なワークロード。ノード内の物理トポロジーに基づいて最適な GPU の組み合わせを割り当てます。 |
| カードモデルスケジューリング | aliyun.accelerator/nvidia_name: <GPU_card_name> | ノードアフィニティルールを使用して、特定の GPU モデルを持つノードにジョブをルーティングするか、特定のモデルを除外します。 |
aliyun.accelerator/nvidia_mem: <memory_per_card> | カードあたりの GPU メモリでフィルタリングします。カードモデルスケジューリングと併用します。 | |
aliyun.accelerator/nvidia_count: <total_number_of_GPU_cards> | ノード上の GPU カードの総数でフィルタリングします。カードモデルスケジューリングと併用します。 |
ack.node.gpu.placementラベルは、共有スケジューリング (cgpu、core_mem、share、またはmps) が有効な場合にのみ適用されます。binpackとspreadの値は相互排他的であり、一度に 1 つの配置ポリシーのみがノードごとにアクティブになります。
スケジューリング機能の有効化
排他スケジューリング
GPU スケジューリングラベルのないノードは、デフォルトで排他スケジューリングを使用します。各 Pod は 1 つの完全な GPU カードを取得します。
以前に別のモードが有効になっていた場合、ラベルを削除しても排他スケジューリングは復元されません。元に戻すには、ラベル値を明示的に設定します: kubectl label node <NODE_NAME> ack.node.gpu.schedule=default --overwrite。共有スケジューリング
共有スケジューリングは、ACK マネージドクラスター プロ版でのみ利用可能です。詳細については、「制限事項」をご参照ください。
ステップ 1: ack-ai-installer コンポーネントのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [クラウドネイティブ AI スイート] を選択します。
[クラウドネイティブ AI スイート] ページで、[デプロイ] をクリックします。[クラウドネイティブ AI スイートのデプロイ] ページで、[スケジューリングポリシー拡張 (バッチタスクスケジューリング、GPU 共有、トポロジー対応 GPU スケジューリング)] を選択します。
cGPU サービスのコンピュートスケジューリングポリシーの設定に関する詳細については、「cGPU サービスのインストールと使用」をご参照ください。
[クラウドネイティブ AI スイートのデプロイ] をクリックします。[クラウドネイティブ AI スイート] ページで、インストール済みコンポーネントのリストに ack-ai-installer が表示されていることを確認します。
ステップ 2: ノードプールでの共有スケジューリングの有効化
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックします。ノードラベルを設定し、[確認] をクリックします。他のフィールドはデフォルト値のままにします。ラベルの定義については、「スケジューリングラベルの概要」をご参照ください。
基本共有スケジューリング: [ノードラベル] の横にある
アイコンをクリックします。 [キー] を ack.node.gpu.scheduleに、[値] を次のいずれかに設定します:cgpu、core_mem、share、またはmps。 > [注意]:mpsを使用するには、MPS Control Daemon コンポーネントが必要です。 詳細については、「MPS Control Daemon コンポーネントのインストール」をご参照ください。配置ポリシー (マルチ GPU ノードのみ): 2 つ目のラベルを追加します。
アイコンをクリックし、[キー] を ack.node.gpu.placementに設定し、[値] をbinpackまたはspreadに設定します。
ステップ 3: 共有スケジューリングが有効になっていることの確認
共有モードに対応するコマンドを実行します。<NODE_NAME> を対象ノードプール内のノードに置き換えます。
cgpu/share/mps
kubectl get nodes <NODE_NAME> -o yaml | grep -q "aliyun.com/gpu-mem"期待される出力:
aliyun.com/gpu-mem: "60"aliyun.com/gpu-mem フィールドの値が 0 以外の場合、cgpu、share、または mps 共有スケジューリングがアクティブであることを示します。
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"core_mem 共有スケジューリングがアクティブであるためには、aliyun.com/gpu-core.percentage と aliyun.com/gpu-mem の両方のフィールドが 0 以外である必要があります。
binpack
共有 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%)各 GPUx(Allocated/Total) 列には、そのカードで使用中のメモリ量が表示されます。GPU0 は完全に割り当てられており (15/15)、GPU1 は部分的に割り当てられています (9/15)。一方、GPU2 および GPU3 は Empty です。この順次充填パターン — 次のカードに進む前に 1 つのカードを詰め込む — により、binpack がアクティブであることが確認されます。
spread
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、GPU1、GPU3 はそれぞれ 4/15 を示しており、GPU2 は Empty です。この分散割り当てパターン — 1 枚のカードを先に満たすのではなく、Pod を複数のカードに分散させること — により、spread がアクティブであることが確認されます。
core_mem
ビンパック
展開
トポロジー対応スケジューリング
トポロジー対応スケジューリングは、ACK マネージドクラスター プロ版でのみ利用可能です。バージョン要件については、「システムコンポーネントのバージョン要件」をご参照ください。
対象ノードにトポロジーラベルを追加します:
ノードでトポロジー対応スケジューリングを有効にすると、そのノードはトポロジー非対応の GPU ワークロードを受け入れなくなります。排他スケジューリングを復元するには、次のコマンドを実行します:
kubectl label node <NODE_NAME> ack.node.gpu.schedule=default --overwrite。kubectl label node <NODE_NAME> ack.node.gpu.schedule=topologyトポロジー対応スケジューリングが有効になっていることを確認します:
kubectl get nodes <NODE_NAME> -o yaml | grep aliyun.com/gpu期待される出力:
aliyun.com/gpu: "2"aliyun.com/gpuフィールドの値が 0 以外の場合、トポロジー対応スケジューリングがアクティブであることを示します。
カードモデルスケジューリング
カードモデルスケジューリングは、ノードラベルと Kubernetes のノードアフィニティルールを使用して、ジョブを特定の GPU ハードウェアに固定したり、そこから遠ざけたりします。
ステップ 1: ノードの GPU カードモデルを確認する
kubectl get nodes -L aliyun.accelerator/nvidia_nameNVIDIA_NAME 列は、各ノードの GPU モデルを示します:
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
ステップ 2: カードモデルスケジューリングでジョブを作成する
ACK コンソールで、[ワークロード] > [ジョブ] に移動し、[YAML から作成] をクリックします。以下の両方の例では、aliyun.accelerator/nvidia_name ラベルを使用して GPU モデルの選択を制御します。

GPU モデルの指定
nodeSelector を使用して、ジョブを特定の GPU モデルを持つノードに固定します。Tesla-V100-SXM2-32GB をご利用のクラスターのモデルに置き換えてください。
ジョブが作成された後、[ワークロード] > [Pod] に移動します。Pod リストには、一致するノードにスケジューリングされた Pod が表示され、カードモデルラベルスケジューリングが機能していることを確認できます。
GPU モデルの回避
nodeAffinity と NotIn を使用して、ジョブが特定の GPU モデルを持つノードで実行されないようにします。Tesla-V100-SXM2-32GB を除外するモデルに置き換えてください。
ジョブが作成された後、Pod は aliyun.accelerator/nvidia_name: Tesla-V100-SXM2-32GB ラベルを持つノードにはスケジュールされませんが、他の任意の GPU ノードで実行できます。
カード モデルを除外する