Berbagi GPU dengan beberapa workload menggunakan pembagian waktu GPU


Halaman ini menunjukkan cara mengizinkan beberapa beban kerja mendapatkan akses berbagi waktu GPU ke satu akselerator hardware GPU NVIDIA® di node Google Kubernetes Engine (GKE) Anda. Untuk mempelajari lebih lanjut cara kerja pembagian waktu GPU, serta batasan dan contoh kapan Anda harus menggunakan pembagian 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 ke 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 bagi Anda jika Anda adalah salah satu dari yang 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 berbagi waktu GPU, lihat Men-deploy workload yang menggunakan pembagian 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 pembagian 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 initialize 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 pembagian waktu GPU di cluster GKE Standard sebelum developer dapat men-deploy workload untuk menggunakan GPU. Untuk mengaktifkan berbagi waktu GPU, Anda harus melakukan langkah 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 beban kerja. Untuk mempelajari lebih lanjut, lihat bagian Men-deploy beban kerja yang menggunakan GPU bersama waktu.

Mengaktifkan berbagi waktu GPU di cluster GKE Standard

Anda dapat mengaktifkan berbagi waktu GPU saat membuat cluster GKE Standar. Node pool default di cluster telah mengaktifkan fitur tersebut. Anda masih perlu mengaktifkan pembagian waktu GPU saat membuat kumpulan node 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 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 kumpulan node GKE

Anda dapat mengaktifkan pembagian 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 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 memilih untuk menonaktifkan penginstalan driver otomatis saat membuat cluster, atau jika 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 pembagian 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 pembagian waktu GPU

Sebagai operator aplikasi yang men-deploy beban kerja GPU, Anda dapat memilih berbagi waktu GPU yang 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 beban kerja agar menggunakan pembagian waktu GPU, selesaikan langkah-langkah berikut:

  1. Tambahkan nodeSelector ke manifes beban kerja 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-langkah berikut menunjukkan cara men-deploy tiga Pod ke kumpulan node berbagi waktu GPU. GKE mengalokasikan setiap container ke GPU fisik yang sama. Container mencetak UUID GPU yang terpasang pada 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 dipasang ke node. Untuk contoh ini, gunakan 1.

Standar

        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 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 hal 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. Berbagi waktu GPU berfungsi dengan GPU multi-instance, yang mempartisi satu GPU fisik menjadi hingga tujuh irisan. 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 akan mendukung hingga tiga penampung, dengan total hingga 21 perangkat berbagi waktu GPU 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, pembagian waktu GPU dan GPU multi-instance dapat digunakan bersamaan menggunakan kedua set 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

Standar

Dengan Standard, Anda perlu membuat cluster multi-instance dan berbagi waktu GPU 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 pembagian waktu GPU, GKE menerapkan isolasi ruang alamat, isolasi performa, dan isolasi error antar-penampung yang menggunakan GPU fisik yang sama. Namun, batas memori tidak diterapkan pada GPU. Untuk menghindari masalah kehabisan memori (OOM), tetapkan batas memori GPU dalam workload Anda. Untuk menghindari masalah keamanan, hanya deploy beban kerja yang berada dalam batas kepercayaan yang sama dengan pembagian waktu GPU.
  • Untuk mencegah perilaku yang tidak 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 resource beban kerja dan kapasitas GPU fisik yang mendasarinya untuk mengoptimalkan performa dan responsivitas Anda.

Langkah selanjutnya