Generar y buscar incrustaciones multimodales
En este tutorial se muestra cómo generar incrustaciones multimodales para imágenes y texto con BigQuery y Vertex AI, y cómo usar estas incrustaciones para realizar una búsqueda semántica de texto a imagen.
En este tutorial se explican las siguientes tareas:
- Crear una tabla de objetos de BigQuery a partir de datos de imagen en un segmento de Cloud Storage.
- Explorar los datos de imagen con un cuaderno de Colab Enterprise en BigQuery.
- Crear un modelo remoto de BigQuery ML
que tenga como objetivo el
modelo fundacional
multimodalembedding
de Vertex AI. - Usar el modelo remoto con la función
ML.GENERATE_EMBEDDING
para generar las inserciones de las imágenes de la tabla de objetos. - Corrige los errores de generación de inserciones.
- Opcionalmente, puedes crear un índice vectorial para indexar las incrustaciones de imágenes.
- Crea una inserción de texto para una cadena de búsqueda determinada.
- Usar la función
VECTOR_SEARCH
para realizar una búsqueda semántica de las inserciones de imágenes que sean similares a la inserción de texto. - Visualizar los resultados con un cuaderno.
En este tutorial se usan imágenes artísticas de dominio público de The Metropolitan Museum of Art, que están disponibles en el gcs-public-data--met
segmento público de Cloud Storage.
Roles obligatorios
Para completar este tutorial, necesitas los siguientes roles de Gestión de Identidades y Accesos (IAM):
- Crear y usar conjuntos de datos, conexiones, modelos y cuadernos de BigQuery:
Administrador de BigQuery Studio (
roles/bigquery.studioAdmin
). - Concede permisos a la cuenta de servicio de la conexión: administrador de gestión de identidades y accesos del proyecto (
roles/resourcemanager.projectIamAdmin
).
Estos roles predefinidos contienen los permisos necesarios para realizar las tareas descritas en este documento. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:
Permisos obligatorios
- Crea un conjunto de datos:
bigquery.datasets.create
- Crear, delegar y usar una conexión:
bigquery.connections.*
- Definir la conexión predeterminada:
bigquery.config.*
- Define los permisos de la cuenta de servicio:
resourcemanager.projects.getIamPolicy
yresourcemanager.projects.setIamPolicy
- Crea una tabla de objetos:
bigquery.tables.create
ybigquery.tables.update
- Crea un modelo y ejecuta la inferencia:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
- Crear y usar cuadernos:
resourcemanager.projects.get
resourcemanager.projects.list
bigquery.config.get
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
bigquery.readsessions.update
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
aiplatform.notebookRuntimeTemplates.apply
También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.
Costes
En este documento, se utilizan los siguientes componentes facturables 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.
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Para obtener más información sobre los precios de BigQuery, consulta la página Precios de BigQuery en la documentación de BigQuery.
Para obtener más información sobre los precios de Vertex AI, consulta la página de precios de Vertex AI.
Antes de empezar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
Crear conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.
Consola
En la Google Cloud consola, ve a la página BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haga clic en
Ver acciones > Crear conjunto de datos.En la página Crear conjunto de datos, haz lo siguiente:
En ID del conjunto de datos, introduce
bqml_tutorial
.En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).
Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.
bq
Para crear un conjunto de datos, usa el comando
bq mk
con la marca --location
. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset
.
Crea un conjunto de datos llamado
bqml_tutorial
con la ubicación de los datos definida comoUS
y la descripciónBigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
En lugar de usar la marca
--dataset
, el comando usa el acceso directo-d
. Si omite-d
y--dataset
, el comando creará un conjunto de datos de forma predeterminada.Confirma que se ha creado el conjunto de datos:
bq ls
API
Llama al método datasets.insert
con un recurso de conjunto de datos definido.
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.
Crear la tabla de objetos
Crea una tabla de objetos sobre las imágenes artísticas del segmento público de Cloud Storage gcs-public-data--met
.
La tabla de objetos permite analizar las imágenes sin moverlas de Cloud Storage.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images` WITH CONNECTION DEFAULT OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://gcs-public-data--met/*'] );
Explorar los datos de la imagen
Crea un cuaderno de Colab Enterprise en BigQuery para explorar los datos de imagen.
En la Google Cloud consola, ve a la página BigQuery.
Configura el cuaderno:
- Añade una celda de código al cuaderno.
Copia y pega el siguiente código en la celda de código:
#@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)
Sustituye
PROJECT_ID
por el nombre del proyecto que vas a usar en este tutorial.Ejecuta la celda de código.
Habilita la visualización de la tabla:
- Añade una celda de código al cuaderno.
Copia y pega el siguiente código en la celda de código:
#@title Enable data table display %load_ext google.colab.data_table
Ejecuta la celda de código.
Crea una función para mostrar las imágenes:
- Añade una celda de código al cuaderno.
Copia y pega el siguiente código en la celda de código:
#@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()
Ejecuta la celda de código.
Mostrar las imágenes:
- Añade una celda de código al cuaderno.
Copia y pega el siguiente código en la celda de código:
#@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))
Ejecuta la celda de código.
Los resultados deberían ser similares a los siguientes:
Guarda el cuaderno como
met-image-analysis
.
Crear el modelo remoto
Crea un modelo remoto que represente un modelo de inserciones multimodal de Vertex AI alojado:
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'multimodalembedding@001');
La consulta tarda varios segundos en completarse. Después, el modelo
multimodal_embedding_model
aparece en el conjunto de datosbqml_tutorial
del panel Explorador. Como la consulta usa una instrucciónCREATE MODEL
para crear un modelo, no hay resultados de la consulta.
Generar incrustaciones de imágenes
Genera las inserciones de las imágenes de la tabla de objetos con la función ML.GENERATE_EMBEDDING
y, a continuación, escríbelas en una tabla para usarlas en un paso posterior. La generación de embeddings es una operación costosa, por lo que la consulta usa una subconsulta que incluye la cláusula LIMIT
para limitar la generación de embeddings a 10.000 imágenes en lugar de insertar el conjunto de datos completo de 601.294 imágenes. Esto también ayuda a mantener el número de imágenes por debajo del límite de 25.000 de la función ML.GENERATE_EMBEDDING
. Esta consulta tarda unos 40 minutos en ejecutarse.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta:
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))
Corregir errores de generación de inserciones
Comprueba si hay errores de generación de inserciones y corrígelos. La generación de embeddings puede fallar debido a las cuotas de IA generativa en Vertex AI o a la falta de disponibilidad del servicio.
La función ML.GENERATE_EMBEDDING
devuelve los detalles del error en la columna ml_generate_embedding_status
. Esta columna está vacía si la generación de la inserción se ha completado correctamente o contiene un mensaje de error si no se ha podido generar.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta para ver si se ha producido algún error al generar las inserciones:
SELECT DISTINCT(ml_generate_embedding_status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
Si se devuelven filas con errores, elimina las filas en las que no se haya podido generar la inserción:
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
Crear un índice vectorial
También puedes usar la
declaración CREATE VECTOR INDEX
para crear el índice de vector met_images_index
en la
columna ml_generate_embedding_result
de la tabla met_images_embeddings
.
Un índice vectorial te permite realizar una búsqueda vectorial más rápidamente, pero a cambio se reduce la recuperación y, por lo tanto, se devuelven resultados más aproximados.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta:
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');
El índice vectorial se crea de forma asíncrona. Para comprobar si se ha creado el índice vectorial, consulta la vista
INFORMATION_SCHEMA.VECTOR_INDEXES
y confirma que el valor decoverage_percentage
es mayor que0
y que el valor delast_refresh_time
no esNULL
: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';
Generar una inserción para el texto de búsqueda
Para buscar imágenes que correspondan a una cadena de búsqueda de texto específica, primero debes crear una inserción de texto para esa cadena. Usa el mismo modelo remoto para crear la inserción de texto que usaste para crear las inserciones de imagen y, a continuación, escribe la inserción de texto en una tabla para usarla en un paso posterior. La cadena de búsqueda es pictures of white or cream colored dress from victorian era
.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta:
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 ) );
Hacer una búsqueda semántica de texto a imagen
Usa la función VECTOR_SEARCH
para realizar una búsqueda semántica de las imágenes que mejor se correspondan con la cadena de búsqueda representada por la incrustación de texto.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta para realizar una búsqueda semántica y escribir los resultados en una tabla:
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);
Visualizar los resultados de la búsqueda semántica
Visualiza los resultados de la búsqueda semántica con un cuaderno.
En la Google Cloud consola, ve a la página BigQuery.
Abre el cuaderno
met-image-analysis
que has creado antes.Visualiza los resultados de la búsqueda vectorial:
- Añade una celda de código al cuaderno.
Copia y pega el siguiente código en la celda de código:
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))
Ejecuta la celda de código.
Los resultados deberían ser similares a los siguientes:
Limpieza
- 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.