Exécuter une inférence par lot sur des tâches Cloud Run

1. Introduction

Présentation

Dans cet atelier de programmation, vous allez utiliser des jobs Cloud Run pour exécuter une inférence par lot à l'aide du LLM Llama 3.2-1b de Meta et de vLLM, optimisés par Cloud Run Jobs GPU. Vous écrirez les résultats directement dans Cloud Storage à l'aide des installations de volume Cloud Run.

Points abordés

  • Comment effectuer une inférence par lot à l'aide de Cloud Run Jobs GPU
  • Comment écrire dans Cloud Storage à l'aide des installations de volume Cloud Run

2. Avant de commencer

Activer les API

Avant de commencer à utiliser cet atelier de programmation, activez les API suivantes en exécutant :

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

Quota de GPU

Demandez une augmentation de quota pour une région compatible. Le quota est nvidia_l4_gpu_allocation_no_zonal_redundancy, sous l'API Cloud Run Admin.

Remarque : Si vous utilisez un nouveau projet, l'activation de l'API et l'affichage des quotas sur cette page peuvent prendre quelques minutes.

Hugging Face

Cet atelier de programmation utilise un modèle hébergé sur Hugging Face. Pour obtenir ce modèle, demandez le jeton d'accès utilisateur Hugging Face avec l'autorisation "Read" (Lecture). Vous y ferez référence ultérieurement en tant que YOUR_HF_TOKEN.

Vous devrez également accepter les conditions d'utilisation pour utiliser le modèle : https://huggingface.co/meta-llama/Llama-3.2-1B

3. Prérequis

Cette section inclut des instructions pour configurer les ressources suivantes :

  • Compte de service IAM et autorisations IAM associées.
  • Secret Secret Manager pour stocker votre jeton Hugging Face.
  • Bucket Cloud Storage pour stocker le résultat de votre inférence.

Pour configurer les ressources requises, procédez comme suit :

  1. Définissez les variables d'environnement pour cet atelier de programmation :
    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. Créez le compte de service en exécutant :
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Utilisez Secret Manager pour stocker le jeton d'accès Hugging Face :
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. Accordez à votre compte de service le rôle Accesseur de secrets de Secret Manager :
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. Créez un bucket pour héberger votre modèle affiné :
    gcloud storage buckets create -l europe-west4 gs://${BUCKET_NAME}
    
  6. Accordez à votre compte de service l'accès au bucket :
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. Créez un dépôt Artifact Registry pour stocker l'image de conteneur. Si vous avez déjà utilisé des déploiements de source Cloud Run dans votre projet, ignorez cette étape.
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. Créer le job Cloud Run

Dans cette section, vous allez créer le code qui effectue les opérations suivantes :

  • Importe le modèle Llama depuis Hugging Face
  • Effectue une inférence par lot sur le modèle. Le job utilise un seul GPU L4 pour ce processus.
  • Écrit les résultats sur le disque local. Ils sont écrits dans Cloud Storage via des installations de volume.

Pour créer le job Cloud Run et un Dockerfile, procédez comme suit :

  1. Créez un répertoire pour héberger le code de votre job d'affinage :
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. Créez un fichier nommé 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. Créez 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. Déployer et exécuter le job

Lors de cette étape, vous allez créer le job Cloud Run à l'aide du déploiement de source Cloud Run, puis l'exécuter. Cette étape inclut également les indicateurs d'installation de volume Cloud Run pour stocker les résultats.

  1. Créez le 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
    
    Cette commande crée l'image à partir de la source et déploie le job. Cette opération prendra un certain temps.
  2. Exécutez le job :
    gcloud run jobs execute inference-job --region $REGION --async
    
    L'exécution du job prend quelques minutes. Vous pouvez vérifier l'état à l'aide du lien fourni dans la sortie de la dernière commande.

Confirmer la réussite

Pour confirmer que votre job s'est exécuté correctement, consultez les journaux du job, comme dans la sortie de la dernière commande.

Vérifiez les résultats dans le bucket Cloud Storage :

Dans la console :

  1. Accédez à Cloud Storage.
  2. Sélectionnez le bucket commençant par inference-codelab.
  3. Sélectionnez output.txt.
  4. Cliquez sur URL authentifiée pour afficher le contenu dans le navigateur.

Le contenu du fichier doit correspondre aux quatre invites et à leurs sorties.

6. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Nous vous recommandons de consulter la documentation Cloud Run.

Points abordés

  • Comment effectuer une inférence par lot à l'aide de Cloud Run Jobs GPU
  • Comment écrire dans Cloud Storage à l'aide des installations de volume Cloud Run

7. Effectuer un nettoyage

Pour supprimer le job Cloud Run, accédez à Cloud Run Cloud Console sur https://console.cloud.google.com/run et supprimez le job inference-job.

Pour supprimer l'ensemble du projet, accédez à Gérer les ressources, sélectionnez le projet que vous avez créé à l'étape 2, puis choisissez Supprimer. Si vous supprimez le projet, vous devrez modifier les projets dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.