Container Service for Kubernetes (ACK) は GPU スケジューリングおよび操作をサポートしています。そのデフォルトの GPU 使用モードは、アップストリームの Kubernetes コミュニティのパターンに準拠しています。本トピックでは、GPU スケジューリングを検証するために、サンプルの TensorFlow ワークロードをデプロイする手順を説明します。
前提条件
以下の要件を満たしていることを確認してください。
-
GPU ノードが 1 台以上ある ACK クラスター
-
クラスターへの接続が構成済みの kubectl
-
ACK コンソールへのアクセス
標準的な GPU リソースリクエストをバイパスしないこと
ACK で管理される GPU ノードでは、標準的な Kubernetes 拡張リソースメカニズム(nvidia.com/gpu を resources.limits 内で指定)を通じてのみ 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>を追加すること -
NVIDIA_VISIBLE_DEVICES環境変数を使用して Pod の GPU リソースをリクエストすること -
Pod の YAML で設定されていない場合に、コンテナイメージ内で
NVIDIA_VISIBLE_DEVICESをデフォルトでallに設定すること -
Pod の
securityContextにprivileged: trueを設定して GPU プログラムを実行すること
重要性: 非標準的な GPU リクエストは、スケジューラのリソーストラッキングに対して非表示になります。この不整合により、スケジューラがノード上の GPU を過剰に割り当て、複数の Pod が同一の GPU カード(例:GPU メモリ)を争う状態となり、ワークロードが失敗する可能性があります。これらの方法は、NVIDIA コミュニティによって報告されている既知のエラーを引き起こすこともあります。
GPU の可用性の確認
ワークロードをデプロイする前に、ご利用の GPU ノードが Kubernetes スケジューラに対して GPU 容量を公開していることを確認してください。
-
クラスター内のノード一覧を取得します。
kubectl get nodes -
GPU ノードの詳細を確認し、その容量をチェックします。
kubectl describe node <gpu-node-name>Capacity セクションで、
nvidia.com/gpuがゼロ以外の値を示している必要があります。Capacity: nvidia.com/gpu: 1nvidia.com/gpuが存在しない、または0を示している場合は、NVIDIA デバイスプラグインがノード上で実行されていない可能性があります。先に進む前に、プラグインの DaemonSet デプロイメント、GPU ドライバー、およびノード構成を確認してください。
GPU アプリケーションのデプロイ
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、対象のクラスターをクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
-
[デプロイメント] ページで、[YAML から作成] をクリックし、以下のマニフェストを貼り付けます。
apiVersion: v1 kind: Pod metadata: name: tensorflow-mnist namespace: default spec: containers: - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5 name: tensorflow-mnist command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: nvidia.com/gpu: 1 # このコンテナに GPU カードを 1 枚リクエストします。 workingDir: /root restartPolicy: AlwaysGPU 拡張リソースには
limitsのみが必要であり、requestsは不要です。Kubernetes では、拡張リソースに対して一致するlimitsなしにrequestsを指定することはできません。スケジューラはlimitsの値を有効なリクエストとして扱います。 -
左側のナビゲーションウィンドウで、[ワークロード] > [Pod] を選択します。該当の Pod を見つけてクリックします。
-
[ログ] タブをクリックします。イメージのプルおよび Pod の起動には数分かかる場合があります。実行開始後、ログ出力により GPU スケジューリングが正しく機能していることが確認できます。

次のステップ
-
異種混合クラスターで特定の GPU タイプをターゲットにするには、ノードラベルとセレクターを使用します。アクセラレータタイプ別に GPU ノードにラベルを付与します(例:
kubectl label nodes <node-name> accelerator=<gpu-model>)。その後、Pod の spec にnodeSelectorを追加します。 -
GPU 共有や隔離などの高度な GPU スケジューリングオプションについては、ACK GPU スケジューリングドキュメントをご参照ください。