1. はじめに
概要
Cloud Run では、最近 GPU のサポートが追加されました。この機能は、ウェイティング リストに登録したユーザー向けの公開プレビュー版として提供されています。この機能を試してみたい場合は、こちらのフォームにご記入のうえ、順番待ちリストにご登録ください。Cloud Run は、Google Cloud 上のコンテナ プラットフォームです。クラスタを管理することなく、コンテナでコードを簡単に実行できます。
現在、利用可能な GPU は 24 GB の vRAM を搭載した Nvidia L4 GPU です。Cloud Run インスタンスごとに 1 つの GPU があり、Cloud Run の自動スケーリングは引き続き適用されます。これには、最大 5 つのインスタンスへのスケールアウト(割り当ての増加が可能)と、リクエストがない場合のゼロ インスタンスへのスケールダウンが含まれます。
GPU のユースケースの 1 つは、独自のオープン大規模言語モデル(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 モデルをプルダウンします。
ollama pull gemma2:2b
(省略可)次のコマンドを実行して、コマンドラインから Gemma を操作できます。
ollama run gemma2:2b
Gemma とのチャットが終了したら、「
/bye
4. Storage バケットを作成する
モデルがダウンロードされたので、モデルを 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 --platform=linux/amd64 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
サービス イメージを保存する 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 イメージを pull します。
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
env:
- name: OLLAMA_MODELS
value: /root/.ollama/models
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 サービスをテストする
ウェブブラウザでサービス URL を開きます。
UI の読み込みが完了したら、[モデルを選択] で [Gemma 2 2B] を選択します。
Gemma に質問します(例: 「空はなぜ青いの?」)。
8. 完了
以上で、この Codelab は完了です。
Cloud Run functions のドキュメントを確認することをおすすめします。
学習した内容
- Cloud Run でマルチコンテナ サービスを作成する方法
- Gemma 2 2B モデルを提供するサイドカーとして Ollama をデプロイする方法
- Open WebUI をフロントエンドの Ingress コンテナとしてデプロイする方法
9. クリーンアップ
誤って課金されないようにするには(たとえば、Cloud Run サービスが誤って 無料枠の Cloud Run 呼び出しの月間割り当てよりも多く呼び出された場合など)、Cloud Run を削除するか、ステップ 2 で作成したプロジェクトを削除します。
Cloud Run 関数を削除するには、https://console.cloud.google.com/run で Cloud Run Cloud Console に移動し、ollama-sidecar-codelab サービスを削除します。
プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除した場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。