Berbagi GPU dengan beberapa workload menggunakan pembagian waktu GPU


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

Ringkasan

Berbagi waktu GPU adalah fitur GKE yang memungkinkan beberapa container berbagi satu GPU fisik yang dilekatkan ke 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 berikut ini:

  • 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 menginginkan petunjuk untuk meminta Pembagian waktu GPU, lihat Deploy workload yang menggunakan pembagian waktu GPU.

Persyaratan

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

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Mengaktifkan 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 pembagian waktu GPU di cluster GKE dan node pool

Sebagai administrator platform, Anda harus mengaktifkan pembagian waktu GPU di GKE Cluster standar sebelum developer dapat men-deploy workload untuk menggunakan GPU. Untuk mengaktifkan Pembagian waktu GPU, Anda harus melakukan hal berikut:

  1. Aktifkan pembagian 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 kemudian mengaktifkan GPU berbagi waktu secara default. Berbagi waktu dengan Autopilot dikonfigurasi dalam spesifikasi workload. Untuk mempelajari lebih lanjut, lihat Men-deploy workload yang menggunakan GPU bersama waktu bagian.

Mengaktifkan pembagian waktu GPU di cluster GKE Standard

Anda dapat mengaktifkan pembagian waktu GPU saat membuat GKE Cluster standar. Node pool default di cluster telah mengaktifkan fitur tersebut. Anda masih harus mengaktifkan pembagian waktu GPU saat membuat kumpulan node dalam 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 Anda memilih 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 pembagian waktu GPU pada node pool GKE

Anda dapat mengaktifkan pembagian waktu GPU saat membuat kumpulan node 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 Anda memilih 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 instalasi {i>driver<i} otomatis saat membuat cluster, atau jika Anda menggunakan versi GKE yang lebih lama dari 1.27.2-gke.1200, Anda harus secara manual menginstal driver NVIDIA yang kompatibel untuk mengelola pembagian 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 nomor yang ditentukan saat Anda mengaktifkan pembagian waktu GPU, jelaskan 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 pembagian waktu GPU

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

Untuk men-deploy workload agar dapat menggunakan pembagian 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 pembagian 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 berikut menunjukkan cara men-deploy tiga Pod ke Kumpulan node pembagian waktu GPU. GKE mengalokasikan setiap container ke GPU fisik yang sama. Container mencetak UUID GPU yang dipasang 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 workload 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 "berbagi waktu" untuk meminta pembagian waktu untuk GPU Anda.
  • CLIENTS_PER_GPU: jumlah workload 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 pembagian waktu GPU dengan GPU multi-instance

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

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 akan mendukung hingga tiga kontainer, dengan total hingga 21 perangkat berbagi waktu GPU yang tersedia untuk dialokasikan dalam 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 pembagian waktu GPU yang diaktifkan, jalankan perintah berikut:

Autopilot

Dengan Autopilot, pembagian waktu GPU dan GPU multi-instance dapat digunakan bersama-sama menggunakan kedua set pemilih {i>node<i}.

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

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

Langkah selanjutnya