GPU-k használata számítási igényű számítási feladatokhoz az Azure Kubernetes Service-ben (AKS)

A grafikus feldolgozási egységeket (GPU-kat) gyakran használják nagy számítási feladatokhoz, például grafikus és vizualizációs számítási feladatokhoz. Az AKS támogatja a GPU-kompatibilis Linux-csomópontkészleteket a nagy számítási kapacitású Kubernetes-számítási feladatok futtatásához.

Ez a cikk segítséget nyújt a csomópontok új és meglévő AKS-fürtöken való üzembe helyezéséhez schedulable GPU-kkal.

Támogatott GPU-kompatibilis virtuális gépek

A támogatott GPU-kompatibilis virtuális gépek megtekintéséhez tekintse meg a GPU-ra optimalizált virtuálisgép-méreteket az Azure-ban. Az AKS-csomópontkészletek esetében a minimális Standard_NC6s_v3 méretet javasoljuk. Az NVv4-sorozat (AMD GPU-k alapján) nem támogatott az AKS-en.

Feljegyzés

A GPU-kompatibilis virtuális gépek speciális hardvereket tartalmaznak, amelyek magasabb díjszabást és régiók rendelkezésre állását teszik lehetővé. További információkért tekintse meg a díjszabási eszközt és a régió rendelkezésre állását.

Korlátozások

  • Ha Azure Linux GPU-kompatibilis csomópontkészletet használ, a rendszer nem alkalmazza az automatikus biztonsági javításokat, és a fürt alapértelmezett viselkedése nem felügyelt. További információ: automatikus frissítés.
  • Az NVadsA10 v5 sorozat nem ajánlott termékváltozat GPU VHD-hez.
  • A meglévő csomópontkészlet GPU-ra való frissítése nem támogatott.

Mielőtt elkezdené

  • Ez a cikk feltételezi, hogy van egy meglévő AKS-fürtje. Ha nem rendelkezik fürttel, hozzon létre egyet az Azure CLI, az Azure PowerShell vagy az Azure Portal használatával.
  • Telepítenie és konfigurálnia kell az Azure CLI 2.0.64-es vagy újabb verzióját. A verzió azonosításához futtassa a következőt: az --version. Ha telepíteni vagy frissíteni szeretne: Az Azure CLI telepítése.

A fürt hitelesítő adatainak lekérése

  • Kérje le az AKS-fürt hitelesítő adatait a az aks get-credentials paranccsal. Az alábbi példaparancs lekéri a myAKSCluster hitelesítő adatait a myResourceGroup erőforráscsoportban:

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

Az NVIDIA GPU-k használatának lehetőségei

Az NVIDIA GPU-k használata magában foglalja a különböző NVIDIA-szoftverösszetevők telepítését, például a Kuberneteshez készült NVIDIA eszköz beépülő modult, a GPU-illesztőprogram telepítését stb.

GPU-illesztőprogram telepítésének kihagyása (előzetes verzió)

Az AKS alapértelmezés szerint engedélyezve van az automatikus GPU-illesztőprogram-telepítéssel. Bizonyos esetekben, például a saját illesztőprogramok telepítése vagy az NVIDIA GPU-operátor használata esetén érdemes kihagyni a GPU-illesztőprogramok telepítését.

Fontos

Az AKS előzetes verziójú funkciói önkiszolgáló, opt-in alapon érhetők el. Az előzetes verziókat "ahogy van" és "rendelkezésre állóként" biztosítjuk, és a szolgáltatási szerződésekből és a korlátozott jótállásból kizárjuk őket. Az AKS előzetes verzióit részben az ügyfélszolgálat fedezi a legjobb munkamennyiség alapján. Ezért ezek a funkciók nem éles használatra vannak szánva. További információkért tekintse meg az alábbi támogatási cikkeket:

  1. Regisztrálja vagy frissítse az aks-preview bővítményt a vagy az extension update parancs az extension add használatával.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Hozzon létre egy csomópontkészletet a az aks nodepool add jelölővel ellátott paranccsal az --skip-gpu-driver-install automatikus GPU-illesztőprogram telepítésének kihagyásához.

    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
    

    A csomópontkészlet létrehozásakor a --skip-gpu-driver-install jelölő hozzáadása kihagyja az automatikus GPU-illesztőprogram telepítését. A meglévő csomópontok nem módosulnak. A csomópontkészletet nullára skálázhatja, majd biztonsági másolatot készíthet a módosítás érvénybe lépéséhez.

NVIDIA eszköz beépülő modul telepítése

AZ NVIDIA eszköz beépülő moduljának telepítése szükséges, ha GPU-kat használ az AKS-en. Bizonyos esetekben a rendszer automatikusan kezeli a telepítést, például az NVIDIA GPU-operátor vagy az AKS GPU-rendszerkép (előzetes verzió) használatakor. Másik lehetőségként manuálisan is telepítheti az NVIDIA eszköz beépülő modult.

Az NVIDIA eszköz beépülő modul manuális telepítése

Az NVIDIA eszköz beépülő modulhoz üzembe helyezhet egy DaemonSetet, amely minden csomóponton futtat egy podot, hogy biztosítsa a GPU-khoz szükséges illesztőprogramokat. Ez az ajánlott módszer GPU-kompatibilis csomópontkészletek Azure Linuxhoz való használatakor.

Az alapértelmezett operációsrendszer-termékváltozat használatához az operációsrendszer-termékváltozat megadása nélkül hozza létre a csomópontkészletet. A csomópontkészlet a fürt Kubernetes-verziója alapján van konfigurálva az alapértelmezett operációs rendszerhez.

  1. Adjon hozzá csomópontkészletet a fürthöz a az aks nodepool add parancs használatával.

    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
    

    Ez a parancs hozzáad egy gpunp nevű csomópontkészletet a myAKSClusterhez a myResourceGroupban, és paraméterekkel konfigurálja a következő csomópontkészlet-beállításokat:

    • --node-vm-size: Beállítja a csomópontkészlet csomópontjának virtuálisgép-méretét Standard_NC6s_v3.
    • --node-taints: Egy sku=gpu:NoSchedule taint értéket ad meg a csomópontkészleten.
    • --enable-cluster-autoscaler: Engedélyezi a fürt automatikus skálázását.
    • --min-count: Úgy konfigurálja a fürt automatikus skálázását, hogy legalább egy csomópont maradjon a csomópontkészletben.
    • --max-count: Úgy konfigurálja a fürt automatikus skálázását, hogy legfeljebb három csomópontot tartson fenn a csomópontkészletben.

    Feljegyzés

    A csomópontkészletek létrehozásakor csak a csomópontkészletek méretei és méretei állíthatók be, de az automatikus skálázási beállításokat bármikor frissítheti.

  1. Hozzon létre egy névteret a kubectl create namespace paranccsal.

    kubectl create namespace gpu-resources
    
  2. Hozzon létre egy nvidia-device-plugin-ds.yaml nevű fájlt, és illessze be a kubernetes-projekthez készült NVIDIA eszköz beépülő modul részeként megadott alábbi YAML-jegyzékfájlt:

    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. Hozza létre a Démonkészletet, és győződjön meg arról, hogy az NVIDIA eszköz beépülő modul sikeresen létrejött a kubectl apply parancs használatával.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Most, hogy sikeresen telepítette az NVIDIA eszköz beépülő modult, ellenőrizheti, hogy a GPU-k schedulable-e , és gpu-számítási feladatot futtatnak-e.

NVIDIA GPU-operátor használata az AKS-sel

Az NVIDIA GPU-operátor automatizálja a GPU kiépítéséhez szükséges összes NVIDIA-szoftverösszetevő kezelését, beleértve az illesztőprogram telepítését, a Kubernetes NVIDIA eszköz beépülő modulját, az NVIDIA tároló futtatókörnyezetét stb. Mivel a GPU-operátor kezeli ezeket az összetevőket, nem szükséges manuálisan telepíteni az NVIDIA eszköz beépülő modult. Ez azt is jelenti, hogy az AKS-en már nincs szükség automatikus GPU-illesztő telepítésre.

  1. Hagyja ki az automatikus GPU-illesztőprogram-telepítést úgy, hogy létrehoz egy csomópontkészletet a az aks nodepool add következő paranccsal --skip-gpu-driver-install: . A csomópontkészlet létrehozásakor a --skip-gpu-driver-install jelölő hozzáadása kihagyja az automatikus GPU-illesztőprogram telepítését. A meglévő csomópontok nem módosulnak. A csomópontkészletet nullára skálázhatja, majd biztonsági másolatot készíthet a módosítás érvénybe lépéséhez.

  2. A GPU-operátor telepítéséhez kövesse az NVIDIA dokumentációját.

  3. Most, hogy sikeresen telepítette a GPU-operátort, ellenőrizheti, hogy a GPU-k schedulable-e , és futtathatók-e GPU-számítási feladatok.

Figyelmeztetés

Nem javasoljuk, hogy manuálisan telepítse az NVIDIA eszköz beépülő modul démonkészletét fürtökkel az AKS GPU-lemezkép használatával.

Az AKS GPU-lemezkép használata (előzetes verzió)

Az AKS egy teljes mértékben konfigurált AKS-rendszerképet biztosít, amely tartalmazza a Kuberneteshez készült NVIDIA eszköz beépülő modult. Az AKS GPU-rendszerkép jelenleg csak az Ubuntu 18.04-hez támogatott.

Fontos

Az AKS előzetes verziójú funkciói önkiszolgáló, opt-in alapon érhetők el. Az előzetes verziókat "ahogy van" és "rendelkezésre állóként" biztosítjuk, és a szolgáltatási szerződésekből és a korlátozott jótállásból kizárjuk őket. Az AKS előzetes verzióit részben az ügyfélszolgálat fedezi a legjobb munkamennyiség alapján. Ezért ezek a funkciók nem éles használatra vannak szánva. További információkért tekintse meg az alábbi támogatási cikkeket:

  1. Telepítse az aks-preview Azure CLI-bővítményt a az extension add paranccsal.

    az extension add --name aks-preview
    
  2. Frissítsen a bővítmény legújabb verziójára a az extension update paranccsal.

    az extension update --name aks-preview
    
  3. Regisztrálja a GPUDedicatedVHDPreview funkciójelzőt a az feature register paranccsal.

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

    Néhány percig tart, amíg az állapot megjelenik a Regisztrált állapotban.

  4. Ellenőrizze a regisztrációs állapotot a az feature show paranccsal.

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Ha az állapot a Regisztrált állapotot tükrözi, frissítse a Microsoft.ContainerService erőforrás-szolgáltató regisztrációját a az provider register paranccsal.

    az provider register --namespace Microsoft.ContainerService
    

    Most, hogy frissítette a fürtöt az AKS GPU-rendszerkép használatára, hozzáadhat egy csomópontkészletet a GPU-csomópontokhoz a fürthöz.

  6. Adjon hozzá egy csomópontkészletet a az aks nodepool add parancs használatával.

    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
    

    Az előző példaparancs hozzáad egy gpunp nevű csomópontkészletet a myAKSClusterhez a myResourceGroupban, és paraméterekkel konfigurálja a következő csomópontkészlet-beállításokat:

    • --node-vm-size: Beállítja a csomópontkészlet csomópontjának virtuálisgép-méretét Standard_NC6s_v3.
    • --node-taints: Egy sku=gpu:NoSchedule taint értéket ad meg a csomópontkészleten.
    • --aks-custom-headers: Egy speciális AKS GPU-rendszerképet ad meg, a UseGPUDedicatedVHD=true értéket. Ha a GPU-termékváltozathoz 2. generációs virtuális gépek szükségesek, használja a --aks-custom-headers UseGPUDedicatedVHD=true, usegen2vm=true parancsot.
    • --enable-cluster-autoscaler: Engedélyezi a fürt automatikus skálázását.
    • --min-count: Úgy konfigurálja a fürt automatikus skálázását, hogy legalább egy csomópont maradjon a csomópontkészletben.
    • --max-count: Úgy konfigurálja a fürt automatikus skálázását, hogy legfeljebb három csomópontot tartson fenn a csomópontkészletben.

    Feljegyzés

    A csomópontkészletek létrehozásakor csak a csomópontkészletek méretei és méretei állíthatók be, de az automatikus skálázási beállításokat bármikor frissítheti.

  7. Most, hogy sikeresen létrehozott egy csomópontkészletet a GPU-rendszerkép használatával, ellenőrizheti, hogy a GPU-k schedulable-e , és futtathatók-e GPU-számítási feladatok.

Ellenőrizze, hogy a GPU-k schedulable-e

A fürt létrehozása után győződjön meg arról, hogy a GPU-k a Kubernetesben használhatók.

  1. A parancs használatával kubectl get nodes listázhatja a fürt csomópontjait.

    kubectl get nodes
    

    A kimenetnek a következő példakimenethez hasonlóan kell kinéznie:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Győződjön meg arról, hogy a GPU-k a parancs használatával kubectl describe node schedulable-e.

    kubectl describe node aks-gpunp-28993262-0
    

    A Kapacitás szakaszban a GPU-nak a következőként kell szerepelnienvidia.com/gpu: 1: . A kimenetnek a következő kondenzált példakimenethez hasonlóan kell kinéznie:

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

GPU-kompatibilis számítási feladat futtatása

Ha működés közben szeretné látni a GPU-t, ütemezheti a GPU-kompatibilis számítási feladatokat a megfelelő erőforrás-kéréssel. Ebben a példában egy Tensorflow-feladatot futtatunk az MNIST-adathalmazon.

  1. Hozzon létre egy samples-tf-mnist-demo.yaml nevű fájlt, és illessze be a következő YAML-jegyzékfájlt, amely a következő erőforráskorlátot nvidia.com/gpu: 1tartalmazza:

    Feljegyzés

    Ha verzióeltérési hibát kap az illesztőprogramok behívásakor, például "A CUDA-illesztőprogram verziója nem elegendő a CUDA futtatókörnyezet verziójához", tekintse át az NVIDIA-illesztőprogramok mátrixkompatibilitási diagramját.

    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. Futtassa a feladatot a kubectl apply parancs használatával, amely elemzi a jegyzékfájlt, és létrehozza a definiált Kubernetes-objektumokat.

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

A GPU-kompatibilis számítási feladat állapotának megtekintése

  1. A feladat előrehaladásának figyelése a kubectl get jobs jelölővel ellátott --watch paranccsal. A rendszerkép lekérése és az adathalmaz feldolgozása eltarthat néhány percig.

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

    Ha a BEFEJEZÉSEK oszlop 1/1-et jelenít meg, a feladat sikeresen befejeződött, ahogy az alábbi példakimenetben is látható:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. Lépjen ki a folyamatból a kubectl --watch Ctrl-C billentyűkombinációval.

  3. Kérje le a pod nevét a kubectl get pods parancs használatával.

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. A parancs használatával megtekintheti a GPU-kompatibilis számítási feladat kimenetét kubectl logs .

    kubectl logs samples-tf-mnist-demo-smnr6
    

    A podnaplók következő sűrített példakimenete megerősíti, Tesla K80hogy a megfelelő GPU-eszköz felderítve lett:

    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
    

Tároló Elemzések használata a GPU-használat figyeléséhez

Az AKS-sel rendelkező tároló Elemzések a következő GPU-használati metrikákat figyeli:

Metrika neve Metrikadimenzió (címkék) Leírás
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuIdgpuModelgpuVendor Az elmúlt mintaidőszak (60 másodperc) időtartamának százalékos aránya, amely során a GPU foglalt/aktív feldolgozást végzett egy tárolón. A vámciklus egy 1 és 100 közötti szám.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Minden tároló megadhat korlátokat egy vagy több GPU-ként. A GPU töredékét nem lehet lekérni vagy korlátozni.
containerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Minden tároló igényelhet egy vagy több GPU-t. A GPU töredékét nem lehet lekérni vagy korlátozni.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuIdgpuModelgpuVendor A GPU-memória mennyisége bájtokban, amelyek egy adott tárolóhoz használhatók.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuIdgpuModelgpuVendor A GPU-memória mennyisége bájtokban, amelyeket egy adott tároló használ.
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor A Kubernetes által használható csomópontok GPU-jainak száma.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor A csomópont gpu-jainak teljes száma.

Az erőforrások eltávolítása

  • Távolítsa el a cikkben létrehozott társított Kubernetes-objektumokat a kubectl delete job paranccsal.

    kubectl delete jobs samples-tf-mnist-demo
    

Következő lépések