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:defaultVPC に接続します(このネットワークが存在し、限定公開の 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 を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。