Sdílet prostřednictvím


Použití GPU pro úlohy náročné na výpočetní výkon ve službě Azure Kubernetes Service (AKS)

Grafické procesory (GPU) se často používají pro výpočetně náročné úlohy, jako jsou úlohy zaměřené na grafiku a vizualizaci. AKS podporuje uzlové fondy Linuxu s povolenou podporou GPU pro provoz výpočetně náročných Kubernetes pracovních zátěží.

Tento článek vám pomůže nastavit uzly se plánovatelnými GPU na nových a stávajících AKS clusterů.

Podporované virtuální počítače s podporou GPU

Chcete-li zobrazit podporované virtuální počítače s GPU, navštivte velikosti virtuálních počítačů optimalizovaných pro GPU v Azure. Pro uzly AKS doporučujeme minimální velikost Standard_NC6s_v3. NVv4 série (založená na AMD GPU) není podporována na AKS.

Poznámka:

Virtuální stroje s podporou GPU obsahují specializovaný hardware, který podléhá vyšším cenám a dostupnosti dle regionu. Pro více informací se podívejte na nástroj ceny a dostupnost regionů.

Omezení

  • Pokud používáte uzlový fond s podporou GPU na systému Azure Linux, automatické bezpečnostní záplaty nejsou aplikovány. Odkazujte na svou aktuální verzi API AKS pro výchozí chování kanálu upgradu OS uzlu.

Poznámka:

Pro verzi AKS API 2023-06-01 nebo novější je výchozím kanálem pro upgrade OS uzlu NodeImage. Pro u předchozích verzí je výchozí kanál None. Pokud se chcete dozvědět více, podívejte se na auto-upgrade.

  • Aktualizace existující skupiny uzlů za účelem přidání velikosti GPU VM není podporována v AKS.

Poznámka:

Obraz AKS GPU (náhled) bude vyřazen od 10. ledna 2025. Vlastní záhlaví již není k dispozici, což znamená, že nemůžete vytvářet nové uzlové skupiny s povoleným GPU pomocí obrazu AKS GPU. Doporučujeme migrovat na výchozí konfiguraci GPU nebo ji používat namísto obrazového souboru GPU, protože obrazový soubor GPU již není podporován. Pro více informací si přečtěte poznámky k vydání AKS nebo si prohlédněte toto oznámení o ukončení v naší veřejné roadmapě AKS.

Než začnete

  • Tento článek předpokládá, že již máte existující AKS cluster. Pokud nemáte klastr, vytvořte si ho pomocí Azure CLI, Azure PowerShell nebo portálu Azure.
  • K nastavení --gpu-driver pole potřebujete azure CLI verze 2.72.2 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalovat nebo upgradovat, podívejte se na Install Azure CLI.
  • Pokud máte aks-preview nainstalované rozšíření Azure CLI, aktualizujte prosím verzi na 18.0.0b2 nebo novější.

Získejte přihlašovací údaje pro váš klastr

Získejte přihlašovací údaje pro váš AKS cluster pomocí příkazu az aks get-credentials. Následující ukázkový příkaz načte přihlašovací údaje pro myAKSCluster ve skupině prostředků myResourceGroup :

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Možnosti použití GPU NVIDIA

Použití grafických procesorů NVIDIA zahrnuje instalaci různých softwarových komponent NVIDIA, jako je například modul plug-in zařízení NVIDIA pro Kubernetes, instalaci ovladače GPU a další.

Poznámka:

Microsoft ve výchozím nastavení automaticky udržuje verzi ovladačů NVIDIA jako součást nasazení image uzlu a AKS ji podporuje a spravuje . Zatímco ovladače NVIDIA jsou ve výchozím nastavení nainstalovány na uzlech podporujících GPU, musíte nainstalovat modul plug-in zařízení.

Instalace pluginu pro zařízení NVIDIA

Instalace modulu plug-in zařízení NVIDIA se vyžaduje při použití grafických procesorů v AKS. V některých případech je instalace provedena automaticky, například při použití NVIDIA GPU Operator. Případně můžete ručně nainstalovat plugin zařízení NVIDIA.

Ručně nainstalujte plugin zařízení NVIDIA

Můžete nasadit DaemonSet pro plugin zařízení NVIDIA, který spustí pod na každém uzlu, aby poskytl potřebné ovladače pro GPU. Jedná se o doporučený přístup při používání fondů uzlů s podporou GPU pro Azure Linux.

Pokud chcete použít výchozí skladovou položku operačního systému, vytvoříte fond uzlů bez zadání skladové položky operačního systému. Fond uzlů je nakonfigurovaný pro výchozí operační systém založený na verzi Kubernetes clusteru.

  1. Přidejte node pool do svého clusteru pomocí příkazu 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
    

    Tento příkaz přidává fond uzlů s názvem gpunp do myAKSCluster ve skupině prostředků myResourceGroup a používá parametry k nastavení následujících konfigurací fondu uzlů:

    • --node-vm-size: Nastaví velikost virtuálního stroje pro uzel v uzlovém poolu na Standard_NC6s_v3.
    • --node-taints: Určuje poškození sku=gpu:NoSchedule na poolu uzlů.
    • --enable-cluster-autoscaler: Aktivuje automatické škálování clusteru.
    • --min-count: Konfiguruje automatické škálování clusteru tak, aby v poolu uzlů udržovalo minimálně jeden uzel.
    • --max-count: Nakonfiguruje automatické škálování clusteru tak, aby udržovalo maximálně tři uzly v poolu uzlů.

    Poznámka:

    Tainty a velikosti VM lze nastavit pro sady uzlů pouze během jejich vytváření, ale nastavení automatického škálovače můžete aktualizovat kdykoliv.

  1. Vytvořte jmenný prostor pomocí příkazu kubectl create namespace.

    kubectl create namespace gpu-resources
    
  2. Vytvořte soubor s názvem nvidia-device-plugin-ds.yaml a vložte do něj následující YAML manifest, který je součástí projektu NVIDIA device plugin pro Kubernetes.

    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. Vytvořte DaemonSet a pomocí příkazu kubectl apply potvrďte, že byl modul plugin zařízení NVIDIA úspěšně vytvořen.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Nyní, když jste úspěšně nainstalovali plugin pro zařízení NVIDIA, můžete se přesvědčit, že vaše GPU jsou plánovatelná a spustit úlohu na GPU.

Přeskočit instalaci ovladače GPU

Pokud chcete řídit instalaci ovladačů NVIDIA nebo použít operátor NVIDIA GPU, můžete přeskočit výchozí instalaci ovladače GPU. Microsoft nepodporuje ani nespravuje údržbu a kompatibilitu ovladačů NVIDIA v rámci nasazení bitové kopie uzlu.

Poznámka:

Pole gpu-driver API je navrženou alternativou pro zákazníky, kteří dříve používali --skip-gpu-driver-install štítek uzlového fondu.

  • Značka --skip-gpu-driver-install fondu uzlů v AKS bude vyřazena 14. srpna 2025. Pokud chcete zachovat stávající chování při vynechání automatické instalace ovladače GPU, upgradujte fondy uzlů na nejnovější verzi image uzlu a nastavte --gpu-driver pole na none. Po 14. srpnu 2025 nebudete moct zřídit fondy uzlů AKS s podporou GPU pomocí značky fondu uzlů --skip-gpu-driver-install, abyste obešli toto výchozí chování. Další informace najdete v části skip-gpu-driver Vyřazení značek.
  1. Vytvořte fond uzlů pomocí az aks nodepool add příkazu a nastavte pole --gpu-driver na none, aby se přeskočila výchozí instalace ovladače 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 Nastavení pole rozhraní API na none během vytváření fondu uzlů přeskočí automatickou instalaci ovladače GPU. Jakékoli stávající uzly se nezmění. Fond uzlů můžete škálovat na nulu a pak zálohovat, aby se změna projevila.

    Pokud se zobrazí chyba unrecognized arguments: --gpu-driver none , aktualizujte verzi Azure CLI. Další informace najdete v tématu Než začnete.

  2. Podle těchto kroků můžete volitelně nainstalovat operátor NVIDIA GPU.

Potvrďte, že GPU jsou plánovatelné.

Po vytvoření clusteru ověřte, že se v Kubernetes dají schedovat gpu.

  1. Vylistujte uzly ve vašem clusteru pomocí příkazu kubectl get nodes.

    kubectl get nodes
    

    Vaše výstupy by měly vypadat podobně jako následující příklad:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Potvrďte, že GPU lze naplánovat pomocí příkazu kubectl describe node.

    kubectl describe node aks-gpunp-28993262-0
    

    V části Kapacita by gpu měl být uveden jako nvidia.com/gpu: 1. Váš výstup by měl vypadat podobně jako následující zkrácený příkladový výstup:

    Name:               aks-gpunp-28993262-0
    Roles:              agent
    Labels:             accelerator=nvidia
    
    [...]
    
    Capacity:
    [...]
     nvidia.com/gpu:                 1
    [...]
    

Spusťte úlohu se zapnutou podporou GPU

Abyste viděli GPU v akci, můžete naplánovat úkol se zapnutým GPU pomocí příslušného požadavku na prostředky. V tomto příkladu spustíme úlohu Tensorflow na datové sadě MNIST.

  1. Vytvořte soubor s názvem samples-tf-mnist-demo.yaml a vložte následující YAML manifest, který obsahuje limit zdrojů nvidia.com/gpu: 1.

    Poznámka:

    Pokud při volání ovladačů obdržíte chybu nesouladu verzí, například "verze ovladače CUDA je nedostatečná pro verzi CUDA runtime", zkontrolujte tabulku kompatibility ovladačů 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. Spusťte úlohu pomocí příkazu kubectl apply, který zpracovává soubor manifestu a vytváří definované objekty Kubernetes.

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

Zobrazit stav úlohy s podporou GPU

  1. Sledujte průběh úlohy pomocí kubectl get jobs příkazu s příznakem --watch . Může trvat několik minut, než se nejprve stáhne obraz a zpracuje dataset.

    kubectl get jobs samples-tf-mnist-demo --watch
    

    Když sloupec COMPLETIONS ukazuje 1/1, práce byla úspěšně dokončena, jak je vidět v následujícím příkladu výstupu:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. Ukončete proces kubectl --watch pomocí Ctrl-C.

  3. Získejte název podu pomocí příkazu kubectl get pods.

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. Pomocí příkazu zobrazte výstup úlohy kubectl logs s podporou GPU.

    kubectl logs samples-tf-mnist-demo-smnr6
    

    Následující zhuštěný příklad výstupu logů z podu potvrzuje, že byla objevena správná GPU zařízení, 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
    

Vyčistěte zdroje

Odstraňte související objekty Kubernetes, které jste vytvořili v tomto článku, pomocí příkazu kubectl delete job.

kubectl delete jobs samples-tf-mnist-demo

Další kroky