Ollama als Sidecar-Datei mit Cloud Run-GPUs und Open WebUI als Front-End-Container für eingehenden Traffic verwenden

1. Einführung

Übersicht

Cloud Run unterstützt seit Kurzem GPUs. Sie ist als öffentliche Vorschau mit Warteliste verfügbar. Wenn Sie die Funktion ausprobieren möchten, füllen Sie dieses Formular aus, um sich auf die Warteliste setzen zu lassen. Cloud Run ist eine Containerplattform in Google Cloud, mit der Sie Ihren Code ganz einfach in einem Container ausführen können, ohne einen Cluster verwalten zu müssen.

Derzeit stellen wir Nvidia L4-GPUs mit 24 GB vRAM zur Verfügung. Es gibt eine GPU pro Cloud Run-Instanz und das Autoscaling von Cloud Run gilt weiterhin. Dazu gehört das Hochskalieren auf bis zu 5 Instanzen (mit Kontingenterhöhung) sowie das Herunterskalieren auf null Instanzen, wenn keine Anfragen vorhanden sind.

Ein Anwendungsfall für GPUs ist die Ausführung eigener offener Large Language Models (LLMs). In dieser Anleitung wird beschrieben, wie Sie einen Dienst bereitstellen, der ein LLM ausführt.

In diesem Codelab stellen Sie einen Multi-Container-Dienst bereit, der Open WebUI als Frontend-Ingress-Container und Ollama in einem Sidecar verwendet, um ein Gemma 2-Modell mit 2 Milliarden Parametern bereitzustellen, das in einem Google Cloud Storage-Bucket gespeichert ist.

Lerninhalte

  • Dienst mit mehreren Containern in Cloud Run erstellen
  • Ollama als Sidecar für die Bereitstellung eines Gemma 2 2B-Modells bereitstellen
  • Open WebUI als Frontend-Ingress-Container bereitstellen

2. Umgebungsvariablen festlegen und APIs aktivieren

gcloud CLI aktualisieren

Zuerst müssen Sie eine aktuelle Version der gcloud CLI installiert haben. Sie können die CLI mit dem folgenden Befehl aktualisieren:

gcloud components update

Umgebungsvariablen einrichten

Sie können Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.

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

APIs aktivieren

Bevor Sie dieses Codelab verwenden können, müssen Sie mehrere APIs aktivieren. Für dieses Codelab sind die folgenden APIs erforderlich. Sie können diese APIs mit dem folgenden Befehl aktivieren:

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

Erstellen Sie ein Verzeichnis für dieses Codelab.

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

3. GCS-Bucket zum Speichern des Gemma 2 2B-Modells erstellen

Installieren Sie zuerst Ollama, um das Modell herunterzuladen. Dadurch wird das Modell in /home/$USER/.ollama/models heruntergeladen.

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

Führen Sie jetzt Ollama mit folgendem Befehl aus:

ollama serve

Ollama beginnt, Port 11434 zu überwachen.

Öffnen Sie ein zweites Terminalfenster, um das Modell Gemma 2 2B herunterzuladen.

ollama pull gemma2:2b

(Optional) Sie können über die Befehlszeile mit Gemma interagieren, indem Sie

ollama run gemma2:2b

Wenn Sie mit dem Chatten mit Gemma fertig sind, können Sie die Unterhaltung beenden, indem Sie

/bye

4. Storage-Bucket erstellen

Nachdem das Modell heruntergeladen wurde, können Sie es in Ihren GCS-Bucket verschieben.

Erstellen Sie zuerst den Bucket.

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

Verschieben Sie den Ordner „models“ jetzt nach GCS.

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

5. Ollama-Image erstellen

Erstellen Sie ein Dockerfile mit folgendem Inhalt:

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

Erstellen Sie ein Artifact Registry-Repository zum Speichern Ihrer Dienst-Images.

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

Ollama-Sidecar-Image erstellen

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-Frontend-Image erstellen

In diesem Abschnitt erstellen Sie den Frontend-Ingress-Container mit Open WebUI.

Verwenden Sie Docker, um das Open WebUI-Image herunterzuladen.

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

Konfigurieren Sie dann Docker so, dass Ihre Google Cloud-Anmeldedaten für die Authentifizierung bei Artifact Registry verwendet werden. So können Sie mit Docker ein Image in ein Artifact Registry-Repository übertragen.

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

Taggen Sie Ihr Image und übertragen Sie es per Push in die 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. Multi-Container-Dienst in Cloud Run bereitstellen

YAML-Datei zum Bereitstellen des Multi-Container-Dienstes verwenden

Erstellen Sie ein service.yaml mit folgendem Inhalt.

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

Aktualisieren Sie „service.yaml“, um PROJECT_ID durch Ihre Projekt-ID zu ersetzen:

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

Stellen Sie die Anwendung mit dem folgenden Befehl in Cloud Run bereit.

gcloud beta run services replace service.yaml

Cloud Run-Dienst testen

Öffnen Sie jetzt die Dienst-URL in Ihrem Webbrowser.

Wenn die Benutzeroberfläche geladen wurde, wählen Sie unter Select a model (Modell auswählen) die Option Gemma 2B aus.

Stellen Sie Gemma nun eine Frage, z. B. „Warum ist der Himmel blau?“.

8. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Dokumentation zu Cloud Run Functions zu lesen.

Behandelte Themen

  • Dienst mit mehreren Containern in Cloud Run erstellen
  • Ollama als Sidecar für die Bereitstellung eines Gemma 2 2B-Modells bereitstellen
  • Open WebUI als Frontend-Ingress-Container bereitstellen

9. Bereinigen

Damit Ihnen keine unbeabsichtigten Gebühren in Rechnung gestellt werden (z. B. wenn die Cloud Run-Dienste versehentlich öfter aufgerufen werden als Ihre monatliche Cloud Run-Aufrufkontingent im kostenlosen Kontingent), können Sie entweder den Cloud Run-Dienst oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie die Cloud Run-Funktion löschen möchten, rufen Sie die Cloud Run Cloud Console unter https://console.cloud.google.com/run auf und löschen Sie den Dienst ollama-sidecar-codelab.

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das Projekt aus, das Sie in Schritt 2 erstellt haben, und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie das Projekt in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit gcloud projects list aufrufen.