Azure Kubernetes Service (AKS) üzerinde işlem yoğunluğu yoğun iş yükleri için GPU 'ları kullanmaUse GPUs for compute-intensive workloads on Azure Kubernetes Service (AKS)

Grafik işleme birimleri (GPU 'Lar) genellikle grafik ve görselleştirme iş yükleri gibi işlem yoğunluğu yoğun iş yükleri için kullanılır.Graphical processing units (GPUs) are often used for compute-intensive workloads such as graphics and visualization workloads. AKS, bu yoğun işlem yoğunluğu olan iş yüklerini Kubernetes 'de çalıştırmak için GPU etkin düğüm havuzlarının oluşturulmasını destekler.AKS supports the creation of GPU-enabled node pools to run these compute-intensive workloads in Kubernetes. Kullanılabilir GPU etkin VM 'Ler hakkında daha fazla bilgi için bkz. Azure 'Da GPU IYILEŞTIRILMIŞ VM boyutları.For more information on available GPU-enabled VMs, see GPU optimized VM sizes in Azure. AKS düğümlerinde, en az bir Standard_NC6 boyutu öneririz.For AKS nodes, we recommend a minimum size of Standard_NC6.

Not

GPU özellikli VM 'Ler, daha yüksek fiyatlandırma ve bölge kullanılabilirliğine tabi olan özel donanımlar içerir.GPU-enabled VMs contain specialized hardware that is subject to higher pricing and region availability. Daha fazla bilgi için bkz. fiyatlandırma aracı ve bölge kullanılabilirliği.For more information, see the pricing tool and region availability.

Şu anda, GPU etkin düğüm havuzlarının kullanılması yalnızca Linux düğüm havuzları için kullanılabilir.Currently, using GPU-enabled node pools is only available for Linux node pools.

Başlamadan önceBefore you begin

Bu makalede, GPU 'ları destekleyen düğümlere sahip mevcut bir AKS kümeniz olduğunu varsaymaktadır.This article assumes that you have an existing AKS cluster with nodes that support GPUs. AKS kümeniz Kubernetes 1,10 veya sonraki bir sürümü çalıştırmalıdır.Your AKS cluster must run Kubernetes 1.10 or later. Bu gereksinimleri karşılayan bir AKS kümesine ihtiyacınız varsa, BIR aks kümesi oluşturmakiçin bu makalenin ilk bölümüne bakın.If you need an AKS cluster that meets these requirements, see the first section of this article to create an AKS cluster.

Ayrıca Azure CLı sürüm 2.0.64 veya üzeri yüklü ve yapılandırılmış olmalıdır.You also need the Azure CLI version 2.0.64 or later installed and configured. Sürümü bulmak için az --version komutunu çalıştırın.Run az --version to find the version. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.If you need to install or upgrade, see Install Azure CLI.

AKS kümesi oluşturmaCreate an AKS cluster

Minimum gereksinimleri (GPU etkin düğüm ve Kubernetes sürüm 1,10 veya üzeri) karşılayan bir AKS kümesine ihtiyacınız varsa, aşağıdaki adımları izleyin.If you need an AKS cluster that meets the minimum requirements (GPU-enabled node and Kubernetes version 1.10 or later), complete the following steps. Bu gereksinimleri karşılayan bir AKS kümeniz zaten varsa, sonraki bölüme atlayın.If you already have an AKS cluster that meets these requirements, skip to the next section.

İlk olarak, az Group Create komutunu kullanarak küme için bir kaynak grubu oluşturun.First, create a resource group for the cluster using the az group create command. Aşağıdaki örnek eastus bölgesinde myresourcegroup adlı bir kaynak grubu adı oluşturur:The following example creates a resource group name myResourceGroup in the eastus region:

az group create --name myResourceGroup --location eastus

Şimdi az aks Create komutunu kullanarak bir aks kümesi oluşturun.Now create an AKS cluster using the az aks create command. Aşağıdaki örnek tek bir düğümü olan bir küme oluşturur Standard_NC6 :The following example creates a cluster with a single node of size Standard_NC6:

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-vm-size Standard_NC6 \
    --node-count 1

Az aks Get-Credentials komutunu kullanarak aks kümeniz için kimlik bilgilerini alın:Get the credentials for your AKS cluster using the az aks get-credentials command:

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

NVıDıA cihaz eklentisini yüklerInstall NVIDIA device plugin

Düğümlerdeki GPU 'Ların kullanılabilmesi için, NVıDıA cihaz eklentisi için bir DaemonSet dağıtmanız gerekir.Before the GPUs in the nodes can be used, you must deploy a DaemonSet for the NVIDIA device plugin. Bu DaemonSet, GPU 'Lar için gerekli sürücüleri sağlamak üzere her düğümde bir pod çalıştırır.This DaemonSet runs a pod on each node to provide the required drivers for the GPUs.

İlk olarak, GPU kaynakları gibi kubectl Create Namespace komutunu kullanarak bir ad alanı oluşturun:First, create a namespace using the kubectl create namespace command, such as gpu-resources:

kubectl create namespace gpu-resources

NVIDIA-Device-Plugin-DS. YAML adlı bir dosya oluşturun ve aşağıdaki YAML bildirimini yapıştırın.Create a file named nvidia-device-plugin-ds.yaml and paste the following YAML manifest. Bu bildirim, Kubernetes projesi Için NVIDIA cihaz eklentisininbir parçası olarak sağlanır.This manifest is provided as part of the NVIDIA device plugin for Kubernetes project.

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
      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

Şimdi, DaemonSet oluşturmak için kubectl Apply komutunu kullanın ve aşağıdaki örnek çıktıda GÖSTERILDIĞI gibi NVIDIA cihaz eklentisinin başarıyla oluşturulduğunu onaylayın:Now use the kubectl apply command to create the DaemonSet and confirm the NVIDIA device plugin is created successfully, as shown in the following example output:

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

daemonset "nvidia-device-plugin" created

AKS özel GPU görüntüsünü kullanma (Önizleme)Use the AKS specialized GPU image (preview)

Bu adımlara alternatif olarak, AKS, Kubernetes Için NVIDIA cihaz eklentisinizaten içeren tam olarak yapılandırılmış bir aks görüntüsü sağlar.As alternative to these steps, AKS is providing a fully configured AKS image that already contains the NVIDIA device plugin for Kubernetes.

Uyarı

Yeni AKS özel GPU görüntüsünü kullanarak kümeler için, NVıDıA cihaz eklentisi Daemon kümesini el ile yüklememelisiniz.You should not manually install the NVIDIA device plugin daemon set for clusters using the new AKS specialized GPU image.

Özelliği kaydedin GPUDedicatedVHDPreview :Register the GPUDedicatedVHDPreview feature:

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

Durumun kayıtlı olarak gösterilmesi birkaç dakika sürebilir.It might take several minutes for the status to show as Registered. Az Feature List komutunu kullanarak kayıt durumunu kontrol edebilirsiniz:You can check the registration status by using the az feature list command:

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

Durum kayıtlı olarak görünüyorsa, Microsoft.ContainerService az Provider Register komutunu kullanarak kaynak sağlayıcının kaydını yenileyin:When the status shows as registered, refresh the registration of the Microsoft.ContainerService resource provider by using the az provider register command:

az provider register --namespace Microsoft.ContainerService

Aks-Preview CLı uzantısını yüklemek için aşağıdaki Azure CLı komutlarını kullanın:To install the aks-preview CLI extension, use the following Azure CLI commands:

az extension add --name aks-preview

Aks-Preview CLı uzantısını güncelleştirmek için aşağıdaki Azure CLı komutlarını kullanın:To update the aks-preview CLI extension, use the following Azure CLI commands:

az extension update --name aks-preview

Yeni kümelerde AKS özel GPU görüntüsünü kullanma (Önizleme)Use the AKS specialized GPU image on new clusters (preview)

Kümeyi, küme oluşturulduğunda, AKS özel GPU görüntüsünü kullanacak şekilde yapılandırın.Configure the cluster to use the AKS specialized GPU image when the cluster is created. --aks-custom-headersAKS özel GPU görüntüsünü kullanmak için yeni KÜMENIZDEKI GPU Aracısı düğümlerinin bayrağını kullanın.Use the --aks-custom-headers flag for the GPU agent nodes on your new cluster to use the AKS specialized GPU image.

az aks create --name myAKSCluster --resource-group myResourceGroup --node-vm-size Standard_NC6 --node-count 1 --aks-custom-headers UseGPUDedicatedVHD=true

Normal AKS görüntülerini kullanarak bir küme oluşturmak istiyorsanız, özel etiketi atlayarak bunu yapabilirsiniz --aks-custom-headers .If you want to create a cluster using the regular AKS images, you can do so by omitting the custom --aks-custom-headers tag. Ayrıca, aşağıdaki gibi daha özelleştirilmiş GPU düğüm havuzları eklemeyi de seçebilirsiniz.You can also choose to add more specialized GPU node pools as per below.

Mevcut kümelerde AKS özel GPU görüntüsünü kullanma (Önizleme)Use the AKS specialized GPU image on existing clusters (preview)

AKS özel GPU görüntüsünü kullanmak için yeni bir düğüm havuzu yapılandırın.Configure a new node pool to use the AKS specialized GPU image. --aks-custom-headersAKS özel GPU görüntüsünü kullanmak için yeni düğüm havuzunuzdaki GPU Aracısı düğümlerinin bayrak bayrağını kullanın.Use the --aks-custom-headers flag flag for the GPU agent nodes on your new node pool to use the AKS specialized GPU image.

az aks nodepool add --name gpu --cluster-name myAKSCluster --resource-group myResourceGroup --node-vm-size Standard_NC6 --node-count 1 --aks-custom-headers UseGPUDedicatedVHD=true

Normal AKS görüntülerini kullanarak bir düğüm havuzu oluşturmak istiyorsanız, özel etiketi atlayarak bunu yapabilirsiniz --aks-custom-headers .If you want to create a node pool using the regular AKS images, you can do so by omitting the custom --aks-custom-headers tag.

Not

GPU SKU 'nuzun 2. nesil sanal makineler gerekiyorsa, şunları yapabilirsiniz:If your GPU sku requires generation 2 virtual machines, you can create doing:

az aks nodepool add --name gpu --cluster-name myAKSCluster --resource-group myResourceGroup --node-vm-size Standard_NC6s_v2 --node-count 1 --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true

GPU 'Ların zamanlanabilen olduğunu onaylayınConfirm that GPUs are schedulable

AKS kümeniz oluşturulduktan sonra, GPU 'Ların Kubernetes 'te zamanlanabilen olduğunu doğrulayın.With your AKS cluster created, confirm that GPUs are schedulable in Kubernetes. İlk olarak, kubectl Get Nodes komutunu kullanarak kümenizdeki düğümleri listeleyin:First, list the nodes in your cluster using the kubectl get nodes command:

$ kubectl get nodes

NAME                       STATUS   ROLES   AGE   VERSION
aks-nodepool1-28993262-0   Ready    agent   13m   v1.12.7

Artık GPU 'Ların zamanlanabilen olduğunu onaylamak için kubectl açıkla node komutunu kullanın.Now use the kubectl describe node command to confirm that the GPUs are schedulable. Kapasite bölümünün altında, GPU olarak listelemelidir nvidia.com/gpu: 1 .Under the Capacity section, the GPU should list as nvidia.com/gpu: 1.

Aşağıdaki sıkıştırılmış örnek, aks-nodepool1-18821093-0 adlı düğümde bir GPU 'nun kullanılabildiğini göstermektedir:The following condensed example shows that a GPU is available on the node named aks-nodepool1-18821093-0:

$ kubectl describe node aks-nodepool1-28993262-0

Name:               aks-nodepool1-28993262-0
Roles:              agent
Labels:             accelerator=nvidia

[...]

Capacity:
 attachable-volumes-azure-disk:  24
 cpu:                            6
 ephemeral-storage:              101584140Ki
 hugepages-1Gi:                  0
 hugepages-2Mi:                  0
 memory:                         57713784Ki
 nvidia.com/gpu:                 1
 pods:                           110
Allocatable:
 attachable-volumes-azure-disk:  24
 cpu:                            5916m
 ephemeral-storage:              93619943269
 hugepages-1Gi:                  0
 hugepages-2Mi:                  0
 memory:                         51702904Ki
 nvidia.com/gpu:                 1
 pods:                           110
System Info:
 Machine ID:                 b0cd6fb49ffe4900b56ac8df2eaa0376
 System UUID:                486A1C08-C459-6F43-AD6B-E9CD0F8AEC17
 Boot ID:                    f134525f-385d-4b4e-89b8-989f3abb490b
 Kernel Version:             4.15.0-1040-azure
 OS Image:                   Ubuntu 16.04.6 LTS
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://1.13.1
 Kubelet Version:            v1.12.7
 Kube-Proxy Version:         v1.12.7
PodCIDR:                     10.244.0.0/24
ProviderID:                  azure:///subscriptions/<guid>/resourceGroups/MC_myResourceGroup_myAKSCluster_eastus/providers/Microsoft.Compute/virtualMachines/aks-nodepool1-28993262-0
Non-terminated Pods:         (9 in total)
  Namespace                  Name                                     CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                     ------------  ----------  ---------------  -------------  ---
  kube-system                nvidia-device-plugin-daemonset-bbjlq     0 (0%)        0 (0%)      0 (0%)           0 (0%)         2m39s

[...]

GPU etkin iş yükünü çalıştırmaRun a GPU-enabled workload

GPU 'YU eylemde görmek için uygun kaynak isteğiyle GPU özellikli bir iş yükü zamanlayın.To see the GPU in action, schedule a GPU-enabled workload with the appropriate resource request. Bu örnekte, Mnist veri kümesinekarşı bir TensorFlow işi çalıştıralim.In this example, let's run a Tensorflow job against the MNIST dataset.

Samples-TF-mnist-demo. YAML adlı bir dosya oluşturun ve aşağıdaki YAML bildirimini yapıştırın.Create a file named samples-tf-mnist-demo.yaml and paste the following YAML manifest. Aşağıdaki iş bildirimi bir kaynak sınırı içerir nvidia.com/gpu: 1 :The following job manifest includes a resource limit of nvidia.com/gpu: 1:

Not

Sürücülere çağrı yaparken bir sürüm uyumsuzluğu hatası alırsanız (örneğin, CUDA sürücü sürümü CUDA çalışma zamanı sürümü için yetersizse), NVıDıA sürücü matrisi uyumluluk grafiğini gözden geçirin. https://docs.nvidia.com/deploy/cuda-compatibility/index.htmlIf you receive a version mismatch error when calling into drivers, such as, CUDA driver version is insufficient for CUDA runtime version, review the NVIDIA driver matrix compatibility chart - 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

İşi çalıştırmak için kubectl Apply komutunu kullanın.Use the kubectl apply command to run the job. Bu komut, bildirim dosyasını ayrıştırır ve tanımlanmış Kubernetes nesnelerini oluşturur:This command parses the manifest file and creates the defined Kubernetes objects:

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

GPU etkin iş yükünün durumunu ve çıkışını görüntülemeView the status and output of the GPU-enabled workload

Bağımsız değişkenle kubectl Get Jobs komutunu kullanarak işin ilerlemesini izleyin --watch .Monitor the progress of the job using the kubectl get jobs command with the --watch argument. Önce görüntüyü çekmek ve veri kümesini işlemek birkaç dakika sürebilir.It may take a few minutes to first pull the image and process the dataset. Tamamlamalar sütununda 1/1' ı gösteriyorsa, iş başarıyla tamamlanmıştır.When the COMPLETIONS column shows 1/1, the job has successfully finished. kubetctl --watch CTRL-C ile komuttan çıkın:Exit the kubetctl --watch command with 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

GPU etkin iş yükünün çıktısına bakmak için ilk olarak kubectl Get Pod komutunu kullanarak Pod 'un adını alın:To look at the output of the GPU-enabled workload, first get the name of the pod with the kubectl get pods command:

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

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

Şimdi Pod günlüklerini görüntülemek için kubectl logs komutunu kullanın.Now use the kubectl logs command to view the pod logs. Aşağıdaki örnek Pod günlükleri uygun GPU cihazının bulunduğunu onaylayın Tesla K80 .The following example pod logs confirm that the appropriate GPU device has been discovered, Tesla K80. Kendi Pod 'niz için ad belirtin:Provide the name for your own pod:

$ 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

Kaynakları temizlemeClean up resources

Bu makalede oluşturulan ilişkili Kubernetes nesnelerini kaldırmak için kubectl Delete Job komutunu aşağıdaki gibi kullanın:To remove the associated Kubernetes objects created in this article, use the kubectl delete job command as follows:

kubectl delete jobs samples-tf-mnist-demo

Sonraki adımlarNext steps

Apache Spark işleri çalıştırmak için bkz. AKS üzerinde Apache Spark Işleri çalıştırma.To run Apache Spark jobs, see Run Apache Spark jobs on AKS.

Kubernetes üzerinde makine öğrenimi (ML) iş yüklerini çalıştırma hakkında daha fazla bilgi için bkz. Kubeflow Labs.For more information about running machine learning (ML) workloads on Kubernetes, see Kubeflow Labs.