Générer et rechercher des embeddings multimodaux
Ce tutoriel vous guide tout au long du processus de création d'embeddings multimodaux pour les images et le texte, puis d'exécution d'une recherche de texte vers image multimodale.
Ce tutoriel couvre les tâches suivantes :
- Créer une table d'objets BigQuery sur des données d'image dans un bucket Cloud Storage.
- Explorer les données d'image à l'aide d'un notebook Colab Enterprise dans BigQuery.
- Créer un modèle distant BigQuery ML qui cible le modèle de fondation
multimodalembedding
de Vertex AI. - Utiliser le modèle distant avec la fonction
ML.GENERATE_EMBEDDING
pour générer des embeddings à partir des images de la table d'objets. - Corriger les erreurs de génération d'embeddings.
- (Facultatif) Créer un index vectoriel pour indexer les embeddings d'images.
- Créer un embedding textuel (ou "plongement textuel") pour une chaîne de recherche donnée.
- Utiliser la fonction
VECTOR_SEARCH
pour rechercher des embeddings d'images semblables à l'embedding textuel. - Visualiser les résultats à l'aide d'un notebook
Ce tutoriel utilise des images d'art du domaine public provenant du Métrotrometus of Art, disponibles dans le bucket gcs-public-data--met
de Cloud Storage.
Autorisations requises
Pour exécuter ce tutoriel, vous devez disposer des autorisations IAM (Identity and Access Management) suivantes :
Pour créer une connexion, vous devez disposer du rôle d'administrateur de connexion BigQuery (
roles/bigquery.connectionAdmin
).Pour accorder des autorisations au compte de service de la connexion, vous devez disposer de l'autorisation
resourcemanager.projects.setIamPolicy
.Pour créer et exécuter des notebooks, vous avez besoin des autorisations IAM suivantes :
resourcemanager.projects.get
resourcemanager.projects.list
bigquery.config.get
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
bigquery.readsessions.update
resourcemanager.projects.get
resourcemanager.projects.list
dataform.locations.get
dataform.locations.list
dataform.repositories.create
dataform.repositories.list
dataform.collections.create
dataform.collections.list
aiplatform.notebookRuntimeTemplates.apply
aiplatform.notebookRuntimeTemplates.get
aiplatform.notebookRuntimeTemplates.list
aiplatform.notebookRuntimeTemplates.getIamPolicy
aiplatform.notebookRuntimes.assign
aiplatform.notebookRuntimes.get
aiplatform.notebookRuntimes.list
aiplatform.operations.list
Vous pouvez obtenir ces autorisations à partir des rôles IAM suivants :
- Utilisateur de sessions de lecture BigQuery (
roles/bigquery.readSessionUser
) - Utilisateur BigQuery Studio (
roles/bigquery.studioUser
)
Les autorisations IAM requises dans ce tutoriel pour les opérations BigQuery restantes sont incluses dans les deux rôles suivants :
- Éditeur de données BigQuery (
roles/bigquery.dataEditor
) pour créer des modèles, des tables et des index. - Utilisateur BigQuery (
roles/bigquery.user
) pour exécuter des tâches BigQuery.
- Éditeur de données BigQuery (
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Pour en savoir plus sur les tarifs de BigQuery, consultez la page Tarifs de BigQuery dans la documentation BigQuery.
Pour en savoir plus sur les tarifs de Vertex AI, consultez la page Tarifs de Vertex AI.
Avant de commencer
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
- Activer BigQuery Studio
Créer un ensemble de données
Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :
Dans la console Google Cloud, accédez à la page "BigQuery".
Dans le volet Explorateur, cliquez sur le nom de votre projet.
Cliquez sur
Afficher les actions > Créer un ensemble de données.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 connexion
Créez une connexion de ressource cloud et obtenez l'ID du 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
Accédez à la page BigQuery.
Pour créer une connexion, cliquez sur
Ajouter, puis sur Connexions aux sources de données externes.Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).
Dans le champ ID de connexion, saisissez un nom pour votre connexion.
Cliquez sur Create connection (Créer une connexion).
Cliquez sur Accéder à la connexion.
Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.
bq
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 connexionPROJECT_ID
: ID de votre projet Google CloudCONNECTION_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...
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
:
Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.
Préparer Cloud Shell
- Lancez Cloud Shell.
-
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).
-
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 exemplemain.tf
. Dans ce tutoriel, le fichier est appelémain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
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.
- Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
- Enregistrez les modifications.
-
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
-
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.
-
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).
- 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 des autorisations au compte de service de la connexion
Attribuez au compte de service de la connexion les rôles appropriés pour accéder aux services Cloud Storage et Vertex AI. Vous devez accorder ces rôles dans le projet que vous avez créé ou sélectionné dans la section Avant de commencer. 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 les rôles appropriés, procédez comme suit :
Accédez à la page IAM et administration.
Cliquez sur
Accorder l'accès.Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.
Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.
Cliquez sur Ajouter un autre rôle.
Dans le champ Sélectionner un rôle, sélectionnez Cloud Storage, puis Lecteur des objets Storage.
Cliquez sur Enregistrer.
Créer la table d'objets
Créez une table d'objets sur les images artistiques dans le bucket gcs-public-data--met
public de Cloud Storage.
La table d'objets permet d'analyser les images sans les déplacer depuis Cloud Storage.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images` WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://gcs-public-data--met/*'] );
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_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
).
Explorer les données d'image
Créez un notebook Colab Enterprise dans BigQuery pour explorer les données d'image.
Dans la console Google Cloud, accédez à la page BigQuery.
Connectez le notebook à l'environnement d'exécution par défaut.
Configurez le notebook :
- Ajoutez une cellule de code au notebook.
Copiez et collez le code suivant dans la cellule de code :
#@title Set up credentials from google.colab import auth auth.authenticate_user() print('Authenticated') PROJECT_ID='PROJECT_ID' from google.cloud import bigquery client = bigquery.Client(PROJECT_ID)
Remplacez
PROJECT_ID
par le nom du projet que vous utilisez pour ce tutoriel.Exécutez la cellule de code.
Activez l'affichage des tables :
- Ajoutez une cellule de code au notebook.
Copiez et collez le code suivant dans la cellule de code :
#@title Enable data table display %load_ext google.colab.data_table
Exécutez la cellule de code.
Créez une fonction permettant d'afficher les images :
- Ajoutez une cellule de code au notebook.
Copiez et collez le code suivant dans la cellule de code :
#@title Util function to display images import io from PIL import Image import matplotlib.pyplot as plt import tensorflow as tf def printImages(results): image_results_list = list(results) amt_of_images = len(image_results_list) fig, axes = plt.subplots(nrows=amt_of_images, ncols=2, figsize=(20, 20)) fig.tight_layout() fig.subplots_adjust(hspace=0.5) for i in range(amt_of_images): gcs_uri = image_results_list[i][0] text = image_results_list[i][1] f = tf.io.gfile.GFile(gcs_uri, 'rb') stream = io.BytesIO(f.read()) img = Image.open(stream) axes[i, 0].axis('off') axes[i, 0].imshow(img) axes[i, 1].axis('off') axes[i, 1].text(0, 0, text, fontsize=10) plt.show()
Exécutez la cellule de code.
Affichez les images :
- Ajoutez une cellule de code au notebook.
Copiez et collez le code suivant dans la cellule de code :
#@title Display Met images inspect_obj_table_query = """ SELECT uri, content_type FROM bqml_tutorial.met_images WHERE content_type = 'image/jpeg' Order by uri LIMIT 10; """ printImages(client.query(inspect_obj_table_query))
Exécutez la cellule de code.
Le résultat doit ressembler à ce qui suit :
Enregistrez le notebook sous le nom
met-image-analysis
.
Créer le modèle distant
Créez un modèle distant représentant un modèle d'embedding multimodal Vertex AI hébergé :
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'multimodalembedding@001');
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_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
).
L'exécution de la requête prend plusieurs secondes, après quoi le modèle
multimodal_embedding_model
apparaît dans l'ensemble de donnéesbqml_tutorial
dans le volet Explorateur. Étant donné que la requête utilise une instructionCREATE MODEL
pour créer un modèle, il n'y a aucun résultat de requête.
Générer des embeddings d'images
Générez des embeddings à partir des images de la table d'objets à l'aide de la fonction ML.GENERATE_EMBEDDING
, puis écrivez-les dans une table pour les utiliser ultérieurement. La génération d'embeddings est une opération coûteuse. La requête utilise donc une sous-requête incluant LIMIT
pour limiter la génération d'embeddings à 10 000 images au lieu d'intégrer l'ensemble de données complet composé de 601 294 images. Cela permet également de maintenir le nombre d'images sous la limite de 25 000 pour la fonction ML.GENERATE_EMBEDDING
. L'exécution de cette requête prend environ 40 minutes.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))
Corriger les erreurs de génération d'embeddings
Recherchez et corrigez les erreurs de génération d'embeddings. La génération d'embeddings peut échouer en raison des quotas de l'IA générative sur Vertex AI ou de l'indisponibilité du service.
La fonction ML.GENERATE_EMBEDDING
renvoie les détails de l'erreur dans la colonne ml_generate_embedding_status
. Cette colonne est vide si la génération d'embeddings a réussi, ou contient un message d'erreur en cas d'échec de la génération d'embeddings.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez la requête suivante pour vérifier la présence d'échecs de génération d'embeddings :
SELECT DISTINCT(ml_generate_embedding_status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
Si des lignes contenant des erreurs sont renvoyées, supprimez celles pour lesquelles la génération d'embeddings a échoué :
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
Créer un index vectoriel
Vous pouvez éventuellement utiliser l'instruction CREATE VECTOR INDEX
pour créer l'index vectoriel met_images_index
sur la colonne ml_generate_embedding_result
de la table met_images_embeddings
.
Un index vectoriel vous permet d'effectuer une recherche vectorielle plus rapidement, avec le compromis de réduire le rappel et donc de renvoyer des résultats plus approximatifs.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE VECTOR INDEX `met_images_index` ON bqml_tutorial.met_image_embeddings(ml_generate_embedding_result) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE');
L'index vectoriel est créé de manière asynchrone. Pour vérifier si l'index vectoriel a été créé, interrogez la vue
INFORMATION_SCHEMA.VECTOR_INDEXES
et vérifiez que la valeurcoverage_percentage
est supérieure à0
et que la valeurlast_refresh_time
n'est pasNULL
:SELECT table_name, index_name, index_status, coverage_percentage, last_refresh_time, disable_reason FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES WHERE index_name = 'met_images_index';
Générer un embedding pour le texte de recherche
Pour rechercher des images correspondant à une chaîne de recherche de texte spécifiée, vous devez d'abord créer un embedding textuel (ou "plongement textuel") pour cette chaîne. Utilisez le même modèle distant pour créer l'embedding textuel que celui utilisé pour créer les embeddings d'images, puis écrivez l'embedding textuel dans une table pour l'utiliser lors d'une étape suivante. La chaîne de recherche est pictures of white or cream colored dress from victorian era
.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, ( SELECT 'pictures of white or cream colored dress from victorian era' AS content ) );
Effectuer une recherche de texte vers image entre modalités
Utilisez la fonction VECTOR_SEARCH
pour rechercher les images qui correspondent le mieux à la chaîne de recherche représentée par l'embedding textuel, puis les écrire dans une table pour les utiliser lors d'une étape ultérieure.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez la requête suivante :
CREATE OR REPLACE TABLE `bqml_tutorial.vector_search_results` AS SELECT base.uri AS gcs_uri, distance FROM VECTOR_SEARCH( TABLE `bqml_tutorial.met_image_embeddings`, 'ml_generate_embedding_result', TABLE `bqml_tutorial.search_embedding`, 'ml_generate_embedding_result', top_k => 3);
Visualiser les résultats de la recherche vectorielle
Visualiser les résultats de la recherche vectorielle à l'aide d'un notebook.
Dans la console Google Cloud, accédez à la page BigQuery.
Ouvrez le notebook
met-image-analysis
que vous avez créé précédemment.Visualisez les résultats de la recherche vectorielle :
- Ajoutez une cellule de code au notebook.
Copiez et collez le code suivant dans la cellule de code :
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))
Exécutez la cellule de code.
Le résultat doit ressembler à ce qui suit :
Effectuer un nettoyage
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.