GKE へのオープンモデルのデプロイ

1. はじめに

概要

このラボの目的は、Google Cloud でオープンモデルをデプロイするハンズオン エクスペリエンスを提供することです。シンプルなローカル設定から Google Kubernetes Engine(GKE)での本番環境グレードのデプロイまで進めます。開発ライフサイクルの各ステージに適したさまざまなツールの使い方を学びます。

このラボは次の手順で行います。

  • 迅速なプロトタイピング: まず、Ollama を使用してローカルでモデルを実行し、簡単に始める方法を確認します。
  • 本番環境へのデプロイ: 最後に、スケーラブルなサービング エンジンとして Ollama を使用して、モデルを GKE Autopilot にデプロイします。

オープンモデルについて

最近では、「オープンモデル」という言葉は通常、誰でもダウンロードして使用できる生成機械学習モデルを指します。つまり、モデルのアーキテクチャと、最も重要なトレーニング済みパラメータ(重み)が一般公開されます。

この透明性には、通常は制限付き API を介してのみアクセスできるクローズド モデルよりも優れた利点がいくつかあります。

  • 分析情報: デベロッパーや研究者は、モデルの内部構造を理解するために「内部」を調べることができます。
  • カスタマイズ: ユーザーは、ファインチューニングと呼ばれるプロセスを通じて、特定のタスクに合わせてモデルを適応させることができます。
  • イノベーション: コミュニティは、強力な既存のモデルの上に新しい革新的なアプリケーションを構築できます。

Google の貢献と Gemma ファミリー

Google は長年にわたり、オープンソース AI ムーブメントの基礎的な貢献者であり続けています。2017 年の論文「Attention Is All You Need」で発表された革新的な Transformer アーキテクチャは、ほぼすべての最新の大規模言語モデルの基盤となっています。その後、BERT、T5、指示チューニングされた Flan-T5 などの画期的なオープンモデルが続き、それぞれが可能なことの限界を押し広げ、世界中の研究開発を促進しました。

オープン イノベーションの豊富な歴史に基づいて、Google は Gemma モデル ファミリーを導入しました。Gemma モデルは、強力なクローズドソースの Gemini モデルに使用されたものと同じ研究とテクノロジーから作成されますが、オープン ウェイトで利用できます。Google Cloud のお客様は、最先端のテクノロジーとオープンソースの柔軟性を組み合わせることで、モデルのライフサイクルを制御し、多様なエコシステムと統合し、マルチクラウド戦略を推進できます。

Gemma 3 の概要

このラボでは、このファミリーの最新かつ最も高性能な世代である Gemma 3 に焦点を当てます。Gemma 3 モデルは軽量でありながら最先端のモデルで、単一の GPU や CPU でも効率的に動作するように設計されています。

  • パフォーマンスとサイズ: Gemma 3 モデルは軽量でありながら最先端のモデルであり、単一の GPU や CPU でも効率的に実行できるように設計されています。サイズに対して優れた品質と最先端(SOTA)のパフォーマンスを提供します。
  • モダリティ: マルチモーダルであり、テキストと画像の両方の入力を処理してテキスト出力を生成できます。
  • 主な機能: Gemma 3 は 128K の大きなコンテキスト ウィンドウを備え、140 を超える言語をサポートしています。
  • ユースケース: これらのモデルは、質問応答、要約、推論など、さまざまなタスクに適しています。

主な用語

オープンモデルを操作する際には、次の一般的な用語が使用されます。

  • 事前トレーニングでは、大規模で多様なデータセットでモデルをトレーニングし、一般的な言語パターンを学習します。これらのモデルは、強力な自動補完マシンです。
  • 指示チューニングでは、特定の指示やプロンプトに沿って事前トレーニング済みモデルをファインチューニングします。これらは「チャットの方法を知っている」モデルです。
  • モデル バリエーション: オープンモデルは通常、複数のサイズ(Gemma 3 には、1B、4B、12B、27B のパラメータ バージョンと、指示用にチューニングされた(-it)、事前トレーニング済み、効率性を高めるために量子化されたバリアントなどがあります。
  • リソースのニーズ: 大規模言語モデルは大規模であり、ホストするには相当なコンピューティング リソースが必要です。ローカルで実行することもできますが、クラウドにデプロイすると大きなメリットがあります。特に、Ollama などのツールでパフォーマンスとスケーラビリティを最適化すると、そのメリットは大きくなります。

オープンモデルのサービングに GKE を使用する理由

このラボでは、単純なローカル モデルの実行から Google Kubernetes Engine(GKE)での本格的な本番環境デプロイまでを説明します。Ollama などのツールは迅速なプロトタイピングに優れていますが、本番環境には厳しい要件があり、GKE はこれらの要件を満たす独自の機能を備えています。

大規模な AI アプリケーションでは、実行中のモデルだけでなく、復元力があり、スケーラブルで効率的なサービング インフラストラクチャが必要です。GKE はこの基盤を提供します。GKE を選択するタイミングと理由を次に示します。

  • Autopilot による管理の簡素化: GKE Autopilot が基盤となるインフラストラクチャを管理します。アプリケーション構成に集中すると、Autopilot がノードを自動的にプロビジョニングしてスケーリングします。
  • 高いパフォーマンスとスケーラビリティ: GKE の自動スケーリングにより、要求の厳しい変動の多いトラフィックを処理します。これにより、アプリケーションは低レイテンシで高スループットを実現し、必要に応じてスケールアップまたはスケールダウンできます。
  • 大規模な費用対効果: リソースを効率的に管理します。GKE では、アイドル状態のリソースの料金が発生しないようにワークロードをゼロまでスケールダウンできます。また、Spot VM を活用して、ステートレス推論ワークロードの費用を大幅に削減できます。
  • 移植性と豊富なエコシステム: 移植可能な Kubernetes ベースのデプロイにより、ベンダー ロックインを回避できます。GKE は、最高水準のモニタリング、ロギング、セキュリティ ツール用の広範なクラウドネイティブ(CNCF)エコシステムへのアクセスも提供します。

つまり、AI アプリケーションが本番環境に対応し、大規模なスケーリング、パフォーマンス、運用上の成熟度に対応したプラットフォームが必要になったら、GKE に移行します。

学習内容

このラボでは、次のタスクの実行方法について学びます。

  • Ollama を使用してオープンモデルをローカルで実行する。
  • Ollama を使用して、Google Kubernetes Engine(GKE)Autopilot にオープンモデルをデプロイしてサービングする。
  • ローカル開発フレームワークから GKE の本番環境グレードのサービング アーキテクチャへの移行について理解する。

2. プロジェクトの設定

Google アカウント

個人の Google アカウントをお持ちでない場合は、Google アカウントを作成する必要があります。

仕事用または学校用アカウントではなく、個人アカウントを使用します。

Google Cloud コンソールにログインする

個人の Google アカウントを使用して Google Cloud コンソールにログインします。

課金を有効にする

個人用の請求先アカウントを設定する

Google Cloud クレジットを使用して課金を設定した場合は、この手順をスキップできます。

個人用の請求先アカウントを設定するには、Cloud コンソールでこちらに移動して課金を有効にします

注意事項:

  • このラボを完了するのにかかる Cloud リソースの費用は 1 米ドル未満です。
  • このラボの最後の手順に沿ってリソースを削除すると、それ以上の料金は発生しません。
  • 新規ユーザーは、300 米ドル分の無料トライアルをご利用いただけます。

プロジェクトの作成(省略可)

このラボで使用する現在のプロジェクトがない場合は、こちらで新しいプロジェクトを作成します。

3. Cloud Shell エディタを開く

  1. このリンクをクリックすると、Cloud Shell エディタに直接移動します。
  2. 本日、承認を求めるメッセージがどこかの時点で表示された場合は、[承認] をクリックして続行します。Cloud Shell を承認する
  3. ターミナルが画面の下部に表示されない場合は、ターミナルを開きます。
    • [表示] をクリックします。
    • [ターミナル] をクリックします。Cloud Shell エディタで新しいターミナルを開く
  4. ターミナルで、次のコマンドを使用してプロジェクトを設定します。
    gcloud config set project [PROJECT_ID]
    
    • 例:
      gcloud config set project lab-project-id-example
      
    • プロジェクト ID が思い出せない場合は、次のコマンドでプロジェクト ID をすべて一覧表示できます。
      gcloud projects list
      
      Cloud Shell エディタのターミナルでプロジェクト ID を設定する
  5. 次のようなメッセージが表示されます。
    Updated property [core/project].
    

4. Ollama で Gemma を実行する

最初の目標は、開発環境で Gemma 3 をできるだけ早く実行することです。ここでは、大規模言語モデルのローカル実行を大幅に簡素化するツールである Ollama を使用します。このタスクでは、オープンモデルのテストを開始する最も簡単な方法について説明します。

Ollama は、ユーザーが生成モデル(大規模言語モデル、ビジョン言語モデルなど)を自分のパソコンでローカルに実行できる無料のオープンソース ツールです。これにより、これらのモデルへのアクセスと操作のプロセスが簡素化され、モデルの利用が容易になり、ユーザーはプライベートな環境でモデルを操作できるようになります。

Ollama をインストールして実行する

これで、Ollama をインストールし、Gemma 3 モデルをダウンロードして、コマンドラインから操作する準備が整いました。

  1. Cloud Shell ターミナルで、Ollama をダウンロードしてインストールします。
    curl -fsSL https://ollama.com/install.sh | sh
    
    このコマンドは、Ollama をダウンロードしてインストールし、Ollama サービスを開始します。
  2. バックグラウンドで Ollama サービスを起動します。
    ollama serve &
    
  3. Ollama を使用して Gemma 3 1B モデルを pull(ダウンロード)します。
    ollama pull gemma3:1b
    
  4. モデルをローカルで実行します。
    ollama run gemma3:1b
    
    ollama run コマンドは、モデルに質問するためのプロンプト(>>>)を表示します。
  5. 質問を使用してモデルをテストします。たとえば、「Why is the sky blue?」と入力して Enter キーを押します。次のようなレスポンスが表示されます。
    >>> Why is the sky blue?
    Okay, let's break down why the sky is blue – it's a fascinating phenomenon related to how light interacts with the Earth's atmosphere.
    Here's the explanation:
    
    **1. Sunlight and Colors:**
    
    * Sunlight appears white, but it's actually made up of all the colors of the rainbow (red, orange, yellow, green, blue, indigo, and violet).
    Think of a prism splitting sunlight.
    
    **2. Rayleigh Scattering:**
    
    * As sunlight enters the Earth's atmosphere...
    ...
    
  6. ターミナルで Ollama プロンプトを終了するには、「/bye」と入力して Enter キーを押します。

Ollama で OpenAI SDK を使用する

Ollama サービスが実行されているので、プログラムで操作できます。Ollama が公開する API と互換性のある OpenAI Python SDK を使用します。

  1. Cloud Shell ターミナルで、uv を使用して仮想環境を作成して有効にします。これにより、プロジェクトの依存関係がシステム Python と競合しないようになります。
    uv venv --python 3.14
    source .venv/bin/activate
    
  2. ターミナルで OpenAI SDK をインストールします。
    uv pip install openai
    
  3. ターミナルで次のコマンドを入力して、ollama_chat.py という名前の新しいファイルを作成します。
    cloudshell edit ollama_chat.py
    
  4. 次の Python コードを ollama_chat.py に貼り付けます。このコードは、ローカルの Ollama サーバーにリクエストを送信します。
    from openai import OpenAI
    
    client = OpenAI(
        base_url = 'http://localhost:11434/v1',
        api_key='ollama', # required by OpenAI SDK, but not used by Ollama
    )
    
    response = client.chat.completions.create(
        model="gemma3:1b",
        messages=[
            {
                "role": "user",
                "content": "Why is the sky blue?"
            },
        ],
    )
    print(response.choices[0].message.content)
    
  5. ターミナルでスクリプトを実行します。
    python3 ollama_chat.py
    
    数秒後に、コマンドラインから受け取ったレスポンスと同様のレスポンスが表示されます。
  6. ストリーミング モードを試すには、ターミナルで次のコマンドを実行して、ollama_stream.py という名前の別のファイルを作成します。
    cloudshell edit ollama_stream.py
    
  7. 次の内容を ollama_stream.py ファイルに貼り付けます。リクエストの stream=True パラメータに注目してください。これにより、モデルはトークンが生成されるとすぐにトークンを返すことができます。
    from openai import OpenAI
    
    client = OpenAI(
        base_url = 'http://localhost:11434/v1',
        api_key='ollama',
    )
    
    stream = client.chat.completions.create(
        model="gemma3:1b",
        messages=[
            {
                "role": "user",
                "content": "Why is the sky blue?"
            },
        ],
        stream=True
    )
    for chunk in stream:
        if chunk.choices[0].delta.content is not None:
            print(chunk.choices[0].delta.content, end="", flush=True)
    print()
    
  8. ターミナルでストリーミング スクリプトを実行します。
    python3 ollama_stream.py
    
    レスポンスがトークンごとに表示されるようになりました。

ストリーミングは、チャットボットなどのインタラクティブ アプリケーションで優れたユーザー エクスペリエンスを実現するのに役立つ機能です。ストリーミングでは、ユーザーが回答全体が生成されるのを待つのではなく、レスポンスが作成されると同時にトークンごとに表示されます。これにより、即座にフィードバックが提供され、アプリケーションの応答性が大幅に向上します。

学習内容: Ollama を使用したオープンモデルの実行

Ollama を使用してオープンモデルが正常に実行されました。Gemma 3 などの強力なモデルをダウンロードして操作する方法は、コマンドライン インターフェースと Python を使用したプログラムの両方で、非常に簡単であることがわかりました。このワークフローは、迅速なプロトタイピングとローカル開発に最適です。これで、より高度なデプロイ オプションを検討するための確固たる基盤ができました。

5. GKE Autopilot で Ollama を使用して Gemma をデプロイする

オペレーションの簡素化とスケーラビリティが求められる本番環境のワークロードには、Google Kubernetes Engine(GKE)が最適なプラットフォームです。このタスクでは、GKE Autopilot クラスタで Ollama を使用して Gemma をデプロイします。

GKE Autopilot は、ノード、スケーリング、セキュリティ、その他の事前構成された設定などのクラスタ構成を Google が管理する GKE の運用モードです。基盤となるコンピューティング インフラストラクチャを管理することなく、推論ワークロードを実行するのに最適な、真の「サーバーレス」Kubernetes 環境が実現します。

GKE 環境を準備する

Kubernetes へのデプロイの最後のタスクでは、GKE Autopilot クラスタをプロビジョニングします。

  1. Cloud Shell ターミナルで、プロジェクトと目的のリージョンの環境変数を設定します。
    export PROJECT_ID=$(gcloud config get-value project)
    export REGION=europe-west1
    
    gcloud config set compute/region $REGION
    
  2. ターミナルで次のコマンドを実行して、プロジェクトの GKE API を有効にします。
    gcloud services enable container.googleapis.com
    
  3. ターミナルで次のコマンドを実行して、GKE Autopilot クラスタを作成します。
    gcloud container clusters create-auto gemma-cluster \
      --region $REGION \
      --release-channel rapid
    
  4. ターミナルで次のコマンドを実行して、新しいクラスタの認証情報を取得します。
    gcloud container clusters get-credentials gemma-cluster \
      --region $REGION
    

Ollama と Gemma をデプロイする

GKE Autopilot クラスタができたので、Ollama サーバーをデプロイできます。Autopilot は、デプロイ マニフェストで定義した要件に基づいて、コンピューティング リソース(CPU とメモリ)を自動的にプロビジョニングします。

  1. ターミナルで次のコマンドを実行して、gemma-deployment.yaml という名前の新しいファイルを作成します。
    cloudshell edit gemma-deployment.yaml
    
  2. 次の YAML 構成を gemma-deployment.yaml に貼り付けます。この構成では、公式の Ollama イメージを使用して CPU で実行するデプロイを定義します。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ollama-gemma
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ollama-gemma
      template:
        metadata:
          labels:
            app: ollama-gemma
        spec:
          containers:
          - name: ollama-gemma-container
            image: ollama/ollama:0.12.10
            resources:
              requests:
                cpu: "8"
                memory: "8Gi"
                ephemeral-storage: "10Gi"
              limits:
                cpu: "8"
                memory: "8Gi"
                ephemeral-storage: "10Gi"
            # We use a script to start the server and pull the model
            command: ["/bin/bash", "-c"]
            args:
            - |
              ollama serve &
              OLLAMA_PID=$!
              echo "Waiting for Ollama server to start..."
              sleep 5
              echo "Pulling Gemma model..."
              ollama pull gemma3:1b
              echo "Model pulled. Ready to serve."
              wait $OLLAMA_PID
            ports:
            - containerPort: 11434
            env:
            - name: OLLAMA_HOST
              value: "0.0.0.0"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: llm-service
    spec:
      selector:
        app: ollama-gemma
      type: ClusterIP
      ports:
      - protocol: TCP
        port: 8000
        targetPort: 11434
    
    Autopilot の構成について説明します。
    • image: ollama/ollama:latest: 公式の Ollama Docker イメージを指定します。
    • resources: 8 個の vCPU と 8 GiB のメモリを明示的にリクエストします。GKE Autopilot はこれらの値を使用して、基盤となるコンピューティングをプロビジョニングします。GPU を使用していないため、モデルは CPU で実行されます。8 Gi のメモリは、Gemma 1B モデルとそのコンテキストを保持するのに十分です。
    • command/args: 起動コマンドをオーバーライドして、Pod の起動時にモデルが確実に pull されるようにします。このスクリプトは、サーバーをバックグラウンドで起動し、準備が整うのを待ってから、gemma3:1b モデルを pull し、サーバーを実行し続けます。
    • OLLAMA_HOST: これを 0.0.0.0 に設定すると、Ollama がコンテナ内のすべてのネットワーク インターフェースでリッスンし、Kubernetes Service からアクセスできるようになります。
  3. ターミナルで、Deployment マニフェストをクラスタに適用します。
    kubectl apply -f gemma-deployment.yaml
    
    Autopilot がリソースをプロビジョニングして Pod が起動するまでに数分かかります。次のコマンドでモニタリングできます。
    kubectl get pods --watch
    
    Pod のステータスが Running になり、READY1/1 になるまで待ってから続行します。

GKE エンドポイントをテストする

Ollama サービスが GKE Autopilot クラスタで実行されるようになりました。Cloud Shell ターミナルからテストするには、kubectl port-forward を使用します。

  1. 新しい Cloud Shell ターミナル タブを開きます(ターミナル ウィンドウの + アイコンをクリックします)。port-forward コマンドはブロッキング プロセスであるため、独自のターミナル セッションが必要です。
  2. 新しいターミナルで次のコマンドを実行して、ローカルポート(8000)からサービスのポート(8000)に転送します。
    kubectl port-forward service/llm-service 8000:8000
    
    転送が開始されたことを示す出力が表示されます。このターミナルは実行したままにしておきます。
  3. 元のターミナルに戻ります。
  4. ローカルポート 8000 にリクエストを送信します。Ollama サーバーは OpenAI 互換の API を公開します。ポート転送により、http://127.0.0.1:8000 でアクセスできるようになりました。
    curl http://127.0.0.1:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
    "model": "gemma3:1b",
    "messages": [
    {"role": "user", "content": "Explain why the sky is blue."}
    ]
    }'
    
    サービスは、モデルの完了を含む JSON レスポンスを返します。

6. クリーンアップ

このラボで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順で GKE クラスタを削除します。

  1. Cloud Shell ターミナルで、GKE Autopilot クラスタを削除します。
    gcloud container clusters delete gemma-cluster \
      --region $REGION --quiet
    
    このコマンドは、クラスタとそれに関連付けられているすべてのリソースを削除します。

7. まとめ

パフォーマンスは良好です。このラボでは、Google Cloud にオープンモデルをデプロイするためのいくつかの重要な方法について説明しました。Ollama を使用したローカル開発のシンプルさとスピードから始めました。最後に、Google Kubernetes Engine Autopilot と Ollama フレームワークを使用して、Gemma を本番環境グレードのスケーラブルな環境にデプロイしました。

これで、基盤となるインフラストラクチャを管理することなく、要求の厳しいスケーラブルなワークロード向けに Google Kubernetes Engine にオープンモデルをデプロイするための知識が身につきました。

内容のまとめ

このラボでは、次のことを学びました。

  • オープンモデルとは何か、また、オープンモデルが重要な理由。
  • Ollama を使用してオープンモデルをローカルで実行する方法。
  • 推論に Ollama を使用して、Google Kubernetes Engine(GKE)Autopilot にオープンモデルをデプロイする方法。

その他の情報