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
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.
Hinweise
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- Installieren und initialisieren Sie die gcloud CLI.
- 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:
-
Artifact Registry-Administrator (
roles/artifactregistry.admin
) -
Cloud Build-Bearbeiter (
roles/cloudbuild.builds.editor
) -
Cloud Run-Administrator (
roles/run.admin
) -
Create Service Accounts (
roles/iam.serviceAccountCreator
) -
Projekt-IAM-Administrator (
roles/resourcemanager.projectIamAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
) -
Storage-Administrator (
roles/storage.admin
)
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:
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.
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
Erstellen Sie ein Verzeichnis für den Ollama-Dienst und ändern Sie Ihr Arbeitsverzeichnis in dieses neue Verzeichnis:
mkdir ollama-backend cd ollama-backend
Dockerfile
-Datei erstellen
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 UmgebungsvariablenOLLAMA_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:
Starten Sie den Proxy und wählen Sie
Y
aus, wenn Sie aufgefordert werden, die Komponentecloud-run-proxy
zu installieren:gcloud run services proxy ollama-gemma --port=9090
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
- Löschen Sie sonstige Google Cloud-Ressourcen, die in dieser Anleitung erstellt wurden: