Batch-Inferenz in Cloud Run-Jobs ausführen

1. Einführung

Übersicht

In diesem Codelab verwenden Sie Cloud Run-Jobs, um Batch-Inferenzen mit Meta's Llama 3.2-1b LLM und vLLM auszuführen, die von der GPU von Cloud Run-Jobs unterstützt werden. Sie schreiben die Ergebnisse mithilfe von Cloud Run-Volume-Bereitstellungen direkt in Cloud Storage.

Lerninhalte

  • Batch-Inferenzen mit Cloud Run-Jobs mit GPU durchführen
  • Mit Cloud Run-Volume-Bereitstellungen in Cloud Storage schreiben

2. Hinweis

APIs aktivieren

Bevor Sie dieses Codelab verwenden können, müssen Sie die folgenden APIs aktivieren. Führen Sie dazu Folgendes aus:

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 beträgt nvidia_l4_gpu_allocation_no_zonal_redundancy und wird unter „Cloud Run Admin API“ angezeigt.

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

Hugging Face

In diesem Codelab wird ein Modell verwendet, das auf Hugging Face gehostet wird. Wenn Sie dieses Modell abrufen möchten, fordern Sie das Hugging Face-Nutzerzugriffstoken mit der Berechtigung „Lesen“ an. Diese wird später als YOUR_HF_TOKEN bezeichnet.

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 Inferenzergebnisses.

So richten Sie die erforderlichen Ressourcen ein:

  1. Legen Sie die 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 Befehl:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. So speichern Sie das Hugging Face-Zugriffstoken mit Secret Manager:
    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 optimierten Modells:
    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-Quell-Deployments 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 tut:

  • Importiert das Llama-Modell aus Hugging Face
  • Führt eine Batch-Inferenz auf dem Modell aus. Für den Job wird dabei eine einzelne L4-GPU verwendet.
  • Schreibt die Ergebnisse auf das lokale Laufwerk. Diese 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 Cloud Run Source Deploy und führen ihn dann aus. Dieser Schritt umfasst auch die Cloud Run-Flags für die Volume-Bereitstellung zum Speichern der Ergebnisse.

  1. Erstellen Sie den Cloud Run-Job:
    gcloud beta 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. Dieser Vorgang kann einige Zeit dauern.
  2. Job ausführen:
    gcloud run jobs execute inference-job --region $REGION --async
    
    Der Job dauert einige Minuten. Sie können den Status über den Link in der Ausgabe des letzten Befehls prüfen.

Erfolg bestätigen

Sehen Sie sich die Logs des Jobs in der Ausgabe des letzten Befehls an, um zu prüfen, ob 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 den Inhalt im Browser aufzurufen.

Die Datei sollte die vier Prompts und ihre Ausgaben enthalten.

6. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs.

Lesen Sie die Cloud Run-Dokumentation.

Behandelte Themen

  • Batch-Inferenzen mit Cloud Run-Jobs mit GPU 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 Console für Cloud Run 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 klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können eine Liste aller verfügbaren Projekte aufrufen, indem Sie gcloud projects list ausführen.