GPU 共有により、複数の Pod が単一の GPU のコンピューティングリソースを共有できるようになり、GPU 使用率の向上とコスト削減が実現します。同じ GPU 上のコンテナは互いに隔離されて実行されるため、あるコンテナが割り当てられたリソースを超えて他のコンテナに影響を与えることはありません。
このトピックでは、ACK Edge クラスターで GPU 共有を有効にする方法について説明します。
ノードタイプ別の機能サポート
クラウドノードとエッジノードプールでは、サポートされる GPU 共有機能が異なります。ご利用のノードタイプと隔離要件に基づいて、設定パスを選択してください。
| 機能 | クラウドノード | エッジノードプール |
|---|---|---|
| GPU 共有 | サポート済み | サポート済み |
| GPU メモリ隔離 | サポート済み | サポート対象外 |
| コンピューティング能力隔離 | サポート済み | サポート対象外 |
エッジノードプールは GPU 共有のみをサポートします。メモリとコンピューティング能力の隔離はエッジノードでは利用できません。ワークロードでメモリまたはコンピューティング能力の隔離が必要な場合は、クラウドノードを使用してください。
前提条件
開始する前に、以下が準備できていることを確認してください。
Kubernetes 1.18 以降を実行している ACK Edge クラスター。詳細については、「ACK Edge クラスターの作成」をご参照ください。
アクティベート済みのクラウドネイティブ AI スイート。詳細については、「クラウドネイティブ AI スイートの概要」および「クラウドネイティブ AI スイートの課金」をご参照ください。
ACK Edge クラスターの kubeconfig ファイルを取得し、kubectl がクラスターに接続されていること。詳細については、「kubeconfig ファイルを取得してクラスターに接続」をご参照ください。
注意事項
ACK クラスターで管理される GPU ノードの場合、GPU リソースをリクエストして使用する際は、以下のルールに従ってください。
以下のいずれかの方法で GPU リソースをリクエストしないでください。
GPU を多用するアプリケーションをノード上で直接実行する
Docker、Podman、または nerdctl を使用して GPU リクエストを持つコンテナを作成する (例:
docker run --gpus allまたはdocker run -e NVIDIA_VISIBLE_DEVICES=all)Pod の YAML ファイルの
envセクションにNVIDIA_VISIBLE_DEVICES=allまたはNVIDIA_VISIBLE_DEVICES=<GPU ID>を追加するPod の YAML で
NVIDIA_VISIBLE_DEVICESが指定されていない場合に、コンテナイメージのビルド中にNVIDIA_VISIBLE_DEVICES=allを設定するPod の YAML ファイルの
securityContextセクションにprivileged: trueを追加する
これらの方法は、スケジューラのデバイスリソース台帳をバイパスします。その結果、実際の GPU リソース割り当てがスケジューラが追跡しているものと乖離し、スケジューラが同じノードに追加の Pod をスケジュールする原因となります。これにより、アプリケーションが同じ GPU をめぐって競合し、一部は GPU リソース不足で起動に失敗する可能性があります。これらの方法は、NVIDIA コミュニティによって報告されているような、他の未知の問題を引き起こす可能性もあります。
ステップ 1:GPU 共有コンポーネントのインストール
GPU 共有コンポーネント (ack-ai-installer) は、クラウドネイティブ AI スイートの一部です。現在のデプロイ状況に応じた手順に従ってください。
クラウドネイティブ AI スイートがデプロイされていない場合
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [クラウドネイティブ AI スイート] を選択します。
[クラウドネイティブ AI スイート] ページで、[デプロイ] をクリックします。
[クラウドネイティブ AI スイートのデプロイ] ページで、[スケジューリングポリシー拡張 (バッチタスクスケジューリング、GPU 共有、トポロジー認識 GPU スケジューリング)] を選択します。
(任意) コンポーネントの横にある [詳細設定] をクリックします。[パラメーター] パネルで、cGPU の
policyパラメーターを変更し、[OK] をクリックします。コンピューティング能力の共有に要件がない場合は、デフォルトのpolicy: 5を使用します。サポートされているポリシーの詳細については、「Docker コンテナで cGPU をインストールおよび使用する」をご参照ください。
ページの下部で、[クラウドネイティブ AI スイートのデプロイ] をクリックします。
デプロイが完了すると、[クラウドネイティブ AI スイート] ページの ack-ai-installer が [デプロイ済み] 状態で表示されます。
クラウドネイティブ AI スイートが既にデプロイされている場合
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [クラウドネイティブ AI スイート] を選択します。
ack-ai-installer を見つけ、[操作] 列の [デプロイ] をクリックします。
(任意) [パラメーター] パネルで、cGPU の
policyパラメーターを変更します。コンピューティング能力の共有に関する要件がない場合は、デフォルトのpolicy: 5を使用します。サポートされているポリシーの詳細については、「Docker コンテナに cGPU をインストールして使用する」をご参照ください。
[OK] をクリックします。
ack-ai-installer がインストールされると、その状態は [デプロイ済み] に変わります。
ステップ 2:GPU ノードプールの作成
クラウドノードプール
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
[ノードプール] ページの右上隅にある [ノードプールを作成] をクリックします。
[ノードプールの作成] ダイアログボックスでパラメーターを設定し、[注文の確認] をクリックします。 次の表で、主要なパラメーターについて説明します。 その他のパラメーターについては、「ノードプールの作成と管理」をご参照ください。
重要ノードに GPU 共有ラベルを追加した後、
kubectl label nodesまたは ACK コンソールのラベル管理機能を使用してラベル値を変更しないでください。これにより、スケジューリングの問題が発生する可能性があります。GPU 共有はノードプールレベルで設定してください。詳細については、「ノードプールの GPU スケジューリングポリシーを設定する」および「ラベル値を変更した場合に発生する可能性のある問題」をご参照ください。パラメーター 説明 予想されるノード 初期ノード数。 0に設定すると、空のノードプールが作成されます。ノードラベル
「」アイコンをクリックし、[キー] を ack.node.gpu.scheduleに設定し、[値] をcgpuに設定します。このラベルにより、GPU メモリの隔離とコンピューティング能力の共有を伴う GPU 共有が有効になります。ノード上の Pod は GPU メモリのみを要求し、複数の Pod が同じ GPU を共有できます。詳細については、「GPU スケジューリングポリシーを有効化するためのラベル」をご参照ください。
エッジノードプール
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
[ノードプール] ページで、[ノードプールを作成] をクリックします。
[ノードプールを作成] ダイアログボックスで、パラメーターを設定し、[注文の確認] をクリックします。[ノードラベル] セクションで、
アイコンをクリックし、[キー] を ack.node.gpu.scheduleに、[値] をshareに設定します。このラベルは GPU 共有を有効にします。その他のパラメーターについては、「エッジノードプールの管理」をご参照ください。ノードラベルの詳細については、「GPU スケジューリングポリシーを有効にするためのラベル」をご参照ください。
ステップ 3:GPU 高速化ノードの追加
クラウドノード
ノードプールの作成時に既に GPU 高速化ノードを追加している場合は、このステップをスキップしてください。
GPU アクセラレーション対応アーキテクチャの ECS インスタンスをクラウドノードプールに追加します。詳細については、「既存の ECS インスタンスを追加する」または「ノードプールを作成および管理する」をご参照ください。
エッジノード
詳細については、「GPU 高速化ノードの追加」をご参照ください。
ステップ 4:GPU 検査ツールのインストール (クラウドノードのみ)
kubectl-inspect-cgpu を使用して、クラスター全体の GPU メモリ割り当てを検査します。このステップはクラウドノードにのみ適用されます。
kubectl-inspect-cgpu を PATH 内のディレクトリにダウンロードします。この例では
/usr/local/bin/を使用します。Linux: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu``macOS: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/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%)Pod ごとの GPU 割り当て詳細を表示するには、
kubectl inspect cgpu -dを実行します。
ステップ 5:サンプルワークロードのデプロイ
クラウドノードプール
現在の 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%)3 GiB の GPU メモリをリクエストするサンプルジョブをデプロイします。
npxxxxxxxxxxxxxxをご利用のノードプール ID に置き換えてください。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 # ご利用のノードプール ID に置き換えます 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: aliyun.com/gpu-mem: 3 # リクエストする GPU メモリ (GiB) workingDir: /root restartPolicy: Neveraliyun.com/gpu-memフィールドは、GPU メモリの量を GiB 単位で指定します。例えば、3は共有 GPU から 3 GiB の GPU メモリをリクエストします。
エッジノードプール
4 GiB の GPU メモリをリクエストするサンプルジョブをデプロイします。npxxxxxxxxxxxxxx をご利用のエッジノードプール ID に置き換えてください。
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 # ご利用のエッジノードプール ID に置き換えます
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 # リクエストする GPU メモリ (GiB)
workingDir: /root
restartPolicy: Neverステップ 6:結果の確認
クラウドノードプール
コントロールプレーンにログインします。
Pod の最後のログ行をプリントして、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)この出力は、コンテナによって 2,832 MiB の GPU メモリがリクエストされたことを示しています。
コンテナ内で nvidia-smi を実行して、コンテナから見えるメモリを確認します。
`3043MiB / 3231MiB` — コンテナは GPU 全体のメモリではなく、3,231 MiB (約 3 GiB) のみを参照できます。これは 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 | |=============================================================================| +-----------------------------------------------------------------------------+主な考慮事項:
ノード上で nvidia-smi を実行して、合計 GPU メモリを確認します。
`15079MiB` — ノード上の合計 GPU メモリ (Tesla T4 全体)
`3053MiB / 15079MiB` — コンテナは合計 15,079 MiB のうち 3,053 MiB を占有しており、残りのメモリは他の Pod が同じ 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 | +-----------------------------------------------------------------------------+主な考慮事項:
エッジノードプール
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [Pod] を選択します。
ご利用の Pod (例:`tensorflow-mnist-multigpu-*`) の [操作] 列で、[ターミナル] をクリックして以下を実行します。
`16384MiB` — Pod は GPU 全体のメモリ (V100 SXM2, 16 GiB) を参照できます。エッジノードプールは GPU 共有をサポートしますが、GPU メモリ隔離はサポートしないため、Pod のビューはリクエストした 4 GiB に制限されません。
Pod の実際の GPU メモリ使用量は、GPU 共有コンポーネントによって自動的に設定される環境変数によって管理されます:``
ALIYUN_COM_GPU_MEM_CONTAINER=4 # Pod に割り当てられた GPU メモリ (GiB) ALIYUN_COM_GPU_MEM_DEV=16 # 物理 GPU の合計メモリ (GiB)``割り当てられた GPU メモリと合計 GPU メモリの比率は次のとおりです:
4 / 16 = 0.25(25%)
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 | |=============================================================================| +-----------------------------------------------------------------------------+主な考慮事項:
次のステップ
GPU 共有の概要 — 基盤となる cGPU メカニズムについて学べます
GPU 共有コンポーネントのインストール — ack-ai-installer を更新します
cGPU のメモリ隔離機能の無効化 — クラウドノードで GPU メモリ隔離なしでワークロードを実行します
高度な機能 — トポロジー認識スケジューリングやその他の高度な GPU 共有機能