グラフィック処理装置 (GPU) は、グラフィックや視覚化ワークロードなど、コンピューティング処理の負荷が高いワークロードによく使用されます。 AKS では、コンピューティング処理の負荷が高い Kubernetes ワークロードを実行するための GPU 対応 Linux ノード プールがサポートされています。
この記事は、新規および既存の AKS クラスターでスケジュール可能な GPU を使用してノードをプロビジョニングするのに役立ちます。
Important
2025 年 11 月 30 日の時点で、Azure Kubernetes Service (AKS) は Azure Linux 2.0 のセキュリティ更新プログラムをサポートまたは提供しなくなりました。 Azure Linux 2.0 ノード イメージは、 202512.06.0 リリースでフリーズします。 2026 年 3 月 31 日以降、ノード イメージは削除され、ノード プールをスケーリングできなくなります。 ノード プールをサポートされている Kubernetes バージョンにアップグレードするか、osSku AzureLinux3 に移行して、サポートされている Azure Linux バージョンに移行します。 詳細については、「 [廃止] AKS 上の Azure Linux 2.0 ノード プール」を参照してください。
サポートされている GPU 対応 VM
使用可能な GPU 対応 VM を表示するには、Azure での GPU 最適化 VM サイズに関するページを参照してください。 サポートされている VM サイズの一覧に GPU VM サイズがない場合、AKS は必要な GPU ソフトウェア コンポーネントをインストールしたり、サポートを提供したりしません。 AKS では、 GPU ドライバーの自動インストールをスキップした後、サポートされていない GPU VM サイズを使用できます。
az vm list-skus コマンドを使用して、使用可能な VM とサポートされている VM のサイズを確認します。
az vm list-skus --location <your-location> --output table
AKS ノード プールには、最小サイズの Standard_NC6s_v3 をお勧めします。 NVv4 シリーズ (AMD GPU に基づく) は、AKS ではサポートされていません。
注
GPU 対応 VM には、より高い価格が適用され、利用可能なリージョンが限られる特殊なハードウェアが含まれます。 詳細については、価格ツールと利用可能なリージョンを参照してください。
制限事項
- Azure Linux GPU 対応ノード プールを使用している場合、自動セキュリティ パッチは適用されません。 ノード OS アップグレード チャネルの既定の動作については、現在の AKS API バージョンを参照してください。
- AKS 用 Flatcar Container Linux は、AKS 上の NVIDIA GPU ではサポートされていません。
- AZURE Linux と OS Guard for AKS は、AKS 上の NVIDIA GPU ではサポートされていません。
注
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-previewAzure 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-resourcesnvidia-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.18.0 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-pluginsDaemonSet を作成し、
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-driverフィールドをnoneに設定することで、GPU ドライバーの自動インストールをスキップする既存の動作をレプリケートできます。 - 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-driverAPI フィールドを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.7kubectl describe nodeコマンドを使用して GPU がスケジュール可能であることを確認します。kubectl describe node aks-gpunp-28993262-0Capacity セクションで、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 3m36skubectl --watchで プロセスを終了します。kubectl get podsコマンドを使用してポッドの名前を取得します。kubectl get pods --selector app=samples-tf-mnist-demokubectl 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
ノード プールのアップグレード
ノード プールを 更新 または アップグレード する場合でも、どちらの操作にも --gpu-driver パラメーターがないことに気付く場合があります。 パラメーターを渡そうとすると、 unrecognized arguments: --gpu-driver none のようなエラーが発生する可能性があります。 値はそのような操作の影響を受けないため、パラメーターを呼び出す必要はありません。
ノード プールを初めて作成する場合、 --gpu-driver に対して宣言したパラメーターは、アップグレード/更新操作の影響を受けなくなります。 ドライバーをインストールせず、ノード プールの作成時に --gpu-driver None 選択した場合、以降の更新プログラムやアップグレードではドライバーはインストールされません。
リソースをクリーンアップする
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 の詳細については、次を参照してください。