次の方法で共有


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

グラフィック処理装置 (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 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 バージョンに基づき、既定のオペレーティング システムに対して設定されます。

  1. 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.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
    
  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 ドライバーの自動インストールをスキップする既存の動作を保持するには、ノード プールを最新のノード イメージ バージョンにアップグレードし、 --gpu-driver フィールドを none に設定します。 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
    

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

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

kubectl delete jobs samples-tf-mnist-demo

次のステップ