GKE の GPU で vLLM を使用して Gemma オープンモデルを提供する


このチュートリアルでは、Google Kubernetes Engine(GKE)上の GPU を使用する Gemma 3 大規模言語モデル(LLM)を vLLM サービング フレームワークによってデプロイしてサービングする方法について説明します。これにより、マネージド Kubernetes 環境における推論用 LLM の実用的なデプロイに関する基礎を学ぶことができます。vLLM を実行する事前構築済みコンテナを GKE にデプロイします。また、Hugging Face から Gemma 1B、4B、12B、27B の重みを読み込むように GKE を構成します。

このチュートリアルは、ML エンジニア、プラットフォームの管理者とオペレーターのほか、Kubernetes のコンテナ オーケストレーション機能を使用して H200、H100、A100、L4 GPU ハードウェアで AI / ML ワークロードをサービングすることに関心があるデータと AI のスペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

ML モデルを費用対効果の高い方法で迅速に構築してサービングする目的で設計された統合マネージド AI プラットフォームが必要な場合は、Vertex AI デプロイ ソリューションをお試しになることをおすすめします。

このページを読む前に、次のことをよく理解しておいてください。

背景

このセクションでは、このガイドで使用されている重要なテクノロジーについて説明します。

Gemma

Gemma は、オープン ライセンスでリリースされて一般公開されている、軽量の生成 AI モデルのセットです。これらの AI モデルは、アプリケーション、ハードウェア、モバイル デバイス、ホスト型サービスで実行できます。Gemma 3 ではマルチモダリティが導入され、ビジョン言語入力とテキスト出力がサポートされています。最大 128,000 トークンのコンテキスト ウィンドウを処理でき、140 を超える言語に対応しています。また Gemma 3 では、構造化出力や関数呼び出しなど、数学、推論、チャット関連の機能が強化されています。

Gemma モデルはテキスト生成に使用できますが、特殊なタスク用にチューニングすることもできます。

詳細については、Gemma のドキュメントをご覧ください。

GPU

GPU を使用すると、ノードで実行される特定のワークロード(ML やデータ処理など)を高速化できます。GKE では、NVIDIA H200、H100、L4、A100 GPU を搭載したマシンタイプをはじめとする、さまざまなマシンタイプ オプションをノード構成に使用できます。

vLLM

vLLM は、GPU のサービング スループットを向上できる、高度に最適化されたオープンソースの LLM サービング フレームワークであり、次のような機能を備えています。

  • PagedAttention による Transformer の実装の最適化
  • サービング スループットを全体的に向上させる連続的なバッチ処理
  • 複数の GPU でのテンソル並列処理と分散サービング

詳細については、vLLM のドキュメントをご覧ください。

目標

  1. Autopilot モードまたは Standard モードの GKE クラスタで環境を準備する。
  2. vLLM コンテナをクラスタにデプロイする。
  3. vLLM を使用し、curl とウェブチャット インターフェースを介して Gemma 3 モデルをサービングする。

始める前に

  • 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

    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. [新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。

    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。
    8. モデルへのアクセス権を取得する

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

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

      1. [Your Profile] > [Settings] > [Access Tokens] の順にクリックします。
      2. [New Token] を選択します。
      3. 任意の名前と、少なくとも Read ロールを指定します。
      4. [Generate a token] を選択します。
      5. トークンをクリップボードにコピーします。

      環境を準備する

      このチュートリアルでは、Cloud Shell を使用してGoogle Cloudでホストされているリソースを管理します。Cloud Shell には、このチュートリアルに必要な kubectlgcloud CLI などのソフトウェアがプリインストールされています。

      Cloud Shell を使用して環境を設定するには、次の操作を行います。

      1. Google Cloud コンソールで Cloud Shell 有効化アイコンCloud Shell をアクティブにする)をクリックして、Google Cloud コンソールで Cloud Shell セッションを起動します。これにより、 Google Cloud コンソールの下部ペインでセッションが起動します。

      2. デフォルトの環境変数を設定します。

        gcloud config set project PROJECT_ID
        gcloud config set billing/quota_project PROJECT_ID
        export PROJECT_ID=$(gcloud config get project)
        export REGION=REGION
        export CLUSTER_NAME=CLUSTER_NAME
        export HF_TOKEN=HF_TOKEN
        

        次の値を置き換えます。

        • PROJECT_ID: Google Cloudプロジェクト ID
        • REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は us-central1)。
        • CLUSTER_NAME: クラスタの名前。
        • HF_TOKEN: 先ほど生成した Hugging Face トークン。

      Google Cloud リソースを作成して構成する

      次の手順で、必要なリソースを作成します。

      GKE クラスタとノードプールを作成する

      GKE Autopilot クラスタまたは GKE Standard クラスタの GPU で Gemma を提供できます。フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot クラスタを使用することをおすすめします。ワークロードに最適な GKE の運用モードを選択するには、GKE の運用モードを選択するをご覧ください。

      Autopilot

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

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

      次の値を置き換えます。

      • PROJECT_ID: Google Cloudプロジェクト ID
      • REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は us-central1)。
      • CLUSTER_NAME: クラスタの名前。

      GKE は、デプロイされたワークロードからのリクエストに応じた CPU ノードと GPU ノードを持つ Autopilot クラスタを作成します。

      Standard

      1. Cloud Shell で、次のコマンドを実行して Standard クラスタを作成します。

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

        次の値を置き換えます。

        • PROJECT_ID: Google Cloudプロジェクト ID
        • REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は us-central1)。
        • CLUSTER_NAME: クラスタの名前。

        クラスタの作成には数分かかることもあります。

      2. クラスタ用のノードプールを適切なディスクサイズで作成するため、次のコマンドを実行します。

        Gemma 3 1B

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

        GKE 上で、ノードごとに 1 つの L4 GPU を含む単一のノードプールが作成されます。

        Gemma 3 4B

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

        GKE 上で、ノードごとに 1 つの L4 GPU を含む単一のノードプールが作成されます。

        Gemma 3 12B

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

        GKE 上で、ノードごとに 4 つの L4 GPU を含む単一のノードプールが作成されます。

        Gemma 3 27B

        gcloud container node-pools create gpupool \
            --accelerator type=nvidia-a100-80gb,count=1,gpu-driver-version=latest \
            --project=PROJECT_ID \
            --location=REGION \
            --node-locations=REGION-a \
            --cluster=CLUSTER_NAME \
            --machine-type=a2-ultragpu-1g \
            --disk-type=pd-ssd \
            --num-nodes=1 \
            --disk-size=256
        

        GKE 上で、1 つの A100 80 GB GPU を含む単一のノードプールが作成されます。

      Hugging Face の認証情報用の Kubernetes Secret を作成する

      Cloud Shell で、次の操作を行います。

      1. クラスタと通信できるように kubectl を構成します。

        gcloud container clusters get-credentials CLUSTER_NAME \
            --location=REGION
        

        次の値を置き換えます。

        • REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は us-central1)。
        • CLUSTER_NAME: クラスタの名前。
      2. Hugging Face トークンを含む Kubernetes Secret を作成します。

        kubectl create secret generic hf-secret \
            --from-literal=hf_api_token=${HF_TOKEN} \
            --dry-run=client -o yaml | kubectl apply -f -
        

        HF_TOKEN は、先ほど生成した Hugging Face トークンに置き換えます。

      vLLM をデプロイする

      このセクションでは、使用する Gemma モデルをサービングする vLLM コンテナをデプロイします。このチュートリアルでは、モデルをデプロイするために Kubernetes Deployment を使用します。Deployment は、クラスタ内のノード間で分散された複数の Pod レプリカを実行できる Kubernetes API オブジェクトです。

      Gemma 3 1B-it

      Gemma 3 1B の指示チューニング済みモデル(テキストのみの入力)をデプロイする手順は次のとおりです。

      1. 次の vllm-3-1b-it.yaml マニフェストを作成します。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: vllm-gemma-deployment
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-3-1b-it
                ai.gke.io/inference-server: vllm
                examples.ai.gke.io/source: user-guide
            spec:
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250312_0916_RC01
                resources:
                  requests:
                    cpu: "2"
                    memory: "10Gi"
                    ephemeral-storage: "10Gi"
                    nvidia.com/gpu: "1"
                  limits:
                    cpu: "2"
                    memory: "10Gi"
                    ephemeral-storage: "10Gi"
                    nvidia.com/gpu: "1"
                command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
                args:
                - --model=$(MODEL_ID)
                - --tensor-parallel-size=1
                - --host=0.0.0.0
                - --port=8000
                env:
                - name: MODEL_ID
                  value: google/gemma-3-1b-it
                - name: HUGGING_FACE_HUB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: hf-secret
                      key: hf_api_token
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
              volumes:
              - name: dshm
                emptyDir:
                    medium: Memory
              nodeSelector:
                cloud.google.com/gke-accelerator: nvidia-l4
                cloud.google.com/gke-gpu-driver-version: latest
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: llm-service
        spec:
          selector:
            app: gemma-server
          type: ClusterIP
          ports:
            - protocol: TCP
              port: 8000
              targetPort: 8000
      2. 次のようにマニフェストを適用します。

        kubectl apply -f vllm-3-1b-it.yaml
        

      Gemma 3 4B-it

      Gemma 3 4B の指示チューニング済みモデルをデプロイする手順は次のとおりです。

      1. 次の vllm-3-4b-it.yaml マニフェストを作成します。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: vllm-gemma-deployment
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-3-4b-it
                ai.gke.io/inference-server: vllm
                examples.ai.gke.io/source: user-guide
            spec:
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250312_0916_RC01
                resources:
                  requests:
                    cpu: "2"
                    memory: "20Gi"
                    ephemeral-storage: "20Gi"
                    nvidia.com/gpu: "1"
                  limits:
                    cpu: "2"
                    memory: "20Gi"
                    ephemeral-storage: "20Gi"
                    nvidia.com/gpu: "1"
                command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
                args:
                - --model=$(MODEL_ID)
                - --tensor-parallel-size=1
                - --host=0.0.0.0
                - --port=8000
                - --max-model-len=32768
                - --max-num-seqs=4
                env:
                - name: MODEL_ID
                  value: google/gemma-3-4b-it
                - name: HUGGING_FACE_HUB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: hf-secret
                      key: hf_api_token
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
              volumes:
              - name: dshm
                emptyDir:
                    medium: Memory
              nodeSelector:
                cloud.google.com/gke-accelerator: nvidia-l4
                cloud.google.com/gke-gpu-driver-version: latest
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: llm-service
        spec:
          selector:
            app: gemma-server
          type: ClusterIP
          ports:
            - protocol: TCP
              port: 8000
              targetPort: 8000
      2. 次のようにマニフェストを適用します。

        kubectl apply -f vllm-3-4b-it.yaml
        

        この例では、vLLM オプション --max-model-len=32768 を使用してコンテキスト ウィンドウを 32K に制限しています。コンテキスト ウィンドウのサイズを大きくする場合(最大 128K)は、マニフェストとノードプールの構成を調整して GPU 容量を増やします。

      Gemma 3 12B-it

      Gemma 3 12B の指示チューニング済みモデルをデプロイする手順は次のとおりです。

      1. 次の vllm-3-12b-it.yaml マニフェストを作成します。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: vllm-gemma-deployment
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-3-12b-it
                ai.gke.io/inference-server: vllm
                examples.ai.gke.io/source: user-guide
            spec:
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250312_0916_RC01
                resources:
                  requests:
                    cpu: "4"
                    memory: "32Gi"
                    ephemeral-storage: "32Gi"
                    nvidia.com/gpu: "2"
                  limits:
                    cpu: "4"
                    memory: "32Gi"
                    ephemeral-storage: "32Gi"
                    nvidia.com/gpu: "2"
                command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
                args:
                - --model=$(MODEL_ID)
                - --tensor-parallel-size=2
                - --host=0.0.0.0
                - --port=8000
                - --max-model-len=16384
                - --max-num-seqs=4
                env:
                - name: MODEL_ID
                  value: google/gemma-3-12b-it
                - name: HUGGING_FACE_HUB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: hf-secret
                      key: hf_api_token
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
              volumes:
              - name: dshm
                emptyDir:
                    medium: Memory
              nodeSelector:
                cloud.google.com/gke-accelerator: nvidia-l4
                cloud.google.com/gke-gpu-driver-version: latest
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: llm-service
        spec:
          selector:
            app: gemma-server
          type: ClusterIP
          ports:
            - protocol: TCP
              port: 8000
              targetPort: 8000
      2. 次のようにマニフェストを適用します。

        kubectl apply -f vllm-3-12b-it.yaml
        

        この例では、vLLM オプション --max-model-len=16384 を使用してコンテキスト ウィンドウを 16K に制限しています。コンテキスト ウィンドウのサイズを大きくする場合(最大 128K)は、マニフェストとノードプールの構成を調整して GPU 容量を増やします。

      Gemma 3 27B-it

      Gemma 3 27B の指示チューニング済みモデルをデプロイする手順は次のとおりです。

      1. 次の vllm-3-27b-it.yaml マニフェストを作成します。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: vllm-gemma-deployment
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gemma-server
          template:
            metadata:
              labels:
                app: gemma-server
                ai.gke.io/model: gemma-3-27b-it
                ai.gke.io/inference-server: vllm
                examples.ai.gke.io/source: user-guide
            spec:
              containers:
              - name: inference-server
                image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250312_0916_RC01
                resources:
                  requests:
                    cpu: "10"
                    memory: "128Gi"
                    ephemeral-storage: "120Gi"
                    nvidia.com/gpu : "1"
                  limits:
                    cpu: "10"
                    memory: "128Gi"
                    ephemeral-storage: "120Gi"
                    nvidia.com/gpu : "1"
                command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
                args:
                - --model=$(MODEL_ID)
                - --tensor-parallel-size=1
                - --host=0.0.0.0
                - --port=8000
                - --swap-space=16
                - --gpu-memory-utilization=0.95
                - --max-model-len=32768
                - --max-num-seqs=4
                env:
                - name: MODEL_ID
                  value: google/gemma-3-27b-it
                - name: HUGGING_FACE_HUB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: hf-secret
                      key: hf_api_token
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
              volumes:
              - name: dshm
                emptyDir:
                    medium: Memory
              nodeSelector:
                cloud.google.com/gke-accelerator: nvidia-a100-80gb
                cloud.google.com/gke-gpu-driver-version: latest
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: llm-service
        spec:
          selector:
            app: gemma-server
          type: ClusterIP
          ports:
            - protocol: TCP
              port: 8000
              targetPort: 8000
      2. 次のようにマニフェストを適用します。

        kubectl apply -f vllm-3-27b-it.yaml
        

        この例では、vLLM オプション --max-model-len=32768 を使用してコンテキスト ウィンドウを 32K に制限しています。コンテキスト ウィンドウのサイズを大きくする場合(最大 128K)は、マニフェストとノードプールの構成を調整して GPU 容量を増やします。

      クラスタ内の 1 つの Pod が Hugging Face からモデルの重みをダウンロードしてサービス提供エンジンを起動します。

      Deployment が利用可能になるまで待ちます。

      kubectl wait --for=condition=Available --timeout=1800s deployment/vllm-gemma-deployment
      

      実行中の Deployment のログを表示します。

      kubectl logs -f -l app=gemma-server
      

      Deployment リソースによってモデルデータがダウンロードされます。この処理には数分かかることがあります。出力は次のようになります。

      INFO:     Automatically detected platform cuda.
      ...
      INFO      [launcher.py:34] Route: /v1/chat/completions, Methods: POST
      ...
      INFO:     Started server process [13]
      INFO:     Waiting for application startup.
      INFO:     Application startup complete.
      Default STARTUP TCP probe succeeded after 1 attempt for container "vllm--google--gemma-3-4b-it-1" on port 8080.
      

      モデルが完全にダウンロードされたことを確認してから、次のセクションに進んでください。

      モデルを提供する

      このセクションでは、モデルを操作します。

      ポート転送をセットアップする

      次のコマンドを実行して、モデルへのポート転送を設定します。

      kubectl port-forward service/llm-service 8000:8000
      

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

      Forwarding from 127.0.0.1:8000 -> 8000
      

      curl を使用してモデルを操作する

      このセクションでは、デプロイした Gemma 3 指示チューニング済みモデルを基本的なスモークテストによって検証する方法を説明します。他のモデルの場合は、gemma-3-4b-it をモデル名に置き換えます。

      この例では、Gemma 3 4B の指示チューニング済みモデル(テキストのみの入力)をテストする方法を示します。

      新しいターミナル セッションで、curl を使用してモデルとチャットします。

      curl http://127.0.0.1:8000/v1/chat/completions \
      -X POST \
      -H "Content-Type: application/json" \
      -d '{
          "model": "google/gemma-3-4b-it",
          "messages": [
              {
                "role": "user",
                "content": "Why is the sky blue?"
              }
          ]
      }'
      

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

      {
          "id": "chatcmpl-e4a2e624bea849d9b09f838a571c4d9e",
          "object": "chat.completion",
          "created": 1741763029,
          "model": "google/gemma-3-4b-it",
          "choices": [
              {
                  "index": 0,
                  "message": {
                      "role": "assistant",
                      "reasoning_content": null,
                      "content": "Okay, let's break down why the sky appears blue! It's a fascinating phenomenon rooted in physics, specifically something called **Rayleigh scattering**. Here's the explanation: ...",
                      "tool_calls": []
                  },
                  "logprobs": null,
                  "finish_reason": "stop",
                  "stop_reason": 106
              }
          ],
          "usage": {
              "prompt_tokens": 15,
              "total_tokens": 668,
              "completion_tokens": 653,
              "prompt_tokens_details": null
          },
          "prompt_logprobs": null
      }
      

      (省略可)Gradio のチャット インターフェースでモデルを操作する

      このセクションでは、指示チューニング済みモデルを操作できるウェブチャット アプリケーションを作成します。わかりやすくするため、このセクションでは 4B-it モデルを使用したテスト方法についてのみ説明します。

      Gradio は、chatbot のユーザー インターフェースを作成する ChatInterface ラッパーを含む Python ライブラリです。

      チャット インターフェースをデプロイする

      1. Cloud Shell で、次のマニフェストを gradio.yaml として保存します。google/gemma-2-9b-it は、google/gemma-3-4b-it またはデプロイで使用した別の Gemma 3 モデル名に変更します。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: gradio
          labels:
            app: gradio
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: gradio
          template:
            metadata:
              labels:
                app: gradio
            spec:
              containers:
              - name: gradio
                image: us-docker.pkg.dev/google-samples/containers/gke/gradio-app:v1.0.4
                resources:
                  requests:
                    cpu: "250m"
                    memory: "512Mi"
                  limits:
                    cpu: "500m"
                    memory: "512Mi"
                env:
                - name: CONTEXT_PATH
                  value: "/v1/chat/completions"
                - name: HOST
                  value: "http://llm-service:8000"
                - name: LLM_ENGINE
                  value: "openai-chat"
                - name: MODEL_ID
                  value: "google/gemma-2-9b-it"
                - name: DISABLE_SYSTEM_MESSAGE
                  value: "true"
                ports:
                - containerPort: 7860
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: gradio
        spec:
          selector:
            app: gradio
          ports:
          - protocol: TCP
            port: 8080
            targetPort: 7860
          type: ClusterIP
        
      2. 次のようにマニフェストを適用します。

        kubectl apply -f gradio.yaml
        
      3. Deployment が利用可能になるまで待ちます。

        kubectl wait --for=condition=Available --timeout=900s deployment/gradio
        

      チャット インターフェースを使用する

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

        kubectl port-forward service/gradio 8080:8080
        

        これにより、Cloud Shell から Gradio サービスへのポート転送が作成されます。

      2. Cloud Shell タスクバーの右上にある [ウェブ プレビュー アイコン ウェブでプレビュー] ボタンをクリックします。[ポート 8080 でプレビュー] をクリックします。ブラウザで新しいタブが開きます。

      3. Gradio のチャット インターフェースを使用して Gemma を操作します。プロンプトを追加して [送信] をクリックします。

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

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

      モデルのパフォーマンスをモニタリングする

      モデルのパフォーマンスをモニタリングするには、Cloud Monitoring で vLLM ダッシュボードの統合を使用します。このダッシュボードでは、トークンのスループット、リクエスト レイテンシ、エラー率などの重要なパフォーマンス指標を確認できます。

      vLLM ダッシュボードを使用するには、vLLM から指標を収集する Google Cloud Managed Service for Prometheus を GKE クラスタで有効にする必要があります。vLLM の指標はデフォルトで Prometheus 形式によって公開されるため、追加のエクスポーターをインストールする必要はありません。

      その後、指標を vLLM ダッシュボードで確認できます。Google Cloud Managed Service for Prometheus を使用してモデルから指標を収集する方法については、Cloud Monitoring のドキュメントで vLLM のオブザーバビリティ ガイダンスをご覧ください。

      クリーンアップ

      このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

      デプロイされたリソースを削除する

      このガイドで作成したリソースについて Google Cloud アカウントに課金されないようにするには、次のコマンドを実行します。

      gcloud container clusters delete CLUSTER_NAME \
          --region=REGION
      

      次の値を置き換えます。

      • REGION: 使用するアクセラレータ タイプをサポートするリージョン(たとえば、L4 GPU の場合は us-central1)。
      • CLUSTER_NAME: クラスタの名前。

      次のステップ