Genera y busca incorporaciones multimodales
En este instructivo, se explica de manera integral la creación de incorporaciones multimodales para imágenes y texto y, luego, se realiza una búsqueda de texto a imagen de modalidad entre modalidad.
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 buscar incorporaciones de imagen 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.
Permisos necesarios
Para ejecutar este instructivo, necesitas los siguientes permisos de Identity and Access Management (IAM):
Para crear una conexión, necesitas membresía en el rol de Administrador de conexión de BigQuery (
roles/bigquery.connectionAdmin
).Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el siguiente permiso
resourcemanager.projects.setIamPolicy
.Para crear y ejecutar notebooks, necesitas los siguientes permisos de IAM:
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
Puedes obtener estos permisos desde los siguientes roles de IAM:
- Usuario de sesión de lectura de BigQuery (
roles/bigquery.readSessionUser
) - Usuario de BigQuery Studio (
roles/bigquery.studioUser
)
En este instructivo, los permisos de IAM necesarios para las operaciones de BigQuery restantes se incluyen en los siguientes dos roles:
- Editor de datos de BigQuery (
roles/bigquery.dataEditor
) para crear modelos, índices y tablas - Usuario de BigQuery (
roles/bigquery.user
) para ejecutar trabajos de BigQuery.
- Editor de datos de BigQuery (
Costos
En este documento, usarás 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 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 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.
- Habilita BigQuery Studio.
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:
En la consola de Google Cloud, ve a la página de 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).
Los conjuntos de datos públicos se almacenan en la multirregión
US
. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.
Crear una conexión
Crea una conexión de recurso de Cloud y obtén el ID de la cuenta de servicio de la conexión. Crea la conexión en la misma ubicación que el conjunto de datos que creaste en el paso anterior.
Selecciona una de las siguientes opciones:
Console
Ve a la página de BigQuery.
Para crear una conexión, haz clic en
Agregar y, luego, en Conexiones a fuentes de datos externas.En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).
En el campo ID de conexión, escribe un nombre para tu conexión.
Haz clic en Crear conexión (Create connection).
Haz clic en Ir a la conexión.
En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
bq
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_id
anula el proyecto predeterminado.Reemplaza lo siguiente:
REGION
: tu región de conexiónPROJECT_ID
: El ID del proyecto de Google Cloud.CONNECTION_ID
: Es un ID para tu conexión.
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado es similar a este:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Agrega la siguiente sección a tu archivo main.tf
.
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }
CONNECTION_ID
: Es un ID para tu conexión.PROJECT_ID
: El ID del proyecto de Google Cloud.REGION
: tu región de conexión
Otorga permisos a la cuenta de servicio de las conexiones
Otorga a la cuenta de servicio de la conexión los roles adecuados para acceder a los servicios de Cloud Storage y Vertex AI. Debes otorgar estos roles en el mismo proyecto que creaste o seleccionaste en la sección Antes de comenzar. Si otorgas el rol en un proyecto diferente, se produce el error bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
.
Para otorgar los roles adecuados, sigue estos pasos:
Ir a la página IAM y administración
Haz clic en
Otorgar acceso.En el campo Principales nuevas, escribe el ID de la cuenta de servicio que copiaste antes.
En el campo Selecciona un rol, elige Vertex AI y, luego, selecciona Usuario de Vertex AI.
Haz clic en Agregar otro rol.
En el campo Elige un rol, elige Cloud Storage y, luego,Visualizador de objetos de Storage.
Haz clic en Guardar.
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 Google Cloud, ve a la página de BigQuery.
En el Editor de consultas, ejecute la siguiente consulta:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images` WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://gcs-public-data--met/*'] );
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando ves los detalles de conexión en la consola de Google Cloud, este es el valor en la última sección del ID de conexión completamente calificado que se muestra en Conexión ID, por ejemplo,
projects/myproject/locations/connection_location/connections/myconnection
.
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 Google Cloud, ve a la página de 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 Google Cloud, ve a la página de BigQuery.
En el Editor de consultas, ejecute la siguiente consulta:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'multimodalembedding@001');
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando ves los detalles de conexión en la consola de Google Cloud, este es el valor en la última sección del ID de conexión completamente calificado que se muestra en Conexión ID, por ejemplo,
projects/myproject/locations/connection_location/connections/myconnection
.
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 Google Cloud, ve a la página de 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 Google Cloud, ve a la página de 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 Google Cloud, ve a la página de 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 Google Cloud, ve a la página de 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 de texto a imagen de modalidad múltiple
Usa la función VECTOR_SEARCH
para buscar las imágenes que mejor se adapten a la string de búsqueda representada por la incorporación de texto y, luego, escribirlas en una tabla para usarlas en un siguiente paso.
En la consola de Google Cloud, ve a la página de BigQuery.
En el Editor de consultas, ejecute la siguiente consulta:
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 vectorial
Visualiza los resultados de la búsqueda vectorial mediante un notebook.
En la consola de Google Cloud, ve a la página de 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:
Realiza una 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.