Batch-Inferenz in Cloud Run-Jobs ausführen

1. Einführung

Übersicht

In diesem Codelab verwenden Sie Cloud Run-Jobs, um Batchinferenzen mit dem Llama 3.2-1b LLM von Meta und vLLM auszuführen, die von Cloud Run-Jobs-GPUs unterstützt werden. Sie schreiben die Ergebnisse direkt in Cloud Storage, indem Sie Cloud Run-Volume-Bereitstellungen verwenden.

Lerninhalte

  • Batchinferenzen mit Cloud Run-Jobs-GPUs durchführen
  • Mit Cloud Run-Volume-Bereitstellungen in Cloud Storage schreiben

2. Hinweis

APIs aktivieren

Bevor Sie dieses Codelab verwenden können, aktivieren Sie die folgenden APIs, indem Sie Folgendes ausführen:

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

GPU-Kontingent

Fordern Sie eine Kontingenterhöhung für eine unterstützte Region an. Das Kontingent ist nvidia_l4_gpu_allocation_no_zonal_redundancy unter Cloud Run Admin API.

Hinweis: Wenn Sie ein neues Projekt verwenden, kann es einige Minuten dauern, bis die Kontingente auf dieser Seite angezeigt werden.

Hugging Face

In diesem Codelab wird ein Modell verwendet, das auf Hugging Face gehostet wird. Um dieses Modell zu erhalten, fordern Sie das Hugging Face-Nutzerzugriffstoken mit der Berechtigung „Lesen“ an. Sie verweisen später als YOUR_HF_TOKEN darauf.

Außerdem müssen Sie den Nutzungsbedingungen zustimmen, um das Modell zu verwenden: https://huggingface.co/meta-llama/Llama-3.2-1B

3. Einrichtung und Anforderungen

In diesem Abschnitt finden Sie eine Anleitung zum Einrichten der folgenden Ressourcen:

  • IAM-Dienstkonto und zugehörige IAM-Berechtigungen
  • Secret Manager-Secret zum Speichern Ihres Hugging Face-Tokens
  • Cloud Storage-Bucket zum Speichern des Inferenzergebnisses

So richten Sie die erforderlichen Ressourcen ein:

  1. Legen Sie Umgebungsvariablen für dieses Codelab fest:
    export PROJECT_ID=<your_project_id>
    export REGION=<your_region>
    export HF_TOKEN=<YOUR_HF_TOKEN>
    
    export SERVICE_ACCOUNT=inference-service-account
    export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
    export SECRET_ID=hugging-face-token
    export BUCKET_NAME=inference-codelab-${PROJECT_ID}
    
  2. Erstellen Sie das Dienstkonto mit folgendem Befehl:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Verwenden Sie Secret Manager, um das Hugging Face-Zugriffstoken zu speichern:
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. Weisen Sie Ihrem Dienstkonto die Rolle „Secret Manager Secret Accessor“ zu:
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. Erstellen Sie einen Bucket zum Hosten Ihres abgestimmten Modells:
    gcloud storage buckets create -l europe-west4 gs://${BUCKET_NAME}
    
  6. Gewähren Sie Ihrem Dienstkonto Zugriff auf den Bucket:
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. Erstellen Sie ein Artifact Registry-Repository zum Speichern des Container-Images. Wenn Sie in Ihrem Projekt bereits Cloud Run-Quellbereitstellungen verwendet haben, überspringen Sie diesen Schritt.
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. Cloud Run-Job erstellen

In diesem Abschnitt erstellen Sie den Code, der Folgendes ausführt:

  • Importiert das Llama-Modell aus Hugging Face
  • Führt Batchinferenzen für das Modell aus. Für diesen Vorgang verwendet der Job eine einzelne L4-GPU.
  • Schreibt die Ergebnisse auf die lokale Festplatte. Diese werden über Volume-Bereitstellungen in Cloud Storage geschrieben.

So erstellen Sie den Cloud Run-Job und ein Dockerfile:

  1. Erstellen Sie ein Verzeichnis zum Hosten des Codes für den Feinabstimmungsjob:
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. Erstellen Sie eine Datei mit dem Namen main.py:
    # SPDX-License-Identifier: Apache-2.0
    from vllm import LLM, SamplingParams
    
    # Sample prompts.
    prompts = [
        "Cloud Run is",
        "The future of AI is",
        "The capital of Germany is",
        "python as a programming language is",
    ]
    # Create a sampling params object.
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    
    # Create an LLM.
    llm = LLM(model="meta-llama/Llama-3.2-1B")
    # Generate texts from the prompts. The output is a list of RequestOutput objects
    # that contain the prompt, generated text, and other information.
    outputs = llm.generate(prompts, sampling_params)
    
    # Save the outputs to disk
    with open("/results/output.txt", "w") as f:
        for output in outputs:
            prompt = output.prompt
            generated_text = output.outputs[0].text
            f.write(f"Prompt: {prompt!r}, Generated text: {generated_text!r}\n")
    
    print(f"Wrote {len(outputs)} to disk.")
    
  3. Erstellen Sie ein Dockerfile:
    FROM python:3.12
    ADD main.py .
    RUN python -m pip install --upgrade pip setuptools
    RUN pip install vllm
    CMD ["python", "./main.py"]
    

5. Job bereitstellen und ausführen

In diesem Schritt erstellen Sie den Cloud Run-Job mit der Cloud Run-Quellbereitstellung und führen ihn dann aus. Dieser Schritt enthält auch die Cloud Run-Volume-Bereitstellungsflags zum Speichern von Ergebnissen.

  1. Cloud Run-Job erstellen:
    gcloud run jobs deploy inference-job \
      --region $REGION \
      --source . \
      --gpu=1 \
      --set-secrets HF_TOKEN=${SECRET_ID}:latest \
      --add-volume name=results,type=cloud-storage,bucket=${BUCKET_NAME} \
      --add-volume-mount volume=results,mount-path=/results \
      --service-account $SERVICE_ACCOUNT_EMAIL
    
    Mit diesem Befehl wird das Image aus der Quelle erstellt und der Job bereitgestellt. Das kann einige Zeit dauern.
  2. Job ausführen:
    gcloud run jobs execute inference-job --region $REGION --async
    
    Die Ausführung des Jobs dauert einige Minuten. Sie können den Status über den Link prüfen, der in der Ausgabe des letzten Befehls angegeben ist.

Erfolg bestätigen

Um zu bestätigen, dass der Job erfolgreich ausgeführt wurde, sehen Sie sich die Logs des Jobs an, wie in der Ausgabe des letzten Befehls.

Prüfen Sie die Ergebnisse im Cloud Storage-Bucket:

In der Console:

  1. Cloud Storage aufrufen
  2. Wählen Sie den Bucket aus, der mit inference-codelab beginnt.
  3. Wählen Sie output.txt aus.
  4. Klicken Sie auf Authentifizierte URL , um den Inhalt im Browser anzusehen.

Der Inhalt der Datei sollte die vier Prompts und ihre Ausgaben sein.

6. Glückwunsch!

Sie haben das Codelab abgeschlossen.

Wir empfehlen, die Cloud Run-Dokumentation zu lesen.

Behandelte Themen

  • Batchinferenzen mit Cloud Run-Jobs-GPUs durchführen
  • Mit Cloud Run-Volume-Bereitstellungen in Cloud Storage schreiben

7. Bereinigen

Wenn Sie den Cloud Run-Job löschen möchten, rufen Sie die Cloud Run-Cloud Console unter https://console.cloud.google.com/run auf und löschen Sie den Job inference-job.

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 wählen Sie „Löschen“ aus. 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.