GKE Inference Quickstartを使用して生成AIモデルの推論サーバーをデプロイしてみた

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では GKE Inference Quickstart を使用し、Google Kubernetes Engine(GKE)で Google Cloud のベストプラクティスに沿った生成 AI ワークロードのデプロイを試してみます。

GKE Inference Quickstart とは

GKE Inference Quickstart(以下、Inference Quickstart)は、Google Kubernetes Engine(GKE)で利用できる生成 AI 機能の1つで、ユーザーが生成 AI モデルのコンテナ化やマニフェストファイルの記述などを行うことなく、Google のベンチマークに基づいた最適化された構成で推論サーバーをデプロイをすることができます。

Google Cloud によって事前構成されたレシピにより、手動での構成の調整やテストを行うことなく、最低限のセットアップで必要な Kubernetes リソースを素早く簡単に展開できます。

Inference Quickstart は Autopilot モードの GKE クラスタ、Standard モードの GKE クラスタの両方で利用することができます。

機能の詳細については以下のドキュメントもご一読ください。

なお当機能は、Google Cloud の旗艦イベントである Google Cloud Next '25 で発表されたものです。

G-gen Tech Blog では、Google Cloud Next '25 のセッションレポートなどを随時公開しています。

blog.g-gen.co.jp

事前準備

コマンド実行の準備

Inference Quickstart を利用するためには、プロジェクトで以下の API を有効化する必要があります。

# API 有効化
$ gcloud services enable gkerecommender.googleapis.com

また、以下のコマンドで Application Default Credentials(ADC)の設定を行ってください。

# ADC の設定
$ gcloud auth application-default login

Hugging Face アクセストークンの準備

当記事では gemma-2-27b-it モデルを使用していきます。

モデルの利用に Hugging Face アクセストークンが必要となるため、トークンの情報を格納した Secret リソースをクラスタ上に作成しておきます。

# シークレットの作成
kubectl create secret generic hf-secret \
    --from-literal=hf_api_token=<Hugging Face アクセストークン>

また、gemma-2-27b-it モデルを使用するためには Hugging Face から利用申請をする必要があるため、モデルのページから申請を行ってください。

モデルの探索

gcloud alpha container ai recommender コマンドを使用することで、利用するモデルサーバー、サーバーバージョン、アクセラレータを探索します。

models list で利用できるモデルを表示します。

# サポートされているモデルの表示
$ gcloud alpha container ai recommender models list
Supported models:
-  deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
-  google/gemma-2-27b-it
-  google/gemma-2-2b-it
-  google/gemma-3-27b-it
-  meta-llama/Llama-3.2-1B-Instruct
-  meta-llama/Llama-3.3-70B-Instruct
-  meta-llama/Llama-4-Scout-17B-16E-Instruct
-  meta-llama/Meta-Llama-3-8B
-  mistralai/Mixtral-8x22B-Instruct-v0.1
-  mistralai/Mixtral-8x7B-Instruct-v0.1

model-servers list で、指定したモデルで使用できるモデルサーバーを表示します。

# モデルがサポートされているモデルサーバーを表示
$ gcloud alpha container ai recommender model-servers list \
      --model=google/gemma-2-27b-it
Supported model servers:
-  vllm

model-server-versions list で、指定したモデルとモデルサーバーの組み合わせで利用できるサーバーバージョンを表示します。

# サーバーバージョンの確認
$ gcloud alpha container ai recommender model-server-versions list \
      --model=google/gemma-2-27b-it \
      --model-server=vllm
Supported model server versions:
-  v0.7.2

accelerators list で、モデルが使用できるアクセラレータを表示します。ここでは1秒あたりの出力トークン数(output tokens per second)などのメトリックが確認できます。

# アクセラレータの表示
$ gcloud alpha container ai recommender accelerators list \
      --model=google/gemma-2-27b-it \
      --model-server-version=v0.7.2
Supported accelerators:
accelerator       | model                 | model server | model server version | accelerator count | output tokens per second | ntpot ms
------------------|-----------------------|--------------|----------------------|-------------------|--------------------------|---------
nvidia-h100-80gb  | google/gemma-2-27b-it | vllm         | v0.7.2               | 1                 | 2050                     | 67      
nvidia-tesla-a100 | google/gemma-2-27b-it | vllm         | v0.7.2               | 2                 | 1243                     | 70      
nvidia-l4         | google/gemma-2-27b-it | vllm         | v0.7.2               | 4                 | 425                      | 1085    

マニフェストの生成とデプロイ

gcloud alpha container ai recommender manifests create コマンドを使用して、指定したモデルで Kubernetes ワークロードを展開することができる、推奨構成のマニフェストファイルを生成できます。

--output-path でマニフェストファイルの出力先を指定して、gemma-2-27b-it モデルを使用するワークロードのマニフェストファイルを生成します。

# マニフェストを生成する
$ gcloud alpha container ai recommender manifests create \
    --model=google/gemma-2-27b-it \
    --model-server=vllm \
    --model-server-version=v0.7.2 \
    --accelerator-type=nvidia-l4 \
    --target-ntpot-milliseconds=200 \
    --output=manifest \
    --output-path  ./manifests.yaml

マニフェストの一部パラメータはコマンドのオプションで調整することができます。詳細はコマンドリファレンスを参照してください。

生成されたマニフェストファイルは以下のようになっています。

# 生成されたマニフェスト
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    aire.gke.io/generated: "true"
    aire.gke.io/inference-server: vllm
    recommender.ai.gke.io/generated: "true"
    recommender.ai.gke.io/inference-server: vllm
  creationTimestamp: null
  labels:
    app: gemma2-27b-it-vllm-inference-server
    recommender.ai.gke.io/generated: "true"
    recommender.ai.gke.io/inference-server: vllm
  name: gemma2-27b-it-vllm-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma2-27b-it-vllm-inference-server
  strategy: {}
  template:
    metadata:
      annotations:
        recommender.ai.gke.io/generated: "true"
        recommender.ai.gke.io/inference-server: vllm
      creationTimestamp: null
      labels:
        ai.gke.io/inference-server: vllm
        ai.gke.io/model: gemma2-27b-it
        app: gemma2-27b-it-vllm-inference-server
        examples.ai.gke.io/source: blueprints
        recommender.ai.gke.io/generated: "true"
        recommender.ai.gke.io/inference-server: vllm
    spec:
      containers:
      - args:
        - --model=$(MODEL_ID)
        - --disable-log-requests
        - --tensor-parallel-size=4
        - --max-num-seq=512
        - --gpu-memory-utilization=0.95
        - --num-scheduler-steps=8
        command:
        - python3
        - -m
        - vllm.entrypoints.openai.api_server
        env:
        - name: MODEL_ID
          value: google/gemma-2-27b-it
        - name: HUGGING_FACE_HUB_TOKEN
          valueFrom:
            secretKeyRef:
              key: hf_api_token
              name: hf-secret
        image: vllm/vllm-openai:v0.7.2
        name: inference-server
        ports:
        - containerPort: 8000
          name: metrics
        readinessProbe:
          failureThreshold: 6000
          httpGet:
            path: /health
            port: 8000
          periodSeconds: 10
        resources:
          limits:
            nvidia.com/gpu: "4"
          requests:
            nvidia.com/gpu: "4"
        volumeMounts:
        - mountPath: /dev/shm
          name: dshm
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-l4
      volumes:
      - emptyDir:
          medium: Memory
        name: dshm
status: {}

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    aire.gke.io/generated: "true"
    recommender.ai.gke.io/generated: "true"
  creationTimestamp: null
  labels:
    app: gemma2-27b-it-vllm-inference-server
    recommender.ai.gke.io/generated: "true"
  name: vllm-hpa
  namespace: default
spec:
  maxReplicas: 10
  metrics:
  - pods:
      metric:
        name: prometheus.googleapis.com|vllm:gpu_cache_usage_perc|gauge
      target:
        averageValue: 504m
        type: AverageValue
    type: Pods
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: gemma2-27b-it-vllm-deployment
status:
  currentMetrics: null
  desiredReplicas: 0

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    aire.gke.io/generated: "true"
    recommender.ai.gke.io/generated: "true"
  creationTimestamp: null
  labels:
    app: gemma2-27b-it-vllm-inference-server
    recommender.ai.gke.io/generated: "true"
  name: gemma2-27b-it-vllm-service
  namespace: default
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 8000
  selector:
    app: gemma2-27b-it-vllm-inference-server
  type: ClusterIP
status:
  loadBalancer: {}

---
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  annotations:
    aire.gke.io/generated: "true"
    recommender.ai.gke.io/generated: "true"
  labels:
    app: gemma2-27b-it-vllm-inference-server
    recommender.ai.gke.io/generated: "true"
  name: vllm-podmonitoring
  namespace: default
spec:
  endpoints:
  - interval: 15s
    path: /metrics
    port: metrics
  selector:
    matchLabels:
      app: gemma2-27b-it-vllm-inference-server
  targetLabels:
    metadata:
    - pod
    - container
    - node

---

このマニフェストをデプロイするだけで、モデルが推論リクエストを処理するために必要なリソースがすべて作成されます。

GKE クラスタにマニフェストを適用します。

$ kubectl apply -f ./manifests.yaml
deployment.apps/gemma2-27b-it-vllm-deployment created
horizontalpodautoscaler.autoscaling/vllm-hpa created
service/gemma2-27b-it-vllm-service created
podmonitoring.monitoring.googleapis.com/vllm-podmonitoring created

推論リクエストの送信

デプロイされたサービスは、以下の形式のエンドポイントで公開されます。

http://<モデル名>-<モデルサーバー名>-service:<ポート>/

エンドポイントにアクセスするために、以下のコマンドでポート転送を設定します。

$ kubectl port-forward service/gemma2-27b-it-vllm-service 8000:8000
Forwarding from 127.0.0.1:8000 -> 8000
Forwarding from [::1]:8000 -> 8000

ポート転送の準備ができたら、curl コマンドでモデルに推論リクエストを送信してみます。

$ curl -X POST http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "google/gemma-2-27b-it",
        "prompt": "Google Cloud のサーバーレスコンテナサービスの名前はなんですか?",
        "max_tokens": 100,
        "temperature": 0.7
    }'

gemma-2-27b-it モデルを使用する推論サーバーから、以下のようにレスポンスが返ってきました。

{
  "id": "cmpl-8871ad8cf483442bbf57bff2397958c8",
  "object": "text_completion",
  "created": 1744225757,
  "model": "google/gemma-2-27b-it",
  "choices": [
    {
      "index": 0,
      "text": "\n\n正解は **Cloud Run** です。\n\nCloud Run は、サーバーレス環境でコンテナを実行するためのフルマネージドサービスです。コンテナを構築し、デプロイし、スケールアウトする必要がなく、アプリケーションのコードのみを記述してデプロイするだけで、必要に応じて自動的にスケールアウトします。\n\nCloud Run についてさらに詳しく知りたい場合は、公式ドキュメントを参照してください:\n\n[https://cloud.google.com/run/docs](https",
      "logprobs": null,
      "finish_reason": "length",
      "stop_reason": null,
      "prompt_logprobs": null
    }
  ],
  "usage": {
    "prompt_tokens": 14,
    "total_tokens": 114,
    "completion_tokens": 100,
    "prompt_tokens_details": null
  }
}

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。