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 úlohy náročné na výpočetní výkon, jako jsou grafické a vizualizační úlohy. AKS podporuje fondy uzlů Linuxu s podporou GPU pro spouštění úloh Kubernetes náročných na výpočetní výkon.

Tento článek vám pomůže zřizovat uzly se schedovatelnými grafickými procesory v nových a existujících clusterech AKS.

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

Pokud chcete zobrazit podporované virtuální počítače s podporou GPU, podívejte se na velikosti virtuálních počítačů optimalizovaných pro GPU v Azure. Pro fondy uzlů AKS doporučujeme minimální velikost Standard_NC6s_v3. Řada NVv4 (založená na grafických procesorech AMD) není podporována v AKS.

Poznámka:

Virtuální počítače s podporou GPU obsahují specializovaný hardware, na který se vztahují vyšší ceny a dostupnost oblastí. Další informace najdete v cenovém nástroji a dostupnosti oblastí.

Omezení

  • Pokud používáte fond uzlů s podporou GPU s Linuxem, nepoužijí se automatické opravy zabezpečení a výchozí chování clusteru je nespravované. Další informace najdete v tématu automatický upgrade.
  • NVadsA10 v5-series nejsou doporučenou skladovou jednotkou pro virtuální pevný disk GPU.
  • Aktualizace existujícího fondu uzlů pro přidání GPU se nepodporuje.

Než začnete

  • Tento článek předpokládá, že máte existující cluster AKS. Pokud cluster nemáte, vytvořte ho pomocí Azure CLI, Azure PowerShellu nebo webu Azure Portal.
  • Potřebujete nainstalovanou a nakonfigurovanou verzi Azure CLI 2.0.64 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Získání přihlašovacích údajů pro cluster

  • Pomocí příkazu získejte přihlašovací údaje pro cluster az aks get-credentials AKS. 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í grafických procesorů 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ší.

Přeskočit instalaci ovladače GPU (Preview)

AKS má ve výchozím nastavení povolenou automatickou instalaci ovladače GPU. V některých případech, například instalace vlastních ovladačů nebo použití operátoru NVIDIA GPU, můžete přeskočit instalaci ovladače GPU.

Důležité

Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi. Verze Preview jsou poskytovány "tak, jak jsou" a "dostupné", a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

  1. Zaregistrujte nebo aktualizujte rozšíření aks-preview pomocí az extension add příkazu nebo az extension update příkazu.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Vytvořte fond uzlů pomocí az aks nodepool add příkazu s příznakem --skip-gpu-driver-install , který přeskočí automatickou instalaci ovladače GPU.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --skip-gpu-driver-install \
        --node-vm-size Standard_NC6s_v3 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Přidání příznaku --skip-gpu-driver-install během vytváření fondu uzlů přeskočí automatickou instalaci ovladače GPU. Žádné existující uzly se nezmění. Fond uzlů můžete škálovat na nulu a pak zálohovat, aby se změna projevila.

Instalace modulu plug-in 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 se instalace zpracovává automaticky, například při použití operátoru NVIDIA GPU nebo image GPU AKS (Preview). Případně můžete modul plug-in zařízení NVIDIA nainstalovat ručně.

Ruční instalace modulu plug-in zařízení NVIDIA

Můžete nasadit daemonSet pro modul plug-in zařízení NVIDIA, který spouští pod na každém uzlu, aby poskytoval požadované ovladače pro gpu. Tento postup se doporučuje při použití 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 do clusteru az aks nodepool add fond uzlů pomocí příkazu.

    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á do myAKSCluster v myResourceGroup fond uzlů s názvem gpunpa pomocí parametrů nakonfiguruje následující nastavení fondu uzlů:

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

    Poznámka:

    Tainty a velikosti virtuálních počítačů je možné nastavit pouze pro fondy uzlů během vytváření fondu uzlů, ale nastavení automatického škálování můžete kdykoli aktualizovat.

  1. Vytvořte obor názvů pomocí kubectl create namespace příkazu.

    kubectl create namespace gpu-resources
    
  2. Vytvořte soubor s názvem nvidia-device-plugin-ds.yaml a vložte následující manifest YAML poskytnutý jako součást modulu plug-in zařízení NVIDIA pro projekt 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:
          # 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.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            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. Pomocí příkazu vytvořte daemonSet a potvrďte úspěšné vytvoření kubectl apply modulu plug-in zařízení NVIDIA.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Teď, když jste úspěšně nainstalovali modul plug-in zařízení NVIDIA, můžete zkontrolovat, jestli jsou grafické procesory schedovatelné , a spustit úlohu GPU.

Použití operátoru NVIDIA GPU s AKS

Operátor NVIDIA GPU automatizuje správu všech softwarových komponent NVIDIA potřebných ke zřízení gpu včetně instalace ovladačů, modulu plug-in zařízení NVIDIA pro Kubernetes, modulu runtime kontejneru NVIDIA a dalších. Vzhledem k tomu, že operátor GPU zpracovává tyto komponenty, není nutné ručně nainstalovat modul plug-in zařízení NVIDIA. To také znamená, že automatická instalace ovladače GPU v AKS už není nutná.

  1. Přeskočte automatickou instalaci ovladače GPU vytvořením fondu uzlů pomocí az aks nodepool add příkazu s --skip-gpu-driver-install. Přidání příznaku --skip-gpu-driver-install během vytváření fondu uzlů přeskočí automatickou instalaci ovladače GPU. Žádné existující uzly se nezmění. Fond uzlů můžete škálovat na nulu a pak zálohovat, aby se změna projevila.

  2. Postupujte podle dokumentace NVIDIA a nainstalujte operátor GPU.

  3. Teď, když jste úspěšně nainstalovali operátor GPU, můžete zkontrolovat, jestli jsou gpu dosažitelné a spustit úlohu GPU.

Upozorňující

Pomocí image AKS GPU nedoporučujeme ručně instalovat démon modulu plug-in NVIDIA s clustery.

Použití image AKS GPU (Preview)

AKS poskytuje plně nakonfigurovanou image AKS obsahující modul plug-in zařízení NVIDIA pro Kubernetes. Image AKS GPU je aktuálně podporována pouze pro Ubuntu 18.04.

Důležité

Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi. Verze Preview jsou poskytovány "tak, jak jsou" a "dostupné", a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

  1. aks-preview Nainstalujte rozšíření Azure CLI pomocí az extension add příkazu.

    az extension add --name aks-preview
    
  2. Pomocí příkazu aktualizujte na nejnovější verzi rozšíření az extension update .

    az extension update --name aks-preview
    
  3. GPUDedicatedVHDPreview Pomocí příkazu zaregistrujte příznak az feature register funkce.

    az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    

    Zobrazení stavu Zaregistrované trvá několik minut.

  4. Pomocí příkazu ověřte stav az feature show registrace.

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Jakmile se stav projeví jako zaregistrovaný, aktualizujte registraci poskytovatele prostředků Microsoft.ContainerService pomocí az provider register příkazu.

    az provider register --namespace Microsoft.ContainerService
    

    Teď, když jste cluster aktualizovali tak, aby používal image GPU AKS, můžete do clusteru přidat fond uzlů pro uzly GPU.

  6. Přidejte fond uzlů pomocí az aks nodepool add příkazu.

    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 \
        --aks-custom-headers UseGPUDedicatedVHD=true \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Předchozí ukázkový příkaz přidá do myAKSCluster v myResourceGroup fond uzlů s názvem gpunpa pomocí parametrů nakonfiguruje následující nastavení fondu uzlů:

    • --node-vm-size: Nastaví velikost virtuálního počítače pro uzel ve fondu uzlů na Standard_NC6s_v3.
    • --node-taints: Určuje taint sku=gpu:NoSchedule ve fondu uzlů.
    • --aks-custom-headers: Určuje specializovanou image AKS GPU, UseGPUDedicatedVHD=true. Pokud skladová položka GPU vyžaduje virtuální počítače generace 2, použijte - -aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true .
    • --enable-cluster-autoscaler: Povolí automatické škálování clusteru.
    • --min-count: Nakonfiguruje automatické škálování clusteru tak, aby udržovalo minimálně jeden uzel ve fondu uzlů.
    • --max-count: Nakonfiguruje automatické škálování clusteru tak, aby udržovalo maximálně tři uzly ve fondu uzlů.

    Poznámka:

    Tainty a velikosti virtuálních počítačů je možné nastavit pouze pro fondy uzlů během vytváření fondu uzlů, ale nastavení automatického škálování můžete kdykoli aktualizovat.

  7. Teď, když jste úspěšně vytvořili fond uzlů pomocí image GPU, můžete zkontrolovat, jestli jsou grafické procesory schedovatelné , a spustit úlohu GPU.

Potvrďte, že jsou gpu schedlitelné.

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

  1. Pomocí příkazu vypište uzly v clusteru kubectl get nodes .

    kubectl get nodes
    

    Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Pomocí příkazu ověřte, že jsou grafické procesory schednutelné 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ýstup by měl vypadat podobně jako v následujícím zhuštěném příkladu výstupu:

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

Spuštění úlohy s podporou GPU

Pokud chcete zobrazit GPU v akci, můžete naplánovat úlohu s podporou GPU s příslušnou žádostí o prostředky. V tomto příkladu spustíme úlohu Tensorflow pro datovou sadu MNIST.

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

    Poznámka:

    Pokud při volání do ovladačů dojde k chybě neshody verzí, například "Verze ovladače CUDA není pro verzi modulu runtime CUDA dostatečná", projděte si graf kompatibility ovladače 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í kubectl apply příkazu, který analyzuje soubor manifestu a vytvoří definované objekty Kubernetes.

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

Zobrazení stavu úlohy s podporou GPU

  1. Sledujte průběh úlohy pomocí kubectl get jobs příkazu s příznakem --watch . Načtení image a zpracování datové sady může trvat několik minut.

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

    Když se ve sloupci COMPLETIONS zobrazí hodnota 1/1, úloha se úspěšně dokončila, jak je znázorněno 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 kubectl --watch proces stisknutím ctrl-C.

  3. Pomocí příkazu získejte název podu 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ý ukázkový výstup protokolů podů potvrzuje, Tesla K80že bylo zjištěno příslušné zařízení GPU:

    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
    

Monitorování využití GPU pomocí Přehledy kontejneru

Kontejner Přehledy s AKS monitoruje následující metriky využití GPU:

Název metriky Dimenze metriky (značky) Popis
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Procento času v minulém ukázkovém období (60 sekund), během kterého byl GPU zaneprázdněn/aktivně zpracovával kontejner. Pracovní cyklus je číslo mezi 1 a 100.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Každý kontejner může zadat omezení jako jeden nebo více GPU. Není možné požadovat ani omezit zlomek GPU.
ContainerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Každý kontejner si může vyžádat jednu nebo více grafických procesorů. Není možné požadovat ani omezit zlomek GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Množství paměti GPU v bajtech, které lze použít pro konkrétní kontejner.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Velikost paměti GPU v bajtech používaných konkrétním kontejnerem
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Počet GPU v uzlu, který může Kubernetes používat.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Celkový počet GPU v uzlu

Vyčištění prostředků

  • Pomocí příkazu odeberte přidružené objekty Kubernetes, které jste vytvořili v tomto článku kubectl delete job .

    kubectl delete jobs samples-tf-mnist-demo
    

Další kroky