Cloud Run で Gemma 3 を実行する

このガイドでは、事前構築されたコンテナを使用して Gemma 3 オープンモデルを Cloud Run にデプロイする方法について説明します。また、デプロイされた Cloud Run サービスを Google Gen AI SDK で使用する方法についても説明します。

始める前に

Google AI Studio を使用して Cloud Run にデプロイした場合は、Google Gen AI SDK を安全に操作するに進みます。

Google AI Studio を使用していない場合は、Cloud Run を使用して新しいサービスを作成する前に、次の操作を行います。

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Google Cloud プロジェクトで Cloud Run 開発環境を設定します。
  7. gcloud CLI をインストールして初期化します
  8. アカウントに次の IAM ロールが付与されていることを確認します。
  9. ロールの付与方法を確認する

    コンソール

    1. Google Cloud コンソールで、[IAM] ページに移動します。

      IAM に移動
    2. プロジェクトを選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、ユーザー ID を入力します。このユーザー ID は通常、Cloud Run サービスのデプロイに使用される Google アカウントのメールアドレスです。

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

    gcloud

    プロジェクトで自分のアカウントに必要な IAM ロールを付与するには:

            gcloud projects add-iam-policy-binding PROJECT_ID \
                --member=PRINCIPAL \
                --role=ROLE
            

    次のように置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクト番号。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • PRINCIPAL は、バインディングを追加するアカウントに置き換えます。これは通常、Cloud Run サービスのデプロイに使用される Google アカウントのメールアドレスです。
    • ROLE はデプロイするアカウントに付与するロールに置き換えます。
  10. Cloud Run Admin API の [割り当てとシステムの上限] ページで Total Nvidia L4 GPU allocation, per project per region 割り当てをリクエストします。
  11. Cloud Run の料金ページを確認します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
  12. ビルド済みコンテナを使用して 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

    次のように置き換えます。

    • 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 イメージに置き換えます。

    • REGION は、Cloud Run をデプロイする Google Cloud リージョンに置き換えます(europe-west1 など)。リージョンを変更する必要がある場合は、GPU 構成で、GPU 対応のデプロイでサポートされているリージョンを確認してください。

    その他の設定は次のとおりです。

    オプション 説明
    --concurrency

    特定のインスタンスで同時に処理できるリクエストの最大数4 など)。最適なリクエスト レイテンシに関する推奨事項については、最適なパフォーマンスを実現するための同時実行の設定をご覧ください。

    --cpu

    サービスに割り当てられた CPU の量(8 など)。

    --set-env-vars

    サービスに設定された環境変数。例: OLLAMA_NUM_PARALLEL=4最適なリクエスト レイテンシに関する推奨事項については、最適なパフォーマンスを実現するための同時実行の設定をご覧ください。

    --gpu

    サービスの GPU 値1 など)。

    --gpu-type

    サービスに使用する GPU のタイプnvidia-l4 など)。

    --max-instances

    サービスのコンテナ インスタンスの最大数1 など)。

    --memory

    サービスに割り当てられたメモリの量(32Gi など)。

    --no-invoker-iam-check

    呼び出し元の IAM チェックを無効にします。アプリのセキュリティを強化するおすすめの方法については、Google Gen AI SDK を安全に操作するをご覧ください。

    --no-cpu-throttling

    この設定により、コンテナがリクエストをアクティブに処理していないときに CPU の抑制が無効になります。

    --timeout

    レスポンスを返すまでの許容時間600 秒など)。

    デフォルト設定を変更する必要がある場合や、Cloud Run サービスにカスタマイズされた設定を追加する必要がある場合は、サービスを構成するをご覧ください。

    デプロイされたサービスが完了すると、成功メッセージと、run.app で終わる Cloud Run エンドポイント URL が表示されます。

    デプロイされた Gemma サービスを curl でテストする

    Gemma サービスがデプロイされたので、そのサービスにリクエストを送信できます。ただし、リクエストを直接送信すると、Cloud Run は HTTP 401 Unauthorized で応答します。これは、LLM 推論 API が他のサービス(フロントエンド アプリケーションなど)によって呼び出されることを前提としているためです。Cloud Run のサービス間認証の詳細については、サービス間の認証をご覧ください。

    Gemma サービスにリクエストを送信するには、Cloud Run デベロッパー プロキシなどを使用して、有効な OIDC トークンを含むヘッダーをリクエストに追加します。

    1. プロキシを起動し、cloud-run-proxy コンポーネントのインストールを求めるメッセージが表示されたら、「Y」を選択します。

      gcloud run services proxy ollama-gemma --port=9090
    2. プロキシを実行したまま、別のターミナルタブでリクエストを送信します。プロキシは 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}
      ...
      

    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 エンドポイントにアクセスします。

    • コンテンツの生成には /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."}]
            }]
            }'
      

    同時実行を設定してパフォーマンスを最適化する

    このセクションでは、推奨される同時実行設定のコンテキストについて説明します。リクエストのレイテンシを最適化するには、--concurrency の設定が Ollama の OLLAMA_NUM_PARALLEL 環境変数と同じであることを確認します。

    • OLLAMA_NUM_PARALLEL には、各モデルで推論リクエストを同時に処理するために使用できるリクエスト スロットの数を設定します。
    • --concurrency には、Cloud Run が Ollama インスタンスに同時に送信するリクエストの数を設定します。

    --concurrencyOLLAMA_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 リソースを削除します。

    次のステップ