Prédiction par lot

La prédiction par lots est une technique utile pour appliquer efficacement des modèles de machine learning à de grands ensembles de données. Au lieu de traiter des points de données individuels, vous pouvez envoyer un lot de données à Gemini pour la prédiction, ce qui vous permet de gagner du temps et des ressources de calcul. Contrairement à la prédiction en ligne, où vous êtes limité à une requête d'entrée à la fois, vous pouvez envoyer un grand nombre de requêtes multimodales dans une seule requête par lot. Vos réponses sont ensuite insérées de manière asynchrone dans l'emplacement de sortie de votre stockage BigQuery ou Cloud Storage.

Les requêtes par lots pour les modèles Gemini font l'objet d'une remise de 50 % par rapport aux requêtes standards. Pour en savoir plus, consultez la page des tarifs.

Cas d'utilisation de la prédiction par lots

Prenons l'exemple d'une librairie en ligne qui contient des milliers de livres dans sa base de données. Au lieu de générer des descriptions individuellement pour chaque livre, ce qui serait chronophage, la boutique peut utiliser la prédiction par lots de Gemini pour traiter toutes les informations sur les livres en une seule fois. Cette approche améliore considérablement l'efficacité en réduisant le temps de traitement global et en limitant les ressources de calcul requises.

La prédiction par lots peut également améliorer la cohérence grâce à l'automatisation. En traitant toutes les descriptions simultanément, le modèle conserve un ton et un style uniformes dans les descriptions de livres, ce qui renforce l'identité de la marque. Cette librairie peut également intégrer la prédiction par lots à son workflow afin de générer automatiquement des descriptions pour les nouvelles entrées de livres. Les efforts manuels sont ainsi éliminés et le site Web reste à jour tout en limitant l'intervention humaine.

Modèles Gemini compatibles avec les prédictions par lots

Les modèles Gemini de base et ajustés suivants sont compatibles avec les prédictions par lots:

Limites

Une fois envoyées, les tâches par lot sont validées et mises en file d'attente en fonction de la capacité disponible. Une fois qu'une tâche commence à s'exécuter, elle est limitée à 24 heures. Si l'opération n'est pas terminée dans ce délai, toutes les demandes terminées seront exportées et vous ne serez facturé que pour les demandes terminées. La durée maximale qu'une job par lot peut passer dans la file d'attente et en cours d'exécution est de 72 heures.

Entrées et sorties de la prédiction par lot

Les requêtes par lots pour les modèles Gemini acceptent les sources de stockage BigQuery et Cloud Storage. Vous pouvez choisir d'exporter les prédictions vers une table BigQuery ou un fichier JSONL dans un bucket Cloud Storage.

Nous vous recommandons d'inclure au moins 25 000 requêtes par tâche dans votre source d'entrée (table ou fichier). Le système de prédiction par lot divise et parallélise les tâches aussi rapidement et efficacement que possible avec les ressources disponibles à ce moment-là. Il n'y a pas de nombre maximal de requêtes par tâche.

Pour en savoir plus sur les quotas et les limites des jobs de prédiction par lot, consultez la section Quotas et limites système de l'IA générative sur Vertex AI.

Prédiction par lots pour Cloud Storage

Préparer les entrées

Entrée Cloud Storage

  • Format de fichier : JSON Lines (JSONL)
  • Emplacement : us-central1
  • Vous devez disposer des autorisations Cloud Storage appropriées pour le compte de service. Pour accorder au compte de service l'autorisation de lecture et d'écriture sur un bucket Cloud Storage, utilisez la commande gcloud iam service-accounts add-iam-policy-binding comme suit :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectUser"
    

    Remplacez les valeurs suivantes :

    • PROJECT_ID : projet dans lequel votre compte de service a été créé.
    • SERVICE_ACCOUNT_ID : ID du compte de service.
Exemple d'entrée (JSONL)

{"request":{"contents": [{"role": "user", "parts": [{"text": "What is the relation between the following video and image samples?"}, {"fileData": {"fileUri": "gs://cloud-samples-data/generative-ai/video/animals.mp4", "mimeType": "video/mp4"}}, {"fileData": {"fileUri": "gs://cloud-samples-data/generative-ai/image/cricket.jpeg", "mimeType": "image/jpeg"}}]}]}}
{"request":{"contents": [{"role": "user", "parts": [{"text": "Describe what is happening in this video."}, {"fileData": {"fileUri": "gs://cloud-samples-data/generative-ai/video/another_video.mov", "mimeType": "video/mov"}}]}]}}
        

Demander un job de prédiction par lots

Spécifiez votre table d'entrée, votre modèle et votre emplacement de sortie Cloud Storage.

REST

Pour créer un job de prédiction par lots, utilisez la méthode projects.locations.batchPredictionJobs.create.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région compatible avec les modèles Gemini.
  • PROJECT_ID : l'ID de votre projet.
  • MODEL_PATH: nom du modèle de l'éditeur, par exemple publishers/google/models/gemini-2.0-flash-001, ou nom du point de terminaison affiné, par exemple projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID, où MODEL_ID est l'ID du modèle affiné.
  • INPUT_URI : emplacement Cloud Storage de votre entrée de prédiction par lots JSONL, par exemple gs://bucketname/path/to/file.jsonl.
  • OUTPUT_FORMAT : pour générer une sortie dans une table BigQuery, spécifiez bigquery. Pour générer la sortie dans un bucket Cloud Storage, spécifiez jsonl.
  • DESTINATION : pour BigQuery, spécifiez bigqueryDestination. Pour Cloud Storage, spécifiez gcsDestination.
  • OUTPUT_URI_FIELD_NAME : pour BigQuery, spécifiez outputUri. Pour Cloud Storage, spécifiez outputUriPrefix.
  • OUTPUT_URI : pour BigQuery, spécifiez l'emplacement de la table, par exemple bq://myproject.mydataset.output_result. La région de l'ensemble de données BigQuery de sortie doit être identique à celle du job de prédiction par lots Vertex AI. Pour Cloud Storage, spécifiez l'emplacement du bucket et du répertoire, par exemple gs://mybucket/path/to/output.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs

Corps JSON de la requête :

{
  "displayName": "my-cloud-storage-batch-prediction-job",
  "model": "MODEL_PATH",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris" : "INPUT_URI"
    }
  },
  "outputConfig": {
    "predictionsFormat": "OUTPUT_FORMAT",
    "DESTINATION": {
      "OUTPUT_URI_FIELD_NAME": "OUTPUT_URI"
    }
  }
}

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON semblable à la suivante.

La réponse inclut un identifiant unique pour le job par lot. Vous pouvez interroger l'état du job par lot à l'aide de BATCH_JOB_ID jusqu'à ce que le job state soit défini sur JOB_STATE_SUCCEEDED. Exemple :

curl \
  -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/batchPredictionJobs/BATCH_JOB_ID

Gen AI SDK for Python

Installer

pip install --upgrade google-genai

Pour en savoir plus, lisez la documentation de référence du SDK.

Définissez les variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

import time

from google import genai
from google.genai.types import CreateBatchJobConfig, JobState, HttpOptions

client = genai.Client(http_options=HttpOptions(api_version="v1"))
# TODO(developer): Update and un-comment below line
# output_uri = "gs://your-bucket/your-prefix"

# See the documentation: https://googleapis.github.io/python-genai/genai.html#genai.batches.Batches.create
job = client.batches.create(
    # To use a tuned model, set the model param to your tuned model using the following format:
    # model="projects/{PROJECT_ID}/locations/{LOCATION}/models/{MODEL_ID}
    model="gemini-2.0-flash-001",
    # Source link: https://storage.cloud.google.com/cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl
    src="gs://cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl",
    config=CreateBatchJobConfig(dest=output_uri),
)
print(f"Job name: {job.name}")
print(f"Job state: {job.state}")
# Example response:
# Job name: projects/%PROJECT_ID%/locations/us-central1/batchPredictionJobs/9876453210000000000
# Job state: JOB_STATE_PENDING

# See the documentation: https://googleapis.github.io/python-genai/genai.html#genai.types.BatchJob
completed_states = {
    JobState.JOB_STATE_SUCCEEDED,
    JobState.JOB_STATE_FAILED,
    JobState.JOB_STATE_CANCELLED,
    JobState.JOB_STATE_PAUSED,
}

while job.state not in completed_states:
    time.sleep(30)
    job = client.batches.get(name=job.name)
    print(f"Job state: {job.state}")
# Example response:
# Job state: JOB_STATE_PENDING
# Job state: JOB_STATE_RUNNING
# Job state: JOB_STATE_RUNNING
# ...
# Job state: JOB_STATE_SUCCEEDED

Résultat de la prédiction par lot

Lorsqu'une tâche de prédiction par lots est terminée, le résultat est stocké dans le bucket Cloud Storage ou la table BigQuery que vous avez spécifié dans votre requête. Pour les lignes réussies, les réponses du modèle sont stockées dans la colonne response. Sinon, les détails de l'erreur sont stockés dans la colonne status en vue d'une inspection plus approfondie.

Pendant les jobs de longue durée, les prédictions terminées sont exportées en continu vers la destination de sortie spécifiée. Cette période commence après 90 minutes. Si le job de prédiction par lots est annulée ou échoue, toutes les prédictions terminées sont exportées.

Exemple de sortie Cloud Storage

{
  "status": "",
  "processed_time": "2024-11-01T18:13:16.826+00:00",
  "request": {
    "contents": [
      {
        "parts": [
          {
            "fileData": null,
            "text": "What is the relation between the following video and image samples?"
          },
          {
            "fileData": {
              "fileUri": "gs://cloud-samples-data/generative-ai/video/animals.mp4",
              "mimeType": "video/mp4"
            },
            "text": null
          },
          {
            "fileData": {
              "fileUri": "gs://cloud-samples-data/generative-ai/image/cricket.jpeg",
              "mimeType": "image/jpeg"
            },
            "text": null
          }
        ],
        "role": "user"
      }
    ]
  },
  "response": {
    "candidates": [
      {
        "avgLogprobs": -0.5782725546095107,
        "content": {
          "parts": [
            {
              "text": "This video shows a Google Photos marketing campaign where animals at the Los Angeles Zoo take self-portraits using a modified Google phone housed in a protective case. The image is unrelated."
            }
          ],
          "role": "model"
        },
        "finishReason": "STOP"
      }
    ],
    "modelVersion": "gemini-2.0-flash-001@default",
    "usageMetadata": {
      "candidatesTokenCount": 36,
      "promptTokenCount": 29180,
      "totalTokenCount": 29216
    }
  }
}

Prédiction par lots pour BigQuery

Spécifiez votre table d'entrée, votre modèle et votre emplacement de sortie BigQuery. Le job de prédiction par lots et votre table doivent se trouver dans la même région.

Préparer les entrées

Entrée de stockage BigQuery

  • Votre compte de service doit disposer des autorisations BigQuery appropriées. Pour attribuer le rôle Utilisateur BigQuery au compte de service, utilisez la commande gcloud iam service-accounts add-iam-policy-binding comme suit :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/bigquery.user"
    

    Remplacez les valeurs suivantes :

    • PROJECT_ID : projet dans lequel votre compte de service a été créé.
    • SERVICE_ACCOUNT_ID : ID du compte de service.
  • Une colonne request est obligatoire et doit être au format JSON valide. Ces données JSON représentent votre entrée pour le modèle.

  • Le contenu de la colonne request doit correspondre à la structure de GenerateContentRequest.

  • Votre table d'entrée peut comporter des types de données de colonne autres que request. Ces colonnes peuvent avoir des types de données BigQuery, à l'exception des suivants : array, struct, range, datetime et geography. Ces colonnes sont ignorées pour la génération de contenu, mais sont incluses dans la table de sortie.

Exemple d'entrée (JSON)
        
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Give me a recipe for banana bread."
        }
      ]
    }
  ],
  "system_instruction": {
    "parts": [
      {
        "text": "You are a chef."
      }
    ]
  }
}
        
        

Demander un job de prédiction par lots

REST

Pour créer un job de prédiction par lots, utilisez la méthode projects.locations.batchPredictionJobs.create.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région compatible avec les modèles Gemini.
  • PROJECT_ID : l'ID de votre projet.
  • MODEL_PATH: nom du modèle de l'éditeur, par exemple publishers/google/models/gemini-2.0-flash-001, ou nom du point de terminaison affiné, par exemple projects/PROJECT_ID/locations/LOCATION/models/MODEL_ID, où MODEL_ID est l'ID du modèle affiné.
  • INPUT_URI : table BigQuery où se trouve votre entrée de prédiction par lots, par exemple bq://myproject.mydataset.input_table. Les ensembles de données multirégionaux ne sont pas acceptés.
  • OUTPUT_FORMAT : pour générer une sortie dans une table BigQuery, spécifiez bigquery. Pour générer la sortie dans un bucket Cloud Storage, spécifiez jsonl.
  • DESTINATION : pour BigQuery, spécifiez bigqueryDestination. Pour Cloud Storage, spécifiez gcsDestination.
  • OUTPUT_URI_FIELD_NAME : pour BigQuery, spécifiez outputUri. Pour Cloud Storage, spécifiez outputUriPrefix.
  • OUTPUT_URI : pour BigQuery, spécifiez l'emplacement de la table, par exemple bq://myproject.mydataset.output_result. La région de l'ensemble de données BigQuery de sortie doit être identique à celle du job de prédiction par lots Vertex AI. Pour Cloud Storage, spécifiez l'emplacement du bucket et du répertoire, par exemple gs://mybucket/path/to/output.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs

Corps JSON de la requête :

{
  "displayName": "my-bigquery-batch-prediction-job",
  "model": "MODEL_PATH",
  "inputConfig": {
    "instancesFormat": "bigquery",
    "bigquerySource":{
      "inputUri" : "INPUT_URI"
    }
  },
  "outputConfig": {
    "predictionsFormat": "OUTPUT_FORMAT",
    "DESTINATION": {
      "OUTPUT_URI_FIELD_NAME": "OUTPUT_URI"
    }
  }
}

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/batchPredictionJobs" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON semblable à la suivante.

La réponse inclut un identifiant unique pour le job par lot. Vous pouvez interroger l'état du job par lot à l'aide de BATCH_JOB_ID jusqu'à ce que le job state soit défini sur JOB_STATE_SUCCEEDED. Exemple :

curl \
  -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/batchPredictionJobs/BATCH_JOB_ID

Gen AI SDK for Python

Installer

pip install --upgrade google-genai

Pour en savoir plus, lisez la documentation de référence du SDK.

Définissez les variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

import time

from google import genai
from google.genai.types import CreateBatchJobConfig, JobState, HttpOptions

client = genai.Client(http_options=HttpOptions(api_version="v1"))

# TODO(developer): Update and un-comment below line
# output_uri = f"bq://your-project.your_dataset.your_table"

job = client.batches.create(
    # To use a tuned model, set the model param to your tuned model using the following format:
    # model="projects/{PROJECT_ID}/locations/{LOCATION}/models/{MODEL_ID}
    model="gemini-2.0-flash-001",
    src="bq://storage-samples.generative_ai.batch_requests_for_multimodal_input",
    config=CreateBatchJobConfig(dest=output_uri),
)
print(f"Job name: {job.name}")
print(f"Job state: {job.state}")
# Example response:
# Job name: projects/%PROJECT_ID%/locations/us-central1/batchPredictionJobs/9876453210000000000
# Job state: JOB_STATE_PENDING

# See the documentation: https://googleapis.github.io/python-genai/genai.html#genai.types.BatchJob
completed_states = {
    JobState.JOB_STATE_SUCCEEDED,
    JobState.JOB_STATE_FAILED,
    JobState.JOB_STATE_CANCELLED,
    JobState.JOB_STATE_PAUSED,
}

while job.state not in completed_states:
    time.sleep(30)
    job = client.batches.get(name=job.name)
    print(f"Job state: {job.state}")
# Example response:
# Job state: JOB_STATE_PENDING
# Job state: JOB_STATE_RUNNING
# Job state: JOB_STATE_RUNNING
# ...
# Job state: JOB_STATE_SUCCEEDED

Récupérer une sortie par lot

Une fois la tâche de prédiction par lots terminée, le résultat est stocké dans la table BigQuery que vous avez spécifiée dans votre requête.

Pour les lignes réussies, les réponses du modèle sont stockées dans la colonne response. Sinon, les détails de l'erreur sont stockés dans la colonne status en vue d'une inspection plus approfondie.

Exemple de sortie BigQuery

requête réponse état
{"content":[{...}]}
{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "In a medium bowl, whisk together the flour, baking soda, baking powder."
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.14057204,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.14270912
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 8,
    "candidatesTokenCount": 396,
    "totalTokenCount": 404
  }
}

Étape suivante