このトピックでは、YAMLファイルをデプロイして、1つのGPUを共有するコンテナーを作成する方法について説明します。 ファイルのデプロイ後、GPU共有を使用して、各コンテナーに割り当てられているGPUメモリを分離できます。 これにより、GPUリソース使用率が向上します。
目次
前提条件
使用上の注意
Container Service For Kubernetes (ACK) クラスターで管理されているGPUノードの場合、アプリケーション用にGPUリソースをリクエストし、GPUリソースを使用する場合は、次の項目に注意する必要があります。
GPUを多用するアプリケーションをノードで直接実行しないでください。
Docker
、Podman
、nerdctl
などのツールを使用してコンテナーを作成し、コンテナーの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コミュニティから報告された問題など、他の未知の問題も発生する可能性があります。
手順
次のコマンドを実行して、クラスターでの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コマンドを実行します。
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
次のコマンドを実行して、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メモリ分離が有効になっているかどうかを確認できます。
マスターノードにログインします。
次のコマンドを実行して、デプロイされたアプリケーションのログを印刷し、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がコンテナによって要求されたことを示します。
次のコマンドを実行して、コンテナにログインし、コンテナに割り当てられている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であることを示します。
次のコマンドを実行して、アプリケーションがデプロイされている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ことを示します。