GPU共有では、複数のポッドを同じGPUにスケジュールして、GPUのコンピューティングリソースを共有できます。 これにより、GPUの使用率が向上し、コストが削減されます。 GPU共有を実装すると、同じGPUで実行される複数のコンテナーを互いに分離し、各アプリケーションのリソース使用量に応じて実行できます。 これにより、1つのコンテナのリソース使用量が制限を超えて他のコンテナの通常の動作に影響を与えることを防ぎます。 このトピックでは、ACK EdgeクラスターでGPU共有を使用する方法について説明します。
前提条件
Kubernetes 1.18以降を実行するACK Edgeクラスターが作成されます。 詳細については、「ACK Edgeクラスターの作成」をご参照ください。
クラウドネイティブのAIスイートが有効化されます。 クラウドネイティブAIスイートの詳細については、「クラウドネイティブAIスイート」および「クラウドネイティブAIスイートの課金」をご参照ください。
ACK Edgeクラスターのkubeconfigファイルが取得され、kubectlを使用してクラスターに接続するために使用されます。
制限事項
ACK Edgeクラスターのクラウドノードは、GPU共有、GPUメモリ分離、およびコンピューティング電力分離機能をサポートしています。
ACK edgeクラスターのエッジノードプールは、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コミュニティから報告された問題など、他の未知の問題も発生する可能性があります。
ステップ1: GPU共有コンポーネントのインストール
クラウドネイティブAIスイートがデプロイされていません
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[クラウドネイティブAI Suite] ページで、[デプロイ] をクリックします。
クラウドネイティブAI Suiteページで、[スケジューリングコンポーネント (バッチタスクスケジューリング、GPU共有、トポロジ対応GPUスケジューリング、およびNPUスケジューリング) を選択します。
必要に応じて、 [スケジューリングコンポーネント (バッチタスクスケジューリング、GPU共有、トポロジ対応GPUスケジューリング、およびNPUスケジューリング) の右側にある [詳細設定] をクリックします。 [パラメーター] パネルで、cGPUの
policyパラメーターを変更します。 [OK] をクリックします。cGPUが提供するコンピューティング能力共有機能に関する要件がない場合は、デフォルトの設定
policy: 5を使用することを推奨します。 cGPUでサポートされているポリシーの詳細については、「DockerコンテナーへのcGPUのインストールと使用」をご参照ください。
[クラウドネイティブAIスイート] ページの下部で、[クラウドネイティブAIスイートのデプロイ] をクリックします。
クラウドネイティブAIスイートがインストールされた後、[クラウドネイティブaiスイート] ページでack-AI-installerが [デプロイ済み] 状態になっていることがわかります。
クラウドネイティブAIスイートがデプロイされました
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ack-ai-installerを見つけ、[操作] 列の [デプロイ] をクリックします。
必要に応じて、 [パラメーター] パネルで、cGPUの
policyパラメーターを変更します。cGPUが提供するコンピューティング能力共有機能に関する要件がない場合は、デフォルトの設定
policy: 5を使用することを推奨します。 cGPUでサポートされているポリシーの詳細については、「DockerコンテナーへのcGPUのインストールと使用」をご参照ください。
構成を完了すると、OK をクリックします。
ack-ai-installerをインストールすると、コンポーネントの状態がデプロイ済みに変わります。
ステップ2: GPUノードプールの作成
クラウドGPUノードプールを作成して、GPU共有、GPUメモリの分離、およびコンピューティングパワー共有機能を有効にします。
GPU共有を有効にするエッジGPUノードプールを作成します。
クラウドノードプール
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
の右上隅にノードプールページをクリックします。ノードプールの作成.
[ノードプールの作成] ダイアログボックスで、ノードプールを作成するパラメーターを設定し、[注文の確認] をクリックします。
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成と管理」をご参照ください。
パラメーター
説明
期待されるノード
ノードプール内の初期ノード数。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。
ノードラベル
ビジネス要件に基づいてノードプールに追加するラベル。 ノードラベルの詳細については、「GPUスケジューリングポリシーを有効にするためのラベルとラベル値の変更方法」をご参照ください。
この例では、ラベルの値はcgpuに設定されています。これは、ノードに対してGPU共有が有効になっていることを示します。 ノード上のポッドはGPUメモリのみを要求する必要があります。 複数のポッドが同じGPUを共有して、GPUのメモリ分離とコンピューティング能力の共有を実装できます。
[Node Label] パラメーターの横にある
アイコンをクリックし、[Key] フィールドをack.node.gpu.scheduleに設定し、[Value] フィールドをcgpuに設定します。 cGPUが提供するメモリ分離機能を使用する際の一般的な問題の詳細については、「cGPUのメモリ分離機能に関する使用方法の注意事項」をご参照ください。
重要GPU共有を有効にするためのラベルをノードに追加した後、
kubectl label nodesコマンドを実行してラベル値を変更したり、ラベル管理機能を使用してACKコンソールの [ノード] ページでノードラベルを変更したりしないでください。 これは潜在的な問題を防ぎます。 これらの潜在的な問題の詳細については、「kubectl label nodesコマンドを使用するか、またはACKコンソールでラベル管理機能を使用してラベル値を変更する場合に発生する可能性のある問題」をご参照ください。 ノードプールに基づいてGPU共有を設定することを推奨します。 詳細については、「ノードプールのGPUスケジューリングポリシーの設定」をご参照ください。
エッジノードプールEdge node pools
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックします。
[ノードプールの作成] ダイアログボックスでパラメーターを設定し、[注文の確認] をクリックします。 次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「エッジノードプールの管理」をご参照ください。
[ノードラベル]: [ノードラベル] セクションの
アイコンをクリックし、[キー] を [ack. Node. gpu.schedule]および [共有する値] を[共有する値]に設定します。 このラベル値はGPU共有を有効にします。 ノードラベルの詳細については、「GPUスケジューリングポリシーを有効にするためのラベル」をご参照ください。
ステップ3: GPU高速化ノードの追加
GPU高速化ノードをクラウドノードプールとエッジノードプールにそれぞれ追加します。
クラウドノード
ノードプールの作成時に、GPUアクセラレーションノードをノードプールに既に追加している場合は、この手順をスキップしてください。
ノードプールが作成されたら、GPUアクセラレーションノードをノードプールに追加できます。 GPU高速化ノードを追加するには、GPU高速化アーキテクチャを使用するECSインスタンスを選択する必要があります。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」または「ノードプールの作成と管理」をご参照ください。
エッジノード
GPUアクセラレーションノードをエッジノードプールに追加する方法の詳細については、「GPUアクセラレーションノードの追加」をご参照ください。
ステップ4: クラウドノードにGPUインスペクションツールをインストールして使用する
kubectl-inspect-cgpuのダウンロード. 実行ファイルは, 環境変数PATHに含まれるディレクトリにダウンロードする必要があります。 このセクションでは、例として
/usr/local/bin/を使用します。Linuxを使用している場合は、次のコマンドを実行してkubectl-inspect-cgpuをダウンロードします。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpumacOSを使用している場合は、次のコマンドを実行してkubectl-inspect-cgpuをダウンロードします。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
次のコマンドを実行して、kubectl-inspect-cgpuに実行権限を付与します。
chmod +x /usr/local/bin/kubectl-inspect-cgpu次のコマンドを実行して、クラスターのGPU使用状況を照会します。
kubectl inspect cgpu想定される出力:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.6.104 192.168.6.104 0/15 0/15 ---------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)
ステップ5: GPU共有の例
クラウドノードプール
次のコマンドを実行して、クラスターでのGPU共有に関する情報を照会します。
kubectl inspect cgpuNAME 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: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace this parameter with the ID of the node pool you created. 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 a total of 3 GiB of GPU memory. aliyun.com/gpu-mem: 3 # Specify the amount of GPU memory that is requested by the pod. workingDir: /root restartPolicy: Never
エッジノードプールEdge node pools
cGPUが有効になっているサンプルアプリケーションをデプロイし、アプリケーション用に4 GiBのGPUメモリを要求します。
apiVersion: batch/v1
kind: Job
metadata:
name: tensorflow-mnist-share
spec:
parallelism: 1
template:
metadata:
labels:
app: tensorflow-mnist-share
spec:
nodeSelector:
alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace this parameter with the ID of the edge node pool that you created.
containers:
- name: tensorflow-mnist-share
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ステップ6: 結果を確認する
クラウドノードプール
マスターノードにログインします。
次のコマンドを実行して、デプロイされたアプリケーションのログを印刷し、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ことを示します。
エッジノードプールEdge node pools
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
作成したポッドの [操作] 列で、[ターミナル] (tensorflow-mnist-multigpu-*** など) をクリックします。 管理するポッドの名前を選択し、次のコマンドを実行します。
nvidia-smi想定される出力:
Wed Jun 14 06:45:56 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:09.0 Off | 0 | | N/A 35C P0 59W / 300W | 334MiB / 16384MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+この例では、V100 GPUが使用される。 出力は、ポッドがGPUによって提供されるすべてのメモリ (サイズは16,384 MiB) を使用できることを示します。 つまり、GPU共有はGPUメモリ分離なしで実装されます。 GPUメモリの分離が有効になっている場合、出力に表示されるメモリサイズは、ポッドが要求するメモリの量 (この例では4 GiB) に等しくなります。
ポッドは、次の環境変数に基づいて、使用できるGPUメモリの量を決定します。
ALIYUN_COM_GPU_MEM_CONTAINER=4 # The amount of GPU memory that the pod can use. ALIYUN_COM_GPU_MEM_DEV=16 # The memory size of each GPU.アプリケーションに必要なGPUメモリの比率を計算するには、次の式を使用します。
percetange = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0.25
関連ドキュメント
GPU共有の詳細については、「GPU共有」をご参照ください。
GPU共有コンポーネントを更新する方法の詳細については、「GPU共有コンポーネントの更新」をご参照ください。
アプリケーションのGPUメモリ分離機能を無効にする方法の詳細については、「cGPUのメモリ分離機能を無効にする」をご参照ください。
GPU共有の高度な機能の詳細については、「高度な機能」をご参照ください。