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

Container Service for Kubernetes:GPU共有を使用してGPUを共有する例

最終更新日:Nov 14, 2024

このトピックでは、YAMLファイルをデプロイして、1つのGPUを共有するコンテナーを作成する方法について説明します。 ファイルのデプロイ後、GPU共有を使用して、各コンテナーに割り当てられているGPUメモリを分離できます。 これにより、GPUリソース使用率が向上します。

目次

前提条件

ack-ai-installerとGPUインスペクションツールがインストールされています

使用上の注意

Container Service For Kubernetes (ACK) クラスターで管理されているGPUノードの場合、アプリケーション用にGPUリソースをリクエストし、GPUリソースを使用する場合は、次の項目に注意する必要があります。

  • GPUを多用するアプリケーションをノードで直接実行しないでください。

  • DockerPodmannerdctlなどのツールを使用してコンテナーを作成し、コンテナーのGPUリソースを要求しないでください。 たとえば、docker run -- gpus allまたはdocker run -e NVIDIA_VISIBLE_DEVICES=allコマンドを実行せず、GPUが多いアプリケーションを実行します。

  • NVIDIA_VISIBLE_DEVICES=allまたはNVIDIA_VISIBLE_DEVICES=<GPU ID> 環境変数をポッドYAMLファイルのenvセクションに追加しないでください。 NVIDIA_VISIBLE_DEVICES環境変数を使用してポッドのGPUリソースを要求し、GPUが多いアプリケーションを実行しないでください。

  • ポッドYAMLファイルで環境変数NVIDIA_VISIBLE_DEVICESが指定されていない場合、コンテナーイメージをビルドするときにNVIDIA_VISIBLE_DEVICES=allを設定せず、GPUが多いアプリケーションを実行しないでください。

  • ポッドYAMLファイルのsecurityContextセクションにprivileged: trueを追加せず、GPUが多いアプリケーションを実行しないでください。

上記の方法を使用してアプリケーションのGPUリソースを要求すると、次の潜在的なリスクが存在する可能性があります。

  • 上記のいずれかの方法を使用してノード上のGPUリソースを要求したが、スケジューラのデバイスリソース台帳に詳細が指定されていない場合、実際のGPUリソース割り当て情報がスケジューラのデバイスリソース台帳と異なる場合があります。 このシナリオでは、スケジューラは、GPUリソースをノードに要求する特定のポッドを引き続きスケジュールできます。 その結果、アプリケーションは、同じGPUからリソースを要求するなど、同じGPUによって提供されるリソースを求めて競合する可能性があり、一部のアプリケーションは、不十分なGPUリソースのために起動に失敗する可能性があります。

  • 上記の方法を使用すると、NVIDIAコミュニティから報告された問題など、他の未知の問題も発生する可能性があります。

手順

  1. 次のコマンドを実行して、クラスターでのGPU共有に関する情報を照会します。

    kubectl inspect cgpu

    NAME                     IPADDRESS    GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.168.0.4  192.168.0.4  0/7                    0/7                    0/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/14 (0%)
    説明

    GPU共有に関する詳細情報を照会するには、kubectl inspect cgpu -dコマンドを実行します。

  2. GPU共有が有効になっているサンプルアプリケーションをデプロイし、アプリケーションに対して3 GiBのGPUメモリを要求します。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gpu-share-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: gpu-share-sample
        spec:
          containers:
          - name: gpu-share-sample
            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 # Specify the requested amount of GPU memory. 
            workingDir: /root
          restartPolicy: Never

  3. 次のコマンドを実行して、GPUのメモリ使用量を照会します。

    kubectl inspect cgpu

    予想される出力

    NAME                      IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-beijing.192.168.1.105  192.168.1.105  3/14                   3/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    3/14 (21%)

    出力は、cn-beijing.192.168.1.105のノードの合計GPUメモリが14 GiBであり、3 GiBのGPUメモリが割り当てられていることを示しています。

結果の検証

次の方法を使用して、ノードのGPUメモリ分離が有効になっているかどうかを確認できます。

  1. マスターノードにログインします。

  2. 次のコマンドを実行して、デプロイされたアプリケーションのログを印刷し、GPUメモリ分離が有効になっているかどうかを確認します。

    kubectl logs gpu-share-sample --tail=1

    期待される出力:

    2023-08-07 09:08:13.931003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2832 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5)

    出力は、GPUメモリの2,832 MiBがコンテナによって要求されたことを示します。

  3. 次のコマンドを実行して、コンテナにログインし、コンテナに割り当てられているGPUメモリの量を表示します。

    kubectl exec -it gpu-share-sample nvidia-smi

    期待される出力:

    Mon Aug 7 08:52:18 2023
    +-----------------------------------------------------------------------------+
    | 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 T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   41C    P0    26W /  70W |   3043MiB /  3231MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    出力は、コンテナに割り当てられたGPUメモリの量がMiB 3,231であることを示します。

  4. 次のコマンドを実行して、アプリケーションがデプロイされているGPUアクセラレーションノードの合計GPUメモリを照会します。

    nvidia-smi

    期待される出力:

    Mon Aug  7 09:18:26 2023 
    +-----------------------------------------------------------------------------+
    | 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 T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   40C    P0    26W /  70W |   3053MiB / 15079MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      8796      C   python3                                     3043MiB |
    +-----------------------------------------------------------------------------+
    
                            

    出力は、ノードのGPUメモリの合計がMiBで15,079、GPUメモリのMiBがコンテナに割り当てられてい3,053ことを示します。