グラフィック処理装置 (GPU) は、グラフィックや視覚化ワークロードなど、コンピューティング処理の負荷が高いワークロードによく使用されます。 AKS では、コンピューティング処理の負荷が高い Kubernetes ワークロードを実行するための GPU 対応 Linux ノード プールがサポートされています。
この記事は、新規および既存の AKS クラスターでスケジュール可能な GPU を使用してノードをプロビジョニングするのに役立ちます。
Important
2025 年 11 月 30 日から、AKS は Azure Linux 2.0 のセキュリティ更新プログラムをサポートしたり提供したりしなくなります。
2026 年 3 月 31 日以降、ノード イメージは削除され、ノード プールをスケーリングできなくなります。
ノード プールをサポートされている Kubernetes バージョンにアップグレードするか、osSku AzureLinux3
に移行して、サポートされている Azure Linux バージョンに移行します。 詳細については、「 [廃止] AKS 上の Azure Linux 2.0 ノード プール」を参照してください。
サポートされている GPU 対応 VM
サポートされている GPU 対応 VM を表示するには、Azure での GPU 最適化済み VM サイズに関する記事を参照してください。 AKS ノード プールには、最小サイズの Standard_NC6s_v3 をお勧めします。 NVv4 シリーズ (AMD GPU に基づく) は、AKS ではサポートされていません。
注
GPU 対応 VM には、より高い価格が適用され、利用可能なリージョンが限られる特殊なハードウェアが含まれます。 詳細については、価格ツールと利用可能なリージョンを参照してください。
制限事項
- Azure Linux GPU 対応ノード プールを使用している場合、自動セキュリティ パッチは適用されません。 ノード OS アップグレード チャネルの既定の動作については、現在の AKS API バージョンを参照してください。
注
AKS API バージョン 2023-06-01 以降の場合、ノード OS アップグレードの既定のチャネルは NodeImage です。 以前のバージョンでは、既定のチャネルは None です。 詳細については、「自動アップグレード」を参照してください。
- 既存のノード プールを更新して GPU VM サイズを追加することは、AKS ではサポートされていません。
注
AKS GPU イメージ (プレビュー) は、2025 年 1 月 10 日以降廃止されました。 カスタム ヘッダーは使用できなくなりました。つまり、AKS GPU イメージを使用して新しい GPU 対応ノード プールを作成することはできません。 GPU イメージはサポートされなくなったので、GPU イメージではなく既定の GPU 構成への移行、またはその使用をお勧めします。 詳細については、「AKS リリース ノート」を参照するか、「AKS パブリック ロードマップ」内の廃止のお知らせを確認してください。
開始する前に
- この記事は、AKS クラスターがすでに存在していることを前提としています。 クラスターがない場合は、Azure CLI、Azure PowerShell、または Azure portal を使用して作成します。
-
--gpu-driver
フィールドを設定するには、Azure CLI バージョン 2.72.2 以降がインストールされている必要があります。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。 -
aks-preview
Azure CLI 拡張機能がインストールされている場合は、バージョンを 18.0.0b2 以降に更新してください。
クラスターの資格情報を取得する
az aks get-credentials
コマンドを使用して AKS クラスターの資格情報を取得します。 次のコマンド例では、myResourceGroup リソース グループにある myAKSCluster の資格情報を取得します。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
NVIDIA GPU を使用するためのオプション
NVIDIA GPU の使用には、Kubernetes 向け NVIDIA デバイス プラグインなどのさまざまな NVIDIA ソフトウェア コンポーネントのインストールや GPU ドライバーのインストールなどがともないます。
注
既定では、Microsoft はノード イメージのデプロイの一部として NVIDIA ドライバーのバージョンを自動的に維持し、AKS で サポートおよび管理 されます。 NVIDIA ドライバーは GPU 対応ノードに既定でインストールされますが、デバイス プラグインをインストールする必要があります。
NVIDIA デバイス プラグインのインストール
AKS で GPU を使用するとき、NVIDIA デバイス プラグインをインストールする必要があります。 NVIDIA GPU Operator の使用時など、インストールが自動で処理されることもあります。 あるいは、NVIDIA デバイス プラグインを手動でインストールできます。
NVIDIA デバイス プラグインを手動でインストールする
NVIDIA デバイス プラグイン用の DaemonSet をデプロイできます。このプラグインは、各ノードでポッドを実行して、GPU に必要なドライバーを提供します。 これは、Azure Linux に GPU 対応ノード プールを使用する場合に推奨される方法です。
既定の OS SKU を使用するには、OS SKU を指定せずにノード プールを作成します。 ノード プールは、クラスターの Kubernetes バージョンに基づき、既定のオペレーティング システムに対して設定されます。
az aks nodepool add
コマンドを使用して、クラスターにノード プールを追加します。az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunp \ --node-count 1 \ --node-vm-size Standard_NC6s_v3 \ --node-taints sku=gpu:NoSchedule \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
このコマンドでは、gpunp という名前のノード プールを myResourceGroup の myAKSCluster に追加し、パラメーターを使用して次のノード プール設定を構成します。
-
--node-vm-size
: ノード プール内のノードの VM サイズを Standard_NC6s_v3 に設定します。 -
--node-taints
: ノード プール上の sku=gpu:NoSchedule テイントを指定します。 -
--enable-cluster-autoscaler
: クラスターの自動スケーラーを有効にします。 -
--min-count
: ノード プール内の少なくとも 1 つのノードを維持するようにクラスター自動スケーラーを構成します。 -
--max-count
: ノード プール内の最大 3 つのノードを維持するようにクラスター自動スケーラーを構成します。
注
テイントと VM のサイズは、ノード プールの作成時にのみノード プールに設定できますが、自動スケーラーの設定はいつでも更新できます。
-
kubectl create namespace
コマンドを使って名前空間を作成します。kubectl create namespace gpu-resources
nvidia-device-plugin-ds.yaml という名前のファイルを作成し、Kubernetes プロジェクトの NVIDIA デバイス プラグインの一部として提供される次の YAML マニフェストを貼り付けます。
apiVersion: apps/v1 kind: DaemonSet metadata: name: nvidia-device-plugin-daemonset namespace: gpu-resources spec: selector: matchLabels: name: nvidia-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: labels: name: nvidia-device-plugin-ds spec: tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule" # Mark this pod as a critical add-on; when enabled, the critical add-on # scheduler reserves resources for critical add-on pods so that they can # be rescheduled after a failure. # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/ priorityClassName: "system-node-critical" containers: - image: nvcr.io/nvidia/k8s-device-plugin:v0.17.2 name: nvidia-device-plugin-ctr env: - name: FAIL_ON_INIT_ERROR value: "false" securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins
DaemonSet を作成し、
kubectl apply
コマンドを使って NVIDIA デバイス プラグインが正常に作成されたことを確認します。kubectl apply -f nvidia-device-plugin-ds.yaml
これで NVIDIA デバイス プラグインが正常にインストールされたので、GPU がスケジュール可能であることを確認したり、GPU ワークロードを実行したりできます。
GPU ドライバーのインストールをスキップする
NVIDIA ドライバーのインストールを制御する場合、または NVIDIA GPU オペレーターを使用する場合は、既定の GPU ドライバーのインストールをスキップできます。 Microsoft では、ノード イメージの展開の一環として、NVIDIA ドライバーのメンテナンスと互換性を サポートまたは管理していません 。
注
gpu-driver
API フィールドは、以前に --skip-gpu-driver-install
ノード プール タグを使用していたお客様に推奨される代替手段です。
- AKS の
--skip-gpu-driver-install
ノード プール タグは、2025 年 8 月 14 日に廃止されます。 GPU ドライバーの自動インストールをスキップする既存の動作を保持するには、ノード プールを最新のノード イメージ バージョンにアップグレードし、--gpu-driver
フィールドをnone
に設定します。 2025 年 8 月 14 日以降、この既定の動作をバイパスするために、--skip-gpu-driver-install
ノード プール タグを使用して AKS GPU 対応ノード プールをプロビジョニングすることはできません。 詳細については、「タグの廃止skip-gpu-driver
」を参照してください。
az aks nodepool add
コマンドを使用してノード プールを作成し、--gpu-driver
フィールドをnone
に設定して、既定の GPU ドライバーのインストールをスキップします。az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunp \ --node-count 1 \ --gpu-driver none \ --node-vm-size Standard_NC6s_v3 \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
ノード プールの作成時に
--gpu-driver
API フィールドをnone
に設定すると、GPU ドライバーの自動インストールはスキップされます。 既存のノードは変更されません。 ノード プールをゼロにスケールしてバックアップすることで変更を適用できます。unrecognized arguments: --gpu-driver none
エラーが発生した場合は、Azure CLI のバージョンを更新します。 詳細については、「開始する前に」を参照してください。必要に応じて、 次の手順に従って NVIDIA GPU オペレーターをインストールできます。
GPU がスケジュール可能であることを確認する
クラスターを作成したら、Kubernetes で GPU がスケジュール可能であることを確認します。
kubectl get nodes
コマンドを使用して、クラスター内のノードを一覧表示します。kubectl get nodes
出力は次の出力例のようになります。
NAME STATUS ROLES AGE VERSION aks-gpunp-28993262-0 Ready agent 13m v1.20.7
kubectl describe node
コマンドを使用して GPU がスケジュール可能であることを確認します。kubectl describe node aks-gpunp-28993262-0
Capacity セクションで、GPU は
nvidia.com/gpu: 1
と表示されているはずです。 出力は、次の要約された出力例のようになります:Name: aks-gpunp-28993262-0 Roles: agent Labels: accelerator=nvidia [...] Capacity: [...] nvidia.com/gpu: 1 [...]
GPU 対応ワークロードの実行
GPU が機能していることを確認するために、適切なリソース要求を指定して GPU 対応ワークロードをスケジュールできます。 この例では、MNIST データセットに対して Tensorflow ジョブを実行します。
samples-tf-mnist-demo.yaml という名前のファイルを作成し、
nvidia.com/gpu: 1
という制限のある次の YAML マニフェストを貼り付けます。注
ドライバーを呼び出すときに、"CUDA driver version is insufficient for CUDA runtime version" (CUDA ドライバーのバージョンが CUDA ランタイムのバージョンに対して不十分です" などのバージョン不一致エラーが発生した場合は、NVIDIA ドライバーのマトリックス互換性チャートを確認してください。
apiVersion: batch/v1 kind: Job metadata: labels: app: samples-tf-mnist-demo name: samples-tf-mnist-demo spec: template: metadata: labels: app: samples-tf-mnist-demo spec: containers: - name: samples-tf-mnist-demo image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu args: ["--max_steps", "500"] imagePullPolicy: IfNotPresent resources: limits: nvidia.com/gpu: 1 restartPolicy: OnFailure tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule"
kubectl apply
コマンドを使用してジョブを実行します。これにより、マニフェスト ファイルが解析され、定義された Kubernetes オブジェクトが作成されます。kubectl apply -f samples-tf-mnist-demo.yaml
GPU 対応ワークロードの状態を表示する
kubectl get jobs
フラグを指定して--watch
コマンドを使用し、ジョブの進行状況を監視します。 イメージを最初にプルし、データセットを処理するまで数分かかる可能性があります。kubectl get jobs samples-tf-mnist-demo --watch
次の出力例に示すように、COMPLETIONS 列に 1/1 と表示されている場合、ジョブは正常に完了しました。
NAME COMPLETIONS DURATION AGE samples-tf-mnist-demo 0/1 3m29s 3m29s samples-tf-mnist-demo 1/1 3m10s 3m36s
kubectl --watch
で プロセスを終了します。kubectl get pods
コマンドを使用してポッドの名前を取得します。kubectl get pods --selector app=samples-tf-mnist-demo
kubectl logs
コマンドを使用して、GPU 対応ワークロードの出力を表示します。kubectl logs samples-tf-mnist-demo-smnr6
次の要約されたポッド ログの出力例は、適切な GPU デバイス である
Tesla K80
が検出されたことを確認します。2019-05-16 16:08:31.258328: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2019-05-16 16:08:31.396846: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties: name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235 pciBusID: 2fd7:00:00.0 totalMemory: 11.17GiB freeMemory: 11.10GiB 2019-05-16 16:08:31.396886: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 2fd7:00:00.0, compute capability: 3.7) 2019-05-16 16:08:36.076962: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes. Extracting /tmp/tensorflow/input_data/train-images-idx3-ubyte.gz Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes. Extracting /tmp/tensorflow/input_data/train-labels-idx1-ubyte.gz Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes. Extracting /tmp/tensorflow/input_data/t10k-images-idx3-ubyte.gz Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes. Extracting /tmp/tensorflow/input_data/t10k-labels-idx1-ubyte.gz Accuracy at step 0: 0.1081 Accuracy at step 10: 0.7457 Accuracy at step 20: 0.8233 Accuracy at step 30: 0.8644 Accuracy at step 40: 0.8848 Accuracy at step 50: 0.8889 Accuracy at step 60: 0.8898 Accuracy at step 70: 0.8979 Accuracy at step 80: 0.9087 Accuracy at step 90: 0.9099 Adding run metadata for 99 Accuracy at step 100: 0.9125 Accuracy at step 110: 0.9184 Accuracy at step 120: 0.922 Accuracy at step 130: 0.9161 Accuracy at step 140: 0.9219 Accuracy at step 150: 0.9151 Accuracy at step 160: 0.9199 Accuracy at step 170: 0.9305 Accuracy at step 180: 0.9251 Accuracy at step 190: 0.9258 Adding run metadata for 199 [...] Adding run metadata for 499
リソースをクリーンアップする
kubectl delete job
コマンドを使用して、この記事で作成した関連する Kubernetes オブジェクトを削除します。
kubectl delete jobs samples-tf-mnist-demo
次のステップ
- Apache Spark ジョブを実行するには、AKS での Apache Spark ジョブの実行に関する記事を参照してください。
- Kubernetes スケジューラの機能の詳細については、「Azure Kubernetes Service (AKS) での高度なスケジューラ機能に関するベスト プラクティス」を参照してください。
- Azure Kubernetes Service と Azure Machine Learning の詳細については、次を参照してください。
Azure Kubernetes Service