Menjalankan GPU multi-instance


Halaman ini memberikan petunjuk cara mempartisi unit pemrosesan grafis (GPU) NVIDIA A100 atau H100 untuk berbagi satu GPU di beberapa container di Google Kubernetes Engine (GKE).

Halaman ini mengasumsikan bahwa Anda sudah memahami konsep Kubernetes seperti Pod, node, deployment, dannamespace, serta memahami konsep GKE seperti node pool, penskalaan otomatis, danpenyediaan otomatis.

Pengantar

Kubernetes mengalokasikan satu GPU penuh per container meskipun container hanya memerlukan sebagian kecil GPU untuk workload-nya, yang dapat menyebabkan pemborosan resource dan biaya yang berlebihan, terutama jika Anda menggunakan generasi terbaru GPU yang canggih. Untuk meningkatkan penggunaan GPU, GPU multi-instance memungkinkan Anda mempartisi satu GPU yang didukung menjadi hingga tujuh irisan. Setiap slice dapat dialokasikan ke satu container pada node secara terpisah, untuk maksimum tujuh penampung per GPU. GPU multi-instance memberikan isolasi hardware antara workload, serta QoS yang konsisten dan dapat diprediksi untuk semua container yang berjalan di GPU.

Untuk aplikasi CUDA®, GPU multi-instance sebagian besar bersifat transparan. Setiap partisi GPU muncul sebagai resource GPU reguler, dan model pemrograman tidak berubah.

Untuk informasi selengkapnya tentang GPU multi-instance, lihat panduan pengguna GPU multi-instance NVIDIA.

GPU yang didukung

Jenis GPU berikut mendukung GPU multi-instance:

  • NVIDIA A100 (40GB)
  • NVIDIA A100 (80GB)
  • NVIDIA H100 (80GB)

Partisi GPU multi-instance

GPU A100 dan GPU H100 terdiri dari tujuh unit komputasi dan delapan unit memori, yang dapat dipartisi menjadi instance GPU dengan berbagai ukuran. Ukuran partisi GPU menggunakan sintaksis berikut: [compute]g.[memory]gb. Misalnya, ukuran partisi GPU 1g.5gb mengacu pada instance GPU dengan satu unit komputasi (1/7 multiprosesor streaming di GPU), dan satu unit memori (5 GB). Ukuran partisi untuk GPU dapat ditentukan saat Anda men-deploy beban kerja Autopilot atau saat membuat cluster Standar.

Tabel partisi dalam panduan pengguna GPU multi-instance NVIDIA mencantumkan semua ukuran partisi GPU yang berbeda, beserta jumlah resource memori dan komputasi yang tersedia di setiap partisi GPU. Tabel ini juga menunjukkan jumlah instance GPU untuk setiap ukuran partisi yang dapat dibuat di GPU.

Tabel berikut mencantumkan ukuran partisi yang didukung GKE:

Ukuran partisi Instance GPU
GPU: NVIDIA A100 (40 GB) (nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU: NVIDIA A100 (80 GB) (nvidia-a100-80gb)
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H100 (80GB) (nvidia-h100-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1

Setiap GPU pada setiap node dalam node pool dipartisi dengan cara yang sama. Misalnya, pertimbangkan node pool dengan dua node, empat GPU pada setiap node, dan ukuran partisi 1g.5gb. GKE membuat tujuh partisi ukuran 1g.5gb di setiap GPU. Karena ada empat GPU di setiap node, akan ada 28 partisi GPU 1g.5gb yang tersedia di setiap node. Karena ada dua node dalam node pool, total 56 partisi GPU 1g.5gb tersedia di seluruh node pool.

Untuk membuat cluster GKE Standard dengan lebih dari satu jenis partisi GPU, Anda harus membuat beberapa node pool. Misalnya, jika ingin node dengan partisi GPU 1g.5gb dan 3g.20gb dalam cluster, Anda harus membuat dua kumpulan node: satu dengan ukuran partisi GPU ditetapkan ke 1g.5gb, dan satunya lagi dengan 3g.20gb.

Cluster GKE Autopilot secara otomatis membuat node dengan konfigurasi partisi yang benar saat Anda membuat workload yang memerlukan ukuran partisi yang berbeda.

Setiap node diberi label dengan ukuran partisi GPU yang tersedia pada node. Pelabelan ini memungkinkan workload menargetkan node dengan ukuran partisi GPU yang diperlukan. Misalnya, pada node dengan instance GPU 1g.5gb, node-nya diberi label sebagai:

cloud.google.com/gke-gpu-partition-size=1g.5gb

Cara kerjanya

Untuk menggunakan GPU multi-instance, Anda perlu melakukan tugas-tugas berikut:

  1. Membuat cluster dengan GPU multi-instance diaktifkan.
  2. Menginstal driver secara manual.
  3. Memverifikasi jumlah resource GPU yang ada di node.
  4. Men-deploy container menggunakan GPU multi-instance.

Harga

GPU multi-instance bersifat eksklusif untuk GPU A100 dan GPU H100, serta tunduk pada harga GPU yang sesuai selain produk lain yang digunakan untuk menjalankan beban kerja Anda. Anda hanya dapat memasang seluruh GPU ke node di cluster untuk membuat partisi. Untuk mengetahui informasi harga GPU, lihat halaman harga GPU.

Batasan

  • Penggunaan partisi GPU multi-instance dengan GKE tidak direkomendasikan untuk workload yang tidak tepercaya.
  • Partisi GPU penyediaan otomatis dan penskalaan otomatis didukung sepenuhnya di GKE versi 1.20.7-gke.400 atau yang lebih baru. Pada versi sebelumnya, hanya node pool dengan setidaknya satu node yang dapat diskalakan secara otomatis berdasarkan permintaan untuk ukuran partisi GPU tertentu dari workload.
  • Metrik pemakaian GPU (misalnya duty_cycle) tidak tersedia untuk instance GPU.
  • Multi-instance membagi GPU fisik menjadi beberapa instance terpisah, yang masing-masing diisolasi dari GPU lainnya pada tingkat hardware. Container yang menggunakan instance GPU multi-instance hanya dapat mengakses resource CPU dan memori yang tersedia untuk instance tersebut.
  • Sebuah pod hanya dapat menggunakan hingga satu instance GPU multi-instance.

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.
  • Dalam Autopilot, GPU multi-instance didukung di GKE versi 1.29.3-gke.1093000 dan yang lebih baru.
  • Anda harus memiliki kuota GPU NVIDIA A100 yang memadai. Lihat Meminta penambahan kuota.
  • Jika ingin menggunakan GPU multi-instance dengan Autopilot, Anda dapat mempelajari lebih lanjut cara menggunakan GPU dengan Autopilot di bagian Men-deploy beban kerja GPU dalam Autopilot.
  • GKE menetapkan class komputasi Accelerator ke semua workload GPU multi-instance di cluster Autopilot.

Membuat cluster dengan GPU multi-instance diaktifkan

Jika menggunakan GKE Standard, Anda harus mengaktifkan GPU multi-instance dalam cluster. Cluster Autopilot yang menjalankan versi 1.29.3-gke.1093000 dan yang lebih baru mengaktifkan GPU multi-instance secara default. Untuk menggunakan GPU multi-instance dalam Autopilot, dalam dokumen ini, lihat bagian Men-deploy container menggunakan GPU multi-instance.

Saat membuat cluster Standar dengan GPU multi-instance, Anda harus menentukan gpuPartitionSize beserta acceleratorType dan acceleratorCount. acceleratorType harus nvidia-tesla-a100, nvidia-a100-80gb, atau nvidia-h100-80gb.

Contoh berikut menunjukkan cara membuat cluster GKE dengan satu node, dan tujuh partisi GPU berukuran 1g.5gb pada node. Langkah-langkah lain di halaman ini menggunakan ukuran partisi GPU 1g.5gb, yang membuat tujuh partisi di setiap GPU. Anda juga dapat menggunakan salah satu ukuran partisi GPU yang didukung yang disebutkan sebelumnya.

  1. Untuk membuat cluster dengan GPU multi-instance yang diaktifkan menggunakan Google Cloud CLI, jalankan perintah berikut:

    gcloud container clusters create CLUSTER_NAME  \
        --project=PROJECT_ID  \
        --zone ZONE  \
        --cluster-version=CLUSTER_VERSION  \
        --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
        --machine-type=a2-highgpu-1g  \
        --num-nodes=1
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • PROJECT_ID: ID project Google Cloud Anda.
    • ZONE: zona komputasi untuk bidang kontrol cluster.
    • CLUSTER_VERSION: versi harus 1.19.7-gke.2503 atau yang lebih baru.
    • 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 cluster. Jika Anda menghapus gpu-driver-version, ini adalah opsi defaultnya.
  2. Konfigurasi kubectl untuk terhubung ke cluster yang baru dibuat:

    gcloud container clusters get-credentials CLUSTER_NAME
    

Menginstal {i>driver<i}

Jika memilih untuk menonaktifkan penginstalan driver otomatis saat membuat cluster, atau jika Anda menjalankan versi GKE yang lebih lama dari 1.27.2-gke.1200, Anda harus menginstal driver NVIDIA yang kompatibel secara manual setelah pembuatan selesai. GPU multi-instance memerlukan driver NVIDIA versi 450.80.02 atau yang lebih baru.

Setelah driver diinstal, mode GPU multi-instance akan diaktifkan. Jika Anda menginstal driver secara otomatis, node akan dimulai ulang saat plugin perangkat GPU mulai membuat partisi GPU. Jika Anda menginstal driver secara manual, node Anda akan dimulai ulang saat penginstalan driver selesai. Mungkin perlu waktu beberapa menit untuk menyelesaikan proses mulai ulang.

Memverifikasi jumlah resource GPU yang ada di node

Jalankan perintah berikut untuk memverifikasi bahwa kapasitas dan jumlah resource nvidia.com/gpu yang dapat dialokasikan adalah 7:

kubectl describe nodes

Berikut adalah output dari perintah tersebut:

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

Men-deploy container menggunakan GPU multi-instance

Anda dapat men-deploy hingga satu container per perangkat GPU multi-instance pada node tersebut. Dalam contoh ini, dengan ukuran partisi 1g.5gb, ada tujuh partisi GPU multi-instance yang tersedia pada node. Akibatnya, Anda dapat men-deploy hingga tujuh container yang meminta GPU pada node ini.

  1. Berikut adalah contoh yang memulai container cuda:11.0.3-base-ubi7 dan menjalankan nvidia-smi untuk mencetak UUID GPU dalam container. Dalam contoh ini, ada tujuh penampung, dan setiap penampung menerima satu partisi GPU. Contoh ini juga menetapkan pemilih node cloud.google.com/gke-gpu-partition-size untuk menargetkan node dengan partisi GPU 1g.5gb.

    Autopilot

          cat <<EOF | kubectl apply -f -
          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-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
          EOF
          

    Manifes ini melakukan hal berikut:

    • Meminta jenis GPU nvidia-tesla-a100 dengan menyetel pemilih node cloud.google.com/gke-accelerator.
    • Memisahkan GPU ke dalam ukuran partisi 1g.5gb.
    • Memasang satu GPU ke node dengan menyetel pemilih node cloud.google.com/gke-accelerator-count.

    Standar

          cat <<EOF | kubectl apply -f -
          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
                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
          EOF
          

    Manifes ini melakukan hal berikut:

    • Meminta satu GPU dengan ukuran partisi 1g.5gb.
  2. Pastikan ketujuh Pod sedang berjalan:

    kubectl get pods
    

    Berikut adalah output dari perintah tersebut:

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. Lihat log untuk melihat UUID GPU, menggunakan nama Pod apa pun dari perintah sebelumnya:

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    Berikut adalah output dari perintah tersebut:

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

Langkah selanjutnya