Używanie procesorów GPU na potrzeby obciążeń intensywnie korzystających z obliczeń w usłudze Azure Kubernetes Service (AKS)

Graficzne jednostki przetwarzania (GPU) są często używane do obciążeń intensywnie korzystających z obliczeń, takich jak obciążenia grafiki i wizualizacji. Usługa AKS obsługuje pule węzłów systemu Linux z obsługą procesora GPU w celu uruchamiania obciążeń Kubernetes intensywnie korzystających z obliczeń.

Ten artykuł pomaga aprowizować węzły za pomocą schedulowalnych procesorów GPU w nowych i istniejących klastrach usługi AKS.

Obsługiwane maszyny wirtualne z obsługą procesora GPU

Aby wyświetlić obsługiwane maszyny wirtualne z obsługą procesora GPU, zobacz Rozmiary maszyn wirtualnych zoptymalizowanych pod kątem procesora GPU na platformie Azure. W przypadku pul węzłów usługi AKS zalecamy minimalny rozmiar Standard_NC6s_v3. Seria NVv4 (oparta na procesorach GPU AMD) nie jest obsługiwana w usłudze AKS.

Uwaga

Maszyny wirtualne z obsługą procesora GPU zawierają wyspecjalizowany sprzęt z zastrzeżeniem wyższych cen i dostępności regionów. Aby uzyskać więcej informacji, zobacz narzędzie cenowe i dostępność regionów.

Ograniczenia

  • Jeśli używasz puli węzłów z obsługą procesora GPU systemu Linux platformy Azure, automatyczne poprawki zabezpieczeń nie są stosowane, a domyślne zachowanie klastra to Niezarządzane. Aby uzyskać więcej informacji, zobacz automatyczne uaktualnianie.
  • Seria NVadsA10 v5 nie jest zalecaną jednostkę SKU dla wirtualnego dysku twardego procesora GPU.
  • Aktualizowanie istniejącej puli węzłów w celu dodania procesora GPU nie jest obsługiwane.

Zanim rozpoczniesz

Pobieranie poświadczeń dla klastra

  • Pobierz poświadczenia dla klastra usługi AKS przy użyciu az aks get-credentials polecenia . Następujące przykładowe polecenie pobiera poświadczenia dla grupy zasobów myAKSCluster w grupie zasobów myResourceGroup :

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

Opcje korzystania z procesorów GPU FIRMY NVIDIA

Korzystanie z procesorów GPU FIRMY NVIDIA obejmuje instalację różnych składników oprogramowania NVIDIA, takich jak wtyczka urządzenia NVIDIA dla platformy Kubernetes, instalacja sterownika procesora GPU i nie tylko.

Pomiń instalację sterownika procesora GPU (wersja zapoznawcza)

Usługa AKS ma domyślnie włączoną automatyczną instalację sterownika procesora GPU. W niektórych przypadkach, takich jak instalowanie własnych sterowników lub korzystanie z operatora procesora GPU firmy NVIDIA, możesz pominąć instalację sterownika procesora GPU.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

  1. Zarejestruj lub zaktualizuj rozszerzenie aks-preview przy użyciu az extension add polecenia lub az extension update .

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Utwórz pulę węzłów przy użyciu az aks nodepool add polecenia z flagą --skip-gpu-driver-install , aby pominąć automatyczną instalację sterownika procesora 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
    

    Dodanie flagi --skip-gpu-driver-install podczas tworzenia puli węzłów pomija automatyczną instalację sterownika procesora GPU. Żadne istniejące węzły nie są zmieniane. Możesz skalować pulę węzłów do zera, a następnie wykonać kopię zapasową, aby zmiany zaczęły obowiązywać.

Instalacja wtyczki urządzenia FIRMY NVIDIA

Instalacja wtyczki urządzenia NVIDIA jest wymagana w przypadku korzystania z procesorów GPU w usłudze AKS. W niektórych przypadkach instalacja jest obsługiwana automatycznie, na przykład podczas korzystania z operatora procesora GPU FIRMY NVIDIA lub obrazu procesora GPU usługi AKS (wersja zapoznawcza). Alternatywnie można ręcznie zainstalować wtyczkę urządzenia NVIDIA.

Ręczne instalowanie wtyczki urządzenia NVIDIA

Można wdrożyć zestaw DaemonSet dla wtyczki urządzenia NVIDIA, która uruchamia zasobnik na każdym węźle, aby zapewnić wymagane sterowniki dla procesorów GPU. Jest to zalecane podejście w przypadku korzystania z pul węzłów z obsługą procesora GPU dla systemu Linux.

Aby użyć domyślnej jednostki SKU systemu operacyjnego, należy utworzyć pulę węzłów bez określania jednostki SKU systemu operacyjnego. Pula węzłów jest skonfigurowana dla domyślnego systemu operacyjnego na podstawie wersji rozwiązania Kubernetes klastra.

  1. Dodaj pulę węzłów do klastra az aks nodepool add przy użyciu polecenia .

    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
    

    To polecenie dodaje pulę węzłów o nazwie gpunp do myAKSCluster w grupie myResourceGroup i używa parametrów do skonfigurowania następujących ustawień puli węzłów:

    • --node-vm-size: ustawia rozmiar maszyny wirtualnej dla węzła w puli węzłów na Standard_NC6s_v3.
    • --node-taints: określa wartość sku=gpu:NoSchedule taint w puli węzłów.
    • --enable-cluster-autoscaler: włącza funkcję automatycznego skalowania klastra.
    • --min-count: konfiguruje narzędzie do automatycznego skalowania klastra w celu zachowania co najmniej jednego węzła w puli węzłów.
    • --max-count: Konfiguruje narzędzie do automatycznego skalowania klastra w celu zachowania maksymalnie trzech węzłów w puli węzłów.

    Uwaga

    Rozmiary maszyn wirtualnych i taints można ustawić tylko dla pul węzłów podczas tworzenia puli węzłów, ale w dowolnym momencie można aktualizować ustawienia automatycznego skalowania.

  1. Utwórz przestrzeń nazw przy użyciu kubectl create namespace polecenia .

    kubectl create namespace gpu-resources
    
  2. Utwórz plik o nazwie nvidia-device-plugin-ds.yaml i wklej następujący manifest YAML podany w ramach wtyczki urządzenia NVIDIA dla projektu 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. Utwórz element DaemonSet i upewnij się, że wtyczka urządzenia NVIDIA została pomyślnie utworzona przy użyciu kubectl apply polecenia .

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Teraz, po pomyślnym zainstalowaniu wtyczki urządzenia NVIDIA, możesz sprawdzić, czy procesory GPU można schedulable i uruchomić obciążenie procesora GPU.

Używanie operatora procesora GPU firmy NVIDIA z usługą AKS

Operator procesora GPU firmy NVIDIA automatyzuje zarządzanie wszystkimi składnikami oprogramowania FIRMY NVIDIA wymaganymi do aprowizacji procesora GPU, w tym instalacją sterowników, wtyczką urządzenia NVIDIA dla platformy Kubernetes, środowiskiem uruchomieniowym kontenera NVIDIA i nie tylko. Ponieważ operator procesora GPU obsługuje te składniki, nie jest konieczne ręczne zainstalowanie wtyczki urządzenia NVIDIA. Oznacza to również, że automatyczna instalacja sterownika procesora GPU w usłudze AKS nie jest już wymagana.

  1. Pomiń automatyczną instalację sterownika procesora GPU, tworząc pulę węzłów przy użyciu polecenia z poleceniem az aks nodepool add--skip-gpu-driver-install. Dodanie flagi --skip-gpu-driver-install podczas tworzenia puli węzłów pomija automatyczną instalację sterownika procesora GPU. Żadne istniejące węzły nie są zmieniane. Możesz skalować pulę węzłów do zera, a następnie wykonać kopię zapasową, aby zmiany zaczęły obowiązywać.

  2. Postępuj zgodnie z dokumentacją firmy NVIDIA, aby zainstalować operator procesora GPU.

  3. Po pomyślnym zainstalowaniu operatora procesora GPU możesz sprawdzić, czy procesory GPU można schedulable i uruchomić obciążenie procesora GPU.

Ostrzeżenie

Nie zalecamy ręcznego instalowania demona wtyczki urządzenia NVIDIA z klastrami przy użyciu obrazu procesora GPU usługi AKS.

Korzystanie z obrazu procesora GPU usługi AKS (wersja zapoznawcza)

Usługa AKS udostępnia w pełni skonfigurowany obraz usługi AKS zawierający wtyczkę urządzenia NVIDIA dla platformy Kubernetes. Obraz procesora GPU usługi AKS jest obecnie obsługiwany tylko dla systemu Ubuntu 18.04.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

  1. Zainstaluj rozszerzenie interfejsu wiersza polecenia platformy aks-previewaz extension add Azure przy użyciu polecenia .

    az extension add --name aks-preview
    
  2. Przeprowadź aktualizację do najnowszej wersji rozszerzenia przy użyciu az extension update polecenia .

    az extension update --name aks-preview
    
  3. Zarejestruj flagę GPUDedicatedVHDPreview funkcji przy użyciu az feature register polecenia .

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

    Wyświetlenie stanu Zarejestrowane trwa kilka minut.

  4. Sprawdź stan rejestracji przy użyciu az feature show polecenia .

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Gdy stan będzie odzwierciedlał wartość Zarejestrowano, odśwież rejestrację dostawcy zasobów Microsoft.ContainerService przy użyciu az provider register polecenia .

    az provider register --namespace Microsoft.ContainerService
    

    Po zaktualizowaniu klastra w celu użycia obrazu procesora GPU usługi AKS możesz dodać pulę węzłów dla węzłów procesora GPU do klastra.

  6. Dodaj pulę węzłów przy użyciu az aks nodepool add polecenia .

    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
    

    Poprzednie przykładowe polecenie dodaje pulę węzłów o nazwie gpunp do pliku myAKSCluster w grupie myResourceGroup i używa parametrów do skonfigurowania następujących ustawień puli węzłów:

    • --node-vm-size: ustawia rozmiar maszyny wirtualnej dla węzła w puli węzłów na Standard_NC6s_v3.
    • --node-taints: określa wartość sku=gpu:NoSchedule taint w puli węzłów.
    • --aks-custom-headers: określa wyspecjalizowany obraz procesora GPU usługi AKS, UseGPUDedicatedVHD=true. Jeśli jednostka SKU procesora GPU wymaga maszyn wirtualnych generacji 2, użyj nagłówków --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true zamiast tego.
    • --enable-cluster-autoscaler: włącza funkcję automatycznego skalowania klastra.
    • --min-count: konfiguruje narzędzie do automatycznego skalowania klastra w celu zachowania co najmniej jednego węzła w puli węzłów.
    • --max-count: Konfiguruje narzędzie do automatycznego skalowania klastra w celu zachowania maksymalnie trzech węzłów w puli węzłów.

    Uwaga

    Rozmiary maszyn wirtualnych i taints można ustawić tylko dla pul węzłów podczas tworzenia puli węzłów, ale w dowolnym momencie można aktualizować ustawienia automatycznego skalowania.

  7. Po pomyślnym utworzeniu puli węzłów przy użyciu obrazu procesora GPU możesz sprawdzić, czy procesory GPU można schedulable i uruchomić obciążenie procesora GPU.

Upewnij się, że jednostki GPU można schedulable

Po utworzeniu klastra upewnij się, że procesory GPU można schedulable na platformie Kubernetes.

  1. Wyświetl listę węzłów w klastrze przy użyciu kubectl get nodes polecenia .

    kubectl get nodes
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Upewnij się, że procesory GPU można schedulable przy użyciu kubectl describe node polecenia .

    kubectl describe node aks-gpunp-28993262-0
    

    W sekcji Pojemność procesor GPU powinien mieć wartość nvidia.com/gpu: 1. Dane wyjściowe powinny wyglądać podobnie do następujących skróconych przykładowych danych wyjściowych:

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

Uruchamianie obciążenia z obsługą procesora GPU

Aby zobaczyć, jak działa procesor GPU, możesz zaplanować obciążenie z obsługą procesora GPU przy użyciu odpowiedniego żądania zasobu. W tym przykładzie uruchomimy zadanie Tensorflow względem zestawu danych MNIST.

  1. Utwórz plik o nazwie samples-tf-mnist-demo.yaml i wklej następujący manifest YAML , który zawiera limit nvidia.com/gpu: 1zasobów:

    Uwaga

    Jeśli podczas wywoływania sterowników wystąpi błąd niezgodności wersji, taki jak "Wersja sterownika CUDA jest niewystarczająca dla wersji środowiska uruchomieniowego CUDA", zapoznaj się z wykresem zgodności macierzy sterowników FIRMY 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. Uruchom zadanie przy użyciu kubectl apply polecenia , które analizuje plik manifestu i tworzy zdefiniowane obiekty Kubernetes.

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

Wyświetlanie stanu obciążenia z obsługą procesora GPU

  1. Monitoruj postęp zadania przy użyciu kubectl get jobs polecenia z flagą --watch . Może upłynąć kilka minut, aby najpierw ściągnąć obraz i przetworzyć zestaw danych.

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

    Gdy w kolumnie COMPLETIONS jest wyświetlana wartość 1/1, zadanie zostało zakończone pomyślnie, jak pokazano w poniższych przykładowych danych wyjściowych:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. kubectl --watch Zakończ proces za pomocą klawiszy Ctrl-C.

  3. Pobierz nazwę zasobnika przy użyciu kubectl get pods polecenia .

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. Wyświetl dane wyjściowe obciążenia z obsługą procesora GPU przy użyciu kubectl logs polecenia .

    kubectl logs samples-tf-mnist-demo-smnr6
    

    Następujące skrócone przykładowe dane wyjściowe dzienników zasobników potwierdzają, że wykryto odpowiednie urządzenie 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
    

Monitorowanie użycia procesora GPU przy użyciu Szczegółowe informacje kontenera

Kontener Szczegółowe informacje za pomocą usługi AKS monitoruje następujące metryki użycia procesora GPU:

Nazwa metryki Wymiar metryki (tagi) opis
containerGpuDutyCycle container.azm.ms/clusterId, , container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Procent czasu w poprzednim okresie próby (60 sekund), w którym procesor GPU był zajęty/aktywnie przetwarzany dla kontenera. Cykl dyżurów jest liczbą z zakresu od 1 do 100.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Każdy kontener może określać limity jako co najmniej jeden procesor GPU. Nie można zażądać ani ograniczyć części procesora GPU.
containerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Każdy kontener może zażądać co najmniej jednego procesora GPU. Nie można zażądać ani ograniczyć części procesora GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, , container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Ilość pamięci procesora GPU w bajtach dostępnych do użycia dla określonego kontenera.
containerGpumemoryUsedBytes container.azm.ms/clusterId, , container.azm.ms/clusterName, containerName, gpuId, , gpuModelgpuVendor Ilość pamięci procesora GPU w bajtach używanych przez określony kontener.
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Liczba procesorów GPU w węźle, które mogą być używane przez platformę Kubernetes.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Łączna liczba procesorów GPU w węźle.

Czyszczenie zasobów

  • Usuń skojarzone obiekty Kubernetes utworzone w tym artykule przy użyciu kubectl delete job polecenia .

    kubectl delete jobs samples-tf-mnist-demo
    

Następne kroki