このガイドでは、事前構築されたコンテナを使用して Gemma 3 オープンモデルを Cloud Run にデプロイする方法について説明します。また、デプロイされた Cloud Run サービスを Google Gen AI SDK で使用する方法についても説明します。
始める前に
Google AI Studio を使用して Cloud Run にデプロイした場合は、Google Gen AI SDK を安全に操作するに進みます。
Google AI Studio を使用していない場合は、Cloud Run を使用して新しいサービスを作成する前に、次の操作を行います。
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Google Cloud プロジェクトで Cloud Run 開発環境を設定します。
- gcloud CLI をインストールして初期化します。
- アカウントに次の IAM ロールが付与されていることを確認します。
- Cloud Run 管理者(
roles/run.admin
) - プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) - Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
)
- Cloud Run 管理者(
-
Google Cloud コンソールで、[IAM] ページに移動します。
IAM に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。このユーザー ID は通常、Cloud Run サービスのデプロイに使用される Google アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
- PROJECT_NUMBER: Google Cloud プロジェクト番号。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- PRINCIPAL は、バインディングを追加するアカウントに置き換えます。これは通常、Cloud Run サービスのデプロイに使用される Google アカウントのメールアドレスです。
- ROLE はデプロイするアカウントに付与するロールに置き換えます。
- Cloud Run Admin API の [割り当てとシステムの上限] ページで
Total Nvidia L4 GPU allocation, per project per region
割り当てをリクエストします。 - Cloud Run の料金ページを確認します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
SERVICE_NAME
は、Cloud Run サービスの一意の名前に置き換えます。GEMMA_PARAMETER
は、使用した Gemma モデルに置き換えます。- Gemma 3 1B(
gemma-3-1b-it
):gemma3-1b
- Gemma 3 4B(
gemma-3-4b-it
):gemma3-4b
- Gemma 3 12B(
gemma-3-12b-it
):gemma3-12b
- Gemma 3 27B(
gemma-3-27b-it
):gemma3-27b
必要に応じて、イメージ URL 全体を Gemma-on-Cloudrun GitHub リポジトリからビルドした Docker イメージに置き換えます。
- Gemma 3 1B(
REGION
は、Cloud Run をデプロイする Google Cloud リージョンに置き換えます(europe-west1
など)。リージョンを変更する必要がある場合は、GPU 構成で、GPU 対応のデプロイでサポートされているリージョンを確認してください。プロキシを起動し、
cloud-run-proxy
コンポーネントのインストールを求めるメッセージが表示されたら、「Y
」を選択します。gcloud run services proxy ollama-gemma --port=9090
プロキシを実行したまま、別のターミナルタブでリクエストを送信します。プロキシは
localhost:9090
で実行されます。curl http://localhost:9090/api/generate -d '{ "model": "gemma3:4b", "prompt": "Why is the sky blue?" }'
このコマンドは、次のようなストリーミング出力を生成します。
{"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.641492408Z","response":"That","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.687529153Z","response":"'","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.753284927Z","response":"s","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.812957381Z","response":" a","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.889102649Z","response":" fantastic","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.925748116Z","response":",","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.958391572Z","response":" decept","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.971035028Z","response":"ively","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.989678484Z","response":" tricky","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.999321940Z","response":" question","done":false} ...
コンテンツの生成には
/v1beta/{model=models/*}:generateContent
を使用します。入力GenerateContentRequest
に基づいてモデル レスポンスを生成します。curl "<cloud_run_url>/v1beta/models/<model>:generateContent" \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "Write a story about a magic backpack. You are the narrator of an interactive text adventure game."}] }] }'
ストリーミング生成コンテンツの場合は、
/v1beta/{model=models/*}:streamGenerateContent
を使用します。入力GenerateContentRequest
が指定されたモデルからストリーミング レスポンスを生成します。curl "<cloud_run_url>/v1beta/models/<model>:streamGenerateContent" \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "Write a story about a magic backpack. You are the narrator of an interactive text adventure game."}] }] }'
OLLAMA_NUM_PARALLEL
には、各モデルで推論リクエストを同時に処理するために使用できるリクエスト スロットの数を設定します。--concurrency
には、Cloud Run が Ollama インスタンスに同時に送信するリクエストの数を設定します。
ロールの付与方法を確認する
コンソール
gcloud
プロジェクトで自分のアカウントに必要な IAM ロールを付与するには:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=PRINCIPAL \ --role=ROLE
次のように置き換えます。
ビルド済みコンテナを使用して Gemma モデルをデプロイする
Cloud Run には、Cloud Run で Gemma オープンモデルをサービングするビルド済みコンテナが用意されています。
Gemma モデルを Cloud Run にデプロイするには、推奨設定で次の gcloud CLI コマンドを使用します。
gcloud run deploy SERVICE_NAME \ --image us-docker.pkg.dev/cloudrun/container/gemma/GEMMA_PARAMETER \ --concurrency 4 \ --cpu 8 \ --set-env-vars OLLAMA_NUM_PARALLEL=4 \ --gpu 1 \ --gpu-type nvidia-l4 \ --max-instances 1 \ --memory 32Gi \ --no-allow-unauthenticated \ --no-cpu-throttling \ --timeout=600 \ --region REGION
次のように置き換えます。
その他の設定は次のとおりです。
オプション | 説明 |
---|---|
--concurrency |
特定のインスタンスで同時に処理できるリクエストの最大数( |
--cpu |
サービスに割り当てられた CPU の量( |
--set-env-vars |
サービスに設定された環境変数。例: |
--gpu |
サービスの GPU 値( |
--gpu-type |
サービスに使用する GPU のタイプ( |
--max-instances |
サービスのコンテナ インスタンスの最大数( |
--memory |
サービスに割り当てられたメモリの量( |
--no-invoker-iam-check |
呼び出し元の IAM チェックを無効にします。アプリのセキュリティを強化するおすすめの方法については、Google Gen AI SDK を安全に操作するをご覧ください。 |
--no-cpu-throttling |
この設定により、コンテナがリクエストをアクティブに処理していないときに CPU の抑制が無効になります。 |
--timeout |
レスポンスを返すまでの許容時間( |
デフォルト設定を変更する必要がある場合や、Cloud Run サービスにカスタマイズされた設定を追加する必要がある場合は、サービスを構成するをご覧ください。
デプロイされたサービスが完了すると、成功メッセージと、run.app
で終わる Cloud Run エンドポイント URL が表示されます。
デプロイされた Gemma サービスを curl でテストする
Gemma サービスがデプロイされたので、そのサービスにリクエストを送信できます。ただし、リクエストを直接送信すると、Cloud Run は HTTP 401 Unauthorized
で応答します。これは、LLM 推論 API が他のサービス(フロントエンド アプリケーションなど)によって呼び出されることを前提としているためです。Cloud Run のサービス間認証の詳細については、サービス間の認証をご覧ください。
Gemma サービスにリクエストを送信するには、Cloud Run デベロッパー プロキシなどを使用して、有効な OIDC トークンを含むヘッダーをリクエストに追加します。
Google Gen AI SDK を安全に操作する
Cloud Run サービスをデプロイしたら、Google Gen AI SDK で Cloud Run エンドポイントを使用できます。
Google Gen AI SDK を使用する前に、受信リクエストが適切な ID トークンを渡していることを確認してください。IAM 認証と Cloud Run の使用の詳細については、サービス間の認証をご覧ください。
次の例は、IAM 認証で Google Gen AI SDK を使用する方法を示しています。
JavaScript または TypeScript
Google Gen AI SDK for JavaScript と TypeScript を使用している場合、コードは次のようになります。
import { GoogleGenAI, setDefaultBaseUrls } from "@google/genai";
import { GoogleAuth} from 'google-auth-library'
const cloudrunurl = 'https://CLOUD_RUN_SERVICE_URL';
const targetAudience = url;
const auth = new GoogleAuth();
async function main() {
const client = await auth.getIdTokenClient(targetAudience);
const headers = await client.getRequestHeaders(targetAudience);
const idToken = headers['Authorization']
const ai = new GoogleGenAI({
apiKey:"placeholder",
httpOptions: { baseUrl: url, headers: {'Authorization': idToken} },
});
const response = await ai.models.generateContent({
model: "gemma-3-1b-it",
contents: "I want a pony",
});
console.log(response.text);
}
main();
curl
curl を使用している場合は、次のコマンドを実行して Google Gen AI SDK エンドポイントにアクセスします。
同時実行を設定してパフォーマンスを最適化する
このセクションでは、推奨される同時実行設定のコンテキストについて説明します。リクエストのレイテンシを最適化するには、--concurrency
の設定が Ollama の OLLAMA_NUM_PARALLEL
環境変数と同じであることを確認します。
--concurrency
が OLLAMA_NUM_PARALLEL
を超えている場合、Cloud Run は、使用可能なリクエスト スロットよりも多くのリクエストを Ollama のモデルに送信できます。これにより、Ollama 内でリクエストがキューに追加され、キューに追加されたリクエストのレイテンシが増加します。また、キューに追加されたリクエストが Cloud Run をトリガーしてスケールアウトし、新しいインスタンスを起動しないため、自動スケーリングの応答性が低下します。
Ollama は、1 つの GPU から複数のモデルをサービングする機能も備えています。Ollama インスタンスでリクエストのキューイングを完全に回避するには、OLLAMA_NUM_PARALLEL
と一致するように --concurrency
を設定する必要があります。
OLLAMA_NUM_PARALLEL
を増やすと、並列リクエストにかかる時間も長くなることに注意してください。
使用率の最適化
GPU 使用率を最適化するには、--concurrency
を増やします。ただし、OLLAMA_NUM_PARALLEL
の 2 倍の範囲内にします。これにより、Ollama でリクエストがキューイングされますが、使用率の向上に役立ちます。Ollama インスタンスは、キュー内のリクエストをすぐに処理できるため、キューはトラフィックの急増への対応に役立ちます。
クリーンアップ
作成した次の Google Cloud リソースを削除します。