Menyajikan model dengan satu GPU di GKE


Tutorial ini menunjukkan cara menayangkan model sederhana dengan GPU dalam mode Google Kubernetes Engine (GKE). Tutorial ini membuat cluster GKE yang menggunakan satu GPU L4 Tensor Core 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 cluster GKE Autopilot atau Standard.
  2. Konfigurasikan bucket Cloud Storage, tempat model terlatih berada.
  3. Deploy framework inferensi online yang Anda pilih.
  4. Buat 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE API.

    Enable the 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 menayangkan model di satu GPU dalam cluster GKE Autopilot atau Standard. Sebaiknya gunakan cluster Autopilot untuk pengalaman Kubernetes yang dikelola sepenuhnya. Dengan GKE Autopilot, resource akan diskalakan secara otomatis berdasarkan permintaan model.

Untuk memilih mode operasi GKE yang paling sesuai untuk workload 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.

Standard

  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 mungkin memerlukan waktu beberapa menit.

  2. Jalankan perintah berikut untuk membuat node pool:

      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 node pool yang berisi satu GPU L4 untuk setiap node.

Membuat bucket Cloud Storage

Buat bucket Cloud Storage untuk menyimpan model terlatih yang akan ditayangkan.

Di Cloud Shell, jalankan perintah berikut:

gcloud storage buckets create gs://$GSBUCKET

Mengonfigurasi 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 Buat akun layanan

  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 diharapkan 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 yang telah dilatih ke bucket Cloud Storage:

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Deploy framework menggunakan Deployment. Deployment adalah API Kubernetes yang memungkinkan Anda menjalankan beberapa replika Pod di antara node dalam cluster:

    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
    

    Jika framework sudah siap, output-nya akan mirip dengan berikut ini:

    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 telah 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
    ...
    

Penayangan TF

  1. Di Cloud Shell, salin model ML yang telah dilatih ke bucket Cloud Storage:

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Deploy framework menggunakan Deployment. Deployment adalah API Kubernetes yang memungkinkan Anda menjalankan beberapa replika Pod di antara node dalam cluster:

    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
    

    Jika framework sudah siap, output-nya akan mirip dengan berikut ini:

    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 telah 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": ""
            }
          }
        ]
    }
    

Menayangkan 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 image yang Anda gunakan, outputnya akan mirip dengan berikut ini:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

Penayangan 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 Serving 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

Penayangan 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Langkah selanjutnya