Générer des embeddings de vidéo à l'aide de la fonction ML.GENERATE_EMBEDDING

Ce document explique comment créer un modèle distant BigQuery ML faisant référence à un modèle de fondation d'embedding Vertex AI. Vous utilisez ensuite ce modèle avec la fonction ML.GENERATE_EMBEDDING pour créer des embeddings de vidéos à l'aide de données provenant d'une table d'objets BigQuery.

Rôles requis

  • Pour créer une connexion, vous devez disposer du rôle IAM (Identity and Access Management) suivant :

    • roles/bigquery.connectionAdmin
  • Pour accorder des autorisations au compte de service de la connexion, vous devez disposer de l'autorisation suivante :

    • resourcemanager.projects.setIamPolicy
  • Pour créer le modèle à l'aide de BigQuery ML, vous devez disposer des autorisations IAM suivantes :

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Pour exécuter une inférence, vous devez disposer des autorisations suivantes :

    • bigquery.tables.getData sur la table
    • bigquery.models.getData sur le modèle
    • bigquery.jobs.create

Avant de commencer

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Créer un ensemble de données

Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :

  1. Dans la console Google Cloud, accédez à la page "BigQuery".

    Accéder à la page "BigQuery"

  2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

  3. Cliquez sur Afficher les actions > Créer un ensemble de données.

    Créer l'ensemble de données

  4. Sur la page Créer un ensemble de données, procédez comme suit :

    • Dans le champ ID de l'ensemble de données, saisissez bqml_tutorial.

    • Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).

      Les ensembles de données publics sont stockés dans l'emplacement multirégional US. Par souci de simplicité, stockez votre ensemble de données dans le même emplacement.

    • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

      Créer une page d'ensemble de données

Créer une connexion

Créez une connexion de ressource cloud et obtenez le compte de service de la connexion. Créez la connexion dans le même emplacement que l'ensemble de données que vous avez créé à l'étape précédente.

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Pour créer une connexion, cliquez sur Ajouter, puis sur Connexions aux sources de données externes.

  3. Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).

  4. Dans le champ ID de connexion, saisissez un nom pour votre connexion.

  5. Cliquez sur Create connection (Créer une connexion).

  6. Cliquez sur Accéder à la connexion.

  7. Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.

bq

  1. Dans un environnement de ligne de commande, créez une connexion :

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    Le paramètre --project_id remplace le projet par défaut.

    Remplacez les éléments suivants :

    • REGION : votre région de connexion
    • PROJECT_ID : ID de votre projet Google Cloud
    • CONNECTION_ID : ID de votre connexion

    Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.

    Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    Le résultat ressemble à ce qui suit :

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Utilisez la ressource google_bigquery_connection.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

L'exemple suivant crée une connexion de ressources Cloud nommée my_cloud_resource_connection dans la région US:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.

Préparer Cloud Shell

  1. Lancez Cloud Shell.
  2. Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.

    Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.

Préparer le répertoire

Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).

  1. Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension .tf, par exemple main.tf. Dans ce tutoriel, le fichier est appelé main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.

    Copiez l'exemple de code dans le fichier main.tf que vous venez de créer.

    Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.

  3. Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
  4. Enregistrez les modifications.
  5. Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
    terraform init

    Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option -upgrade :

    terraform init -upgrade

Appliquer les modifications

  1. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
    terraform plan

    Corrigez les modifications de la configuration si nécessaire.

  2. Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  3. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

Accorder l'accès au compte de service

Attribuez le rôle d'utilisateur Vertex AI au compte de service de la connexion.

Si vous envisagez de spécifier le point de terminaison en tant qu'URL lors de la création du modèle distant (par exemple, endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/text-embedding-004'), accordez ce rôle dans le projet que vous spécifiez dans l'URL.

Si vous envisagez de spécifier le point de terminaison à l'aide du nom du modèle lors de la création du modèle distant (par exemple endpoint = 'text-embedding-004'), accordez ce rôle dans le projet dans lequel vous prévoyez de créer le modèle distant.

L'attribution du rôle dans un autre projet génère l'erreur bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.

Pour accorder le rôle, procédez comme suit :

Console

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

    La boîte de dialogue Ajouter des comptes principaux s'ouvre.

  3. Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.

  4. Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.

  5. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud projects add-iam-policy-binding :

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

Remplacez les éléments suivants :

  • PROJECT_NUMBER : votre numéro de projet
  • MEMBER : ID du compte de service que vous avez copié précédemment

Créer une table d'objets

Créez une table d'objets qui stocke les contenus vidéo. La table d'objets permet d'analyser les vidéos sans les déplacer depuis Cloud Storage.

Le bucket Cloud Storage utilisé par la table d'objets doit se trouver dans le même projet que celui où vous prévoyez de créer le modèle et d'appeler la fonction ML.GENERATE_EMBEDDING. Si vous souhaitez appeler la fonction ML.GENERATE_EMBEDDING dans un projet différent de celui contenant le bucket Cloud Storage utilisé par la table d'objets, vous devez attribuer le rôle "Administrateur de l'espace de stockage" au niveau du bucket au compte de service service-A@gcp-sa-aiplatform.iam.gserviceaccount.com.

Créer un modèle

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. À l'aide de l'éditeur SQL, créez un modèle distant :

    CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET_ID : ID de l'ensemble de données pour contenir le modèle.
    • MODEL_NAME : nom du modèle
    • REGION : région utilisée par la connexion.
    • CONNECTION_ID : ID de votre connexion BigQuery

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/myproject/locations/connection_location/connections/myconnection).

    • ENDPOINT : LLM d'embedding à utiliser, dans ce cas multimodalembedding@001.

Générer des embeddings de vidéos

Générez des embeddings de vidéos à l'aide de la fonction ML.GENERATE_EMBEDDING en utilisant les données vidéo d'une table d'objets :

SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  STRUCT(FLATTEN_JSON AS flatten_json_output,
    START_SECOND AS start_second,
    END_SECOND AS end_second,
    INTERVAL_SECONDS AS interval_seconds)
);

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET_ID : ID de l'ensemble de données contenant le modèle.
  • MODEL_NAME : nom du modèle distant sur un modèle multimodalembedding@001.
  • TABLE_NAME : nom de la table d'objets contenant les vidéos à intégrer.
  • FLATTEN_JSON : BOOL qui indique s'il faut analyser l'embedding dans une colonne distincte. La valeur par défaut est TRUE.
  • START_SECOND: valeur FLOAT64 spécifiant la seconde de la vidéo à laquelle commencer l'embedding. La valeur par défaut est 0. Cette valeur doit être positive et inférieure à la valeur end_second.
  • END_SECOND : valeur FLOAT64 spécifiant la seconde de la vidéo à laquelle terminer l'embedding. La valeur par défaut est 120. Cette valeur doit être positive et supérieure à la valeur start_second.
  • INTERVAL_SECONDS : valeur FLOAT64 qui spécifie l'intervalle à utiliser lors de la création d'embeddings. Par exemple, si vous définissez start_second = 0, end_second = 120 et interval_seconds = 10, la vidéo est divisée en douze segments de 10 secondes ([0, 10), [10, 20), [20, 30)...) et des représentations vectorielles continues sont générées pour chaque segment. Cette valeur doit être supérieure à 4 et inférieure à 120. La valeur par défaut est 16.

Exemple

L'exemple suivant montre comment créer des embeddings pour les images de la table d'objets videos : Des embeddings sont créés pour chaque intervalle de cinq secondes entre 10 et 40 secondes dans chaque vidéo.

SELECT *
FROM
  ML.GENERATE_EMBEDDING(
    MODEL `mydataset.embedding_model`,
    TABLE `mydataset.videos`,
    STRUCT(TRUE AS flatten_json_output,
    10 AS start_second,
    40 AS end_second,
    5 AS interval_seconds)
  );