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:

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.

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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

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

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

  4. Habilita BigQuery Studio.

Crea un conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:

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

    Ir a la página de BigQuery

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

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

    Crea un conjunto de datos.

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

      Página Crear un 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

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. Para crear una conexión, haz clic en Agregar y, luego, en Conexiones a fuentes de datos externas.

  3. En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).

  4. En el campo ID de conexión, escribe un nombre para tu conexión.

  5. Haz clic en Crear conexión (Create connection).

  6. Haz clic en Ir a la conexión.

  7. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.

bq

  1. 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ón
    • PROJECT_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...
    
  2. 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 {}
}        
Reemplaza lo siguiente:

  • 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:

  1. Ir a la página IAM y administración

    Ir a IAM y administración

  2. Haz clic en Otorgar acceso.

  3. En el campo Principales nuevas, escribe el ID de la cuenta de servicio que copiaste antes.

  4. En el campo Selecciona un rol, elige Vertex AI y, luego, selecciona Usuario de Vertex AI.

  5. Haz clic en Agregar otro rol.

  6. En el campo Elige un rol, elige Cloud Storage y, luego,Visualizador de objetos de Storage.

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

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

    Ir a BigQuery

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

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

    Ir a BigQuery

  2. Crea un notebook mediante el editor de BigQuery.

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

  4. Configura el notebook:

    1. Agrega una celda de código al notebook.
    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)
      

      Reemplaza PROJECT_ID por el nombre del proyecto que usarás para este instructivo.

    3. Ejecuta la celda de código.

  5. Habilita la visualización de la tabla:

    1. Agrega una celda de código al notebook.
    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. Agrega una celda de código al notebook.
    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. Muestra las imágenes:

    1. Agrega una celda de código al notebook.
    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ía ser similar al siguiente:

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

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

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

    Ir a BigQuery

  2. 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 datos bqml_tutorial en el panel Explorador. Debido a que la consulta usa una declaración CREATE 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.

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

    Ir a BigQuery

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

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

    Ir a BigQuery

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

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

    Ir a BigQuery

  2. 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');
  3. 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 valor coverage_percentage sea mayor que 0. y el valor 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';

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.

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

    Ir a BigQuery

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

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.

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

    Ir a BigQuery

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

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

    Ir a BigQuery

  2. Abre el notebook met-image-analysis que creaste antes.

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

    1. Agrega una celda de código al notebook.
    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ía ser similar al siguiente:

      Imágenes que se muestran de una consulta de búsqueda vectorial multimodal.

Limpia

  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.