デフォルトでは、別のGPUに切り替える前に、スケジューラはノード上のGPUのすべてのリソースをポッドに割り当てます。 これにより、GPUフラグメントを防ぐことができます。 一部のシナリオでは、GPUに障害が発生したときにビジネスの中断が発生した場合に備えて、ノード上の異なるGPUにポッドを分散することができます。 このトピックでは、GPU共有機能が有効になっているノードのGPU選択ポリシーを設定する方法について説明します。
前提条件
ACK Proクラスターが作成されました。 詳細については、「ACK Proクラスターの作成」をご参照ください。
GPU検査ツールがインストールされています。 詳細については、「GPU共有コンポーネントの設定」トピックの「ステップ4: GPUインスペクションツールのインストールと使用」をご参照ください。
ポリシーの説明
GPU共有機能が有効になっているノードに複数のGPUがある場合、次のいずれかのGPU選択ポリシーを選択できます。
Binpack: デフォルトでは、binpackポリシーが使用されます。 スケジューラは、別のGPUに切り替える前に、GPUのすべてのリソースをポッドに割り当てます。 これにより、GPUフラグメントを防ぐことができます。
Spread: スケジューラは、GPUに障害が発生したときにビジネスの中断が発生した場合に、ノード上の異なるGPUにポッドを拡散しようとします。
この例では、ノードは2つのGPUを有する。 各GPUは15 GiBのメモリを提供します。 Pod1は2 GiBのメモリを要求し、Pod2は3 GiBのメモリを要求します。
手順1: ノードプールの作成
デフォルトでは、binpackポリシーはGPUの選択に使用されます。 スプレッドポリシーを使用するには、次の手順を実行します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックしてクラスターの詳細ページに移動します。 左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。
[ノードプールの作成] ダイアログボックスで、ノードプールのパラメーターを設定し、[注文の確認] をクリックします。 次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。
パラメーター
説明
インスタンスタイプ
[アーキテクチャ] を [GPUアクセラレーション] に設定し、複数のGPUアクセラレーションインスタンスタイプを選択します。
スプレッドポリシーは、ノードに複数のGPUがある場合にのみ有効になります。 したがって、複数のGPUを持つインスタンスタイプを選択します。
期待されるノード
ノードプール内のノードの初期数を指定します。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。
ノードラベル
アイコンをクリックして2つのエントリを追加します。
keyが
ack.node.gpu.schedule
、valueがcgpu
のラベルを追加します。 このラベルは、GPU共有およびGPUメモリ分離機能を有効にします。keyが
ack.node.gpu.placement
で、valueがspread
のラベルを追加します。 このラベルは、スプレッドポリシーを有効にします。
ステップ2: ジョブを送信する
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
ページの右上にある [YAMLから作成] をクリックし、次のコードをテンプレートエディターにコピーしてから、次のコメントに基づいてパラメーターを変更します。 設定が完了したら、[作成] をクリックします。
YAMLテンプレートの説明:
このYAMLテンプレートは、TensorFlow MNISTジョブを定義します。 ジョブは3つのポッドを作成し、各ポッドは4 GiBのメモリを要求します。
ポッドリソースの制限
aliyun.com/gpu-mem: 4
は、ポッドのメモリを要求するために使用されます。GPU選択ポリシーをノードに適用するには、NodeSelector
kubernetes.io/hostname: <NODE_NAME>
をYAMLテンプレートに追加して、指定したノードにポッドをスケジュールします。
ステップ3: スプレッドポリシーが使用されているかどうかを確認する
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%)
結果は、ポッドが異なるGPUに広がっていることを示しています。 スプレッドポリシーは有効です。