透過 Saxml 在 GKE 上使用 TPU 提供 Gemma 開放原始碼模型


本教學課程說明如何使用 Saxml 服務架構,透過 GKE 上的 TPU 部署及提供 Gemma 2 大型語言模型 (LLM)。本教學課程提供基礎知識,協助您瞭解及探索如何在代管型 Kubernetes 環境中,實際部署 LLM 以進行推論。您可以使用 Saxml 將預先建構的容器部署至 GKE。您也會設定 GKE,在執行階段從 Cloud Storage 載入 Gemma 2B 和 7B 的權重。

本教學課程的適用對象為機器學習 (ML) 工程師、平台管理員和操作員,以及有興趣使用 Kubernetes 容器自動化調度管理功能提供 LLM 服務的資料和 AI 專家。如要進一步瞭解Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

閱讀本頁面之前,請先熟悉下列概念:

如果您需要統一管理的 AI 平台,以符合成本效益的方式快速建構及提供機器學習模型,建議您試用 Vertex AI 部署解決方案。

背景

本節說明本教學課程中使用的重要技術。

Gemma

Gemma 是一組開放授權的輕量型生成式 AI 模型,您可以在應用程式、硬體、行動裝置或代管服務中執行這些 AI 模型。您可以使用 Gemma 模型生成文字,也可以調整這些模型,執行專業工作。

詳情請參閱 Gemma 說明文件

TPU

TPU 是 Google 開發的客製化特殊應用積體電路 (ASIC),用於加速 TensorFlowPyTorchJAX 等資料處理架構。

本教學課程會提供 Gemma 2B 和 Gemma 7B 模型。 GKE 會在下列單一主機 TPU v5e 節點集區中代管這些模型:

  • Gemma 2B:在 TPU v5e 節點集區中代管的指令調整模型,拓撲為 1x1,代表一個 TPU 晶片。節點的機器類型為 ct5lp-hightpu-1t
  • Gemma 7B:在 TPU v5e 節點集區中代管的指令調整模型,拓撲為 2x2,代表四個 TPU 晶片。節點的機器類型為 ct5lp-hightpu-4t

Saxml

Saxml 是實驗性系統,可為推論作業提供 PaxmlJAXPyTorch 模型。Saxml 系統包含下列元件:

  • Saxml 儲存格或 Sax 叢集:管理伺服器和一組模型伺服器。管理伺服器會追蹤模型伺服器、將已發布的模型指派給模型伺服器以提供服務,並協助用戶端找出提供特定已發布模型的模型伺服器。
  • Saxml 用戶端:Saxml 系統的使用者導向程式設計介面。Saxml 用戶端包含指令列工具 (saxutil) 和一組 Python、C++ 和 Go 的用戶端程式庫

在本教學課程中,您也會使用 Saxml HTTP 伺服器。 Saxml HTTP 伺服器是自訂 HTTP 伺服器,可封裝 Saxml Python 用戶端程式庫,並公開 REST API,與 Saxml 系統互動。REST API 包含發布、列出、取消發布模型,以及產生預測結果的端點。

目標

  1. 根據模型特性,準備具有建議 TPU 拓撲的 GKE Standard 叢集。
  2. 在 GKE 上部署 Saxml 元件。
  3. 取得並發布 Gemma 2B 或 Gemma 7B 參數模型。
  4. 提供已發布的模型並與之互動。

架構

本節說明本教學課程使用的 GKE 架構。此架構包含 GKE Standard 叢集,可佈建 TPU 並代管 Saxml 元件,以部署及提供 Gemma 2B 或 7B 模型。下圖顯示這個架構的元件:

本教學課程中部署的架構圖

這個架構包含下列元件:

  • GKE Standard 可用區叢集。
  • 單一主機 TPU 配量節點集區,取決於您想服務的 Gemma 模型:
    • Gemma 2B:使用 1x1 拓撲設定的 TPU v5e。Saxml 模型伺服器的一個例項已設定為使用這個節點集區。
    • Gemma 7B:使用 TPU v5e 設定,並採用 2x2 拓撲。Saxml 模型伺服器的一個例項已設定為使用這個節點集區。
  • 預設 CPU 節點集區,用於部署 Saxml 管理伺服器和 Saxml HTTP 伺服器。
  • 兩個 Cloud Storage bucket
    • 一個 Cloud Storage 值區會儲存由管理伺服器管理的狀態。
    • 一個 Cloud Storage bucket 儲存 Gemma 模型檢查點。

這個架構具有下列特徵:

  • 公開的 Artifact Registry 會管理 Saxml 元件的容器映像檔。
  • GKE 叢集使用 Workload Identity Federation for GKE。所有 Saxml 元件都使用工作負載身分聯盟,整合 IAM 服務帳戶來存取外部服務,例如 Cloud Storage 值區。
  • Saxml 元件產生的記錄檔會整合至 Cloud Logging
  • 您可以使用 Cloud Monitoring 分析 GKE 節點集區的效能指標,例如本教學課程建立的節點集區。

事前準備

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

      前往「IAM」頁面
    2. 選取專案。
    3. 按一下「授予存取權」
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是 Google 帳戶的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [Save]
  • 確認您有足夠的配額,可使用 5 個 TPU v5e 晶片。在本教學課程中,您將使用隨選執行個體
  • 如果沒有 Kaggle 帳戶,請先建立帳戶

準備 Gemma 環境

啟動 Cloud Shell

在本教學課程中,您將使用 Cloud Shell 管理託管在 Google Cloud上的資源。Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectlgcloud CLI

  1. 在 Google Cloud 控制台中啟動 Cloud Shell 執行個體:
    開啟 Cloud Shell

  2. 設定預設環境變數:

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

    替換下列值:

建立 GKE Standard 叢集

在本節中,您將建立 GKE 叢集和節點集區。

Gemma 2B-it

使用 Cloud Shell 執行下列操作:

  1. 建立使用 Workload Identity Federation for GKE 的 Standard 叢集:

    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}
    

    建立叢集可能需要幾分鐘的時間。

  2. 建立具有 1x1 拓撲和一個節點的 TPU v5e 節點集區:

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

    您會在節點集區中提供 Gemma 2B 模型。

Gemma 7B-it

使用 Cloud Shell 執行下列操作:

  1. 建立使用 Workload Identity Federation for GKE 的 Standard 叢集:

    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}
    

    建立叢集可能需要幾分鐘的時間。

  2. 建立具有 2x2 拓撲和一個節點的 TPU v5e 節點集區:

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

    您會在節點集區中提供 Gemma 7B 模型。

建立 Cloud Storage bucket

建立兩個 Cloud Storage bucket,用來管理 Saxml Admin 伺服器和模型檢查點的狀態。

在 Cloud Shell 中執行下列指令:

  1. 建立 Cloud Storage bucket,用來儲存 Saxml Admin 伺服器設定。

    gcloud storage buckets create gs://ADMIN_BUCKET_NAME
    

    ADMIN_BUCKET_NAME 替換為儲存 Saxml 管理伺服器的 Cloud Storage 值區名稱。

  2. 建立 Cloud Storage bucket 來儲存模型檢查點:

    gcloud storage buckets create gs://CHECKPOINTS_BUCKET_NAME
    

    CHECKPOINTS_BUCKET_NAME 替換為儲存模型檢查點的 Cloud Storage bucket 名稱。

使用 Workload Identity Federation for GKE 設定工作負載存取權

Kubernetes ServiceAccount 指派給應用程式,並將該 Kubernetes ServiceAccount 設定為 IAM 服務帳戶。

  1. 設定 kubectl 與叢集通訊:

    gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}
    
  2. 為應用程式建立要使用的 Kubernetes ServiceAccount:

    gcloud iam service-accounts create wi-sax
    
  3. 為 IAM 服務帳戶新增 IAM 政策繫結,允許讀取及寫入 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. 在兩個服務帳戶之間新增 IAM 政策繫結,允許 Kubernetes ServiceAccount模擬 IAM 服務帳戶。這個繫結可讓 Kubernetes ServiceAccount 做為 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. 使用 IAM 服務帳戶的電子郵件地址註解 Kubernetes 服務帳戶:

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

取得模型存取權

如要部署至 GKE,您必須登入 Kaggle 平台、簽署授權同意協議,並取得 Kaggle API 權杖,才能存取 Gemma 模型。在本教學課程中,您會使用 Kubernetes Secret 儲存 Kaggle 憑證。

您必須簽署同意聲明,才能使用 Gemma。請按照以下步驟操作:

  1. 前往 Kaggle.com 的模型同意聲明頁面
  2. 如果尚未登入 Kaggle,請先登入。
  3. 按一下「要求存取權」
  4. 在「選擇同意聲明適用的帳戶」部分,選取「透過 Kaggle 帳戶驗證」,使用 Kaggle 帳戶授予同意聲明。
  5. 接受模型條款及細則

產生存取權杖

如要透過 Kaggle 存取模型,您需要 Kaggle API 權杖

如果沒有權杖,請按照下列步驟產生新權杖:

  1. 在瀏覽器中前往 Kaggle 設定
  2. 在「API」部分下方,按一下「Create New Token」

Kaggle 會下載名為 kaggle.json 的檔案。

將存取權杖上傳至 Cloud Shell

在 Cloud Shell 中,您可以將 Kaggle API 權杖上傳至專案: Google Cloud

  1. 在 Cloud Shell 中,依序點選「更多」>「上傳」
  2. 選取「檔案」,然後按一下「選擇檔案」
  3. 開啟 kaggle.json 檔案。
  4. 按一下「上傳」。

為 Kaggle 憑證建立 Kubernetes Secret

在 Cloud Shell 中執行下列步驟:

  1. 設定 kubectl 與叢集通訊:

    gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}
    
  2. 建立 Secret 來儲存 Kaggle 憑證:

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

部署 Saxml

在本節中,您將部署 Saxml 管理伺服器、模型伺服器和 HTTP 伺服器。本教學課程使用 Kubernetes Deployment 資訊清單。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集的節點中。

部署 Saxml 管理伺服器

在本節中,您將部署 Saxml 管理伺服器。

  1. 建立下列 saxml-admin-server.yaml 資訊清單:

    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

    ADMIN_BUCKET_NAME 替換為您在「建立 Cloud Storage 值區」一節中建立的值區名稱。請勿加入 gs:// 前置字元。

  2. 套用資訊清單:

    kubectl apply -f saxml-admin-server.yaml
    
  3. 驗證管理伺服器部署作業:

    kubectl get deployment
    

    輸出看起來類似以下內容:

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

部署 Saxml 模型伺服器

請按照下列操作說明,為 Gemma 2B 或 Gemma 7B 模型部署模型伺服器。

Gemma 2B-it

  1. 建立下列 saxml-model-server-1x1.yaml 資訊清單:

    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

    ADMIN_BUCKET_NAME 替換為您在「建立 Cloud Storage 值區」一節中建立的值區名稱。請勿加入 gs:// 前置字元。

  2. 套用資訊清單:

    kubectl apply -f saxml-model-server-1x1.yaml
    
  3. 確認模型伺服器部署作業的狀態:

    kubectl get deployment
    

    輸出看起來類似以下內容:

    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. 建立下列 saxml-model-server-2x2.yaml 資訊清單:

    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

    ADMIN_BUCKET_NAME 替換為您在「建立 Cloud Storage 值區」一節中建立的值區名稱。請勿加入 gs:// 前置字元。

  2. 套用資訊清單:

    kubectl apply -f saxml-model-server-2x2.yaml
    
  3. 確認模型伺服器部署作業的狀態:

    kubectl get deployment
    

    輸出看起來類似以下內容:

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

部署 Saxml HTTP 伺服器

在本節中,您會部署 Saxml HTTP 伺服器,並建立用於存取伺服器的叢集 IP 服務。

  1. 建立下列 saxml-http.yaml 資訊清單:

    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

    ADMIN_BUCKET_NAME 替換為儲存 Saxml 管理伺服器的 Cloud Storage 值區名稱。

  2. 套用資訊清單:

    kubectl apply -f saxml-http.yaml
    
  3. 驗證 Saxml HTTP 伺服器部署作業的狀態:

    kubectl get deployment
    

    Gemma 2B-it

    輸出看起來類似以下內容:

    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

    輸出看起來類似以下內容:

    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
    

下載模型檢查點

在本節中,您將執行 Kubernetes Job,擷取、下載及儲存模型檢查點。Kubernetes 中的 Job 控制器會建立一或多個 Pod,並確保這些 Pod 成功執行特定工作。

根據您要使用的 Gemma 模型,遵循步驟執行:

Gemma 2B-it

  1. 建立下列 job-2b.yaml 資訊清單:

    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

    CHECKPOINTS_BUCKET_NAME 替換為您在「建立 Cloud Storage 值區」一節中建立的值區名稱。請勿加入 gs:// 前置字元。

  2. 套用資訊清單:

    kubectl apply -f job-2b.yaml
    
  3. 等待工作完成:

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

    輸出看起來類似以下內容:

    job.batch/data-loader-2b condition met
    
  4. 確認工作是否順利完成:

    kubectl get job/data-loader-2b
    

    輸出看起來類似以下內容:

    NAME             COMPLETIONS   DURATION   AGE
    data-loader-2b   1/1           ##s        #m##s
    
  5. 查看工作的記錄:

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

這項工作會將檢查點上傳至 gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000

Gemma 7B-it

  1. 建立下列 job-7b.yaml 資訊清單:

    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

    CHECKPOINTS_BUCKET_NAME 替換為您在「建立 Cloud Storage 值區」一節中建立的值區名稱。請務必加入 gs:// 前置字元。

  2. 套用資訊清單:

    kubectl apply -f job-7b.yaml
    
  3. 等待工作完成:

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

    輸出看起來類似以下內容:

    job.batch/data-loader-7b condition met
    
  4. 確認工作是否順利完成:

    kubectl get job/data-loader-7b
    

    輸出看起來類似以下內容:

    NAME             COMPLETIONS   DURATION   AGE
    data-loader-7b   1/1           ##s        #m##s
    
  5. 查看工作的記錄:

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

這項工作會將檢查點上傳至 gs://CHECKPOINTS_BUCKET_NAME/gemma_7b_it/checkpoint_00000000

公開 Saxml HTTP 伺服器

您可以透過叢集 IP 服務存取 Saxml HTTP 伺服器,該服務是在部署 Saxml HTTP 伺服器時建立。ClusterIP 服務只能從叢集內部存取。因此,如要從叢集外部存取 Service,請完成下列步驟:

  1. 建立通訊埠轉送工作階段:

    kubectl port-forward service/sax-http-svc 8888:8888
    
  2. 開啟新終端機並執行下列指令,確認您可以存取 Saxml HTTP 伺服器:

    curl -s localhost:8888
    

    輸出看起來類似以下內容:

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

Saxml HTTP 伺服器會封裝 Saxml 系統的用戶端介面,並透過一組 REST API 公開。您可以使用這些 API 發布、管理 Gemma 2B 和 Gemma 7B 模型,以及與這些模型互動。

發布 Gemma 模型

接著,您可以將 Gemma 模型發布至在 TPU 節點集區中執行的模型伺服器。您可以使用 Saxml HTTP 伺服器的 publish API 發布模型。請按照下列步驟發布 Gemma 2B 或 7B 參數模型。

如要進一步瞭解 Saxml HTTP 伺服器的 API,請參閱「Saxml HTTP API」。

Gemma 2B-it

  1. 確認連接埠轉送工作階段仍處於啟用狀態:

    curl -s localhost:8888
    
  2. 發布 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"
    }'
    

    輸出看起來類似以下內容:

    {
        "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
    }
    

    請參閱下一個步驟,瞭解如何監控部署作業的進度。

  3. sax-model-server-v5e-1x1 部署作業的模型伺服器 Pod 中觀察記錄,監控進度。

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

    部署作業最多可能需要五分鐘才能完成。等待畫面顯示類似以下的訊息:

    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. 顯示模型資訊,確認您可以存取模型:

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

    輸出看起來類似以下內容:

    {
        "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. 確認連接埠轉送工作階段仍處於啟用狀態:

    curl -s localhost:8888
    
  2. 發布 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"
    }'
    

    輸出看起來類似以下內容:

    {
        "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
    }
    

    請參閱下一個步驟,瞭解如何監控部署作業的進度。

  3. sax-model-server-v5e-2x2 部署作業的模型伺服器 Pod 中觀察記錄,監控進度。

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

    等待畫面顯示類似以下的訊息:

    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. 顯示模型資訊,確認模型已發布:

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

    輸出結果會與下列內容相似:

    {
        "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
    }
    

使用模型

您可以與 Gemma 2B 或 7B 模型互動。使用 Saxml HTTP 伺服器的 generate API 將提示傳送至模型。

Gemma 2B-it

使用 Saxml HTTP 伺服器的 generate 端點,提供提示要求:

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?"
}'

以下是模型回覆的範例。 實際輸出內容會因您提供的提示而異:

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

您可以搭配不同的 query 參數執行指令。您也可以使用 generate API 修改 temperaturetop_ktopc_p 等額外參數。如要進一步瞭解 Saxml HTTP 伺服器的 API,請參閱「Saxml HTTP API」。

Gemma 7B-it

使用 Saxml HTTP 伺服器的 generate 端點,提供提示要求:

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?"
}'

以下是模型回覆的範例。您提供的每個提示輸出內容可能有所不同:

[
    [
        "\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
    ]
]

您可以搭配不同的 query 參數執行指令。您也可以使用 generate API 修改額外參數,例如 temperaturetop_ktopc_p。如要進一步瞭解 Saxml HTTP 伺服器的 API,請參閱「Saxml HTTP API」。

取消發布模型

如要取消發布模型,請按照下列步驟操作:

Gemma 2B-it

如要取消發布 Gemma 2B-it 模型,請執行下列指令:

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

輸出看起來類似以下內容:

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

您可以搭配 query 參數傳遞的不同提示執行指令。

Gemma 7B-it

如要取消發布 Gemma 7B-it 模型,請執行下列指令:

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

輸出看起來類似以下內容:

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

您可以搭配 query 參數傳遞的不同提示執行指令。

排解問題

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

刪除已部署的資源

如要避免系統向您的 Google Cloud 帳戶收取本指南所建立資源的費用,請執行下列指令:

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

更改下列內容:

  • ADMIN_BUCKET_NAME:儲存 Saxml Admin 伺服器的 Cloud Storage 值區名稱。
  • CHECKPOINTS_BUCKET_NAME:儲存模型檢查點的 Cloud Storage 值區名稱。

後續步驟