Saxml を備えた GKE で TPU を使用して Gemma オープンモデルを提供する


このガイドでは、Saxml を備えた Google Kubernetes Engine(GKE)で Tensor Processing Unit(TPU)を使用して、Gemma オープンモデル大規模言語モデル(LLM)を提供する方法について説明します。このガイドでは、2B パラメータと 7B パラメータの指示でチューニングした Gemma モデルを Cloud Storage にダウンロードし、Saxml を実行するコンテナを使用して GKE Standard クラスタにデプロイします。

このガイドは、モデルを Saxml にデプロイするときに Kubernetes の機能によって実現されるスケーラビリティ、復元力、費用対効果が必要な場合に適しています。ML モデルを費用対効果の高い方法で迅速に構築して提供するために、統合されたマネージド AI プラットフォームが必要な場合は、Vertex AI デプロイ ソリューションをお試しになることをおすすめします。

背景

Saxml を備えた GKE で TPU を使用して Gemma を提供することで、マネージド Kubernetes のメリット(効率的なスケーラビリティと可用性の向上など)をすべて活用した、本番環境対応の堅牢な推論サービング ソリューションを実装できます。このセクションでは、このチュートリアルで使用されている重要なテクノロジーについて説明します。

Gemma

Gemma はオープン ライセンスでリリースされ公開されている軽量の生成 AI モデルのセットです。これらの AI モデルは、アプリケーション、ハードウェア、モバイル デバイス、ホスト型サービスで実行できます。Gemma モデルはテキスト生成に使用できますが、特殊なタスク用にチューニングすることもできます。

詳しくは、Gemma のドキュメントをご覧ください。

TPU

TPU は、Google が独自に開発した特定用途向け集積回路(ASIC)であり、TensorFlow、PyTorch、JAX などのデータ処理フレームワークを高速化するために使用されます。

GKE で TPU を使用する前に、次の学習プログラムを完了することをおすすめします。

  1. Cloud TPU システム アーキテクチャで、現在の TPU バージョンの可用性について学習する。
  2. GKE の TPU についてを確認する。

このチュートリアルでは、Gemma 2B モデルと Gemma 7B モデルを使用します。GKE は、次の単一ホスト TPU v5e ノードプールでこれらのモデルをホストします。

  • Gemma 2B: 1 つの TPU チップを表す 1x1 トポロジを持つ TPU v5e ノードプールでホストされる指示チューニング済みモデル。ノードのマシンタイプは ct5lp-hightpu-1t です。
  • Gemma 7B: 4 つの TPU チップを表す 2x2 トポロジを持つ TPU v5e ノードプールでホストされる指示チューニング済みモデル。ノードのマシンタイプは ct5lp-hightpu-4t です。

Saxml

Saxml は、推論に PaxmlJAXPyTorch モデルを提供する試験運用版のシステムです。Saxml システムは、次のコンポーネントで構成されています。

  • Saxml セルまたは Sax クラスタ: 管理サーバーとモデルサーバーのグループで構成されます。管理サーバーはモデルサーバーを追跡し、公開されたモデルをモデルサーバーに割り当てて提供します。また、クライアントが特定の公開モデルを提供するモデルサーバーを特定できるようにします。
  • Saxml クライアント: Saxml システムのユーザー向けプログラミング インターフェース。Saxml クライアントには、コマンドライン ツール(saxutil)と、Python、C++、Go のクライアント ライブラリのスイートが含まれています。

このチュートリアルでは、Saxml HTTP サーバーも使用します。Saxml HTTP Server は、Saxml Python クライアント ライブラリをカプセル化し、Saxml システムを操作する REST API を公開するカスタム HTTP サーバーです。これには、モデルの公開、一覧表示、公開停止、予測の生成を行うエンドポイントが含まれます。

目標

このチュートリアルは、JAX を使用している生成 AI をご利用のお客様、GKE の新規または既存のユーザー、ML エンジニア、MLOps(DevOps)エンジニア、Gemma を提供するために Kubernetes コンテナのオーケストレーション機能を使用することに関心をお持ちのプラットフォーム管理者を対象としています。

このチュートリアルでは、次の手順について説明します。

  1. モデルの特性に基づいて推奨される TPU トポロジを持つ GKE Standard クラスタを準備します。
  2. GKE に Saxml コンポーネントをデプロイします。
  3. Gemma 2B または Gemma 7B パラメータ モデルを取得して公開します。
  4. 公開されたモデルを提供して操作します。

アーキテクチャ

このセクションでは、このチュートリアルで使用する GKE アーキテクチャについて説明します。このアーキテクチャは、TPU をプロビジョニングし、Gemma 2B または 7B モデルをデプロイして提供するための Saxml コンポーネントをホストする GKE Standard クラスタで構成されています。次の図は、このアーキテクチャのコンポーネントを示しています。

このチュートリアルでデプロイするアーキテクチャの図

このアーキテクチャには次のコンポーネントが含まれています。

  • GKE Standard ゾーンクラスタ。
  • 提供する Gemma モデルに依存する単一ホストの TPU スライス ノードプール:
    • Gemma 2B: 1x1 トポロジの TPU v5e で構成されています。Saxml モデルサーバーの 1 つのインスタンスが、このノードプールを使用するように構成されています。
    • Gemma 7B: 2x2 トポロジの TPU v5e で構成されています。Saxml モデルサーバーの 1 つのインスタンスが、このノードプールを使用するように構成されています。
  • Saxml 管理サーバーと Saxml HTTP サーバーがデプロイされているデフォルトの CPU ノードプール。
  • 2 つの Cloud Storage バケット:
    • 一方の Cloud Storage バケットには、管理サーバーによって管理される状態が保存されます。
    • もう一方の Cloud Storage バケットには Gemma モデルのチェックポイントが保存されます。

このアーキテクチャには次の特徴があります。

  • 一般公開の Artifact Registry は、Saxml コンポーネントのコンテナ イメージを管理します。
  • GKE クラスタは GKE 用 Workload Identity 連携を使用します。すべての Saxml コンポーネントは、IAM サービス アカウントを統合する Workload Identity 連携を使用して、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.
  • Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  • Google Cloud プロジェクトで課金が有効になっていることを確認します

  • 必要な API を有効にします。

    API を有効にする

  • Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  • Google Cloud プロジェクトで課金が有効になっていることを確認します

  • 必要な API を有効にします。

    API を有効にする

  • プロジェクトに次のロールがあることを確認します。 roles/container.admin, roles/iam.serviceAccountAdmin

    ロールを確認する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. プロジェクトを選択します。
    3. [プリンシパル] 列で、自分のメールアドレスを含む行を見つけます。

      自分のメールアドレスがその列にない場合、ロールは割り当てられていません。

    4. 自分のメールアドレスを含む行の [ロール] 列で、ロールのリストに必要なロールが含まれているかどうかを確認します。

    ロールを付与する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. プロジェクトを選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、自分のメールアドレスを入力します。
    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。

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. GKE 用 Workload Identity 連携を使用する 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 トポロジと 1 つのノードを持つ 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. GKE 用 Workload Identity 連携を使用する 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 トポロジと 1 つのノードを持つ 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 バケットを作成する

Saxml 管理サーバーとモデル チェックポイントの状態を管理する 2 つの Cloud Storage バケットを作成します。

Cloud Shell で次のコマンドを実行します。

  1. Saxml 管理サーバーの構成を保存する Cloud Storage バケットを作成します。

    gcloud storage buckets create gs://ADMIN_BUCKET_NAME
    

    ADMIN_BUCKET_NAME は、Saxml 管理サーバーを保存する Cloud Storage バケットの名前に置き換えます。

  2. モデルのチェックポイントを保存する Cloud Storage バケットを作成します。

    gcloud storage buckets create gs://CHECKPOINTS_BUCKET_NAME
    

    CHECKPOINTS_BUCKET_NAME は、モデルのチェックポイントを保存する Cloud Storage バケットの名前に置き換えます。

GKE 用 Workload Identity 連携を使用してワークロード アクセスを構成する

アプリケーションに 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. 2 つのサービス アカウントの間に 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. Kubernetes サービス アカウントに IAM サービス アカウントのメールアドレスでアノテーションを付けます。

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

モデルへのアクセス権を取得する

GKE にデプロイするために Gemma モデルへのアクセス権を取得するには、Kaggle プラットフォームにログインし、ライセンス同意契約に署名して、Kaggle API トークンを入手する必要があります。このチュートリアルでは、Kaggle 認証情報に Kubernetes Secret を使用します。

Gemma を使用するには同意契約に署名する必要があります。手順は次のとおりです。

  1. Kaggle.com のモデルの同意ページにアクセスします。
  2. Kaggle にログインしていない場合はログインします。
  3. [アクセス権限をリクエスト] をクリックします。
  4. [同意に使用するアカウントを選択] セクションで、[Kaggle アカウントを使用して確認] を選択して、同意に Kaggle アカウントを使用します。
  5. モデルの利用規約に同意します。

アクセス トークンを生成する

Kaggle からモデルにアクセスするには、Kaggle API トークンが必要です。

トークンをまだ生成していない場合は、次の手順に沿って生成します。

  1. ブラウザで [Kaggle の設定] に移動します。
  2. [API] セクションで [新しいトークンを作成] をクリックします。

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. Kaggle 認証情報を保存する Secret を作成します。

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

Saxml をデプロイする

このセクションでは、Saxml 管理サーバー、モデルサーバー、HTTP サーバーをデプロイします。

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. モデルサーバーの Deployment のステータスを確認します。

    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. モデルサーバーの Deployment のステータスを確認します。

    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 の Service を作成します。

  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 を実行します。使用する 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. Job が完了するまで待ちます。

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

    出力は次のようになります。

    job.batch/data-loader-2b condition met
    
  4. Job が正常に完了したことを確認します。

    kubectl get job/data-loader-2b
    

    出力は次のようになります。

    NAME             COMPLETIONS   DURATION   AGE
    data-loader-2b   1/1           ##s        #m##s
    
  5. Job のログを表示します。

    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. Job が完了するまで待ちます。

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

    出力は次のようになります。

    job.batch/data-loader-7b condition met
    
  4. Job が正常に完了したことを確認します。

    kubectl get job/data-loader-7b
    

    出力は次のようになります。

    NAME             COMPLETIONS   DURATION   AGE
    data-loader-7b   1/1           ##s        #m##s
    
  5. Job のログを表示します。

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

チェックポイントが gs://CHECKPOINTS_BUCKET_NAME/gemma_7b_it/checkpoint_00000000 にアップロードされます。

Saxml HTTP サーバーを公開する

Saxml HTTP サーバーには、前のステップで作成した ClusterIP Service を介してアクセスできます。ClusterIP Service にはクラスタ内からのみアクセスできます。したがって、クラスタの外部から 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 モデルを公開する

Saxml コンポーネントを設定したら、TPU スライスのノードプールで実行されるモデルサーバーに Gemma モデルを公開できます。Saxml HTTP サーバーの publish API を使用してモデルを公開します。Saxml HTTP サーバーの API の詳細については、Saxml HTTP API をご覧ください。Gemma 2B または 7B パラメータ モデルを公開する手順は次のとおりです。

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 Deployment のモデルサーバー Pod でログを監視して、進行状況をモニタリングします。

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

    このデプロイが完了するまでに、最長で 5 分を要する場合があります。次のようなメッセージが表示されるまで待ちます。

    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 Deployment のモデルサーバー 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 パラメータで渡されるさまざまなプロンプトを使用して、コマンドを実行できます。

問題のトラブルシューティング

  • Empty reply from server というメッセージが表示された場合は、コンテナがモデルデータのダウンロードを完了していない可能性があります。モデルがサービス提供の準備ができていることを示す Connected というメッセージがないか、再度 Pod のログを確認します。
  • Connection refused が表示された場合は、ポート転送が有効であることを確認します。

クリーンアップ

このチュートリアルで使用したリソースについて、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 管理サーバーを保存する Cloud Storage バケットの名前。
  • CHECKPOINTS_BUCKET_NAME: モデルのチェックポイントを保存する Cloud Storage バケットの名前。

次のステップ