LLM-Inferenzen auf Cloud Run-GPUs mit Ollama ausführen


In dieser Anleitung erfahren Sie, wie Sie Gemma 2 von Google, ein offenes Large Language Model (LLM), in einem GPU-fähigen Cloud Run-Dienst bereitstellen (für schnelle Inferenz).

Sie verwenden Ollama, einen LLM-Inferenzserver für offene Modelle. Nachdem Sie die Anleitung abgeschlossen haben, können Sie auch andere offene Modelle ausprobieren, die von Ollama unterstützt werden, darunter Llama 3.1 (8B), Mistral (7B) und Qwen2 (7B).

Ziele

  • Ollama mit dem Gemma 2-Modell in einem GPU-fähigen Cloud Run-Dienst bereitstellen.
  • Prompts an den Ollama-Dienst über seinen privaten Endpunkt senden.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. Installieren und initialisieren Sie die gcloud CLI.
  8. Beantragen Sie ein Total Nvidia L4 GPU allocation, per project per region-Kontingent unter „Cloud Run Admin API“ auf der Seite Kontingente und Systemlimits, um diese Anleitung abzuschließen.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Anleitung benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

gcloud einrichten

So konfigurieren Sie die Google Cloud CLI für Ihren Cloud Run-Dienst:

  1. Legen Sie ein Standardprojekt fest:

    gcloud config set project PROJECT_ID

    Klicken Sie auf das Symbol , um die Variable PROJECT_ID durch den Namen des Projekts zu ersetzen, das Sie für diese Anleitung erstellt haben. So ist sichergestellt, dass für alle Einträge auf dieser Seite, die auf PROJECT_ID verweisen, bereits der richtige Wert angegeben ist.

  2. Konfigurieren Sie die Google Cloud CLI so, dass die Region us-central1 für Cloud Run-Befehle verwendet wird.

    gcloud config set run/region us-central1

Artifact Registry-Docker-Repository erstellen

Erstellen Sie ein Docker-Repository zum Speichern der Container-Images für diese Anleitung:

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

Ersetzen Sie REPOSITORY durch den Namen des Repositorys. Beispiel: repo.

Mit Docker ein Container-Image mit Ollama und Gemma erstellen

  1. Erstellen Sie ein Verzeichnis für den Ollama-Dienst und ändern Sie Ihr Arbeitsverzeichnis in dieses neue Verzeichnis:

    mkdir ollama-backend
    cd ollama-backend
  2. Dockerfile-Datei erstellen

    FROM ollama/ollama:0.3.6
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # 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:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

Modellgewichte im Container-Image speichern, um Instanzen schneller zu starten

Google empfiehlt, die Modellgewichte für Gemma 2 (9 B) und Modelle ähnlicher Größe direkt im Container-Image zu speichern.

Modellgewichte sind die numerischen Parameter, die das Verhalten eines LLM definieren. Ollama muss diese Dateien vollständig lesen und die Gewichte beim Starten der Containerinstanz in den GPU-Speicher (VRAM) laden, bevor es mit der Ausführung von Inferenzanfragen beginnen kann.

Bei Cloud Run ist ein schneller Start der Containerinstanz wichtig, um die Anfragelatenz zu minimieren. Wenn die Startzeit Ihrer Containerinstanz lang ist, dauert es länger, bis der Dienst von null auf eine Instanz skaliert wird. Bei einem Traffic-Anstieg dauert es auch länger, bis der Dienst horizontal skaliert wird.

Speichern Sie die Modelldateien im Container-Image selbst, um einen schnellen Start zu ermöglichen. Das ist schneller und zuverlässiger als das Herunterladen der Dateien während des Starts von einem Remote-Speicherort. Der interne Container-Image-Speicher von Cloud Run ist für die Verarbeitung von Traffic-Spitzen optimiert. So kann das Dateisystem des Containers beim Starten einer Instanz schnell eingerichtet werden.

Die Modellgewichte für Gemma 2 (9B) belegen 5,4 GB Speicherplatz. Größere Modelle haben größere Modellgewichtsdateien, die sich möglicherweise nicht im Container-Image speichern lassen. Eine Übersicht über die Vor- und Nachteile finden Sie unter Best Practices: KI-Inferenz in Cloud Run mit GPUs.

Erstellen Sie mithilfe von Cloud Build das Container-Image

So erstellen Sie das Container-Image mit Cloud Build und schieben es in das Artifact Registry-Repository:

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

Achten Sie auf die folgenden Hinweise:

  • Für einen schnelleren Build wird mit diesem Befehl ein leistungsstarker Maschinentyp mit mehr CPU- und Netzwerkbandbreite ausgewählt.
  • Der Build dauert etwa sieben Minuten.
  • Alternativ können Sie das Image lokal mit Docker erstellen und per Push in Artifact Registry übertragen. Je nach Netzwerkbandbreite kann dies langsamer sein als die Ausführung in Cloud Build.

Ollama als Cloud Run-Dienst bereitstellen

Da das Container-Image in einem Artifact Registry-Repository gespeichert ist, können Sie Ollama jetzt als Cloud Run-Dienst bereitstellen.

Dediziertes Dienstkonto erstellen

Erstellen Sie ein spezielles Dienstkonto, das vom Ollama-Dienst als Dienstidentität verwendet wird:

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

Ersetzen Sie OLLAMA_IDENTITY durch den Namen des Dienstkontos, das Sie erstellen möchten, z. B. ollama.

Es empfiehlt sich, für jeden Cloud Run-Dienst ein eigenes Dienstkonto mit den minimal erforderlichen Berechtigungen zu erstellen. Der Ollama-Dienst muss keine Google Cloud APIs aufrufen. Daher müssen seinem Dienstkonto keine Berechtigungen gewährt werden.

Dienst bereitstellen

Stellen Sie den Dienst in Cloud Run bereit:

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
  --timeout=600

Beachten Sie die folgenden wichtigen Flags in diesem Befehl:

  • --concurrency 4 ist auf den Wert der Umgebungsvariablen OLLAMA_NUM_PARALLEL festgelegt.
  • --gpu 1 mit --gpu-type nvidia-l4 weist jeder Cloud Run-Instanz im Dienst eine NVIDIA L4-GPU zu.
  • --no-allow-authenticated schränkt den nicht authentifizierten Zugriff auf den Dienst ein. Wenn Sie den Dienst privat nutzen, können Sie die integrierte Identity and Access Management (IAM)-Authentifizierung von Cloud Run für die Dienst-zu-Dienst-Kommunikation verwenden. Weitere Informationen finden Sie unter Zugriff mit IAM verwalten.
  • --no-cpu-throttling ist erforderlich, um die GPU zu aktivieren.
  • --service-account legt die Dienstidentität des Dienstes fest.

Nebenläufigkeit für optimale Leistung festlegen

In diesem Abschnitt finden Sie weitere Informationen zu den empfohlenen Einstellungen für die Parallelität. Für eine optimale Anfragelatenz muss die Einstellung --concurrency der Umgebungsvariablen OLLAMA_NUM_PARALLEL von Ollama entsprechen.

  • Mit OLLAMA_NUM_PARALLEL wird festgelegt, wie viele Anfrageslots für jedes Modell verfügbar sind, um Inferenzanfragen gleichzeitig zu verarbeiten.
  • Mit --concurrency wird festgelegt, wie viele Anfragen Cloud Run gleichzeitig an eine Ollama-Instanz sendet.

Wenn --concurrency OLLAMA_NUM_PARALLEL überschreitet, kann Cloud Run mehr Anfragen an ein Modell in Ollama senden, als für die verfügbaren Anfrageslots vorgesehen sind. Dies führt zu einer Anfragewarteschlange in Ollama, was die Anfragelatenz für die anstehenden Anfragen erhöht. Außerdem führt es zu einem weniger reaktionsfähigen Autoscaling, da die anstehenden Anfragen nicht dazu führen, dass Cloud Run skaliert und neue Instanzen startet.

Ollama unterstützt auch die Bereitstellung mehrerer Modelle von einer GPU aus. Um Anfragen in der Ollama-Instanz vollständig zu vermeiden, sollten Sie --concurrency weiterhin auf OLLAMA_NUM_PARALLEL festlegen.

Beachten Sie, dass parallele Anfragen bei einer Erhöhung von OLLAMA_NUM_PARALLEL auch länger dauern.

Auslastung optimieren

Für eine optimale GPU-Auslastung erhöhen Sie --concurrency, wobei der Wert unter dem Doppelten von OLLAMA_NUM_PARALLEL liegen muss. Dies führt zwar zu einer Anfragewarteschlange in Ollama, kann aber die Auslastung verbessern: Ollama-Instanzen können Anfragen aus ihrer Warteschlange sofort verarbeiten und die Warteschlangen helfen, Trafficspitzen abzufangen.

Bereitgestellten Ollama-Dienst mit curl testen

Nachdem Sie den Ollama-Dienst bereitgestellt haben, können Sie Anfragen an ihn senden. Wenn Sie jedoch eine Anfrage direkt senden, antwortet Cloud Run mit HTTP 401 Unauthorized. Das ist beabsichtigt, da eine LLM-Inferenz-API für andere Dienste gedacht ist, z. B. für eine Frontend-Anwendung. Weitere Informationen zur Dienst-zu-Dienst-Authentifizierung in Cloud Run finden Sie unter Dienst-zu-Dienst-Authentifizierung.

Wenn Sie Anfragen an den Ollama-Dienst senden möchten, fügen Sie den Anfragen einen Header mit einem gültigen OIDC-Token hinzu, z. B. mit dem Cloud Run-Entwicklerproxy:

  1. Starten Sie den Proxy und wählen Sie Y aus, wenn Sie aufgefordert werden, die Komponente cloud-run-proxy zu installieren:

    gcloud run services proxy ollama-gemma --port=9090
  2. Senden Sie eine Anfrage an den Proxy in einem separaten Terminaltab und lassen Sie den Proxy laufen. Der Proxy wird auf localhost:9090 ausgeführt:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

    Dieser Befehl sollte eine Streamingausgabe ähnlich der folgenden liefern:

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

Bereinigen

  1. Löschen Sie sonstige Google Cloud-Ressourcen, die in dieser Anleitung erstellt wurden:

Nächste Schritte