Come eseguire l'inferenza batch sui job Cloud Run

1. Introduzione

Panoramica

In questo codelab, utilizzerai i job Cloud Run per eseguire l'inferenza batch utilizzando Llama 3.2-1b LLM di Meta e vLLM basato sulla GPU Cloud Run Jobs. Scriverai i risultati direttamente in Cloud Storage utilizzando i montaggi dei volumi di Cloud Run.

Obiettivi didattici

  • Come eseguire l'inferenza batch utilizzando la GPU di Cloud Run Jobs
  • Come scrivere in Cloud Storage utilizzando i volumi montati di Cloud Run

2. Prima di iniziare

Abilita API

Prima di poter iniziare a utilizzare questo codelab, abilita le seguenti API eseguendo:

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

Quota GPU

Richiedi un aumento della quota per una regione supportata. La quota è nvidia_l4_gpu_allocation_no_zonal_redundancy, nell'API Cloud Run Admin.

Nota: se utilizzi un nuovo progetto, potrebbero essere necessari alcuni minuti tra l'abilitazione dell'API e la visualizzazione delle quote in questa pagina.

Hugging Face

Questo codelab utilizza un modello ospitato su Hugging Face. Per ottenere questo modello, richiedi il token di accesso utente di Hugging Face con l'autorizzazione "Lettura". A cui farai riferimento in un secondo momento come YOUR_HF_TOKEN.

Per utilizzare il modello, devi anche accettare i termini di utilizzo: https://huggingface.co/meta-llama/Llama-3.2-1B

3. Configurazione e requisiti

Questa sezione include le istruzioni per configurare le seguenti risorse:

  • Service account IAM e autorizzazioni IAM associate.
  • Secret di Secret Manager per archiviare il token Hugging Face.
  • Bucket Cloud Storage in cui archiviare il risultato dell'inferenza.

Per configurare le risorse richieste:

  1. Imposta le variabili di ambiente per questo codelab:
    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. Crea il service account eseguendo:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Utilizza Secret Manager per archiviare il token di accesso a Hugging Face:
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. Concedi al tuo service account il ruolo Secret Manager Secret Accessor:
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. Crea un bucket per ospitare il modello ottimizzato:
    gcloud storage buckets create -l us-central1 gs://${BUCKET_NAME}
    
  6. Concedi al service account l'accesso al bucket:
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. Crea un repository Artifact Registry per archiviare l'immagine container. Se hai già utilizzato i deployment dell'origine Cloud Run nel tuo progetto, salta questo passaggio.
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. Crea il job Cloud Run

In questa sezione creerai il codice che esegue le seguenti operazioni:

  • Importa il modello Llama da Hugging Face
  • Esegue l'inferenza batch sul modello. Il job utilizza una singola GPU L4 per questo processo.
  • Scrive i risultati sul disco locale. Questi dati vengono scritti in Cloud Storage tramite i montaggi dei volumi.

Per creare il job Cloud Run e un Dockerfile:

  1. Crea una directory per ospitare il codice del job di perfezionamento:
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. Crea un file denominato 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. Crea un 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. Esegui il deployment ed esegui il job

In questo passaggio, creerai il job Cloud Run utilizzando Cloud Run Source Deploy, quindi lo eseguirai. Questo passaggio include anche i flag di montaggio del volume Cloud Run per archiviare i risultati.

  1. Crea il job Cloud Run:
    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
    
    Questo comando crea l'immagine dall'origine e ne esegue il deployment. Il completamento dell'operazione richiederà del tempo.
  2. Esegui il job:
    gcloud run jobs execute inference-job --region $REGION --async
    
    Il completamento del job richiede alcuni minuti. Puoi controllare lo stato utilizzando il link fornito nell'output dell'ultimo comando.

Conferma dell'esito positivo

Per verificare che il job sia stato eseguito correttamente, visualizza i log del job come nell'output dell'ultimo comando.

Controlla i risultati nel bucket Cloud Storage:

Nella console:

  1. Vai a Cloud Storage.
  2. Seleziona il bucket che inizia con inference-codelab.
  3. Seleziona output.txt.
  4. Fai clic su URL di autenticazione per visualizzare i contenuti nel browser.

I contenuti del file devono essere i quattro prompt e i relativi output.

6. Complimenti!

Congratulazioni per aver completato il codelab.

Ti consigliamo di consultare la documentazione di Cloud Run.

Argomenti trattati

  • Come eseguire l'inferenza batch utilizzando la GPU di Cloud Run Jobs
  • Come scrivere in Cloud Storage utilizzando i volumi montati di Cloud Run

7. Esegui la pulizia

Per eliminare il job Cloud Run, vai alla console Google Cloud di Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il job inference-job.

Per eliminare l'intero progetto, vai a Gestisci risorse, seleziona il progetto che hai creato nel passaggio 2 e scegli Elimina. Se elimini il progetto, dovrai cambiarlo in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.