RTX 6000 Pro GPU を使用して Cloud Run で Gemma モデルを使用して推論を実行する

1. はじめに

概要

学習内容

  • Cloud Run RTX 6000 Pro GPU に Gemma モデルをデプロイする方法
  • コンテナの起動時に Cloud Storage からモデルを同時にダウンロードする方法

2. 設定と要件

この Codelab 全体で使用する環境変数を設定します。

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

この Codelab に必要な API を有効にする

gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        compute.googleapis.com

Codelab 用のフォルダを作成する

mkdir codelab-rtx
cd codelab-rtx

サブネットで限定公開の Google アクセスを有効にして、Cloud Storage からの ML モデルの読み込みを最適化します。詳細については、GPU のベスト プラクティスのドキュメントの Cloud Storage からモデルを読み込むのセクションをご覧ください。

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. Cloud Storage を設定する

まず、モデルの重みを保存する Cloud Storage バケットを作成します。

一意のバケットを作成する

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. モデルの重みを取得する

次に、Gemma 3 モデルをローカル ディレクトリにダウンロードし、Cloud Storage バケットにアップロードします。

Ollama をインストールする

このコマンドを実行して Ollama をインストールできます。

curl -fsSL https://ollama.com/install.sh | sh

モデルをダウンロード

ダウンロードしたモデルのディレクトリを作成します。

mkdir model-weights

このプロセスでは、2 つのターミナル タブを使用します。1 つは Ollama サーバーを実行し、もう 1 つはモデルを取得します。

ターミナル 1(サーバー):

ダウンロードしたモデルの場所を渡して、サーバーを起動します。このコマンドは引き続き実行されます。

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

ターミナル 2(クライアント): 新しいターミナルタブを開き、モデルをダウンロードします。クライアントは実行中のサーバーと自動的に通信します。

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

ターミナル 1 に戻る: ターミナル 2 でのダウンロードが完了したら、ターミナル 1 に戻り、Ctrl+C キーを押してサーバーを停止します。

Cloud Storage へのアップロード

次に、重みをバケットにアップロードします。gcloud storage は、高速化のために並列アップロードを自動的に処理します。

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(省略可)ローカルの重みをクリーンアップする

モデルが Cloud Storage に保存されたので、ローカル コピーを削除します。

rm -rf model-weights

5. サービスを作成する

まず、サービスのフォルダを作成します。

mkdir rtx-service
cd rtx-service

次の内容で Dockerfile を作成します。

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# Store model weight files in /models
ENV OLLAMA_MODELS /models

# Reduce logging verbosity
ENV OLLAMA_DEBUG false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

次の内容のファイルを、entrypoint.sh という名前で作成します。

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. Cloud Run にデプロイする

このセクションでは、gcloud run deploy を使用してサービスをデプロイします。このコマンドは、ソースからコンテナをビルドし、必要な GPU とネットワーク構成を使用して Cloud Run にデプロイします。

サービス アカウントを作成する

このアプリケーション専用のサービス アカウントを作成し、必要な権限のみを付与します。

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

ネットワーク構成

大規模なモデルをダウンロードする際の最適なパフォーマンスを得るには、ダイレクト VPC 下り(外向き)を使用します。これにより、コンテナは公共のインターネットと NAT ゲートウェイをバイパスして、Google プライベート ネットワーク経由で Cloud Storage にアクセスできます。gcloud run deploy コマンドでは、次のフラグが使用されます。

  • --network: default VPC に接続します(このネットワークが存在し、限定公開の Google アクセスが有効になっているリージョンにサブネットがあることを確認してください)。
  • --subnet: リージョン内の特定のサブネット(デフォルト ネットワークを使用している場合は通常 default)。
  • --vpc-egress: すべての下り(外向き)トラフィックを VPC 経由で強制的に送信するには、all-traffic に設定します。

デプロイ コマンド

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. サービスをテストする

デプロイすると、Ollama API を使用して Gemma 3 モデルを操作できます。

サービス URL を取得する

デプロイされた Cloud Run サービスの URL を取得します。

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

推論を実行する

curl を使用してプロンプトをモデルに送信します。"stream": false を設定して、単一の JSON オブジェクトで完全なレスポンスを取得し、jq を使用してテキストのみを抽出できます。

注: より大きなモデル(gemma3:27b など)を使用している場合は、次の JSON でモデル名を変更する必要があります。

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. 完了

以上で、この Codelab は完了です。

Cloud Run のドキュメントを確認することをおすすめします。

学習した内容

  • Cloud Run RTX 6000 Pro GPU に Gemma モデルをデプロイする方法
  • コンテナの起動時に Cloud Storage からモデルを同時にダウンロードする方法

9. クリーンアップ

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

オプション 1: リソースを削除する

Cloud Run サービスを削除する

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

サービス アカウントを削除する

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

Cloud Storage バケットを削除する

gcloud storage rm --recursive gs://$MODEL_BUCKET

コンテナ イメージを削除する

このビルドにより、Artifact Registry にコンテナ イメージが作成されました。イメージ名を見つけて削除できます。

イメージを一覧表示して、正確な名前(通常は gcr.io/PROJECT_ID/SERVICE_NAME)を確認します。

gcloud container images list --filter="name:$SERVICE_NAME"

イメージを削除します(IMAGE_NAME は上記の結果に置き換えます)。

gcloud container images delete <IMAGE_NAME> --force-delete-tags

オプション 2: プロジェクトを削除する

プロジェクト全体を削除するには、[リソースの管理] に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除した場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。