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

1. Einführung

Übersicht

Cloud Run unterstützt seit Kurzem GPUs. Sie ist als öffentliche Vorschau mit Warteliste verfügbar. 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 Autoscaling von Cloud Run gilt weiterhin. 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 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, in dem vLLM, eine Inferenz-Engine für Produktionssysteme, ausgeführt wird. In diesem Codelab wird Gemma 2 von Google verwendet, ein 2-Milliarden-Parameter-Modell mit Instruction Tuning.

Lerninhalte

  • GPUs in Cloud Run verwenden
  • So rufen Sie ein Modell mit Hugging Face ab.
  • So stellen Sie das Gemma 2-Modell mit 2 Milliarden Parametern von Google mit Instruction Tuning in Cloud Run bereit und verwenden vLLM als Inferenz-Engine.
  • So rufen Sie den Backend-Dienst auf, um Sätze zu vervollständigen.

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 Webservices aus dem Quellcode.
  • Sie haben ein Hugging Face-Konto und haben die Gemma 2 2b-Lizenz unter https://huggingface.co/google/gemma-2-2b-it bestätigt. 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 Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung angezeigt. Klicken Sie in diesem Fall auf Weiter.

d95252b003979716.png

Die Bereitstellung und Verbindung mit Cloud Shell sollte nur wenige Augenblicke dauern.

7833d5e1c5d18f54.png

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklertools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Ein Großteil, wenn nicht sogar die gesamte Arbeit in diesem Codelab kann mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in 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 den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass 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 dieses Codelab verwenden 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=us-central1
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"

Zweitens weisen Sie dem Dienstkonto die Rolle „Vertex AI User“ 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 (2B)-Modell von Hugging Face herunterzuladen. Weitere Informationen zu Secrets und Cloud Build

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

Gewähren Sie dem Compute-Standarddienstkonto Zugriff auf das HF_TOKEN-Secret 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 us-central1

Erstellen Sie als Nächstes ein Dockerfile, in das das Secret aus Secret Manager eingebunden wird. Weitere Informationen zum Docker Buildx-Flag „–secrets“

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli 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} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

cloudbuild.yaml-Datei erstellen

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: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

Reichen Sie zum Schluss einen Build ein.

gcloud builds submit --config=cloudbuild.yaml

Der Build kann etwa 8 Minuten dauern.

6. Dienst bereitstellen

Sie können das Image jetzt 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 Bild mehr Zeit zum Laden hat. Andernfalls erhalten Sie vom Health-Check 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-Entwicklungsproxy-Dienst verwenden, der automatisch ein ID-Token für Sie hinzufügt, oder die Dienst-URL direkt mit curl aufrufen.

Cloud Run-Entwicklungsproxydienst verwenden

So verwenden Sie den Cloud Run-Entwicklungsproxy:

Führen Sie zuerst den folgenden Befehl aus:

gcloud run services proxy $SERVICE_NAME --region us-central1

Als Nächstes den Dienst mit „curl“ aufrufen

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)')

Dienst mit „curl“ aufrufen

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!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Dokumentation zu Cloud Run zu lesen.

Behandelte Themen

  • GPUs in Cloud Run verwenden
  • So rufen Sie ein Modell mit Hugging Face ab.
  • So stellen Sie das Gemma 2-Modell (2B) von Google in Cloud Run bereit und verwenden vLLM als Inferenz-Engine.
  • So rufen Sie den Backend-Dienst auf, um Sätze zu vervollständigen.

9. Bereinigen

Damit Ihnen keine unbeabsichtigten Gebühren in Rechnung gestellt werden (z. B. wenn die Cloud Run-Dienste versehentlich öfter aufgerufen werden als Ihre monatliche Cloud Run-Aufrufkontingent 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 die Cloud Run Cloud Console unter https://console.cloud.google.com/run auf und löschen Sie den vllm-gemma-2-2b-Dienst. 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 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.