Berbagi GPU dengan beberapa workload menggunakan berbagi waktu GPU


Halaman ini menunjukkan cara mengizinkan beberapa workload mendapatkan akses berbagi waktu GPU ke satu akselerator hardware GPU NVIDIA® di node Google Kubernetes Engine (GKE) Anda. Untuk mempelajari lebih lanjut cara kerja berbagi waktu GPU, serta keterbatasan dan contoh kapan Anda harus menggunakan berbagi waktu GPU, lihat Berbagi waktu GPU di GKE.

Ringkasan

Berbagi waktu GPU adalah fitur GKE yang memungkinkan beberapa container berbagi satu GPU fisik yang terpasang pada sebuah node. Dengan menggunakan berbagi waktu GPU di GKE, Anda dapat menggunakan GPU yang terpasang secara lebih efisien dan menghemat biaya pengoperasian.

Siapa sasaran pengguna panduan ini

Petunjuk dalam panduan ini berlaku untuk Anda jika Anda adalah salah satu dari yang berikut:

  • Administrator platform: Membuat dan mengelola cluster GKE, merencanakan persyaratan infrastruktur dan resource, serta memantau performa cluster.
  • Developer aplikasi: Mendesain dan men-deploy workload di cluster GKE. Jika Anda ingin petunjuk untuk meminta berbagi waktu GPU, lihat Men-deploy workload yang menggunakan berbagi waktu GPU.

Persyaratan

  • Versi GKE: Anda dapat mengaktifkan berbagi waktu GPU di cluster GKE Standard yang menjalankan GKE versi 1.23.7-gke.1400 dan yang lebih baru. Anda dapat menggunakan GPU berbagi waktu di cluster GKE Autopilot yang menjalankan GKE versi 1.29.3-gke.1093000 dan yang lebih baru.
  • Jenis GPU: Anda dapat mengaktifkan berbagi waktu GPU di semua model GPU NVIDIA.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan berbagi waktu GPU di cluster GKE dan node pool

Sebagai administrator platform, Anda harus mengaktifkan berbagi waktu GPU di cluster GKE Standard sebelum developer dapat men-deploy workload untuk menggunakan GPU tersebut. Untuk mengaktifkan berbagi waktu GPU, Anda harus melakukan hal berikut:

  1. Aktifkan berbagi waktu GPU di cluster GKE.
  2. Instal driver perangkat GPU NVIDIA (jika diperlukan).
  3. Verifikasi resource GPU yang tersedia di node Anda.

Cluster Autopilot yang menjalankan versi 1.29.3-gke.1093000 dan yang lebih baru mengaktifkan GPU berbagi waktu secara default. Pembagian waktu di cluster Autopilot dikonfigurasi dalam spesifikasi workload. Untuk mempelajari lebih lanjut, lihat bagian Men-deploy workload yang menggunakan GPU berbagi waktu.

Mengaktifkan berbagi waktu GPU di cluster GKE Standard

Anda dapat mengaktifkan berbagi waktu GPU saat membuat cluster GKE Standard. Node pool default di cluster telah mengaktifkan fitur tersebut. Anda masih harus mengaktifkan berbagi waktu GPU saat membuat node pool baru secara manual di cluster tersebut.

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster baru.
  • COMPUTE_REGION: region Compute Engine untuk cluster baru Anda. Untuk cluster zona, tentukan --zone=COMPUTE_ZONE.
  • CLUSTER_VERSION: versi GKE untuk bidang kontrol dan node cluster. Gunakan GKE versi 1.23.7-gke.1400 atau yang lebih baru. Atau, tentukan saluran rilis dengan versi GKE tersebut menggunakan flag --release-channel=RELEASE_CHANNEL.
  • MACHINE_TYPE: Jenis mesin Compute Engine untuk node Anda. Sebaiknya pilih Jenis mesin yang dioptimalkan untuk akselerator.
  • GPU_TYPE: jenis GPU yang harus berupa platform GPU NVIDIA seperti nvidia-tesla-v100.
  • GPU_QUANTITY: jumlah GPU fisik yang akan dipasang ke setiap node di node pool default.
  • CLIENTS_PER_GPU: jumlah maksimum container yang dapat membagikan setiap GPU fisik.
  • DRIVER_VERSION: versi driver NVIDIA yang akan diinstal. Dapat berupa salah satu dari hal berikut:
    • default: Menginstal versi driver default untuk versi GKE Anda.
    • latest: Instal versi driver terbaru yang tersedia untuk versi GKE Anda. Hanya tersedia untuk node yang menggunakan Container-Optimized OS.
    • disabled: Melewati penginstalan driver otomatis. Anda harus menginstal driver secara manual setelah membuat node pool. Jika Anda menghilangkan gpu-driver-version, ini adalah opsi defaultnya.

Mengaktifkan berbagi waktu GPU di node pool GKE

Anda dapat mengaktifkan berbagi waktu GPU saat membuat node pool baru secara manual di cluster GKE.

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ganti kode berikut:

  • NODEPOOL_NAME: nama node pool baru Anda.
  • CLUSTER_NAME: nama cluster Anda yang harus menjalankan GKE versi 1.23.7-gke.1400 atau yang lebih baru.
  • COMPUTE_REGION: region Compute Engine Anda. Untuk cluster zona, tentukan --zone=COMPUTE_ZONE.
  • MACHINE_TYPE: Jenis mesin Compute Engine untuk node Anda. Sebaiknya pilih Jenis mesin yang dioptimalkan untuk akselerator.
  • GPU_TYPE: jenis GPU yang harus berupa platform GPU NVIDIA seperti nvidia-tesla-v100.
  • GPU_QUANTITY: jumlah GPU fisik yang akan dipasang ke setiap node di node pool.
  • CLIENTS_PER_GPU: jumlah maksimum container yang dapat membagikan setiap GPU fisik.
  • DRIVER_VERSION: versi driver NVIDIA yang akan diinstal. Dapat berupa salah satu dari hal berikut:

    • default: Menginstal versi driver default untuk versi GKE Anda.
    • latest: Instal versi driver terbaru yang tersedia untuk versi GKE Anda. Hanya tersedia untuk node yang menggunakan Container-Optimized OS.
    • disabled: Melewati penginstalan driver otomatis. Anda harus menginstal driver secara manual setelah membuat node pool. Jika Anda menghilangkan gpu-driver-version, ini adalah opsi defaultnya.

Menginstal driver perangkat GPU NVIDIA

Sebelum melanjutkan, hubungkan ke cluster Anda dengan menjalankan perintah berikut:

gcloud container clusters get-credentials CLUSTER_NAME

Jika Anda memilih untuk menonaktifkan penginstalan driver otomatis saat membuat cluster, atau menggunakan versi GKE yang lebih lama dari 1.27.2-gke.1200, Anda harus menginstal driver NVIDIA yang kompatibel secara manual untuk mengelola pembagian waktu GPU dari GPU fisik. Untuk menginstal driver, Anda men-deploy DaemonSet penginstalan GKE yang menyiapkan driver.

Untuk mendapatkan petunjuk, lihat Menginstal driver perangkat GPU NVIDIA.

Jika berencana menggunakan penyediaan otomatis node di cluster, Anda juga harus mengonfigurasi penyediaan otomatis node dengan cakupan yang memungkinkan GKE untuk menginstal driver perangkat GPU untuk Anda. Untuk mendapatkan petunjuk, lihat Menggunakan penyediaan otomatis node dengan GPU.

Memverifikasi resource GPU yang tersedia di node Anda

Untuk memverifikasi bahwa jumlah GPU yang terlihat di node Anda cocok dengan jumlah yang Anda tentukan saat mengaktifkan berbagi waktu GPU, deskripsikan node Anda:

kubectl describe nodes NODE_NAME

Outputnya mirip dengan hal berikut ini:

...
Capacity:
  ...
  nvidia.com/gpu:             3
Allocatable:
  ...
  nvidia.com/gpu:             3

Dalam contoh output ini, jumlah resource GPU di node adalah 3 karena nilai yang ditentukan untuk max-shared-clients-per-gpu adalah 3 dan count GPU fisik yang akan dipasang di node adalah 1. Contoh lainnya, jika count GPU fisik adalah 2, output akan menampilkan 6 resource GPU yang dapat dialokasikan, masing-masing tiga pada setiap GPU fisik.

Men-deploy workload yang menggunakan berbagi waktu GPU

Sebagai operator aplikasi yang men-deploy workload GPU, Anda dapat memilih berbagi waktu GPU yang diaktifkan dengan menentukan label node yang sesuai di nodeSelector dalam manifes Anda. Saat merencanakan permintaan Anda, tinjau batas permintaan untuk memastikan GKE tidak menolak deployment Anda.

Untuk men-deploy workload guna menggunakan berbagi waktu GPU, selesaikan langkah-langkah berikut:

  1. Tambahkan nodeSelector ke manifes workload Anda untuk label berikut:

    • cloud.google.com/gke-gpu-sharing-strategy: time-sharing: memilih node yang menggunakan berbagi waktu GPU.
    • cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU": memilih node yang memungkinkan sejumlah container tertentu berbagi GPU dasar.
  2. Tambahkan permintaan resource GPU nvidia.com/gpu=1 ke spesifikasi container Anda, di spec.containers.resources.limits.

Misalnya, langkah-langkah berikut menunjukkan cara men-deploy tiga Pod ke node pool berbagi waktu GPU. GKE mengalokasikan setiap container ke GPU fisik yang sama. Container mencetak UUID GPU yang dipasang ke container tersebut.

  1. Simpan manifes berikut sebagai gpu-timeshare.yaml:

Autopilot

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-accelerator: "GPU_TYPE"
                cloud.google.com/gke-gpu-sharing-strategy: "time-sharing"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
                cloud.google.com/gke-accelerator-count: "GPU_COUNT"
              containers:
              - name: cuda-simple
                image: nvidia/cuda:11.0.3-base-ubi7
                command:
                - bash
                - -c
                - |
                  /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                resources:
                  limits:
                    nvidia.com/gpu: 1
      

Ganti kode berikut:

  • GPU_TYPE: jenis GPU.
  • CLIENTS_PER_GPU: jumlah beban kerja yang akan menggunakan GPU ini. Untuk contoh ini, gunakan 3.
  • GPU_COUNT: jumlah GPU fisik yang akan dipasang ke node. Untuk contoh ini, gunakan 1.

Standard

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
              containers:
              - name: cuda-simple
                image: nvidia/cuda:11.0.3-base-ubi7
                command:
                - bash
                - -c
                - |
                  /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                resources:
                  limits:
                    nvidia.com/gpu: 1
      

Ganti kode berikut:

  • SHARING_STRATEGY dengan "time-sharing" untuk meminta berbagi waktu untuk GPU Anda.
  • CLIENTS_PER_GPU: jumlah beban kerja yang akan menggunakan GPU ini. Untuk contoh ini, gunakan 3.
  1. Terapkan manifes:

    kubectl apply -f gpu-timeshare.yaml
    
  2. Pastikan semua Pod berjalan:

    kubectl get pods -l=app=cuda-simple
    
  3. Periksa log setiap Pod untuk melihat UUID GPU:

    kubectl logs POD_NAME
    

    Outputnya mirip dengan yang berikut ini:

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    
  4. Jika node Anda memiliki satu GPU fisik yang dipasang, periksa log Pod lain di node yang sama untuk memastikan bahwa UUID GPU-nya sama:

    kubectl logs POD2_NAME
    

    Outputnya mirip dengan hal berikut ini:

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    

Menggunakan berbagi waktu GPU dengan GPU multi-instance

Sebagai administrator platform, Anda mungkin ingin menggabungkan beberapa fitur GPU GKE. Berbagi waktu GPU berfungsi dengan GPU multi-instance, yang mempartisi satu GPU fisik menjadi sampai tujuh bagian. Partisi ini terpisah satu sama lain. Anda dapat mengonfigurasi pembagian waktu GPU untuk setiap partisi GPU multi-instance.

Misalnya, jika Anda menetapkan gpu-partition-size ke 1g.5gb, GPU dasar akan dibagi menjadi tujuh partisi. Jika Anda juga menetapkan max-shared-clients-per-gpu ke 3, setiap partisi dapat mendukung hingga tiga container, untuk total hingga 21 perangkat GPU berbagi waktu yang tersedia untuk dialokasikan di GPU fisik tersebut. Untuk mempelajari cara gpu-partition-size mengonversi ke partisi yang sebenarnya, lihat Partisi GPU multi-instance.

Untuk membuat cluster GPU multi-instance dengan berbagi waktu GPU yang diaktifkan, jalankan perintah berikut:

Autopilot

Dengan Autopilot, GPU berbagi waktu dan GPU multi-instance dapat digunakan bersama menggunakan kedua kumpulan pemilih node.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cuda-simple
spec:
  replicas: 7
  selector:
    matchLabels:
      app: cuda-simple
  template:
    metadata:
      labels:
        app: cuda-simple
    spec:
      nodeSelector:
        cloud.google.com/gke-gpu-partition-size: 1g.5gb
        cloud.google.com/gke-gpu-sharing-strategy: time-sharing
        cloud.google.com/gke-max-shared-clients-per-gpu: "3"
        cloud.google.com/gke-accelerator: nvidia-tesla-a100
        cloud.google.com/gke-accelerator-count: "1"
      containers:
      - name: cuda-simple
        image: nvidia/cuda:11.0.3-base-ubi7
        command:
        - bash
        - -c
        - |
          /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
        resources:
          limits:
            nvidia.com/gpu: 1

Standard

Dengan Standard, Anda perlu membuat cluster multi-instance GPU berbagi waktu dengan menjalankan perintah berikut:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ganti PARTITION_SIZE dengan ukuran partisi GPU multi-instance yang Anda inginkan, seperti 1g.5gb.

Batasan

  • Dengan berbagi waktu GPU, GKE menerapkan isolasi ruang alamat, isolasi performa, dan isolasi error di antara container yang menggunakan GPU fisik yang sama. Namun, batas memori tidak diterapkan pada GPU. Agar tidak mengalami masalah kehabisan memori (OOM), tetapkan batas memori GPU dalam workload Anda. Untuk menghindari masalah keamanan, hanya deploy workload yang berada dalam batas kepercayaan yang sama ke GPU berbagi waktu.
  • Untuk mencegah perilaku yang tidak terduga selama alokasi kapasitas, GKE mungkin menolak permintaan berbagi waktu GPU tertentu. Untuk mengetahui detailnya, lihat Permintaan GPU untuk berbagi waktu GPU.
  • Jumlah maksimum container yang dapat menggunakan pembagian waktu dalam satu GPU fisik adalah 48. Saat merencanakan konfigurasi berbagi waktu GPU, pertimbangkan kebutuhan resource dari workload Anda dan kapasitas GPU fisik yang mendasarinya untuk mengoptimalkan performa dan responsivitas Anda.

Langkah selanjutnya