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

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

2. Hinweis

APIs aktivieren

Bevor Sie mit diesem Codelab beginnen können, müssen Sie die folgenden APIs aktivieren:

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

GPU-Kontingent

Kontingenterhöhung für eine unterstützte Region anfordern 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. Wenn Sie dieses Modell verwenden möchten, fordern Sie das Hugging Face-Nutzerzugriffstoken mit der Berechtigung „Lesen“ an. Darauf wird später als YOUR_HF_TOKEN Bezug genommen.

Außerdem müssen Sie den Nutzungsbedingungen zustimmen, um das Modell verwenden zu können: 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 Inferenz-Ergebnisses.

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 dem folgenden Befehl:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Hugging Face-Zugriffstoken mit Secret Manager 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. Bucket zum Hosten des feinabgestimmten Modells erstellen:
    gcloud storage buckets create -l us-central1 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 die Batchinferenz für das Modell aus. Für diesen Prozess wird eine einzelne L4-GPU verwendet.
  • Schreibt die Ergebnisse auf die lokale Festplatte. Die Daten 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-Quellcodebereitstellung und führen ihn dann aus. Dieser Schritt umfasst auch die Cloud Run-Flags für die Volume-Bereitstellung 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
    
    Es kann einige Minuten dauern, bis der Job abgeschlossen ist. Den Status können Sie über den Link in der Ausgabe des letzten Befehls prüfen.

Erfolg bestätigen

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

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 die Inhalte im Browser aufzurufen.

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

6. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Cloud Run-Dokumentation zu lesen.

Behandelte Themen

  • Batchinferenz 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 inference-job-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 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.