Azure Kubernetes Service'te (AKS) işlem yoğunluklu iş yükleri için GPU'ları kullanma

Grafik işleme birimleri (GPU' lar) genellikle grafikler ve görselleştirme iş yükleri gibi yoğun işlem gücü kullanan iş yükleri için kullanılır. AKS, yoğun işlem gücü kullanan Kubernetes iş yüklerini çalıştırmak için GPU özellikli Linux düğüm havuzlarını destekler.

Bu makale, yeni ve mevcut AKS kümelerinde zamanlanabilir GPU'larla düğümler sağlamanıza yardımcı olur.

Desteklenen GPU özellikli VM'ler

Desteklenen GPU özellikli VM'leri görüntülemek için bkz . Azure'da GPU için iyileştirilmiş VM boyutları. AKS düğüm havuzları için en düşük Standard_NC6s_v3 boyutu önerilir. NVv4 serisi (AMD GPU'ları temel alınarak) AKS'de desteklenmez.

Not

GPU özellikli VM'ler, daha yüksek fiyatlandırma ve bölge kullanılabilirliğine tabi özel donanımlar içerir. Daha fazla bilgi için bkz . fiyatlandırma aracı ve bölge kullanılabilirliği.

Sınırlamalar

  • Azure Linux GPU özellikli bir düğüm havuzu kullanıyorsanız otomatik güvenlik düzeltme ekleri uygulanmaz ve küme için varsayılan davranış Yönetilmeyen'dir. Daha fazla bilgi için bkz . otomatik yükseltme.
  • NVadsA10 v5 serisi , GPU VHD için önerilen bir SKU değildir .
  • Gpu eklemek için mevcut düğüm havuzunu güncelleştirme desteklenmez.

Başlamadan önce

  • Bu makalede, mevcut bir AKS kümeniz olduğu varsayılır. Kümeniz yoksa Azure CLI, Azure PowerShell veya Azure portalını kullanarak bir küme oluşturun.
  • Azure CLI sürüm 2.0.64 veya üzerinin yüklü ve yapılandırılmış olması gerekir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Kümenizin kimlik bilgilerini alma

  • komutunu kullanarak az aks get-credentials AKS kümenizin kimlik bilgilerini alın. Aşağıdaki örnek komut, myResourceGroup kaynak grubundaki myAKSCluster için kimlik bilgilerini alır:

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

NVIDIA GPU'larını kullanma seçenekleri

NVIDIA GPU'larının kullanılması Kubernetes için NVIDIA cihaz eklentisi, GPU sürücü yüklemesi ve daha fazlası gibi çeşitli NVIDIA yazılım bileşenlerinin yüklenmesini içerir.

GPU sürücüsü yüklemesini atlama (önizleme)

AKS'de varsayılan olarak otomatik GPU sürücüsü yüklemesi etkindir. Kendi sürücülerinizi yükleme veya NVIDIA GPU Operatörünü kullanma gibi bazı durumlarda GPU sürücüsü yüklemesini atlamak isteyebilirsiniz.

Önemli

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

  1. veya komutunu kullanarak aks-preview uzantısını kaydedin veya az extension update güncelleştirinaz extension add.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Otomatik GPU sürücüsü yüklemesini az aks nodepool add atlamak için bayrağıyla --skip-gpu-driver-install komutunu kullanarak bir düğüm havuzu oluşturun.

    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
    

    Düğüm havuzu oluşturma sırasında bayrağının --skip-gpu-driver-install eklenmesi, otomatik GPU sürücüsü yüklemesini atlar. Mevcut düğümler değiştirilmez. Değişikliğin etkili olması için düğüm havuzunu sıfıra ölçeklendirin ve sonra yedekleyin.

NVIDIA cihaz eklentisi yüklemesi

AKS'de GPU'lar kullanılırken NVIDIA cihaz eklentisi yüklemesi gereklidir. Bazı durumlarda yükleme, örneğin NVIDIA GPU operatörü veya AKS GPU görüntüsü (önizleme) kullanılırken otomatik olarak işlenir. Alternatif olarak, NVIDIA cihaz eklentisini el ile yükleyebilirsiniz.

NVIDIA cihaz eklentisini el ile yükleme

GPU'lar için gerekli sürücüleri sağlamak üzere her düğümde bir pod çalıştıran NVIDIA cihaz eklentisi için bir DaemonSet dağıtabilirsiniz. Bu, Azure Linux için GPU özellikli düğüm havuzları kullanılırken önerilen yaklaşımdır.

Varsayılan işletim sistemi SKU'su kullanmak için, bir işletim sistemi SKU'su belirtmeden düğüm havuzunu oluşturursunuz. Düğüm havuzu, kümenin Kubernetes sürümüne göre varsayılan işletim sistemi için yapılandırılır.

  1. komutunu kullanarak az aks nodepool add kümenize bir düğüm havuzu ekleyin.

    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
    

    Bu komut, myResourceGroup'taki myAKSCluster'agpunp adlı bir düğüm havuzu ekler ve aşağıdaki düğüm havuzu ayarlarını yapılandırmak için parametreleri kullanır:

    • --node-vm-size: Düğüm havuzundaki düğümün VM boyutunu Standard_NC6s_v3 olarak ayarlar.
    • --node-taints: Düğüm havuzundaki sku =gpu:NoSchedule renk tonunu belirtir.
    • --enable-cluster-autoscaler: Küme otomatik ölçeklendiricisini etkinleştirir.
    • --min-count: Küme otomatik ölçeklendiricisini düğüm havuzunda en az bir düğümü koruyacak şekilde yapılandırılır.
    • --max-count: Küme otomatik ölçeklendiricisini, düğüm havuzunda en fazla üç düğüm koruyacak şekilde yapılandırılır.

    Not

    Renk tonları ve VM boyutları yalnızca düğüm havuzu oluşturma sırasında düğüm havuzları için ayarlanabilir, ancak otomatik ölçeklendirici ayarlarını istediğiniz zaman güncelleştirebilirsiniz.

  1. komutunu kullanarak kubectl create namespace bir ad alanı oluşturun.

    kubectl create namespace gpu-resources
    
  2. nvidia-device-plugin-ds.yaml adlı bir dosya oluşturun ve Kubernetes için NVIDIA cihaz eklentisi projesi kapsamında sağlanan aşağıdaki YAML bildirimini yapıştırın:

    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. DaemonSet'i oluşturun ve komutunu kullanarak NVIDIA cihaz eklentisinin başarıyla oluşturulduğunu kubectl apply onaylayın.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. NVIDIA cihaz eklentisini başarıyla yüklediğinize göre, GPU'larınızın zamanlanabilir olup olmadığını denetleyebilirsiniz ve bir GPU iş yükü çalıştırabilirsiniz.

AKS ile NVIDIA GPU operatörü kullanma

NVIDIA GPU Operatörü, sürücü yüklemesi, Kubernetes için NVIDIA cihaz eklentisi, NVIDIA kapsayıcı çalışma zamanı ve daha fazlası dahil olmak üzere GPU sağlamak için gereken tüm NVIDIA yazılım bileşenlerinin yönetimini otomatikleştirir. GPU Operatörü bu bileşenleri işlediğinden NVIDIA cihaz eklentisini el ile yüklemeniz gerekmez. Bu, AKS'de otomatik GPU sürücüsü yüklemesinin artık gerekli olmadığı anlamına da gelir.

  1. ile --skip-gpu-driver-installkomutunu kullanarak bir düğüm havuzu oluşturarak otomatik GPU sürücüsü yüklemesini az aks nodepool add atlayın. Düğüm havuzu oluşturma sırasında bayrağının --skip-gpu-driver-install eklenmesi, otomatik GPU sürücüsü yüklemesini atlar. Mevcut düğümler değiştirilmez. Değişikliğin etkili olması için düğüm havuzunu sıfıra ölçeklendirin ve sonra yedekleyin.

  2. GPU operatörünü yüklemek için NVIDIA belgelerini izleyin.

  3. GPU operatörünü başarıyla yüklediğinize göre GPU'larınızın zamanlanabilir olup olmadığını denetleyebilirsiniz ve bir GPU iş yükü çalıştırabilirsiniz.

Uyarı

AKS GPU görüntüsünü kullanarak kümelerle ayarlanan NVIDIA cihaz eklentisi daemon'unu el ile yüklemenizi önermiyoruz.

AKS GPU görüntüsünü kullanma (önizleme)

AKS, Kubernetes için NVIDIA cihaz eklentisini içeren tam olarak yapılandırılmış bir AKS görüntüsü sağlar. AKS GPU görüntüsü şu anda yalnızca Ubuntu 18.04 için desteklenmektedir.

Önemli

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

  1. aks-preview komutunu kullanarak Azure CLI uzantısını az extension add yükleyin.

    az extension add --name aks-preview
    
  2. komutunu kullanarak uzantının en son sürümüne güncelleştirin az extension update .

    az extension update --name aks-preview
    
  3. GPUDedicatedVHDPreview komutunu kullanarak özellik bayrağını az feature register kaydedin.

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

    Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer.

  4. komutunu kullanarak az feature show kayıt durumunu doğrulayın.

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Durum Kayıtlı olarak yansıtıldığında, komutunu kullanarak Microsoft.ContainerService kaynak sağlayıcısının kaydını yenileyinaz provider register.

    az provider register --namespace Microsoft.ContainerService
    

    Kümenizi AKS GPU görüntüsünü kullanacak şekilde güncelleştirdiğinize göre, kümenize GPU düğümleri için bir düğüm havuzu ekleyebilirsiniz.

  6. komutunu kullanarak az aks nodepool add bir düğüm havuzu ekleyin.

    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
    

    Önceki örnek komut, myResourceGroup'takimyAKSCluster'a gpunp adlı bir düğüm havuzu ekler ve aşağıdaki düğüm havuzu ayarlarını yapılandırmak için parametreleri kullanır:

    • --node-vm-size: Düğüm havuzundaki düğümün VM boyutunu Standard_NC6s_v3 olarak ayarlar.
    • --node-taints: Düğüm havuzundaki sku =gpu:NoSchedule renk tonunu belirtir.
    • --aks-custom-headers: UseGPUDedicatedVHD=true adlı özelleştirilmiş bir AKS GPU görüntüsü belirtir. GPU sku'nuz 2. nesil VM gerektiriyorsa bunun yerine --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true kullanın.
    • --enable-cluster-autoscaler: Küme otomatik ölçeklendiricisini etkinleştirir.
    • --min-count: Küme otomatik ölçeklendiricisini düğüm havuzunda en az bir düğümü koruyacak şekilde yapılandırılır.
    • --max-count: Küme otomatik ölçeklendiricisini, düğüm havuzunda en fazla üç düğüm koruyacak şekilde yapılandırılır.

    Not

    Renk tonları ve VM boyutları yalnızca düğüm havuzu oluşturma sırasında düğüm havuzları için ayarlanabilir, ancak otomatik ölçeklendirici ayarlarını istediğiniz zaman güncelleştirebilirsiniz.

  7. GPU görüntüsünü kullanarak bir düğüm havuzunu başarıyla oluşturduğunuza göre, GPU'larınızın zamanlanabilir olup olmadığını denetleyebilirsiniz ve bir GPU iş yükü çalıştırabilirsiniz.

GPU'ların zamanlanabilir olduğunu onaylayın

Kümenizi oluşturduktan sonra GPU'ların Kubernetes'te zamanlanabilir olduğunu onaylayın.

  1. komutunu kullanarak kümenizdeki düğümleri listeleyin kubectl get nodes .

    kubectl get nodes
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. komutunu kullanarak kubectl describe node GPU'ların zamanlanabilir olduğunu onaylayın.

    kubectl describe node aks-gpunp-28993262-0
    

    Kapasite bölümünün altında GPU olarak nvidia.com/gpu: 1listelenmelidir. Çıkışınız aşağıdaki daraltılmış örnek çıkışa benzer olmalıdır:

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

GPU özellikli iş yükü çalıştırma

GPU'yı iş başında görmek için uygun kaynak isteğiyle GPU özellikli bir iş yükü zamanlayabilirsiniz. Bu örnekte, MNIST veri kümesinde bir Tensorflow işi çalıştıracağız.

  1. samples-tf-mnist-demo.yaml adlı bir dosya oluşturun ve kaynak sınırı içeren aşağıdaki YAML bildirimini nvidia.com/gpu: 1yapıştırın:

    Not

    Sürücülere çağrı yaparken "CUDA sürücü sürümü CUDA çalışma zamanı sürümü için yetersiz" gibi bir sürüm uyuşmazlığı hatası alırsanız NVIDIA sürücü matrisi uyumluluk grafiğini gözden geçirin.

    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. Bildirim dosyasını ayrıştıran ve tanımlı Kubernetes nesnelerini oluşturan komutunu kullanarak kubectl apply işi çalıştırın.

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

GPU özellikli iş yükünün durumunu görüntüleme

  1. bayrağıyla komutunu kullanarak kubectl get jobs işin ilerleme durumunu --watch izleyin. Önce görüntüyü çekmek ve veri kümesini işlemek birkaç dakika sürebilir.

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

    TAMAMLANMALAR sütununda 1/1 gösterildiğinde, aşağıdaki örnek çıktıda gösterildiği gibi iş başarıyla tamamlanmıştır:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. Ctrl-C ile işlemden kubectl --watch çıkın.

  3. komutunu kullanarak kubectl get pods podun adını alın.

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. komutunu kullanarak GPU özellikli iş yükünün çıkışını kubectl logs görüntüleyin.

    kubectl logs samples-tf-mnist-demo-smnr6
    

    Pod günlüklerinin aşağıdaki daraltılmış örnek çıktısı, Tesla K80uygun GPU cihazının bulunduğunu onaylar:

    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
    

GPU kullanımını izlemek için Kapsayıcı Analizler kullanma

AKS ile kapsayıcı Analizler aşağıdaki GPU kullanım ölçümlerini izler:

Ölçüm adı Ölçüm boyutu (etiketler) Açıklama
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, , gpuId, gpuModel, gpuVendor GPU'nun bir kapsayıcı için meşgul/etkin olarak işlendiği geçmiş örnek dönemi (60 saniye) içindeki zaman yüzdesi. Görev döngüsü 1 ile 100 arasında bir sayıdır.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Her kapsayıcı sınırları bir veya daha fazla GPU olarak belirtebilir. GPU'nun bir bölümünü istemek veya sınırlamak mümkün değildir.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Her kapsayıcı bir veya daha fazla GPU isteyebilir. GPU'nun bir bölümünü istemek veya sınırlamak mümkün değildir.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, , gpuId, gpuModel, gpuVendor Belirli bir kapsayıcı için kullanılabilen bayt cinsinden GPU Belleği miktarı.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, , gpuId, gpuModel, gpuVendor Belirli bir kapsayıcı tarafından kullanılan bayt cinsinden GPU Belleği miktarı.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Kubernetes tarafından kullanılabilen düğümdeki GPU sayısı.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Bir düğümdeki TOPLAM GPU sayısı.

Kaynakları temizleme

  • komutunu kullanarak kubectl delete job bu makalede oluşturduğunuz ilişkili Kubernetes nesnelerini kaldırın.

    kubectl delete jobs samples-tf-mnist-demo
    

Sonraki adımlar