次の方法で共有


Azure Kubernetes Service (AKS) でコンピューティングを集中的に使用するワークロードに GPU を使用する

グラフィック処理装置 (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 CLIAzure 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 という名前のノード プールを myResourceGroupmyAKSCluster に追加し、パラメーターを使用して次のノード プール設定を構成します。

  • --node-vm-size: ノード プール内のノードの VM サイズを Standard_NC6s_v3 に設定します。
  • --node-taints: ノード プール上の sku=gpu:NoSchedule テイントを指定します。
  • --enable-cluster-autoscaler: クラスターの自動スケーラーを有効にします。
  • --min-count: ノード プール内の少なくとも 1 つのノードを維持するようにクラスター自動スケーラーを構成します。
  • --max-count: ノード プール内の最大 3 つのノードを維持するようにクラスター自動スケーラーを構成します。

テイントと VM のサイズは、ノード プールの作成時にのみノード プールに設定できますが、自動スケーラーの設定はいつでも更新できます。

  1. kubectl create namespace コマンドを使って名前空間を作成します。

    kubectl create namespace gpu-resources
    
  2. 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.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-plugins
    
  3. DaemonSet を作成し、kubectl apply コマンドを使って NVIDIA デバイス プラグインが正常に作成されたことを確認します。

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. これで 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」を参照してください。
  1. 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 のバージョンを更新します。 詳細については、「開始する前に」を参照してください。

  2. 必要に応じて、 次の手順に従って NVIDIA GPU オペレーターをインストールできます。

GPU がスケジュール可能であることを確認する

クラスターを作成したら、Kubernetes で GPU がスケジュール可能であることを確認します。

  1. kubectl get nodes コマンドを使用して、クラスター内のノードを一覧表示します。

    kubectl get nodes
    

    出力は次の出力例のようになります。

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. 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 ジョブを実行します。

  1. 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"
    
  2. kubectl apply コマンドを使用してジョブを実行します。これにより、マニフェスト ファイルが解析され、定義された Kubernetes オブジェクトが作成されます。

    kubectl apply -f samples-tf-mnist-demo.yaml
    

GPU 対応ワークロードの状態を表示する

  1. 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
    
  2. kubectl --watch プロセスを終了します。

  3. kubectl get pods コマンドを使用してポッドの名前を取得します。

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. 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
    

ノード プールのアップグレード

ノード プールを 更新 または アップグレード する場合でも、どちらの操作にも --gpu-driver パラメーターがないことに気付く場合があります。 パラメーターを渡そうとすると、 unrecognized arguments: --gpu-driver none のようなエラーが発生する可能性があります。 値はそのような操作の影響を受けないため、パラメーターを呼び出す必要はありません。

ノード プールを初めて作成する場合、 --gpu-driver に対して宣言したパラメーターは、アップグレード/更新操作の影響を受けなくなります。 ドライバーをインストールせず、ノード プールの作成時に --gpu-driver None 選択した場合、以降の更新プログラムやアップグレードではドライバーはインストールされません。

リソースをクリーンアップする

kubectl delete job コマンドを使用して、この記事で作成した関連する Kubernetes オブジェクトを削除します。

kubectl delete jobs samples-tf-mnist-demo

次のステップ