Inferenzen mit einem Gemma-Modell auf Cloud Run mit RTX 6000 Pro-GPU ausführen

1. Einführung

Übersicht

Lerninhalte

  • Gemma-Modell auf einer Cloud Run RTX 6000 Pro-GPU bereitstellen
  • Modell während des Containerstarts gleichzeitig aus Cloud Storage herunterladen

2. Einrichtung und Anforderungen

Legen Sie Umgebungsvariablen fest, die in diesem Codelab verwendet werden:

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

Für dieses Codelab erforderliche APIs aktivieren

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

Ordner für das Codelab erstellen

mkdir codelab-rtx
cd codelab-rtx

Aktivieren Sie den privaten Google-Zugriff für Ihr Subnetz, um das Laden von ML-Modellen aus Cloud Storage zu optimieren. Weitere Informationen finden Sie im Abschnitt Modelle aus Cloud Storage laden in der Dokumentation zu GPU-Best Practices.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. Cloud Storage einrichten

Erstellen Sie zuerst einen Cloud Storage-Bucket zum Speichern der Modellgewichte.

Eindeutigen Bucket erstellen

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. Modellgewichtungen abrufen

Laden Sie als Nächstes das Gemma 3-Modell in ein lokales Verzeichnis herunter und laden Sie es dann in Ihren Cloud Storage-Bucket hoch.

Ollama installieren

Sie können Ollama mit diesem Befehl installieren:

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

Modell herunterladen

Erstellen Sie ein Verzeichnis für das heruntergeladene Modell.

mkdir model-weights

Für diesen Vorgang verwenden Sie zwei Terminaltabs: einen zum Ausführen des Ollama-Servers und einen zum Abrufen des Modells.

Terminal 1 (Server):

Starten Sie den Server, indem Sie den Speicherort des heruntergeladenen Modells übergeben. Dieser Befehl wird weiterhin ausgeführt.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

Terminal 2 (Client): Öffnen Sie einen neuen Terminaltab und laden Sie das Modell herunter. Der Client kommuniziert automatisch mit dem laufenden Server.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

Zurück in Terminal 1:Wenn der Download in Terminal 2 abgeschlossen ist, kehren Sie zu Terminal 1 zurück und drücken Sie Strg + C, um den Server zu beenden.

Nach Cloud Storage hochladen

Laden Sie die Gewichte jetzt in Ihren Bucket hoch. gcloud storage verarbeitet parallele Uploads automatisch, um die Geschwindigkeit zu erhöhen.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(Optional) Lokale Gewichte bereinigen

Da sich das Modell jetzt in Cloud Storage befindet, entfernen Sie die lokale Kopie.

rm -rf model-weights

5. Dienst erstellen

Erstellen Sie zuerst einen Ordner für den Dienst.

mkdir rtx-service
cd rtx-service

Erstellen Sie ein Dockerfile mit folgendem Inhalt:

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 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

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

Erstellen Sie eine Datei mit dem Namen entrypoint.sh und mit folgendem Inhalt:

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. In Cloud Run bereitstellen

In diesem Abschnitt stellen Sie den Dienst mit gcloud run deploy bereit. Mit diesem Befehl wird Ihr Container aus dem Quellcode erstellt und mit den erforderlichen GPU- und Netzwerkkonfigurationen in Cloud Run bereitgestellt.

Dienstkonto erstellen

Erstellen Sie für diese Anwendung ein dediziertes Dienstkonto und gewähren Sie ihm nur die erforderlichen Berechtigungen.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

Netzwerkkonfiguration

Für eine optimale Leistung beim Herunterladen großer Modelle sollten Sie ausgehenden Direct VPC-Traffic verwenden. Dadurch kann der Container über das private Google-Netzwerk auf Cloud Storage zugreifen und das öffentliche Internet und NAT-Gateways umgehen. Die folgenden Flags werden im Befehl „gcloud run deploy“ verwendet:

  • --network: Stellt eine Verbindung zur default-VPC her. Achten Sie darauf, dass dieses Netzwerk vorhanden ist und ein Subnetz in Ihrer Region mit aktiviertem privaten Google-Zugriff enthält.
  • --subnet: Das spezifische Subnetz in Ihrer Region (in der Regel default, wenn Sie das Standardnetzwerk verwenden).
  • --vpc-egress: Setzen Sie diese Option auf all-traffic, um den gesamten ausgehenden Traffic über die VPC zu leiten.

Bereitstellungsbefehl

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. Dienst testen

Nach der Bereitstellung können Sie über die Ollama API mit Ihrem Gemma 3-Modell interagieren.

Service-URL abrufen

Rufen Sie die URL Ihres bereitgestellten Cloud Run-Dienstes ab.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

Inferenz ausführen

Senden Sie mit curl einen Prompt an das Modell. Sie können "stream": false festlegen, um die vollständige Antwort in einem einzelnen JSON-Objekt zu erhalten, und jq verwenden, um nur den Text zu extrahieren.

Hinweis: Wenn Sie ein größeres Modell wie gemma3:27b verwenden, müssen Sie den Modellnamen im folgenden JSON ändern.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Cloud Run-Dokumentation zu lesen.

Behandelte Themen

  • Gemma-Modell auf einer Cloud Run RTX 6000 Pro-GPU bereitstellen
  • Modell während des Containerstarts gleichzeitig aus Cloud Storage herunterladen

9. Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen oder die einzelnen Ressourcen entfernen.

Option 1: Ressourcen löschen

Cloud Run-Dienst löschen

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

Dienstkonto löschen

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

Cloud Storage-Bucket löschen

gcloud storage rm --recursive gs://$MODEL_BUCKET

Container-Image löschen

Bei diesem Build wurde ein Container-Image in Artifact Registry erstellt. Sie können den Bildnamen finden und das Bild löschen.

Listen Sie Images auf, um den genauen Namen zu finden (normalerweise gcr.io/PROJECT_ID/SERVICE_NAME).

gcloud container images list --filter="name:$SERVICE_NAME"

Löschen Sie das Bild (ersetzen Sie IMAGE_NAME durch das Ergebnis von oben).

gcloud container images delete <IMAGE_NAME> --force-delete-tags

Option 2: Projekt löschen

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie Ressourcen verwalten 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.