如何將 Ollama 當做補充資訊,搭配 Cloud Run GPU 和 Open WebUI 做為前端輸入容器

1. 簡介

總覽

Cloud Run 最近新增了 GPU 支援。這項產品可做為候補名單的公開預先發布版。如有意試用這項功能,請填寫這份表單,加入候補名單。Cloud Run 是 Google Cloud 上的容器平台,可讓您輕鬆在容器中執行程式碼,不必管理叢集。

目前,我們提供的 GPU 是 Nvidia L4 GPU,具有 24 GB 的 vRAM。每個 Cloud Run 執行個體有一個 GPU,但仍適用 Cloud Run 自動調整資源配置功能。包括向外擴充 5 個執行個體 (可增加配額),以及在沒有任何要求時將執行個體縮減至零。

GPU 的其中一個用途是執行您自己的開放式大型語言模型 (LLM)。本教學課程將逐步引導您部署執行 LLM 的服務。

在本程式碼研究室中,您將部署使用 Open WebUI 做為前端輸入容器的多容器服務,並在補充資訊中使用 Ollama,為儲存在 Google Cloud Storage 值區中的 Gemma 2 2B 模型提供服務。

課程內容

  • 如何在 Cloud Run 中建立多個容器服務
  • 如何部署 Ollama 做為提供 Gemma 2 2B 模型的附屬服務
  • 如何將 Open WebUI 部署為前端 Ingress 容器

2. 設定環境變數並啟用 API

升級 gcloud CLI

首先,您必須安裝最新版本的 gcloud CLI。如要更新 CLI,請執行下列指令:

gcloud components update

設定環境變數

您可以設定在本程式碼研究室中使用的環境變數。

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

啟用 API

開始使用本程式碼研究室之前,您必須先啟用多個 API。本程式碼研究室需要使用下列 API。您可以執行下列指令來啟用這些 API:

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

為本程式碼研究室建立目錄。

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

3. 建立 GCS 值區來儲存 Gemma 2 2B 模型

首先,您必須安裝 Ollama 才能下載模型。這會將模型下載至 /home/$USER/.ollama/models

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

現在只要跑步以跑 ollama 吧

ollama serve

Ollama 開始監聽通訊埠 11434。

開啟第二個終端機視窗,將 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

接著,將模型資料夾移至 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 建立前端入口容器。

使用 docker 下拉 Open WebUI 映像檔。

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

然後將 Docker 設為使用您的 Google Cloud 憑證,透過 Artifact Registry 進行驗證。這樣您就能使用 Docker 將映像檔推送至 Artifact Registry 存放區。

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

標記映像檔,然後推送至 Artifact Registry。

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 服務

現在請在網路瀏覽器中開啟服務網址。

等 UI 載入完成後,請在「Select a model」下方選擇「Gemma 2 2B」

接著詢問 Gemma 問題,例如「為什麼天空是藍色的?」

8. 恭喜!

恭喜您完成程式碼研究室!

建議您參考 Cloud Run 函式的說明文件

涵蓋內容

  • 如何在 Cloud Run 中建立多個容器服務
  • 如何部署 Ollama 做為提供 Gemma 2 2B 模型的附屬服務
  • 如何將 Open WebUI 部署為前端 Ingress 容器

9. 清理

為避免產生意外費用 (舉例來說,如果 Cloud Run 服務意外叫用次數超過免費方案的每月 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 來查看所有可用專案的清單。