Genera y busca incorporaciones multimodales
En este instructivo, se muestra cómo generar embeddings multimodales para imágenes y texto con BigQuery y Vertex AI, y, luego, usar estos embeddings para realizar una búsqueda semántica de texto a imagen.
En este instructivo, se abarcan las siguientes tareas:
- Crear una tabla de objetos de BigQuery sobre datos de imágenes en un bucket de Cloud Storage.
- Explora los datos de imágenes mediante un notebook de Colab Enterprise en BigQuery
- Crea un modelo remoto de BigQuery ML que se oriente al modelo de base
multimodalembedding
de Vertex AI. - Usa el modelo remoto con la función
ML.GENERATE_EMBEDDING
para generar incorporaciones a partir de las imágenes en la tabla de objetos. - Corrige cualquier error de generación de incorporaciones.
- De forma opcional, crea un índice vectorial para indexar las incorporaciones de imagen.
- Crea una incorporación de texto para una string de búsqueda determinada
- Usa la función
VECTOR_SEARCH
para realizar una búsqueda semántica de incorporaciones de imágenes que sean similares a la incorporación de texto. - Visualiza los resultados mediante un notebook.
En este instructivo, se usan las imágenes de arte de dominio público del Museo de Arte Metropolitano que están disponibles en el bucket gcs-public-data--met
de Cloud Storage público.
Roles obligatorios
Para ejecutar este instructivo, necesitas los siguientes roles de Identity and Access Management (IAM):
- Crear y usar conjuntos de datos, conexiones, modelos y notebooks de BigQuery: Administrador de BigQuery Studio (
roles/bigquery.studioAdmin
) - Otorga permisos a la cuenta de servicio de la conexión: Administrador de IAM del proyecto (
roles/resourcemanager.projectIamAdmin
).
Estos roles predefinidos contienen los permisos necesarios para realizar las tareas de este documento. Para ver los permisos exactos que son necesarios, expande la sección Permisos necesarios:
Permisos necesarios
- Crea un conjunto de datos:
bigquery.datasets.create
- Crea, delega y usa una conexión:
bigquery.connections.*
- Establece la conexión predeterminada:
bigquery.config.*
- Configura 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
- Crea y usa notebooks:
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 o con otros roles predefinidos.
Costos
En este documento, usarás los siguientes componentes facturables de Trusted Cloud by S3NS:
- 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 costos en función del uso previsto, usa la calculadora de precios.
Para obtener más información sobre los precios de BigQuery, consulta 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 Precios de Vertex AI.
Antes de comenzar
-
In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.
-
Verify that billing is enabled for your Trusted Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA.
Console
En la consola de Trusted Cloud , ve a la página BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haz 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, ingresa
bqml_tutorial
.En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).
Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.
bq
Para crear un conjunto de datos nuevo, usa el comando bq mk
con la marca --location
. Para obtener 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 establecida enUS
y una descripción deBigQuery 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 omites-d
y--dataset
, el comando crea un conjunto de datos de manera predeterminada.Confirma que se haya 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" } }
Permite trabajar con BigQuery DataFrames.
Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local.
Crea la tabla de objetos
Crea una tabla de objetos con las imágenes de arte en el bucket gcs-public-data--met
público de Cloud Storage.
La tabla de objetos permite analizar las imágenes sin transferirlas desde Cloud Storage.
En la consola de Trusted Cloud , ve a la página BigQuery.
En el Editor de consultas, ejecute 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/*'] );
Explora los datos de imágenes
Crear un notebook de Colab Enterprise en BigQuery para explorar los datos de imágenes.
En la consola de Trusted Cloud , ve a la página BigQuery.
Configura el notebook:
- Agrega una celda de código al notebook.
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)
Reemplaza
PROJECT_ID
por el nombre del proyecto que usarás para este instructivo.Ejecuta la celda de código.
Habilita la visualización de la tabla:
- Agrega una celda de código al notebook.
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:
- Agrega una celda de código al notebook.
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.
Muestra las imágenes:
- Agrega una celda de código al notebook.
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ía ser similar al siguiente:
Guarda el notebook como
met-image-analysis
.
Crea el modelo remoto
Crea un modelo remoto que represente un modelo de incorporación multimodal de Vertex AI alojado:
En la consola de Trusted Cloud , ve a la página BigQuery.
En el Editor de consultas, ejecute 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 de eso, el modelo
multimodal_embedding_model
aparece en el conjunto de datosbqml_tutorial
en el panel Explorador. Debido a que la consulta usa una declaraciónCREATE MODEL
para crear un modelo, no hay resultados de consultas.
Genera incorporaciones de imágenes
Genera incorporaciones a partir de las imágenes de la tabla de objetos mediante la función ML.GENERATE_EMBEDDING
y, luego, escríbelas en una tabla para usarlas en el siguiente paso. La generación de incorporaciones 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 incorporaciones a 10,000 imágenes en lugar de incorporar el conjunto de datos completo de 601,294 imágenes. Esto también ayuda a mantener la cantidad de imágenes por debajo del límite de 25,000 para la función ML.GENERATE_EMBEDDING
. Esta consulta tarda unos 40 minutos en ejecutarse.
En la consola de Trusted Cloud , ve a la página BigQuery.
En el Editor de consultas, ejecute 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))
Corrige cualquier error de generación de incorporaciones
Comprueba y corrige cualquier error de generación de incorporaciones. La generación de incorporaciones puede fallar debido a cuotas de IA generativa en Vertex AI o a la falta de disponibilidad del servicio.
La función ML.GENERATE_EMBEDDING
muestra los detalles del error en la columna ml_generate_embedding_status
. Esta columna está vacía si la generación de la incorporación se realizó correctamente o contiene un mensaje de error si la generación de la incorporación falló.
En la consola de Trusted Cloud , ve a la página BigQuery.
En el editor de consultas, ejecuta la siguiente consulta para ver si hubo errores de generación de incorporaciones:
SELECT DISTINCT(ml_generate_embedding_status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
Si se muestran filas con errores, descarta las filas en las que la generación de incorporaciones falló:
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
Crea un índice vectorial
De forma opcional, puedes usar la declaración CREATE VECTOR INDEX
para crear el índice vectorial 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ápida, con la compensación de reducir la recuperación y, de esa forma, mostrar resultados más aproximados.
En la consola de Trusted Cloud , ve a la página BigQuery.
En el Editor de consultas, ejecute 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 verificar si se creó el índice vectorial, consulta la vista
INFORMATION_SCHEMA.VECTOR_INDEXES
y confirma que el valorcoverage_percentage
sea mayor que0
. y el valorlast_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';
Genera una incorporación para el texto de búsqueda
Para buscar imágenes que correspondan a una string de búsqueda de texto específica, primero debes crear una incorporación de texto para esa string. Usa el mismo modelo remoto para crear la incorporación de texto que usaste para crear las incorporaciones de imagen y, luego, escribe la incorporación de texto en una tabla para usarla en un paso siguiente. La string de búsqueda es pictures of white or cream colored dress from victorian era
.
En la consola de Trusted Cloud , ve a la página BigQuery.
En el Editor de consultas, ejecute 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 ) );
Realiza 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 incorporación de texto.
En la consola de Trusted Cloud , 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);
Visualiza los resultados de la búsqueda semántica
Visualiza los resultados de la búsqueda semántica con un notebook.
En la consola de Trusted Cloud , ve a la página BigQuery.
Abre el notebook
met-image-analysis
que creaste antes.Visualiza los resultados de la búsqueda vectorial:
- Agrega una celda de código al notebook.
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ía ser similar al siguiente:
Limpia
- In the Trusted 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.