Gunakan GPU untuk beban kerja intensif komputasi pada Layanan Azure Kubernetes (AKS)

Unit pemrosesan grafis (GPU) sering digunakan untuk beban kerja intensif komputasi, seperti beban kerja grafis dan visualisasi. AKS mendukung kumpulan simpul Linux berkemampuan GPU untuk menjalankan beban kerja Kubernetes intensif komputasi.

Artikel ini membantu Anda memprovisikan simpul dengan GPU yang dapat di-schedulable pada kluster AKS baru dan yang sudah ada.

VM yang didukung GPU

Untuk melihat VM yang didukung GPU, lihat Ukuran VM yang dioptimalkan GPU di Azure. Untuk kumpulan simpul AKS, kami merekomendasikan ukuran minimum Standard_NC6s_v3. Seri NVv4 (berdasarkan GPU AMD) tidak didukung di AKS.

Catatan

VM dengan dukungan GPU berisi perangkat keras khusus yang tunduk pada harga dan ketersediaan wilayah yang lebih tinggi. Untuk informasi selengkapnya, lihat alat penentuan harga dan ketersediaan wilayah.

Batasan

  • Jika Anda menggunakan kumpulan simpul berkemampuan GPU Azure Linux, patch keamanan otomatis tidak diterapkan, dan perilaku default untuk kluster tidak dikelola. Untuk informasi selengkapnya, lihat peningkatan otomatis.
  • Seri NVadsA10 v5 bukan SKU yang direkomendasikan untuk GPU VHD.
  • Memperbarui kumpulan simpul yang ada untuk menambahkan GPU tidak didukung.

Sebelum Anda mulai

  • Artikel ini mengasumsikan Anda memiliki kluster AKS yang sudah ada. Jika Anda tidak memiliki kluster, buat kluster menggunakan Azure CLI, Azure PowerShell, atau portal Azure.
  • Anda memerlukan Azure CLI versi 2.0.64 atau yang lebih baru yang diinstal dan dikonfigurasi. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

Dapatkan informasi masuk untuk kluster Anda

  • Dapatkan kredensial untuk kluster AKS Anda menggunakan az aks get-credentials perintah . Contoh perintah berikut mendapatkan kredensial untuk myAKSCluster di grup sumber daya myResourceGroup :

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

Opsi untuk menggunakan GPU NVIDIA

Menggunakan GPU NVIDIA melibatkan penginstalan berbagai komponen perangkat lunak NVIDIA seperti plugin perangkat NVIDIA untuk Kubernetes, penginstalan driver GPU, dan banyak lagi.

Lewati penginstalan driver GPU (pratinjau)

AKS mengaktifkan penginstalan driver GPU otomatis secara default. Dalam beberapa kasus, seperti menginstal driver Anda sendiri atau menggunakan Operator GPU NVIDIA, Anda mungkin ingin melewati penginstalan driver GPU.

Penting

Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

  1. Daftarkan atau perbarui ekstensi aks-preview menggunakan az extension add perintah atau 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. Buat kumpulan simpul menggunakan az aks nodepool add perintah dengan --skip-gpu-driver-install bendera untuk melewati penginstalan driver GPU otomatis.

    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
    

    --skip-gpu-driver-install Menambahkan bendera selama pembuatan kumpulan simpul melewati penginstalan driver GPU otomatis. Simpul yang ada tidak diubah. Anda dapat menskalakan kumpulan simpul ke nol lalu mencadangkan untuk membuat perubahan berlaku.

Penginstalan plugin perangkat NVIDIA

Penginstalan plugin perangkat NVIDIA diperlukan saat menggunakan GPU di AKS. Dalam beberapa kasus, penginstalan ditangani secara otomatis, seperti saat menggunakan Operator GPU NVIDIA atau gambar GPU AKS (pratinjau). Atau, Anda dapat menginstal plugin perangkat NVIDIA secara manual.

Pasang plugin perangkat NVIDIA secara manual

Anda dapat menyebarkan DaemonSet untuk plugin perangkat NVIDIA, yang menjalankan pod pada setiap simpul untuk menyediakan driver yang diperlukan untuk GPU. Ini adalah pendekatan yang disarankan saat menggunakan kumpulan simpul berkemampuan GPU untuk Azure Linux.

Untuk menggunakan SKU OS default, Anda membuat kumpulan simpul tanpa menentukan SKU OS. Kumpulan simpul dikonfigurasi untuk sistem operasi default berdasarkan versi Kubernetes kluster.

  1. Tambahkan kumpulan simpul ke kluster Anda menggunakan az aks nodepool add perintah .

    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
    

    Perintah ini menambahkan kumpulan simpul bernama gpunp ke myAKSCluster di myResourceGroup dan menggunakan parameter untuk mengonfigurasi pengaturan kumpulan simpul berikut:

    • --node-vm-size: Mengatur ukuran VM untuk simpul di kumpulan simpul ke Standard_NC6s_v3.
    • --node-taints: Menentukan taint sku=gpu:NoSchedule pada kumpulan simpul.
    • --enable-cluster-autoscaler: Mengaktifkan autoscaler kluster.
    • --min-count: Mengonfigurasi autoscaler kluster untuk mempertahankan minimal satu simpul di kumpulan simpul.
    • --max-count: Mengonfigurasi autoscaler kluster untuk mempertahankan maksimum tiga simpul di kumpulan simpul.

    Catatan

    Taint dan ukuran VM hanya dapat diatur untuk kumpulan simpul selama pembuatan kumpulan simpul, tetapi Anda dapat memperbarui pengaturan autoscaler kapan saja.

  1. Buat namespace layanan menggunakan kubectl create namespace perintah .

    kubectl create namespace gpu-resources
    
  2. Buat file bernama nvidia-device-plugin-ds.yaml dan tempelkan manifes YAML berikut yang disediakan sebagai bagian dari plugin perangkat NVIDIA untuk proyek 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. Buat DaemonSet dan konfirmasikan plugin perangkat NVIDIA berhasil dibuat menggunakan kubectl apply perintah .

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Sekarang setelah Anda berhasil menginstal plugin perangkat NVIDIA, Anda dapat memeriksa bahwa GPU Anda dapat di-schedulable dan menjalankan beban kerja GPU.

Menggunakan Operator GPU NVIDIA dengan AKS

Operator GPU NVIDIA mengotomatiskan manajemen semua komponen perangkat lunak NVIDIA yang diperlukan untuk menyediakan GPU termasuk penginstalan driver, plugin perangkat NVIDIA untuk Kubernetes, runtime kontainer NVIDIA, dan banyak lagi. Karena Operator GPU menangani komponen-komponen ini, tidak perlu menginstal plugin perangkat NVIDIA secara manual. Ini juga berarti bahwa penginstalan driver GPU otomatis pada AKS tidak lagi diperlukan.

  1. Lewati penginstalan driver GPU otomatis dengan membuat kumpulan simpul menggunakan az aks nodepool add perintah dengan --skip-gpu-driver-install. --skip-gpu-driver-install Menambahkan bendera selama pembuatan kumpulan simpul melewati penginstalan driver GPU otomatis. Simpul yang ada tidak diubah. Anda dapat menskalakan kumpulan simpul ke nol lalu mencadangkan untuk membuat perubahan berlaku.

  2. Ikuti dokumentasi NVIDIA untuk Menginstal Operator GPU.

  3. Setelah berhasil menginstal Operator GPU, Anda dapat memeriksa apakah GPU Anda dapat di-schedulable dan menjalankan beban kerja GPU.

Peringatan

Kami tidak menyarankan untuk menginstal daemon plugin perangkat NVIDIA secara manual yang diatur dengan kluster menggunakan gambar GPU AKS.

Menggunakan gambar GPU AKS (pratinjau)

AKS menyediakan gambar AKS yang dikonfigurasi sepenuhnya yang berisi plugin perangkat NVIDIA untuk Kubernetes. Gambar GPU AKS saat ini hanya didukung untuk Ubuntu 18.04.

Penting

Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

  1. aks-preview Instal ekstensi Azure CLI menggunakan az extension add perintah .

    az extension add --name aks-preview
    
  2. Perbarui ke versi terbaru ekstensi menggunakan az extension update perintah .

    az extension update --name aks-preview
    
  3. Daftarkan GPUDedicatedVHDPreview bendera fitur menggunakan az feature register perintah .

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

    Dibutuhkan beberapa menit agar status menampilkan Terdaftar.

  4. Verifikasi status pendaftaran menggunakan az feature show perintah .

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Saat status mencerminkan Terdaftar, refresh pendaftaran penyedia sumber daya Microsoft.ContainerService menggunakan az provider register perintah .

    az provider register --namespace Microsoft.ContainerService
    

    Setelah memperbarui kluster untuk menggunakan gambar GPU AKS, Anda dapat menambahkan kumpulan simpul untuk simpul GPU ke kluster Anda.

  6. Tambahkan kumpulan simpul menggunakan az aks nodepool add perintah .

    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
    

    Contoh perintah sebelumnya menambahkan kumpulan simpul bernama gpunp ke myAKSCluster di myResourceGroup dan menggunakan parameter untuk mengonfigurasi pengaturan kumpulan simpul berikut:

    • --node-vm-size: Mengatur ukuran VM untuk simpul di kumpulan simpul ke Standard_NC6s_v3.
    • --node-taints: Menentukan taint sku=gpu:NoSchedule pada kumpulan simpul.
    • --aks-custom-headers: Menentukan gambar GPU AKS khusus, UseGPUDedicatedVHD=true. Jika sku GPU Anda memerlukan VM generasi 2, gunakan --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true sebagai gantinya.
    • --enable-cluster-autoscaler: Mengaktifkan autoscaler kluster.
    • --min-count: Mengonfigurasi autoscaler kluster untuk mempertahankan minimal satu simpul di kumpulan simpul.
    • --max-count: Mengonfigurasi autoscaler kluster untuk mempertahankan maksimum tiga simpul di kumpulan simpul.

    Catatan

    Taint dan ukuran VM hanya dapat diatur untuk kumpulan simpul selama pembuatan kumpulan simpul, tetapi Anda dapat memperbarui pengaturan autoscaler kapan saja.

  7. Setelah berhasil membuat kumpulan simpul menggunakan gambar GPU, Anda dapat memeriksa apakah GPU Anda dapat di-schedulable dan menjalankan beban kerja GPU.

Konfirmasi bahwa GPU dapat dijadwalkan

Setelah membuat kluster, konfirmasikan bahwa GPU dapat di-schedulable di Kubernetes.

  1. Cantumkan simpul di kluster Anda menggunakan kubectl get nodes perintah .

    kubectl get nodes
    

    Output Anda akan terlihat mirip dengan contoh output berikut:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Konfirmasikan bahwa GPU dapat di-schedulable menggunakan kubectl describe node perintah .

    kubectl describe node aks-gpunp-28993262-0
    

    Di bawah bagian Kapasitas, GPU harus dicantumkan sebagai nvidia.com/gpu: 1. Output Anda akan terlihat mirip dengan contoh output ringkas berikut:

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

Jalankan beban kerja yang mendukung GPU

Untuk melihat GPU beraksi, Anda dapat menjadwalkan beban kerja berkemampuan GPU dengan permintaan sumber daya yang sesuai. Dalam contoh ini, kita akan menjalankan pekerjaan Tensorflow terhadap himpunan data MNIST.

  1. Buat file bernama samples-tf-mnist-demo.yaml dan tempelkan manifes YAML berikut, yang mencakup batas sumber daya :nvidia.com/gpu: 1

    Catatan

    Jika Anda menerima kesalahan ketidakcocokan versi saat memanggil driver, seperti "versi driver CUDA tidak mencukupkan untuk versi runtime CUDA", tinjau bagan kompatibilitas matriks driver 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. Jalankan pekerjaan menggunakan kubectl apply perintah , yang mengurai file manifes dan membuat objek Kubernetes yang ditentukan.

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

Menampilkan status beban kerja berkemampuan GPU

  1. Pantau kemajuan pekerjaan menggunakan kubectl get jobs perintah dengan --watch bendera . Mungkin perlu beberapa menit untuk terlebih dahulu menarik gambar dan memproses dataset.

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

    Ketika kolom COMPLETIONS menunjukkan 1/1, pekerjaan telah berhasil diselesaikan, seperti yang ditunjukkan dalam contoh output berikut:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. Keluar dari kubectl --watch proses dengan Ctrl-C.

  3. Dapatkan nama pod menggunakan kubectl get pods perintah .

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. Lihat output beban kerja berkemampuan GPU menggunakan kubectl logs perintah .

    kubectl logs samples-tf-mnist-demo-smnr6
    

    Contoh output ringkas berikut dari log pod mengonfirmasi bahwa perangkat GPU yang sesuai, Tesla K80, telah ditemukan:

    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
    

Gunakan Container Insights untuk memantau penggunaan GPU

Container Insights dengan AKS memantau metrik penggunaan GPU berikut:

Nama metrik Dimensi metrik (tag) Deskripsi
containerGpuDutyCycle container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , gpuModel,gpuVendor Persentase waktu selama periode sampel sebelumnya (60 detik) di mana GPU sibuk/aktif memproses untuk kontainer. Siklus tugas berupa angka antara 1 dan 100.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Setiap kontainer dapat menentukan batas sebagai satu GPU atau lebih. Tidak mungkin meminta atau membatasi sebagian kecil dari GPU.
containerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Setiap kontainer dapat meminta satu GPU atau lebih. Tidak mungkin meminta atau membatasi sebagian kecil dari GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , gpuModel,gpuVendor Jumlah Memori GPU dalam byte yang tersedia untuk digunakan untuk kontainer tertentu.
containerGpumemoryUsedBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , gpuModel,gpuVendor Jumlah Memori GPU dalam byte yang digunakan oleh kontainer tertentu.
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Jumlah GPU dalam suatu simpul yang dapat digunakan oleh Kube.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Jumlah Total GPU dalam suatu simpul.

Membersihkan sumber daya

  • Hapus objek Kubernetes terkait yang Anda buat di artikel ini menggunakan kubectl delete job perintah .

    kubectl delete jobs samples-tf-mnist-demo
    

Langkah berikutnya