LLM-Inferenz auf Cloud Run-GPUs mit vLLM und dem OpenAI Python SDK ausführen

1. Einführung

Übersicht

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. Vor Kurzem wurde GPU-Unterstützung für Cloud Run hinzugefügt.

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

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

Der Dienst ist ein Backend-Dienst, der vLLM ausführt, eine Inferenz-Engine für Produktionssysteme. In diesem Codelab wird das Gemma 2-Modell von Google mit 2 Milliarden Parametern verwendet, das für die Anleitung optimiert wurde.

Lerninhalte

  • Verwendung von GPUs in Cloud Run
  • Verwendung von Hugging Face zum Abrufen eines Modells
  • Bereitstellung des für die Anleitung optimierten Gemma 2-Modells (2B) von Google in Cloud Run mit vLLM als Inferenz-Engine
  • Aufrufen des Backend-Dienstes zum Vervollständigen von Sätzen

2. Einrichtung und Anforderungen

Voraussetzungen

  • Sie sind in der Cloud Console angemeldet.
  • Sie haben bereits einen Cloud Run-Dienst bereitgestellt. Folgen Sie beispielsweise der Kurzanleitung zum Bereitstellen eines Webdienstes aus Quellcode, um loszulegen.
  • Sie haben ein Hugging Face-Konto und die Gemma 2-Lizenz (2B) unter https://huggingface.co/google/gemma-2-2b-it akzeptiert. Andernfalls können Sie das Modell nicht herunterladen.
  • Sie haben ein Zugriffstoken erstellt, das Zugriff auf das Modell google/gemma-2-2b-it hat.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Wenn Sie die Cloud Shell zum ersten Mal starten, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter.

d95252b003979716.png

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

7833d5e1c5d18f54.png

Diese virtuelle Maschine enthält alle Entwicklungstools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. APIs aktivieren und Umgebungsvariablen festlegen

APIs aktivieren

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

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

Umgebungsvariablen einrichten

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

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=europe-west1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. Dienstkonto erstellen

Dieses Dienstkonto wird verwendet, um den Cloud Run-Dienst zu erstellen und auf ein Secret aus Secret Manager zuzugreifen.

Erstellen Sie zuerst das Dienstkonto mit diesem Befehl:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secret manager"

Weisen Sie dem Dienstkonto als Nächstes die Rolle „Vertex AI-Nutzer“ zu.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

Erstellen Sie nun in Secret Manager ein Secret mit dem Namen „HF_TOKEN“ für Ihr Hugging Face-Zugriffstoken. Cloud Build verwendet das Dienstkonto, um zur Build-Zeit auf dieses Secret zuzugreifen und das Gemma 2-Modell (2B) von Hugging Face abzurufen. Weitere Informationen zu Secrets und Cloud Build hier.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

Gewähren Sie außerdem dem Standarddienstkonto für Compute-Dienste Zugriff auf das Secret „HF_TOKEN“ in Secret Manager, wenn Sie das Image erstellen.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. Image in Artifact Registry erstellen

Erstellen Sie zuerst ein Repository in Artifact Registry.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location $REGION

Erstellen Sie als Nächstes eine Dockerfile, die das Secret aus Secret Manager enthält. Weitere Informationen zum Docker-Flag „buildx –secrets“

FROM vllm/vllm-openai:v0.11.0

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    hf download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    --gpu-memory-utilization 0.85 \
    --max-num-seqs 256 \
    --max-model-len 4096

Erstellen Sie jetzt eine cloudbuild.yaml-Datei.

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: '${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

Senden Sie zum Schluss einen Build.

gcloud builds submit --config=cloudbuild.yaml --substitutions=_LOCATION=$REGION

Der Build kann etwa 8 Minuten dauern.

6. Dienst bereitstellen

Sie können jetzt das Image in Cloud Run bereitstellen. Die Bereitstellung dauert etwa 5 Minuten. Sie müssen die anfängliche Verzögerung für die Systemdiagnose um einige Minuten verlängern, damit das Image mehr Zeit zum Laden hat. Andernfalls erhalten Sie von der Systemdiagnose den Fehler „Deadline Exceeded“.

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

7. Dienst testen

Nach der Bereitstellung können Sie entweder den Cloud Run-Entwicklungsproxydienst verwenden, der automatisch ein ID-Token für Sie hinzufügt, oder die Dienst-URL direkt aufrufen.

Cloud Run-Entwicklungsproxydienst verwenden

So verwenden Sie den Cloud Run-Entwicklungsproxydienst:

Führen Sie zuerst den folgenden Befehl aus:

gcloud run services proxy $SERVICE_NAME --region $REGION

Rufen Sie als Nächstes den Dienst auf:

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

Dienst-URL direkt verwenden

Rufen Sie zuerst die URL für den bereitgestellten Dienst ab.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

Rufen Sie den Dienst auf.

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

Ergebnisse

Die Ergebnisse sollten in etwa so aussehen:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. Glückwunsch!

Sie haben das Codelab abgeschlossen.

Wir empfehlen, die Cloud Run-Dokumentation zu lesen.

Behandelte Themen

  • Verwendung von GPUs in Cloud Run
  • Verwendung von Hugging Face zum Abrufen eines Modells
  • Bereitstellung des Gemma 2-Modells (2B) von Google in Cloud Run mit vLLM als Inferenz-Engine
  • Aufrufen des Backend-Dienstes zum Vervollständigen von Sätzen

9. Bereinigen

Um unbeabsichtigte Kosten zu vermeiden (z. B. wenn die Cloud Run-Dienste versehentlich häufiger aufgerufen werden als Ihre monatliche Zuweisung für Cloud Run-Aufrufe im kostenlosen Kontingent), können Sie entweder den Cloud Run-Dienst oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie den Cloud Run-Dienst löschen möchten, rufen Sie in der Cloud Console unter https://console.cloud.google.com/run Cloud Run auf und löschen Sie den Dienst vllm-gemma-2-2b. Möglicherweise möchten Sie auch das Dienstkonto vllm-gemma-2-2b löschen.

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.