すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:GPU共有機能を有効にしたノードのGPU選択ポリシーの設定

最終更新日:Nov 14, 2024

デフォルトでは、別のGPUに切り替える前に、スケジューラはノード上のGPUのすべてのリソースをポッドに割り当てます。 これにより、GPUフラグメントを防ぐことができます。 一部のシナリオでは、GPUに障害が発生したときにビジネスの中断が発生した場合に備えて、ノード上の異なるGPUにポッドを分散することができます。 このトピックでは、GPU共有機能が有効になっているノードのGPU選択ポリシーを設定する方法について説明します。

前提条件

ポリシーの説明

GPU共有機能が有効になっているノードに複数のGPUがある場合、次のいずれかのGPU選択ポリシーを選択できます。

  • Binpack: デフォルトでは、binpackポリシーが使用されます。 スケジューラは、別のGPUに切り替える前に、GPUのすべてのリソースをポッドに割り当てます。 これにより、GPUフラグメントを防ぐことができます。

  • Spread: スケジューラは、GPUに障害が発生したときにビジネスの中断が発生した場合に、ノード上の異なるGPUにポッドを拡散しようとします。

この例では、ノードは2つのGPUを有する。 各GPUは15 GiBのメモリを提供します。 Pod1は2 GiBのメモリを要求し、Pod2は3 GiBのメモリを要求します。

image

手順1: ノードプールの作成

デフォルトでは、binpackポリシーはGPUの選択に使用されます。 スプレッドポリシーを使用するには、次の手順を実行します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックしてクラスターの詳細ページに移動します。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  1. [ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。

  2. [ノードプールの作成] ダイアログボックスで、ノードプールのパラメーターを設定し、[注文の確認] をクリックします。 次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。

    パラメーター

    説明

    インスタンスタイプ

    [アーキテクチャ][GPUアクセラレーション] に設定し、複数のGPUアクセラレーションインスタンスタイプを選択します。

    スプレッドポリシーは、ノードに複数のGPUがある場合にのみ有効になります。 したがって、複数のGPUを持つインスタンスタイプを選択します。

    期待されるノード

    ノードプール内のノードの初期数を指定します。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。

    ノードラベル

    アイコンをクリックして1.jpg2つのエントリを追加します。

    • keyack.node.gpu.schedulevaluecgpuのラベルを追加します。 このラベルは、GPU共有およびGPUメモリ分離機能を有効にします。

    • keyack.node.gpu.placementで、valuespreadのラベルを追加します。 このラベルは、スプレッドポリシーを有効にします。

ステップ2: ジョブを送信する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [ジョブ] を選択します。

  3. ページの右上にある [YAMLから作成] をクリックし、次のコードをテンプレートエディターにコピーしてから、次のコメントに基づいてパラメーターを変更します。 設定が完了したら、[作成] をクリックします。

    クリックしてYAMLコンテンツを表示

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-spread
    spec:
      parallelism: 3
      template:
        metadata:
          labels:
            app: tensorflow-mnist-spread
        spec:
          nodeSelector:
             kubernetes.io/hostname: <NODE_NAME> # Replace <NODE_NAME> with the name of a GPU-accelerated node in the cluster, such as cn-shanghai.192.0.2.109. 
          containers:
          - name: tensorflow-mnist-spread
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:
              limits:
                aliyun.com/gpu-mem: 4 # Request 4 GiB of memory. 
            workingDir: /root
          restartPolicy: Never

    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に広がっていることを示しています。 スプレッドポリシーは有効です。