Cloud Run GPU と Open WebUI をフロントエンド Ingress コンテナとして使用し、Ollama をサイドカーとして使用する方法

1. はじめに

概要

Cloud Run に最近 GPU のサポートが追加されました。ウェイティング リストに登録した公開プレビュー版として入手できます。この機能をお試しになりたい場合は、こちらのフォームにご記入のうえ、順番待ちリストにご登録ください。Cloud Run は Google Cloud 上のコンテナ プラットフォームで、クラスタを管理することなく、コンテナ内でコードを簡単に実行できます。

現在提供されている GPU は、24 GB の vRAM を搭載した Nvidia L4 GPU です。Cloud Run インスタンスごとに 1 つの GPU があり、Cloud Run の自動スケーリングは引き続き適用されます。これには、最大 5 インスタンスのスケールアウト(割り当て増加を利用可能)と、リクエストがない場合はインスタンスを 0 にスケールダウンすることが含まれます。

GPU のユースケースの一つに、独自のオープン大規模言語モデル(LLM)の実行があります。このチュートリアルでは、LLM を実行するサービスをデプロイする手順について説明します。

この Codelab では、Open WebUI をフロントエンド Ingress コンテナとして使用し、サイドカーで Ollama を使用して、Google Cloud Storage バケットに保存されている Gemma 2 2B モデルを提供するマルチコンテナ サービスをデプロイします。

学習内容

  • Cloud Run で複数のコンテナ サービスを作成する方法
  • Gemma 2 2B モデルを提供するサイドカーとして Ollama をデプロイする方法
  • Open WebUI をフロントエンド Ingress コンテナとしてデプロイする方法

2. 環境変数を設定して API を有効にする

gcloud CLI をアップグレードする

まず、gcloud CLI の最新バージョンをインストールする必要があります。CLI を更新するには、次のコマンドを実行します。

gcloud components update

環境変数を設定する

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=us-central1
gcloud config set project $PROJECT_ID

API を有効にする

この Codelab を使用する前に、いくつかの API を有効にする必要があります。この Codelab では、次の API を使用する必要があります。これらの API を有効にするには、次のコマンドを実行します。

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

この Codelab 用のディレクトリを作成します。

mkdir ollama-sidecar-codelab
cd ollama-sidecar-codelab

3. Gemma 2 2B モデルを保存する GCS バケットを作成する

まず、モデルをダウンロードするために Ollama をインストールします。これにより、モデルが /home/$USER/.ollama/models にダウンロードされます。

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

次のコマンドを実行して ollama を実行します

ollama serve

Ollama はポート 11434 でリッスンを開始します。

2 つ目のターミナル ウィンドウを開き、Gemma 2 2B モデルを pull して

ollama pull gemma2:2b

(省略可)コマンドラインから Gemma を操作するには、次のコマンドを実行します。

ollama run gemma2:2b

Gemini とのチャットを終了するには、

/bye

4. ストレージ バケットを作成する

モデルがダウンロードされたので、モデルを GCS バケットに移動できます。

まず、バケットを作成します。

gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab

次に、models フォルダを GCS に移動します。

gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab

5. Ollama イメージを作成する

次の内容の dockerfile を作成します。

FROM ollama/ollama

# 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 

# Store the model weights in the container image
ENV MODEL gemma2:2b
RUN ollama serve & sleep 5 && ollama pull $MODEL 

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

サービス イメージを保存する Artifact Registry リポジトリを作成します。

gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
    --location=us-central1 --description="Ollama + OpenWebUI website demo" \
    --project=$PROJECT_ID

ollama サイドカー イメージをビルドする

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/ollama-gemma-2b \
   --machine-type e2-highcpu-32

6. Open WebUI フロントエンド イメージを作成する

このセクションでは、Open WebUI を使用してフロントエンド Ingress コンテナを作成します。

docker を使用して Open WebUI のイメージをプルダウンします。

docker pull ghcr.io/open-webui/open-webui:main

次に、Google Cloud 認証情報を使用して Artifact Registry の認証を行うように Docker を構成します。これにより、Docker を使用して Artifact Registry リポジトリにイメージを push できるようになります。

gcloud auth configure-docker us-central1-docker.pkg.dev

イメージにタグを付けて、Artifact Registry に push します。

docker tag ghcr.io/open-webui/open-webui:main us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

docker push us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

7. マルチコンテナ サービスを Cloud Run にデプロイする

YAML ファイルを使用してマルチコンテナ サービスをデプロイする

次の内容で service.yaml を作成します。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: ollama-sidecar-codelab
  labels:
    cloud.googleapis.com/location: us-central1
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: '5'
        run.googleapis.com/cpu-throttling: 'false'
        run.googleapis.com/startup-cpu-boost: 'true'
        run.googleapis.com/container-dependencies: '{"openwebui":["ollama-sidecar"]}'
    spec:
      containerConcurrency: 80
      timeoutSeconds: 300
      containers:
      - name: openwebui
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/openwebui
        ports:
        - name: http1
          containerPort: 8080
        env:
        - name: OLLAMA_BASE_URL
          value: http://localhost:11434
        - name: WEBUI_AUTH
          value: 'false'
        resources:
          limits:
            memory: 1Gi
            cpu: 2000m
        volumeMounts:
        - name: in-memory-1
          mountPath: /app/backend/data
        startupProbe:
          timeoutSeconds: 240
          periodSeconds: 240
          failureThreshold: 1
          tcpSocket:
            port: 8080
      - name: ollama-sidecar
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/ollama-gemma-2b
        resources:
          limits:
            cpu: '6'
            nvidia.com/gpu: '1'
            memory: 16Gi
        volumeMounts:
        - name: gcs-1
          mountPath: /root/.ollama
        startupProbe:
          timeoutSeconds: 1
          periodSeconds: 10
          failureThreshold: 3
          tcpSocket:
            port: 11434
      volumes:
      - name: gcs-1
        csi:
          driver: gcsfuse.run.googleapis.com
          volumeAttributes:
            bucketName: YOUR_PROJECT_ID-gemma2-2b-codelab
      - name: in-memory-1
        emptyDir:
          medium: Memory
          sizeLimit: 10Gi
      nodeSelector:
        run.googleapis.com/accelerator: nvidia-l4

service.yaml を更新して、PROJECT_ID をプロジェクト ID に置き換えます。

sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml

次のコマンドを使用して Cloud Run にデプロイします。

gcloud beta run services replace service.yaml

Cloud Run サービスをテストする

ウェブブラウザで Service URL を開きます。

UI の読み込みが完了したら、[モデルを選択] で [Gemma 2 2B] を選択します。

次に、Gemma に質問します(例: 「空はなぜ青いの?」)。

8. 完了

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

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

学習した内容

  • Cloud Run で複数のコンテナ サービスを作成する方法
  • Gemma 2 2B モデルを提供するサイドカーとして Ollama をデプロイする方法
  • Open WebUI をフロントエンド Ingress コンテナとしてデプロイする方法

9. クリーンアップ

誤って課金されないようにするには(たとえば、Cloud Run サービスが 無料 tier の Cloud Run の月間呼び出し割り当てを超える回数で誤って呼び出された場合など)、Cloud Run を削除するか、手順 2 で作成したプロジェクトを削除します。

Cloud Run 関数を削除するには、Cloud Run Cloud コンソール(https://console.cloud.google.com/run)に移動して ollama-sidecar-codelab サービスを削除します。

プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除する場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストが表示されます。