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 bietet seit Kurzem GPU-Unterstützung. Er steht als öffentliche Vorschau auf der Warteliste zur Verfügung. 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 Cloud Run-Autoscaling wird weiterhin angewendet. 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 Open 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 Dienst mit mehreren Containern bereit, der Open WebUI als Front-End-Ingress-Container und Ollama in einem Sidecar verwendet, um ein Gemma 2 2B-Modell bereitzustellen, das in einem Google Cloud Storage-Bucket gespeichert ist.

Aufgaben in diesem Lab

  • Mehrere Containerdienste in Cloud Run erstellen
  • Ollama als Sidecar für ein Gemma 2 2B-Modell 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 Befehlszeile 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 aktivieren, indem Sie den folgenden Befehl ausführen:

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 im Verzeichnis /home/$USER/.ollama/models heruntergeladen.

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

Führen Sie jetzt ollama aus, indem Sie

ollama serve

Ollama beginnt mit dem Beobachten von Port 11434.

Öffnen Sie ein zweites Terminalfenster, um das Gemma 2 2B-Modell aufzurufen,

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 den Chat 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 jetzt den Ordner „models“ in GCS.

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

5. Ollama-Bild erstellen

Dockerfile mit folgendem Inhalt erstellen

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"]

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

Olama-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.

Rufen Sie mit Docker das Open WebUI-Image auf.

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 verschieben.

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

Taggen Sie Ihr Image und übertragen Sie es dann per Push an 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. Dienst für mehrere Container in Cloud Run bereitstellen

YAML-Datei verwenden, um den Dienst für mehrere Container bereitzustellen

Erstellen Sie eine service.yaml-Datei 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
        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“, indem Sie PROJECT_ID durch Ihre Projekt-ID ersetzen:

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

Stellen Sie die Funktion 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.

Wählen Sie nach dem Laden der Benutzeroberfläche unter Modell auswählen die Option Gemma 2 2B aus.

Stellen Sie Gemma jetzt eine Frage: „Warum ist der Himmel blau?“

8. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Weitere Informationen finden Sie in der Dokumentation zu Cloud Run-Funktionen.

Behandelte Themen

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

9. Bereinigen

Um versehentliche Gebühren zu vermeiden, z. B. wenn die Cloud Run-Dienste versehentlich häufiger aufgerufen werden als Ihre monatliche Zuweisung von Cloud Run-Aufrufen in der kostenlosen Stufe, können Sie entweder Cloud Run oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie die Cloud Run-Funktion löschen möchten, rufen Sie die 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 in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit dem Befehl gcloud projects list aufrufen.