Menayangkan model dengan satu GPU di GKE


Tutorial ini menunjukkan cara menyajikan model sederhana dengan GPU dalam mode Google Kubernetes Engine (GKE). Tutorial ini membuat cluster GKE yang menggunakan satu L4 Tensor Core GPU dan menyiapkan infrastruktur GKE untuk melakukan inferensi online. Tutorial ini menggunakan dua framework yang paling sering digunakan untuk penayangan online:

Tujuan

Tutorial ini ditujukan untuk engineer infrastruktur, engineer MLOps, engineer DevOps, atau administrator cluster yang ingin menghosting model machine learning (ML) terlatih di cluster GKE.

Tutorial ini membahas langkah-langkah berikut:

  1. Buat GKE Autopilot atau cluster Standar.
  2. Mengonfigurasi bucket Cloud Storage, tempat model terlatih berada.
  3. Deploy framework inferensi online yang Anda pilih.
  4. Membuat permintaan pengujian ke layanan yang di-deploy.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • GKE
  • Cloud Storage
  • Akselerator GPU L4
  • Traffic keluar

Gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.

Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Membersihkan.

Sebelum memulai

Menyiapkan project

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, klik Buat project untuk mulai membuat project Google Cloud baru.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Aktifkan API GKE.

    Mengaktifkan API

  5. Di konsol Google Cloud, pada halaman pemilih project, klik Buat project untuk mulai membuat project Google Cloud baru.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Aktifkan API GKE.

    Mengaktifkan API

Menetapkan setelan default untuk Google Cloud CLI

  1. Di konsol Google Cloud, mulai instance Cloud Shell:
    Buka Cloud Shell

  2. Download kode sumber untuk aplikasi contoh ini:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
    
  3. Tetapkan variabel lingkungan default:

    gcloud config set project PROJECT_ID
    gcloud config set compute/region COMPUTE_REGION
    

    Ganti nilai berikut:

    • PROJECT_ID: project ID Google Cloud Anda.
    • COMPUTE_REGION: region Compute Engine yang mendukung jenis akselerator yang ingin Anda gunakan, misalnya, us-central1 untuk GPU L4.
  4. Di Cloud Shell, buat variabel lingkungan berikut:

    export PROJECT_ID=$(gcloud config get project)
    export REGION=$(gcloud config get compute/region)
    export K8S_SA_NAME=gpu-k8s-sa
    export GSBUCKET=$PROJECT_ID-gke-bucket
    export MODEL_NAME=mnist
    export CLUSTER_NAME=online-serving-cluster
    

Membuat cluster GKE

Anda dapat menyajikan model di satu GPU dalam GKE Autopilot atau cluster Standar. Sebaiknya gunakan cluster Autopilot untuk mendapatkan pengalaman Kubernetes yang terkelola sepenuhnya. Dengan GKE Autopilot, resource akan diskalakan secara otomatis berdasarkan permintaan model.

Untuk memilih mode operasi GKE yang paling sesuai dengan beban kerja Anda, lihat Memilih mode operasi GKE.

Autopilot

Jalankan perintah berikut untuk membuat cluster GKE Autopilot:

  gcloud container clusters create-auto ${CLUSTER_NAME} \
      --region=${REGION} \
      --project=${PROJECT_ID} \
      --release-channel=rapid

GKE membuat cluster Autopilot dengan node CPU dan GPU seperti yang diminta oleh beban kerja yang di-deploy.

Standar

  1. Jalankan perintah berikut untuk membuat cluster GKE Standard:

      gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID}  \
        --region=${REGION}  \
        --workload-pool=${PROJECT_ID}.svc.id.goog \
        --addons GcsFuseCsiDriver \
        --release-channel=rapid \
        --num-nodes=1
    

    Pembuatan cluster memerlukan waktu beberapa menit.

  2. Jalankan perintah berikut untuk membuat kumpulan node:

      gcloud container node-pools create gpupool \
        --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${REGION} \
        --node-locations=${REGION}-a \
        --cluster=${CLUSTER_NAME} \
        --machine-type=g2-standard-8 \
        --num-nodes=1
    

    GKE membuat satu kumpulan node yang berisi satu GPU L4 untuk setiap node.

Membuat bucket Cloud Storage

Membuat bucket Cloud Storage untuk menyimpan model terlatih yang akan disajikan.

Jalankan perintah berikut di Cloud Shell:

gcloud storage buckets create gs://$GSBUCKET

Konfigurasikan cluster Anda untuk mengakses bucket menggunakan Workload Identity Federation for GKE

Agar cluster Anda dapat mengakses bucket Cloud Storage, lakukan langkah berikut:

  1. Buat akun layanan Google Cloud.
  2. Buat Akun Layanan Kubernetes di cluster Anda.
  3. Ikat Akun Layanan Kubernetes ke akun layanan Google Cloud.

Membuat akun layanan Google Cloud

  1. Di konsol Google Cloud, buka halaman Buat akun layanan.

    Buka Create service account

  2. Di kolom Service account ID, masukkan gke-ai-sa.

  3. Klik Buat dan lanjutkan.

  4. Di daftar Role, pilih peran Cloud Storage > Storage Insights Collector Service.

  5. Klik Add another role.

  6. Dalam daftar Select a role, pilih peran Cloud Storage > Storage Object Admin.

  7. Klik Lanjutkan lalu klik Selesai.

Membuat Akun Layanan Kubernetes di cluster Anda

Di Cloud Shell, lakukan hal berikut:

  1. Membuat namespace Kubernetes:

    kubectl create namespace gke-ai-namespace
    
  2. Buat Akun Layanan Kubernetes dalam namespace:

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

Mengikat Akun Layanan Kubernetes ke akun layanan Google Cloud

Di Cloud Shell jalankan perintah berikut:

  1. Tambahkan binding IAM ke akun layanan Google Cloud:

    gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
    

    Flag --member memberikan identitas lengkap Akun Layanan Kubernetes di Google Cloud.

  2. Anotasikan Akun Layanan Kubernetes:

    kubectl annotate serviceaccount gpu-k8s-sa \
        --namespace gke-ai-namespace \
        iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
    

Men-deploy server inferensi online

Setiap framework inferensi online berharap dapat menemukan model ML terlatih dalam format tertentu. Bagian berikut menunjukkan cara men-deploy server inferensi bergantung pada framework yang ingin Anda gunakan:

Triton

  1. Di Cloud Shell, salin model ML terlatih ke dalam bucket Cloud Storage:

    gsutil cp -r src/triton-model-repository gs://$GSBUCKET
    
  2. Deploy framework di Kubernetes:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Validasi bahwa GKE men-deploy framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Setelah framework siap, output-nya akan tampak seperti berikut:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Men-deploy Layanan untuk mengakses deployment

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. Periksa apakah IP eksternal sudah ditetapkan:

    kubectl get services --namespace=gke-ai-namespace
    

    Outputnya mirip dengan hal berikut ini:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    triton-server   LoadBalancer   34.118.227.176   35.239.54.228   8000:30866/TCP,8001:31035/TCP,8002:30516/TCP   5m14s
    

    Catat alamat IP untuk triton-server di kolom EXTERNAL-IP.

  6. Pastikan layanan dan deployment berfungsi dengan benar:

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    Outputnya mirip dengan hal berikut ini:

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

Penyajian TF

  1. Di Cloud Shell, salin model ML terlatih ke dalam bucket Cloud Storage:

    gsutil cp -r src/tfserve-model-repository gs://$GSBUCKET
    
  2. Deploy framework di Kubernetes:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Validasi bahwa GKE men-deploy framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Setelah framework siap, output-nya akan tampak seperti berikut:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Men-deploy Layanan untuk mengakses deployment

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. Periksa apakah IP eksternal sudah ditetapkan:

    kubectl get services --namespace=gke-ai-namespace
    

    Outputnya mirip dengan hal berikut ini:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    tfserve-server  LoadBalancer   34.118.227.176   35.239.54.228   8500:30003/TCP,8000:32194/TCP                  5m14s
    

    Catat alamat IP untuk tfserve-server di kolom EXTERNAL-IP.

  6. Pastikan layanan dan deployment berfungsi dengan benar:

    curl -v EXTERNAL_IP:8000/v1/models/mnist
    

    Ganti EXTERNAL_IP dengan alamat IP eksternal Anda.

    Outputnya mirip dengan hal berikut ini:

    ...
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Date: Thu, 12 Oct 2023 19:01:19 GMT
    < Content-Length: 154
    <
    {
      "model_version_status": [
            {
            "version": "1",
            "state": "AVAILABLE",
            "status": {
              "error_code": "OK",
              "error_message": ""
            }
          }
        ]
    }
    

Menyalurkan model

Triton

  1. Buat lingkungan virtual Python di Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Instal paket Python yang diperlukan.

    pip install -r src/client/triton-requirements.txt
    
  3. Uji server inferensi Triton dengan memuat gambar:

    cd src/client
    python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

    Ganti kode berikut:

    • EXTERNAL_IP: Alamat IP eksternal Anda.
    • TEST_IMAGE: Nama file yang sesuai dengan gambar yang ingin Anda uji. Anda dapat menggunakan gambar yang disimpan di src/client/images.

    Bergantung pada gambar yang Anda gunakan, outputnya mirip dengan berikut ini:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

Penyajian TF

  1. Buat lingkungan virtual Python di Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Instal paket Python yang diperlukan.

    pip install -r src/client/tfserve-requirements.txt
    
  3. Uji TensorFlow Serve dengan beberapa gambar.

    cd src/client
    python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

Ganti kode berikut:

  • EXTERNAL_IP: Alamat IP eksternal Anda.
  • TEST_IMAGE: Nilai dari 0 hingga 9. Anda dapat menggunakan gambar yang disimpan di src/client/images.

Bergantung pada gambar yang Anda gunakan, Anda akan mendapatkan output yang mirip dengan ini:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang dibuat dalam panduan ini, lakukan salah satu langkah berikut:

  • Pertahankan cluster GKE: Hapus resource Kubernetes di cluster dan resource Google Cloud
  • Mempertahankan project Google Cloud: Hapus cluster GKE dan resource Google Cloud
  • Menghapus project

Menghapus resource Kubernetes dalam cluster dan resource Google Cloud

  1. Hapus namespace Kubernetes dan workload yang Anda deploy:

Triton

kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace

Penyajian TF

kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
  1. Hapus bucket Cloud Storage:

    1. Buka halaman Bucket:

      Buka Bucket

    2. Pilih kotak centang untuk PROJECT_ID-gke-bucket.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik DELETE, lalu klik Delete.

  2. Hapus akun layanan Google Cloud:

    1. Buka halaman Akun Layanan.

      Buka Akun layanan

    2. Pilih project Anda.

    3. Pilih kotak centang untuk gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klik Delete.

    5. Untuk mengonfirmasi penghapusan, klik Hapus.

Menghapus cluster GKE dan resource Google Cloud

  1. Hapus cluster GKE:

    1. Buka halaman Cluster:

      Buka Cluster

    2. Pilih kotak centang untuk online-serving-cluster.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik online-serving-cluster, lalu klik Delete.

  2. Hapus bucket Cloud Storage:

    1. Buka halaman Bucket:

      Buka Bucket

    2. Pilih kotak centang untuk PROJECT_ID-gke-bucket.

    3. Klik Delete.

    4. Untuk mengonfirmasi penghapusan, ketik DELETE, lalu klik Delete.

  3. Hapus akun layanan Google Cloud:

    1. Buka halaman Akun Layanan.

      Buka Akun layanan

    2. Pilih project Anda.

    3. Pilih kotak centang untuk gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klik Delete.

    5. Untuk mengonfirmasi penghapusan, klik Hapus.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya