Použití grafických procesorů pro úlohy náročné na výpočetní výkon na Azure Kubernetes Service (AKS)

Grafické jednotky zpracování (GPU) se často používají pro úlohy náročné na výpočetní výkon, jako jsou grafické úlohy a úlohy vizualizace. AKS podporuje vytváření fondů uzlů s podporou GPU ke spouštění těchto úloh náročných na výpočetní výkon v Kubernetes. Další informace o dostupných virtuálních počítačích s podporou GPU najdete v tématu Velikosti virtuálních počítačů optimalizovaných pro GPU v Azure. U fondů uzlů AKS doporučujeme minimální velikost Standard_NC6. Všimněte si, že řada NVv4 (založená na grafických procesorech AMD) se u AKS zatím nepodporuje.

Poznámka

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

V současné době je použití fondů uzlů s podporou GPU dostupné jenom pro fondy uzlů Linuxu.

Než začnete

Tento článek předpokládá, že máte existující cluster AKS. Pokud potřebujete cluster AKS, podívejte se na rychlý start AKS pomocí Azure CLI, pomocí Azure PowerShell nebo pomocí Azure Portal.

Potřebujete také nainstalované a nakonfigurované rozhraní příkazového řádku Azure CLI verze 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 váš cluster

Pomocí příkazu az aks get-credentials získejte přihlašovací údaje pro cluster AKS. Následující ukázkový příkaz získá přihlašovací údaje pro myAKSCluster ve skupině prostředků myResourceGroup .

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

Přidání modulu plug-in zařízení NVIDIA

Existují dvě možnosti přidání modulu plug-in zařízení NVIDIA:

  • Použití image AKS GPU
  • Ruční instalace modulu plug-in zařízení NVIDIA

Upozornění

Můžete použít některou z výše uvedených možností, ale neměli byste ručně nainstalovat démon modulu plug-in NVIDIA s clustery, které používají image AKS GPU.

Aktualizace clusteru tak, aby používala image GPU AKS (Preview)

AKS poskytuje plně nakonfigurovanou image AKS, která už obsahuje modul plug-in zařízení NVIDIA pro Kubernetes.

Zaregistrujte GPUDedicatedVHDPreview funkci:

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

Může to trvat několik minut, než se stav zobrazí jako Zaregistrovaný. Stav registrace můžete zkontrolovat pomocí příkazu az feature list :

az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/GPUDedicatedVHDPreview')].{Name:name,State:properties.state}"

Když se stav zobrazí jako zaregistrovaný, aktualizujte registraci Microsoft.ContainerService poskytovatele prostředků pomocí příkazu az provider register :

az provider register --namespace Microsoft.ContainerService

Pokud chcete nainstalovat rozšíření rozhraní příkazového řádku aks-Preview, použijte následující příkazy Azure CLI:

az extension add --name aks-preview

Pokud chcete aktualizovat rozšíření rozhraní příkazového řádku aks-Preview, použijte následující příkazy Azure CLI:

az extension update --name aks-preview

Přidání fondu uzlů pro uzly GPU

Pokud chcete do clusteru přidat fond uzlů, použijte [az aks nodepool add][az-aks-nodepool-add].

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --node-vm-size Standard_NC6 \
    --node-taints sku=gpu:NoSchedule \
    --aks-custom-headers UseGPUDedicatedVHD=true \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

Výše uvedený příkaz přidá fond uzlů s názvem gpunp do myAKSCluster ve skupině prostředků myResourceGroup . Příkaz také nastaví velikost virtuálního počítače pro uzly ve fondu uzlů na Standard_NC6, povolí automatické škálování clusteru, nakonfiguruje automatické škálování clusteru tak, aby udržoval minimálně jeden uzel a maximálně tři uzly ve fondu uzlů, určuje specializované uzly image GPU AKS ve vašem novém fondu uzlů a určuje sku=gpu: NoSchedule taint pro fond uzlů.

Poznámka

Velikost taintu a virtuálního počítače je možné nastavit jenom pro fondy uzlů během vytváření fondu uzlů, ale nastavení automatického škálování je možné kdykoli aktualizovat.

Poznámka

Pokud skladová položka GPU vyžaduje generování dvou virtuálních počítačů, používají --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true. Příklad:

az aks nodepool add \
   --resource-group myResourceGroup \
   --cluster-name myAKSCluster \
   --name gpunp \
   --node-count 1 \
   --node-vm-size Standard_NC6 \
   --node-taints sku=gpu:NoSchedule \
   --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true \
   --enable-cluster-autoscaler \
   --min-count 1 \
   --max-count 3

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

Alternativně můžete nasadit daemonSet pro modul plug-in zařízení NVIDIA. Tento daemonSet spustí pod na každém uzlu, aby poskytoval požadované ovladače pro gpu.

Přidejte do clusteru fond uzlů pomocí příkazu [az aks nodepool add][az-aks-nodepool-add].

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --node-vm-size Standard_NC6 \
    --node-taints sku=gpu:NoSchedule \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

Výše uvedený příkaz přidá fond uzlů s názvem gpunp do myAKSCluster ve skupině prostředků myResourceGroup . Příkaz také nastaví velikost virtuálního počítače pro uzly ve fondu uzlů na Standard_NC6, povolí automatické škálování clusteru, nakonfiguruje automatické škálování clusteru tak, aby udržoval minimálně jeden uzel a maximálně tři uzly ve fondu uzlů a určuje sku=gpu:NoSchedule taint pro fond uzlů.

Poznámka

Velikost taintu a virtuálního počítače je možné nastavit jenom pro fondy uzlů během vytváření fondu uzlů, ale nastavení automatického škálování je možné kdykoli aktualizovat.

Vytvořte obor názvů pomocí příkazu kubectl create obor názvů , například gpu-resources:

kubectl create namespace gpu-resources

Vytvořte soubor s názvem nvidia-device-plugin-ds.yaml a vložte následující manifest YAML. Tento manifest se poskytuje 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:1.11
        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

Pomocí kubectl použijte k vytvoření daemonSet a potvrzení úspěšného vytvoření modulu plug-in zařízení NVIDIA, jak je znázorněno v následujícím příkladu výstupu:

$ kubectl apply -f nvidia-device-plugin-ds.yaml

daemonset "nvidia-device-plugin" created

Ověřte, že jsou grafické procesory schedovatelné.

S vytvořeným clusterem AKS ověřte, že jsou grafické procesory v Kubernetes schedovatelné. Nejprve vypište uzly v clusteru pomocí příkazu kubectl get nodes :

$ kubectl get nodes

NAME                   STATUS   ROLES   AGE   VERSION
aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7

Teď pomocí příkazu kubectl describe node potvrďte, že jsou grafické procesory schedovatelné. V části Kapacita by měl GPU vypsat jako nvidia.com/gpu: 1.

Následující kondenzovaný příklad ukazuje, že gpu je k dispozici na uzlu s názvem aks-nodepool1-18821093-0:

$ kubectl describe node aks-gpunp-28993262-0

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, naplánujte úlohu s podporou GPU s příslušnou žádostí o prostředky. V tomto příkladu spustíme úlohu Tensorflow s datovou sadou MNIST.

Vytvořte soubor s názvem samples-tf-mnist-demo.yaml a vložte následující manifest YAML. Následující manifest úlohy 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 matic ovladačů NVIDIA – https://docs.nvidia.com/deploy/cuda-compatibility/index.html

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"

Ke spuštění úlohy použijte příkaz kubectl apply . Tento příkaz analyzuje soubor manifestu a vytvoří definované objekty Kubernetes:

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

Zobrazení stavu a výstupu úlohy s podporou GPU

Sledujte průběh úlohy pomocí příkazu kubectl get jobs s argumentem --watch . Načtení image a zpracování datové sady může trvat několik minut. Když sloupec COMPLETIONS zobrazuje 1/1, úloha se úspěšně dokončila. Ukončete kubetctl --watch příkaz pomocí Ctrl-C:

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

NAME                    COMPLETIONS   DURATION   AGE

samples-tf-mnist-demo   0/1           3m29s      3m29s
samples-tf-mnist-demo   1/1   3m10s   3m36s

Pokud se chcete podívat na výstup úlohy s podporou GPU, nejprve získejte název podu pomocí příkazu kubectl get pods :

$ kubectl get pods --selector app=samples-tf-mnist-demo

NAME                          READY   STATUS      RESTARTS   AGE
samples-tf-mnist-demo-mtd44   0/1     Completed   0          4m39s

Teď pomocí příkazu kubectl logs zobrazte protokoly podů. Následující ukázkové protokoly podů ověřte, že bylo zjištěno příslušné zařízení GPU. Tesla K80 Zadejte název vlastního podu:

$ kubectl logs samples-tf-mnist-demo-smnr6

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
Accuracy at step 200: 0.9315
Accuracy at step 210: 0.9361
Accuracy at step 220: 0.9357
Accuracy at step 230: 0.9392
Accuracy at step 240: 0.9387
Accuracy at step 250: 0.9401
Accuracy at step 260: 0.9398
Accuracy at step 270: 0.9407
Accuracy at step 280: 0.9434
Accuracy at step 290: 0.9447
Adding run metadata for 299
Accuracy at step 300: 0.9463
Accuracy at step 310: 0.943
Accuracy at step 320: 0.9439
Accuracy at step 330: 0.943
Accuracy at step 340: 0.9457
Accuracy at step 350: 0.9497
Accuracy at step 360: 0.9481
Accuracy at step 370: 0.9466
Accuracy at step 380: 0.9514
Accuracy at step 390: 0.948
Adding run metadata for 399
Accuracy at step 400: 0.9469
Accuracy at step 410: 0.9489
Accuracy at step 420: 0.9529
Accuracy at step 430: 0.9507
Accuracy at step 440: 0.9504
Accuracy at step 450: 0.951
Accuracy at step 460: 0.9512
Accuracy at step 470: 0.9539
Accuracy at step 480: 0.9533
Accuracy at step 490: 0.9494
Adding run metadata for 499

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

Pro kontejnerové Přehledy s AKS jsou k dispozici následující metriky pro monitorování využití GPU.

Název metriky Dimenze metriky (značky) Description
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Procento času v minulém ukázkovém období (60 sekund), během kterého bylo gpu zaneprázdněné/aktivně zpracovávané pro kontejner. Pracovní cyklus je číslo mezi 1 a 100.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Každý kontejner může zadat limity jako jednu nebo více grafických procesorů. Není možné požadovat ani omezit zlomek GPU.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Každý kontejner může požádat o 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, gpuModel, gpuVendor Množství paměti GPU v bajtech dostupných pro konkrétní kontejner.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Množství paměti GPU v bajtech používaných konkrétním kontejnerem.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Počet grafických procesorů v uzlu, který může Kubernetes používat.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Celkový počet grafických procesorů v uzlu

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

Chcete-li odebrat přidružené objekty Kubernetes vytvořené v tomto článku, použijte příkaz úlohy kubectl delete následujícím způsobem:

kubectl delete jobs samples-tf-mnist-demo

Další kroky

Pokud chcete spouštět úlohy Apache Sparku, přečtěte si téma Spouštění úloh Apache Sparku v AKS.

Další informace o spouštění úloh strojového učení (ML) v Kubernetes najdete v tématu Kubeflow Labs.

Informace o používání Azure Kubernetes Service s Azure Machine Learning najdete v následujících článcích: