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:

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 y resourcemanager.projects.setIamPolicy
  • Crea una tabla de objetos: bigquery.tables.create y bigquery.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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haga clic en Ver acciones > Crear conjunto de datos.

  4. 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.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery 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.

  2. 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.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. Crea un cuaderno con el editor de BigQuery.

  3. Conecta el cuaderno al entorno de ejecución predeterminado.

  4. Configura el cuaderno:

    1. Añade una celda de código al cuaderno.
    2. 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.

    3. Ejecuta la celda de código.

  5. Habilita la visualización de la tabla:

    1. Añade una celda de código al cuaderno.
    2. Copia y pega el siguiente código en la celda de código:

      #@title Enable data table display
      %load_ext google.colab.data_table
      
    3. Ejecuta la celda de código.

  6. Crea una función para mostrar las imágenes:

    1. Añade una celda de código al cuaderno.
    2. 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()
      
    3. Ejecuta la celda de código.

  7. Mostrar las imágenes:

    1. Añade una celda de código al cuaderno.
    2. 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))
      
    3. Ejecuta la celda de código.

      Los resultados deberían ser similares a los siguientes:

      Imágenes que muestran objetos del Museo Metropolitano de Arte.

  8. 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:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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 datos bqml_tutorial del panel Explorador. Como la consulta usa una instrucción CREATE 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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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;
  3. 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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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');
  3. 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 de coverage_percentage es mayor que 0 y que el valor de last_refresh_time no es NULL:

    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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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
      )
    );

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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. 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.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. Abre el cuaderno met-image-analysis que has creado antes.

  3. Visualiza los resultados de la búsqueda vectorial:

    1. Añade una celda de código al cuaderno.
    2. 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))
      
    3. Ejecuta la celda de código.

      Los resultados deberían ser similares a los siguientes:

      Imágenes devueltas de una consulta de búsqueda de vectores multimodal.

Limpieza

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.