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

:ノードプールを使用したcGPUの制御

最終更新日:Oct 18, 2024

Container Service for Kubernetes (ACK) では、ノードプールを使用してcGPUを制御できます。 これにより、より柔軟なGPU共有およびメモリ分離ポリシーを作成できます。 このトピックでは、ACK Proクラスターに2つのラベル付きノードプールを作成し、ノードプールを使用してcGPUのGPU共有およびメモリ分離機能を制御する方法を示します。

シナリオの使用

  • GPU高速化ノードを含むACK専用クラスターのみがack-cgpuコンポーネントをサポートしています。 GPU高速化ノードを含むACK管理クラスターは、ack-cgpuコンポーネントをサポートしていません。

  • ack ProクラスターにACK-cgpuをインストールする場合は、「GPU共有コンポーネントの設定」をご参照ください。

前提条件

開始する前に、次の操作が完了していることを確認してください。

  • ack-cgpuコンポーネントをインストールします

  • ノードプールが設定されています。

    ノードプールの名前をカスタマイズできます。 この例では、cgpuおよびcgpu-no-isolationという名前の2つのノードプールが使用されます。

    ノードプール名

    GPU共有

    メモリ分離

    ラベル

    cpu

    提供済み

    Enabled

    • cppu=true

    • cgpu.disable.isolation=false

    cpu-no-isolation

    Enabled

    無効

    • cppu=true

    • cgpu.disable.isolation=true

背景情報

ACKクラスターでcGPUを使用すると、次のシナリオに遭遇する可能性があります。

  • ジョブAに割り当てることができるGPUメモリの量は、スクリプトで既に指定されています。 この場合、ACKクラスターはジョブAのGPU共有を有効にするだけで済みます。メモリの分離は必要ありません。

  • ジョブBに割り当てることができるGPUメモリの量は、スクリプトで指定されていません。 この場合、ACKクラスターは、ジョブBのGPU共有とメモリ分離の両方を有効にする必要があります。

両方のシナリオをサポートするようにACKクラスターを設定するにはどうすればよいですか。

この問題を解決するには、ノードプールを使用してcGPUを制御します。 2つのノードプールを作成するだけで済みます。

  • GPU共有のみをサポートするノードプールを作成します。 このノードプールはジョブAの実行に使用されます。

  • GPU共有とメモリ分離の両方をサポートする別のノードプールを作成します。 このノードプールはジョブBの実行に使用されます。

使用上の注意

ノードプールを使用してcGPUを制御する場合、次の制限事項に注意してください。

  • ノードプールを使用してcGPUを制御する場合、ジョブがノードセレクタで構成されていない場合、ジョブのポッドが他のノードプールにスケジュールされることがあります。 ジョブの実行エラーが発生する可能性があります。

    重要

    ジョブごとにノードセレクタを設定することを推奨します。

  • ノードのラベルが変更された場合、たとえば、ノードのラベルがcgpu.disable.isolation=falseからcgpu.disable.isolation=trueに変更された場合、設定を有効にするには、ノードでgpushare-device-pluginのポッドを再起動する必要があります。

    これを行うには、ノード上のgpushare-device-pluginのポッドを削除する必要があります。 その後、ACKは自動的に新しいポッドを作成します。 以下の操作を実行できます。

    1. 次のコマンドを実行して、ACKクラスター内のgpushare-device-pluginのポッドを照会します。

      kubectl get po -n kube-system  -l name=gpushare-device-plugin-ds -o wide

      期待される出力:

      NAME                              READY   STATUS    RESTARTS   AGE   IP              NODE                        NOMINATED NODE   READINESS GATES
      gpushare-device-plugin-ds-6r8gs   1/1     Running   0          18h   192.168.7.157   cn-shanghai.192.168.7.157   <none>           <none>
      gpushare-device-plugin-ds-pjrvn   1/1     Running   0          15h   192.168.7.158   cn-shanghai.192.168.7.158   <none>           <none>
    2. この例では、ノードcn-shanghai.192.168.7.157が使用されます。 次のコマンドを実行して、このノードのgpushare-device-pluginのポッドを削除します。

      kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system

ステップ1: ノードプールの作成

  1. ACKコンソールにログインします。

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

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。

  4. 詳細ページの左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  5. [ノードプールの作成] ダイアログボックスで、パラメーターを設定します。

    詳細については、「マネージド Kubernetes クラスターの作成」をご参照ください。 次のリストに、いくつかのパラメーターを示します。

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

    • オペレーティングシステム: ノードのオペレーティングシステムを選択します。 CentOS 7.xとAlibaba Cloud Linux 2.xがサポートされています。

    • ノードラベル: ノードにラベルを追加できます。

    • ECSラベル: Elastic Compute Service (ECS) インスタンスにラベルを追加できます。

    • カスタムリソースグループ: ノードプール内のノードが属するリソースグループを指定できます。

    [ノードラベル] セクションでは、指定したラベルをノードプール内のノードに追加できます。

    • cgpuノードプール内のノードに、cgpu=trueおよびcgpu.disable.isolation=falseのラベルを追加します。

    • cgpu-no-isolationノードプールのノードに、cgpu=trueおよびcgpu.disable.isolation=trueのラベルを追加します。

    次の図は、cgpu-no-isolationノードプールのノードに追加されるラベルを示しています。Node Label

  6. [注文の確認] をクリックします。

    [ノードプール] ページで、ノードプールの [ステータス] 列を確認します。 ノードプールが初期化状態の場合、ノードプールが作成中であることを示します。 ノードプールが作成されると、ノードプールの状態[アクティブ] に変わります。

説明

GPU高速化ノードをノードプールに追加する場合は、ノードプールをスケールアウトできます。 詳細については、「ノードプールの管理」をご参照ください。

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

cgpu-testとcgpu-test-no-isolationという名前の2つのジョブを送信します。 両方のジョブのYAMLファイルでnodeSelectorを設定する必要があります。

  • cgpu-test: このジョブに割り当てることができるGPUメモリの量は、ジョブのスクリプトで指定されていません。 したがって、このジョブを実行するにはメモリ分離が必要です。 次のYAMLテンプレートはその例です。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cgpu-test
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cgpu-test
        spec:
          nodeSelector:
            cgpu.disable.isolation: "false" # Add a node selector to select the cgpu node pool. 
          containers:
          - name: cgpu-test
            image: registry.cn-hangzhou.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:
                # The pod requests 3 GiB of GPU memory in total. 
                aliyun.com/gpu-mem: 3
            workingDir: /root
          restartPolicy: Never
    説明
    • nodeSelector: cppuノードプールを選択します。

    • cgpu.disable.isolation=false: cgpuノードプール内のノードにジョブをスケジュールします。

    • aliyun.com/gpu-mem: ジョブによって要求されるGPUメモリの量を指定します。

  • cgpu-test-no-isolation: GPUごとにジョブに割り当てることができるメモリの量は、ジョブのスクリプトで指定されています。 したがって、このジョブを実行するためにメモリ分離は必要ありません。 次のYAMLテンプレートはその例です。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cgpu-test-no-isolation
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cgpu-test-no-isolation
        spec:
          nodeSelector:
            cgpu.disable.isolation: "true" # Add a node selector to select the cgpu node pool. 
          containers:
          - name: cgpu-test-no-isolation
            image: registry.cn-hangzhou.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:
                # The pod requests 3 GiB of GPU memory in total. 
                aliyun.com/gpu-mem: 3
    説明
    • nodeSelector: cgpu-no-isolationノードプールを選択するために使用されるラベルを指定します。

    • cgpu.disable.isolation=true: cgpu-no-isolationノードプール内のノードにジョブをスケジュールするために使用されるラベル。

    • aliyun.com/gpu-mem: ジョブによって要求されるGPUメモリの量を指定します。

ステップ3: 結果を確認する

  1. 次のコマンドを実行して、ジョブのステータスを照会します。

    kubectl get po

    期待される出力:

    NAME                       READY   STATUS    RESTARTS   AGE
    cgpu-test-0                1/1     Running   0          5m55s
    cgpu-test-no-isolation-0   1/1     Running   0          6m42s
  2. ポッドcgpu-test-0 (メモリ分離が必要) でnvidia-smiコマンドを実行して、ポッドで使用できるGPUメモリの量を照会します

    kubectl exec cgpu-test-0 nvidia-smi

    期待される出力:

    Mon Nov  2 11:33:10 2020
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   34C    P0    54W / 300W |   3039MiB /  3226MiB |      1%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    出力は、GPUメモリの3,226のMiBをコンテナで使用できることを示しています。 GPUメモリの合計は16 GiBです。 これは、GPUメモリの分離が有効になっていることを示します。

  3. ポッドcgpu-test-no-isolation-0でnvidia-smiコマンドを実行し (GPUメモリの分離は必要ありません) 、ポッド内のコンテナで使用できるGPUメモリの量を照会します

    kubectl exec cgpu-test-no-isolation-0 nvidia-smi

    期待される出力:

    Mon Nov  2 11:39:59 2020
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   37C    P0    56W / 300W |   1929MiB / 16130MiB |      1%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    出力は、GPUメモリの16,130のMiBがコンテナによって検出できることを示しています。 GPUメモリの合計は16 GiBです。 これは、GPUメモリの分離が無効になっていることを示します。 この場合、次の環境変数を照会して、ポッド内のコンテナで使用できるGPUメモリの量を確認する必要があります。 次のコマンドを実行して、ポッド内のコンテナーが使用できるGPUメモリの量を確認します。

    kubectl exec cgpu-test-no-isolation-0 env | grep ALIYUN

    期待される出力:

    ALIYUN_COM_GPU_MEM_CONTAINER=3    # The amount of GPU memory that can be used by the containers in the pod. The amount is 3 GiB in this example. 
    ALIYUN_COM_GPU_MEM_DEV=15      # The total amount of memory provided by the GPU. 
    ...
  4. nvidia-smiコマンドを実行した後、ポッドcgpu-test-no-isolation-0とポッドcgpu-test-0から返された結果を比較します。

    ポッドcgpu-test-no-isolation-0の結果はGPUメモリの合計量を示し、ポッドcgpu-test-0の結果はポッドによって要求されたGPUメモリの量のみを示します。 これは、ノードプールを使用して、GPU共有とメモリ分離のためにcGPUを制御できることを示しています。