Menyajikan model terbuka Gemma menggunakan TPU di GKE dengan Saxml


Tutorial ini menunjukkan cara men-deploy dan menyajikan model bahasa besar (LLM) Gemma 2 menggunakan TPU di GKE dengan framework penayangan Saxml. Tutorial ini memberikan dasar untuk memahami dan menjelajahi deployment LLM praktis untuk inferensi di lingkungan Kubernetes terkelola. Anda akan men-deploy container yang telah dibuat sebelumnya dengan Saxml ke GKE. Anda juga mengonfigurasi GKE untuk memuat bobot Gemma 2B dan 7B dari Cloud Storage saat runtime.

Tutorial ini ditujukan untuk engineer Machine Learning (ML), Admin dan operator platform, serta spesialis Data dan AI yang tertarik untuk menggunakan kemampuan orkestrasi container Kubernetes dalam menayangkan LLM. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna umum GKE Enterprise.

Sebelum membaca halaman ini, pastikan Anda memahami hal-hal berikut:

Jika Anda memerlukan platform AI terkelola terpadu untuk membangun dan menayangkan model ML dengan cepat dan hemat biaya, sebaiknya coba solusi deployment Vertex AI kami.

Latar belakang

Bagian ini menjelaskan teknologi utama yang digunakan dalam tutorial ini.

Gemma

Gemma adalah sekumpulan model AI generatif ringan yang tersedia secara terbuka dan dirilis dengan lisensi terbuka. Model AI ini tersedia untuk dijalankan di aplikasi, hardware, perangkat seluler, atau layanan yang dihosting. Anda dapat menggunakan model Gemma untuk pembuatan teks, serta menyesuaikan model ini untuk tugas khusus.

Untuk mempelajari lebih lanjut, lihat dokumentasi Gemma.

TPU

TPU adalah sirkuit terintegrasi khusus aplikasi (ASIC) yang dikembangkan khusus oleh Google dan digunakan untuk mempercepat framework pemrosesan data seperti TensorFlow, PyTorch, dan JAX.

Tutorial ini menyajikan model Gemma 2B dan Gemma 7B. GKE menghosting model ini di node pool TPU v5e host tunggal berikut:

  • Gemma 2B: Model yang dioptimalkan untuk mengikuti perintah yang dihosting di node pool TPU v5e dengan topologi 1x1 yang merepresentasikan satu chip TPU. Jenis mesin untuk node adalah ct5lp-hightpu-1t.
  • Gemma 7B: Model yang disesuaikan dengan perintah yang dihosting di node pool TPU v5e dengan topologi 2x2 yang merepresentasikan empat chip TPU. Jenis mesin untuk node adalah ct5lp-hightpu-4t.

Saxml

Saxml adalah sistem eksperimental yang menyajikan model Paxml, JAX, dan PyTorch untuk inferensi. Sistem Saxml mencakup komponen berikut:

  • Sel Saxml atau cluster Sax: Server admin dan grup server model. Server admin melacak server model, menetapkan model yang dipublikasikan ke server model untuk ditayangkan, dan membantu klien menemukan server model yang menayangkan model tertentu yang dipublikasikan.
  • Klien Saxml: Antarmuka pemrograman yang menghadap pengguna untuk sistem Saxml. Klien Saxml mencakup alat command line (saxutil) dan serangkaian library klien di Python, C++, dan Go.

Dalam tutorial ini, Anda juga akan menggunakan server HTTP Saxml. Server HTTP Saxml adalah server HTTP kustom yang merangkum library klien Python Saxml dan mengekspos REST API untuk berinteraksi dengan sistem Saxml. REST API mencakup endpoint untuk memublikasikan, mencantumkan, membatalkan publikasi model, dan membuat prediksi.

Tujuan

  1. Siapkan cluster GKE Standard dengan topologi TPU yang direkomendasikan berdasarkan karakteristik model.
  2. Deploy komponen Saxml di GKE.
  3. Dapatkan dan publikasikan model parameter Gemma 2B atau Gemma 7B.
  4. Menyajikan dan berinteraksi dengan model yang dipublikasikan.

Arsitektur

Bagian ini menjelaskan arsitektur GKE yang digunakan dalam tutorial ini. Arsitekturnya terdiri dari cluster Standard GKE yang menyediakan TPU dan menghosting komponen Saxml untuk men-deploy dan menyajikan model Gemma 2B atau 7B. Diagram berikut menunjukkan komponen arsitektur ini:

Diagram arsitektur yang di-deploy dalam tutorial ini

Arsitektur ini mencakup komponen berikut:

  • Cluster GKE Standard, zona.
  • Node pool slice TPU host tunggal yang bergantung pada model Gemma yang ingin Anda sajikan:
    • Gemma 2B: Dikonfigurasi dengan TPU v5e dengan topologi 1x1. Satu instance server Model Saxml dikonfigurasi untuk menggunakan node pool ini.
    • Gemma 7B: Dikonfigurasi dengan TPU v5e dengan topologi 2x2. Satu instance server Model Saxml dikonfigurasi untuk menggunakan node pool ini.
  • Kumpulan node CPU default tempat server Admin Saxml dan server HTTP Saxml di-deploy.
  • Dua bucket Cloud Storage:
    • Satu bucket Cloud Storage menyimpan status yang dikelola oleh server Admin.
    • Satu bucket Cloud Storage menyimpan checkpoint model Gemma.

Arsitektur ini memiliki karakteristik berikut:

  • Artifact Registry publik mengelola image container untuk komponen Saxml.
  • Cluster GKE menggunakan Workload Identity Federation for GKE. Semua komponen Saxml menggunakan Workload Identity Federation yang mengintegrasikan Akun Layanan IAM untuk mengakses Layanan eksternal seperti bucket Cloud Storage.
  • Log yang dihasilkan oleh komponen Saxml diintegrasikan ke Cloud Logging.
  • Anda dapat menggunakan Cloud Monitoring untuk menganalisis metrik performa node pool GKE, seperti yang dibuat dalam tutorial ini.

Sebelum memulai

  • 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.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  • Enable the required API.

    Enable the API

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  • Enable the required API.

    Enable the API

  • Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/iam.policyAdmin, roles/iam.securityAdmin, roles/iam.roleAdmin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Buka IAM
    2. Pilih project.
    3. Klik Grant access.
    4. Di kolom New principals, masukkan ID pengguna Anda. Biasanya berupa alamat email untuk Akun Google.

    5. Di daftar Select a role, pilih peran.
    6. Untuk memberikan peran tambahan, klik Tambahkan peran lain, lalu tambahkan setiap peran tambahan.
    7. Klik Simpan.
    8. Menyiapkan lingkungan untuk Gemma

      Meluncurkan Cloud Shell

      Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang Anda perlukan untuk tutorial ini, termasuk kubectl dan gcloud CLI.

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

      2. Tetapkan variabel lingkungan default:

        gcloud config set project PROJECT_ID
        export PROJECT_ID=$(gcloud config get project)
        export LOCATION=LOCATION
        export CLUSTER_NAME=saxml-tpu
        

        Ganti nilai berikut:

      Membuat cluster Standar GKE

      Di bagian ini, Anda akan membuat cluster GKE dan node pool.

      Gemma 2B-it

      Gunakan Cloud Shell untuk melakukan hal berikut:

      1. Buat cluster Standar yang menggunakan Workload Identity Federation untuk GKE:

        gcloud container clusters create ${CLUSTER_NAME} \
            --enable-ip-alias \
            --machine-type=e2-standard-4 \
            --num-nodes=2 \
            --release-channel=rapid \
            --workload-pool=${PROJECT_ID}.svc.id.goog \
            --location=${LOCATION}
        

        Pembuatan cluster dapat memerlukan waktu beberapa menit.

      2. Buat node pool TPU v5e dengan topologi 1x1 dan satu node:

        gcloud container node-pools create tpu-v5e-1x1 \
            --cluster=${CLUSTER_NAME} \
            --machine-type=ct5lp-hightpu-1t \
            --num-nodes=1 \
            --location=${LOCATION}
        

        Anda akan menyajikan model Gemma 2B di kumpulan node ini.

      Gemma 7B-it

      Gunakan Cloud Shell untuk melakukan hal berikut:

      1. Buat cluster Standar yang menggunakan Workload Identity Federation untuk GKE:

        gcloud container clusters create ${CLUSTER_NAME} \
            --enable-ip-alias \
            --machine-type=e2-standard-4 \
            --num-nodes=2 \
            --release-channel=rapid \
            --workload-pool=${PROJECT_ID}.svc.id.goog \
            --location=${LOCATION}
        

        Pembuatan cluster dapat memerlukan waktu beberapa menit.

      2. Buat node pool TPU v5e dengan topologi 2x2 dan satu node:

        gcloud container node-pools create tpu-v5e-2x2 \
            --cluster=${CLUSTER_NAME} \
            --machine-type=ct5lp-hightpu-4t \
            --num-nodes=1 \
            --location=${LOCATION}
        

        Anda akan menyajikan model Gemma 7B di kumpulan node ini.

      Membuat bucket Cloud Storage

      Buat dua bucket Cloud Storage untuk mengelola status server Admin Saxml dan checkpoint model.

      Di Cloud Shell, jalankan perintah berikut:

      1. Buat bucket Cloud Storage untuk menyimpan konfigurasi server Admin Saxml.

        gcloud storage buckets create gs://ADMIN_BUCKET_NAME
        

        Ganti ADMIN_BUCKET_NAME dengan nama bucket Cloud Storage yang menyimpan server Admin Saxml.

      2. Buat bucket Cloud Storage untuk menyimpan checkpoint model:

        gcloud storage buckets create gs://CHECKPOINTS_BUCKET_NAME
        

        Ganti CHECKPOINTS_BUCKET_NAME dengan nama bucket Cloud Storage yang menyimpan checkpoint model.

      Mengonfigurasi akses workload Anda menggunakan Workload Identity Federation for GKE

      Tetapkan ServiceAccount Kubernetes ke aplikasi dan konfigurasikan ServiceAccount Kubernetes tersebut agar bertindak sebagai akun layanan IAM.

      1. Konfigurasi kubectl untuk berkomunikasi dengan cluster Anda:

        gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}
        
      2. Buat Akun Layanan Kubernetes yang akan digunakan untuk aplikasi Anda:

        gcloud iam service-accounts create wi-sax
        
      3. Tambahkan binding kebijakan IAM untuk akun layanan IAM Anda agar dapat membaca dan menulis di Cloud Storage:

        gcloud projects add-iam-policy-binding ${PROJECT_ID} \
            --member "serviceAccount:wi-sax@${PROJECT_ID}.iam.gserviceaccount.com" \
            --role roles/storage.objectUser
        
        gcloud projects add-iam-policy-binding ${PROJECT_ID} \
            --member "serviceAccount:wi-sax@${PROJECT_ID}.iam.gserviceaccount.com" \
            --role roles/storage.insightsCollectorService
        
      4. Izinkan ServiceAccount Kubernetes untuk meniru identitas akun layanan IAM dengan menambahkan binding kebijakan IAM antara kedua akun layanan tersebut. Dengan binding ini, ServiceAccount Kubernetes dapat bertindak sebagai akun layanan IAM:

        gcloud iam service-accounts add-iam-policy-binding wi-sax@${PROJECT_ID}.iam.gserviceaccount.com \
            --role roles/iam.workloadIdentityUser \
            --member "serviceAccount:${PROJECT_ID}.svc.id.goog[default/default]"
        
      5. Beri anotasi pada akun layanan Kubernetes dengan alamat email akun layanan IAM:

        kubectl annotate serviceaccount default \
            iam.gke.io/gcp-service-account=wi-sax@${PROJECT_ID}.iam.gserviceaccount.com
        

      Mendapatkan akses ke model

      Untuk mendapatkan akses ke model Gemma untuk deployment ke GKE, Anda harus login ke platform Kaggle, menandatangani perjanjian izin lisensi, dan mendapatkan token API Kaggle. Dalam tutorial ini, Anda akan menggunakan Secret Kubernetes untuk kredensial Kaggle.

      Anda harus menandatangani perjanjian izin untuk menggunakan Gemma. Ikuti petunjuk berikut:

      1. Akses halaman izin model di Kaggle.com.
      2. Login ke Kaggle, jika Anda belum melakukannya.
      3. Klik Minta Akses.
      4. Di bagian Pilih Akun untuk Izin, pilih Verifikasi melalui Akun Kaggle untuk menggunakan akun Kaggle Anda dalam memberikan izin.
      5. Setujui Persyaratan dan Ketentuan model.

      Membuat token akses

      Untuk mengakses model melalui Kaggle, Anda memerlukan token API Kaggle.

      Ikuti langkah-langkah berikut untuk membuat token baru, jika Anda belum memilikinya:

      1. Di browser Anda, buka setelan Kaggle.
      2. Di bagian API, klik Create New Token.

      Kaggle mendownload file bernama kaggle.json.

      Upload token akses ke Cloud Shell

      Di Cloud Shell, Anda dapat mengupload token Kaggle API ke project Google Cloud Anda:

      1. Di Cloud Shell, klik Lainnya > Upload.
      2. Pilih File, lalu klik Pilih File.
      3. Buka file kaggle.json.
      4. Klik Upload.

      Buat Secret Kubernetes untuk kredensial Kaggle

      Di Cloud Shell, lakukan langkah-langkah berikut:

      1. Konfigurasi kubectl untuk berkomunikasi dengan cluster Anda:

        gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}
        
      2. Buat Secret untuk menyimpan kredensial Kaggle:

        kubectl create secret generic kaggle-secret \
            --from-file=kaggle.json
        

      Men-deploy Saxml

      Di bagian ini, Anda akan men-deploy server admin Saxml, server model, dan server HTTP. Tutorial ini menggunakan manifes Deployment Kubernetes. Deployment adalah objek Kubernetes API yang memungkinkan Anda menjalankan beberapa replika Pod yang didistribusikan di antara node dalam cluster.

      Men-deploy server admin Saxml

      Di bagian ini, Anda akan men-deploy server admin Saxml.

      1. Buat manifes saxml-admin-server.yaml berikut:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sax-admin-server
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: sax-admin-server
          template:
            metadata:
              labels:
                app: sax-admin-server
            spec:
              hostNetwork: false
              containers:
              - name: sax-admin-server
                image: us-docker.pkg.dev/cloud-tpu-images/inference/sax-admin-server:v1.2.0
                securityContext:
                  privileged: true
                ports:
                - containerPort: 10000
                env:
                - name: GSBUCKET
                  value: ADMIN_BUCKET_NAME

        Ganti ADMIN_BUCKET_NAME dengan nama bucket yang Anda buat di bagian Membuat bucket Cloud Storage. Jangan sertakan awalan gs://.

      2. Terapkan manifes:

        kubectl apply -f saxml-admin-server.yaml
        
      3. Verifikasi deployment server admin:

        kubectl get deployment
        

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
        sax-admin-server                  1/1     1            1           ##s
        

      Men-deploy server model Saxml

      Ikuti petunjuk ini untuk men-deploy server model untuk model Gemma 2B atau Gemma 7B.

      Gemma 2B-it

      1. Buat manifes saxml-model-server-1x1.yaml berikut:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sax-model-server-v5e-1x1
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          strategy:
            type: Recreate
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-2b-it
                ai.gke.io/inference-server: saxml
                examples.ai.gke.io/source: user-guide
            spec:
              nodeSelector:
                cloud.google.com/gke-tpu-topology: 1x1
                cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
              hostNetwork: false
              restartPolicy: Always
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/cloud-tpu-images/inference/sax-model-server:v1.2.0
                args:
                - "--jax_platforms=tpu"
                - "--platform_chip=tpuv5e"
                - "--platform_topology=1x1"
                - "--port=10001"
                - "--sax_cell=/sax/test"
                ports:
                - containerPort: 10001
                securityContext:
                  privileged: true
                env:
                - name: SAX_ROOT
                  value: "gs://ADMIN_BUCKET_NAME/sax-root"
                resources:
                  requests:
                    google.com/tpu: 1
                  limits:
                    google.com/tpu: 1

        Ganti ADMIN_BUCKET_NAME dengan nama bucket yang Anda buat di bagian Membuat bucket Cloud Storage. Jangan sertakan awalan gs://.

      2. Terapkan manifes:

        kubectl apply -f saxml-model-server-1x1.yaml
        
      3. Verifikasi status Deployment server model:

        kubectl get deployment
        

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME                                              READY   STATUS    RESTARTS   AGE
        sax-admin-server                                  1/1     Running   0          ##m
        sax-model-server-v5e-1x1                          1/1     Running   0          ##s
        

      Gemma 7B-it

      1. Buat manifes saxml-model-server-2x2.yaml berikut:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sax-model-server-v5e-2x2
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          strategy:
            type: Recreate
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-7b-it
                ai.gke.io/inference-server: saxml
                examples.ai.gke.io/source: user-guide
            spec:
              nodeSelector:
                cloud.google.com/gke-tpu-topology: 2x2
                cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
              hostNetwork: false
              restartPolicy: Always
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/cloud-tpu-images/inference/sax-model-server:v1.2.0
                args:
                - "--jax_platforms=tpu"
                - "--platform_chip=tpuv5e"
                - "--platform_topology=2x2"
                - "--port=10001"
                - "--sax_cell=/sax/test"
                ports:
                - containerPort: 10001
                securityContext:
                  privileged: true
                env:
                - name: SAX_ROOT
                  value: "gs://ADMIN_BUCKET_NAME/sax-root"
                resources:
                  requests:
                    google.com/tpu: 4
                  limits:
                    google.com/tpu: 4

        Ganti ADMIN_BUCKET_NAME dengan nama bucket yang Anda buat di bagian Membuat bucket Cloud Storage. Jangan sertakan awalan gs://.

      2. Terapkan manifes:

        kubectl apply -f saxml-model-server-2x2.yaml
        
      3. Verifikasi status Deployment server model:

        kubectl get deployment
        

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME                                              READY   STATUS    RESTARTS   AGE
        sax-admin-server                                  1/1     Running   0          ##m
        sax-model-server-v5e-2x2                          1/1     Running   0          ##s
        

      Men-deploy server HTTP Saxml

      Di bagian ini, Anda akan men-deploy server HTTP Saxml dan membuat Layanan IP Cluster yang Anda gunakan untuk mengakses server.

      1. Buat manifes saxml-http.yaml berikut:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sax-http
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: sax-http
          template:
            metadata:
              labels:
                app: sax-http
            spec:
              hostNetwork: false
              containers:
              - name: sax-http
                image: us-docker.pkg.dev/cloud-tpu-images/inference/sax-http:v1.2.0
                imagePullPolicy: Always
                ports:
                - containerPort: 8888
                env:
                - name: SAX_ROOT
                  value: "gs://ADMIN_BUCKET_NAME/sax-root"
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: sax-http-svc
        spec:
          selector:
            app: sax-http
          ports:
          - protocol: TCP
            port: 8888
            targetPort: 8888
          type: ClusterIP

        Ganti ADMIN_BUCKET_NAME dengan nama bucket Cloud Storage yang menyimpan server Admin Saxml.

      2. Terapkan manifes:

        kubectl apply -f saxml-http.yaml
        
      3. Verifikasi status deployment server HTTP Saxml:

        kubectl get deployment
        

        Gemma 2B-it

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME                                              READY   STATUS    RESTARTS   AGE
        sax-admin-server                                  1/1     Running   0          ##m
        sax-model-server-v5e-1x1                          1/1     Running   0          ##m
        sax-http                                          1/1     Running   0          ##s
        

        Gemma 7B-it

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME                                              READY   STATUS    RESTARTS   AGE
        sax-admin-server                                  1/1     Running   0          ##m
        sax-model-server-v5e-2x2                          1/1     Running   0          ##m
        sax-http                                          1/1     Running   0          ##s
        

      Download checkpoint model

      Di bagian ini, Anda akan menjalankan Tugas Kubernetes yang mengambil, mendownload, dan menyimpan checkpoint model. Pengontrol Tugas di Kubernetes membuat satu atau beberapa Pod dan memastikan bahwa Pod tersebut berhasil menjalankan tugas tertentu.

      Ikuti langkah-langkah untuk model Gemma yang ingin Anda gunakan:

      Gemma 2B-it

      1. Buat manifes job-2b.yaml berikut:

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: fetch-model-scripts
        data:
          fetch_model.sh: |-
            #!/usr/bin/bash -x
            pip install kaggle --break-system-packages && \
        
            MODEL_NAME=$(echo ${MODEL_PATH} | awk -F'/' '{print $2}') && \
            VARIATION_NAME=$(echo ${MODEL_PATH} | awk -F'/' '{print $4}') && \
        
            mkdir -p /data/${MODEL_NAME}_${VARIATION_NAME} &&\
            kaggle models instances versions download ${MODEL_PATH} --untar -p /data/${MODEL_NAME}_${VARIATION_NAME} && \
            echo -e "\nCompleted extraction to /data/${MODEL_NAME}_${VARIATION_NAME}" && \
        
            gcloud storage rsync --recursive --no-clobber /data/${MODEL_NAME}_${VARIATION_NAME} gs://${BUCKET_NAME}/${MODEL_NAME}_${VARIATION_NAME} && \
            echo -e "\nCompleted copy of data to gs://${BUCKET_NAME}/${MODEL_NAME}_${VARIATION_NAME}"
        ---
        apiVersion: batch/v1
        kind: Job
        metadata:
          name: data-loader-2b
          labels:
            app: data-loader-2b
        spec:
          ttlSecondsAfterFinished: 120
          template:
            metadata:
              labels:
                app: data-loader-2b
            spec:
              restartPolicy: OnFailure
              containers:
              - name: gcloud
                image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
                command:
                - /scripts/fetch_model.sh
                env:
                - name: BUCKET_NAME
                  value: CHECKPOINTS_BUCKET_NAME
                - name: KAGGLE_CONFIG_DIR
                  value: /kaggle
                - name: MODEL_PATH
                  value: "google/gemma/pax/2b-it/2"
                volumeMounts:
                - mountPath: "/kaggle/"
                  name: kaggle-credentials
                  readOnly: true
                - mountPath: "/scripts/"
                  name: scripts-volume
                  readOnly: true
              volumes:
              - name: kaggle-credentials
                secret:
                  defaultMode: 0400
                  secretName: kaggle-secret
              - name: scripts-volume
                configMap:
                  defaultMode: 0700
                  name: fetch-model-scripts

        Ganti CHECKPOINTS_BUCKET_NAME dengan nama bucket yang Anda buat di bagian Membuat bucket Cloud Storage. Jangan sertakan awalan gs://.

      2. Terapkan manifes:

        kubectl apply -f job-2b.yaml
        
      3. Tunggu hingga Tugas selesai:

        kubectl wait --for=condition=complete --timeout=180s job/data-loader-2b
        

        Outputnya terlihat mirip dengan yang berikut ini:

        job.batch/data-loader-2b condition met
        
      4. Pastikan bahwa Job berhasil diselesaikan:

        kubectl get job/data-loader-2b
        

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME             COMPLETIONS   DURATION   AGE
        data-loader-2b   1/1           ##s        #m##s
        
      5. Lihat log untuk Tugas:

        kubectl logs --follow job/data-loader-2b
        

      Pekerjaan mengupload checkpoint ke gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000.

      Gemma 7B-it

      1. Buat manifes job-7b.yaml berikut:

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: fetch-model-scripts
        data:
          fetch_model.sh: |-
            #!/usr/bin/bash -x
            pip install kaggle --break-system-packages && \
        
            MODEL_NAME=$(echo ${MODEL_PATH} | awk -F'/' '{print $2}') && \
            VARIATION_NAME=$(echo ${MODEL_PATH} | awk -F'/' '{print $4}') && \
        
            mkdir -p /data/${MODEL_NAME}_${VARIATION_NAME} &&\
            kaggle models instances versions download ${MODEL_PATH} --untar -p /data/${MODEL_NAME}_${VARIATION_NAME} && \
            echo -e "\nCompleted extraction to /data/${MODEL_NAME}_${VARIATION_NAME}" && \
        
            gcloud storage rsync --recursive --no-clobber /data/${MODEL_NAME}_${VARIATION_NAME} gs://${BUCKET_NAME}/${MODEL_NAME}_${VARIATION_NAME} && \
            echo -e "\nCompleted copy of data to gs://${BUCKET_NAME}/${MODEL_NAME}_${VARIATION_NAME}"
        ---
        apiVersion: batch/v1
        kind: Job
        metadata:
          name: data-loader-7b
          labels:
            app: data-loader-7b
        spec:
          ttlSecondsAfterFinished: 120
          template:
            metadata:
              labels:
                app: data-loader-7b
            spec:
              restartPolicy: OnFailure
              containers:
              - name: gcloud
                image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
                command:
                - /scripts/fetch_model.sh
                env:
                - name: BUCKET_NAME
                  value: CHECKPOINTS_BUCKET_NAME
                - name: KAGGLE_CONFIG_DIR
                  value: /kaggle
                - name: MODEL_PATH
                  value: "google/gemma/pax/7b-it/2"
                volumeMounts:
                - mountPath: "/kaggle/"
                  name: kaggle-credentials
                  readOnly: true
                - mountPath: "/scripts/"
                  name: scripts-volume
                  readOnly: true
              volumes:
              - name: kaggle-credentials
                secret:
                  defaultMode: 0400
                  secretName: kaggle-secret
              - name: scripts-volume
                configMap:
                  defaultMode: 0700
                  name: fetch-model-scripts

        Ganti CHECKPOINTS_BUCKET_NAME dengan nama bucket yang Anda buat di bagian Membuat bucket Cloud Storage. Sertakan awalan gs://.

      2. Terapkan manifes:

        kubectl apply -f job-7b.yaml
        
      3. Tunggu hingga Tugas selesai:

        kubectl wait --for=condition=complete --timeout=360s job/data-loader-7b
        

        Outputnya terlihat mirip dengan yang berikut ini:

        job.batch/data-loader-7b condition met
        
      4. Pastikan bahwa Job berhasil diselesaikan:

        kubectl get job/data-loader-7b
        

        Outputnya terlihat mirip dengan yang berikut ini:

        NAME             COMPLETIONS   DURATION   AGE
        data-loader-7b   1/1           ##s        #m##s
        
      5. Lihat log untuk Tugas:

        kubectl logs --follow job/data-loader-7b
        

      Pekerjaan mengupload checkpoint ke gs://CHECKPOINTS_BUCKET_NAME/gemma_7b_it/checkpoint_00000000.

      Mengekspos server HTTP Saxml

      Anda dapat mengakses server HTTP Saxml melalui ClusterIP Service yang Anda buat saat men-deploy server HTTP Saxml. Layanan ClusterIP hanya dapat dijangkau dari dalam cluster. Oleh karena itu, untuk mengakses Layanan dari luar cluster, selesaikan langkah-langkah berikut:

      1. Buat sesi penerusan port:

        kubectl port-forward service/sax-http-svc 8888:8888
        
      2. Pastikan Anda dapat mengakses server HTTP Saxml dengan membuka terminal baru dan menjalankan perintah berikut:

        curl -s localhost:8888
        

        Outputnya terlihat mirip dengan yang berikut ini:

        {
            "Message": "HTTP Server for SAX Client"
        }
        

      Server HTTP Saxml merangkum antarmuka klien ke sistem Saxml dan mengeksposnya melalui serangkaian REST API. Anda menggunakan API ini untuk memublikasikan, mengelola, dan berinteraksi dengan model Gemma 2B dan Gemma 7B.

      Memublikasikan model Gemma

      Selanjutnya, Anda dapat memublikasikan model Gemma ke server model yang berjalan di node pool slice TPU. Anda menggunakan API publish server HTTP Saxml untuk memublikasikan model. Ikuti langkah-langkah berikut untuk memublikasikan model parameter Gemma 2B atau 7B.

      Untuk mempelajari lebih lanjut API server HTTP Saxml, lihat Saxml HTTP API.

      Gemma 2B-it

      1. Pastikan sesi penerusan port Anda masih aktif:

        curl -s localhost:8888
        
      2. Publikasikan parameter Gemma 2B:

        curl --request POST \
        --header "Content-type: application/json" \
        -s \
        localhost:8888/publish \
        --data \
        '{
            "model": "/sax/test/gemma2bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000",
            "replicas": "1"
        }'
        

        Outputnya terlihat mirip dengan yang berikut ini:

        {
            "model": "/sax/test/gemma2bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000",
            "replicas": 1
        }
        

        Lihat langkah berikutnya untuk memantau progres deployment.

      3. Pantau progres dengan mengamati log di Pod server model deployment sax-model-server-v5e-1x1.

        kubectl logs --follow deployment/sax-model-server-v5e-1x1
        

        Proses deployment ini dapat memerlukan waktu hingga lima menit. Tunggu hingga Anda melihat pesan yang mirip dengan berikut ini:

        I0125 15:34:31.685555 139063071708736 servable_model.py:699] loading completed.
        I0125 15:34:31.686286 139063071708736 model_service_base.py:532] Successfully loaded model for key: /sax/test/gemma2bfp16
        
      4. Verifikasi bahwa Anda dapat mengakses model, dengan menampilkan informasi model:

        curl --request GET \
        --header "Content-type: application/json" \
        -s \
        localhost:8888/listcell \
        --data \
        '{
            "model": "/sax/test/gemma2bfp16"
        }'
        

        Outputnya terlihat mirip dengan yang berikut ini:

        {
            "model": "/sax/test/gemma2bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000",
            "max_replicas": 1,
            "active_replicas": 1
        }
        

      Gemma 7B-it

      1. Pastikan sesi penerusan port Anda masih aktif:

        curl -s localhost:8888
        
      2. Publikasikan parameter Gemma 7B:

        curl --request POST \
        --header "Content-type: application/json" \
        -s \
        localhost:8888/publish \
        --data \
        '{
            "model": "/sax/test/gemma7bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000",
            "replicas": "1"
        }'
        

        Outputnya terlihat mirip dengan yang berikut ini:

        {
            "model": "/sax/test/gemma7bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000",
            "replicas": 1
        }
        

        Lihat langkah berikutnya untuk memantau progres deployment.

      3. Pantau progres dengan mengamati log di Pod server model deployment sax-model-server-v5e-2x2.

        kubectl logs --follow deployment/sax-model-server-v5e-2x2
        

        Tunggu hingga Anda melihat pesan yang mirip dengan berikut ini:

        I0125 15:34:31.685555 139063071708736 servable_model.py:699] loading completed.
        I0125 15:34:31.686286 139063071708736 model_service_base.py:532] Successfully loaded model for key: /sax/test/gemma7bfp16
        
      4. Pastikan model dipublikasikan dengan menampilkan informasi model:

        curl --request GET \
        --header "Content-type: application/json" \
        -s \
        localhost:8888/listcell \
        --data \
        '{
            "model": "/sax/test/gemma7bfp16"
        }'
        

        Outputnya mirip dengan hal berikut ini:

        {
            "model": "/sax/test/gemma7bfp16",
            "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16",
            "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000",
            "max_replicas": 1,
            "active_replicas": 1
        }
        

      Menggunakan model

      Anda dapat berinteraksi dengan model Gemma 2B atau 7B. Gunakan generate API server HTTP Saxml untuk mengirim perintah ke model.

      Gemma 2B-it

      Menayangkan permintaan perintah menggunakan endpoint generate server HTTP Saxml:

      curl --request POST \
      --header "Content-type: application/json" \
      -s \
      localhost:8888/generate \
      --data \
      '{
        "model": "/sax/test/gemma2bfp16",
        "query": "What are the top 5 most popular programming languages?"
      }'
      

      Berikut adalah contoh respons model. Output sebenarnya bervariasi, berdasarkan perintah yang Anda berikan:

      [
          [
              "\n\n1. **Python**\n2. **JavaScript**\n3. **Java**\n4. **C++**\n5. **Go**",
              -3.0704939365386963
          ]
      ]
      

      Anda dapat menjalankan perintah dengan parameter query yang berbeda. Anda juga dapat mengubah parameter tambahan seperti temperature, top_k, topc_p menggunakan generate API. Untuk mempelajari lebih lanjut API server HTTP Saxml, lihat Saxml HTTP API.

      Gemma 7B-it

      Menayangkan permintaan perintah menggunakan endpoint generate server HTTP Saxml:

      curl --request POST \
      --header "Content-type: application/json" \
      -s \
      localhost:8888/generate \
      --data \
      '{
        "model": "/sax/test/gemma7bfp16",
        "query": "What are the top 5 most popular programming languages?"
      }'
      

      Berikut adalah contoh respons model. Output dapat bervariasi di setiap perintah yang Anda berikan:

      [
          [
              "\n\n**1. JavaScript**\n\n* Most widely used language on the web.\n* Used for front-end development, such as websites and mobile apps.\n* Extensive libraries and frameworks available.\n\n**2. Python**\n\n* Known for its simplicity and readability.\n* Versatile, used for various tasks, including data science, machine learning, and web development.\n* Large and active community.\n\n**3. Java**\n\n* Object-oriented language widely used in enterprise applications.\n* Used for web applications, mobile apps, and enterprise software.\n* Strong ecosystem and support.\n\n**4. Go**\n\n",
              -16.806324005126953
          ]
      ]
      

      Anda dapat menjalankan perintah dengan parameter query yang berbeda. Anda juga dapat mengubah parameter tambahan seperti temperature, top_k, topc_p menggunakan generate API. Untuk mempelajari lebih lanjut API server HTTP Saxml, lihat Saxml HTTP API.

      Membatalkan publikasi model

      Ikuti langkah-langkah berikut untuk membatalkan publikasi model Anda:

      Gemma 2B-it

      Untuk membatalkan publikasi model Gemma 2B-it, jalankan perintah berikut:

      curl --request POST \
      --header "Content-type: application/json" \
      -s \
      localhost:8888/unpublish \
      --data \
      '{
          "model": "/sax/test/gemma2bfp16"
      }'
      

      Outputnya terlihat mirip dengan yang berikut ini:

      {
          "model": "/sax/test/gemma2bfp16"
      }
      

      Anda dapat menjalankan perintah dengan berbagai perintah yang diteruskan dalam parameter query.

      Gemma 7B-it

      Untuk membatalkan publikasi model Gemma 7B-it, jalankan perintah berikut:

      curl --request POST \
      --header "Content-type: application/json" \
      -s \
      localhost:8888/unpublish \
      --data \
      '{
          "model": "/sax/test/gemma7bfp16"
      }'
      

      Outputnya terlihat mirip dengan yang berikut ini:

      {
          "model": "/sax/test/gemma7bfp16"
      }
      

      Anda dapat menjalankan perintah dengan berbagai perintah yang diteruskan dalam parameter query.

      Memecahkan masalah

      • Jika Anda mendapatkan pesan Empty reply from server, kemungkinan besar penampung belum selesai mendownload data model. Periksa log Pod lagi untuk melihat pesan Connected yang menunjukkan bahwa model siap ditayangkan.
      • Jika Anda melihat Connection refused, pastikan penerusan port Anda aktif.

      Pembersihan

      Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

      Menghapus resource yang di-deploy

      Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang Anda buat dalam panduan ini, jalankan perintah berikut:

      gcloud container clusters delete ${CLUSTER_NAME} --location=${LOCATION}
      gcloud iam service-accounts delete --quiet wi-sax@${PROJECT_ID}.iam.gserviceaccount.com
      gcloud storage rm --recursive gs://ADMIN_BUCKET_NAME
      gcloud storage rm --recursive gs://CHECKPOINTS_BUCKET_NAME
      

      Ganti kode berikut:

      • ADMIN_BUCKET_NAME: Nama bucket Cloud Storage yang menyimpan server Admin Saxml.
      • CHECKPOINTS_BUCKET_NAME: Nama bucket Cloud Storage yang menyimpan checkpoint model.

      Langkah berikutnya