Gere e pesquise incorporações multimodais

Este tutorial mostra como gerar incorporações multimodais para imagens e texto usando o BigQuery e o Vertex AI e, em seguida, usar estas incorporações para realizar uma pesquisa semântica de texto para imagem.

Este tutorial abrange as seguintes tarefas:

Este tutorial usa as imagens de arte do domínio público do The Metropolitan Museum of Art que estão disponíveis no contentor do gcs-public-data--met Cloud Storage público.

Funções necessárias

Para executar este tutorial, precisa das seguintes funções de gestão de identidade e de acesso (IAM):

  • Criar e usar conjuntos de dados, ligações, modelos e blocos de notas do BigQuery: Administrador do BigQuery Studio (roles/bigquery.studioAdmin).
  • Conceda autorizações à conta de serviço da associação: administrador de IAM do projeto (roles/resourcemanager.projectIamAdmin).

Estas funções predefinidas contêm as autorizações necessárias para realizar as tarefas descritas neste documento. Para ver as autorizações exatas necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

  • Crie um conjunto de dados: bigquery.datasets.create
  • Crie, delegue e use uma associação: bigquery.connections.*
  • Defina a ligação predefinida: bigquery.config.*
  • Defina as autorizações da conta de serviço: resourcemanager.projects.getIamPolicy e resourcemanager.projects.setIamPolicy
  • Crie uma tabela de objetos: bigquery.tables.create e bigquery.tables.update
  • Crie um modelo e execute a inferência:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Criar e usar 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

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Custos

Neste documento, usa os seguintes componentes faturáveis do 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 mais informações acerca dos preços do BigQuery, consulte os preços do BigQuery na documentação do BigQuery.

Para mais informações sobre os preços do Vertex AI, consulte a página de preços do Vertex AI.

Antes de começar

  1. In the Trusted Cloud console, on the project selector page, select or create a Trusted 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 Trusted 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

Crie um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar o seu modelo de ML.

Consola

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda à página do BigQuery

  2. No painel Explorador, clique no nome do projeto.

  3. Clique em Ver ações > Criar conjunto de dados

  4. Na página Criar conjunto de dados, faça o seguinte:

    • Para o ID do conjunto de dados, introduza bqml_tutorial.

    • Em Tipo de localização, selecione Várias regiões e, de seguida, selecione EUA (várias regiões nos Estados Unidos).

    • Deixe as restantes predefinições como estão e clique em Criar conjunto de dados.

bq

Para criar um novo conjunto de dados, use o comando bq mk com a flag --location. Para uma lista completa de parâmetros possíveis, consulte a referência do comando bq mk --dataset.

  1. Crie um conjunto de dados com o nome bqml_tutorial com a localização dos dados definida como US e uma descrição de BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Em vez de usar a flag --dataset, o comando usa o atalho -d. Se omitir -d e --dataset, o comando cria um conjunto de dados por predefinição.

  2. Confirme que o conjunto de dados foi criado:

    bq ls

API

Chame o método datasets.insert com um recurso de conjunto de dados definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

import google.cloud.bigquery

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

Crie a tabela de objetos

Crie uma tabela de objetos sobre as imagens artísticas no contentor do Cloud Storage público gcs-public-data--met. A tabela de objetos permite analisar as imagens sem as mover do Cloud Storage.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta:

    CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images`
    WITH CONNECTION DEFAULT
    OPTIONS
      ( object_metadata = 'SIMPLE',
        uris = ['gs://gcs-public-data--met/*']
      );

Explore os dados da imagem

Crie um bloco de notas do Colab Enterprise no BigQuery para explorar os dados de imagens.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. Crie um bloco de notas com o editor do BigQuery.

  3. Associe o bloco de notas ao tempo de execução predefinido.

  4. Configure o notebook:

    1. Adicione uma célula de código ao notebook.
    2. Copie e cole o seguinte código na célula 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)
      

      Substitua PROJECT_ID pelo nome do projeto que está a usar para este tutorial.

    3. Execute a célula de código.

  5. Ativar apresentação de tabelas:

    1. Adicione uma célula de código ao notebook.
    2. Copie e cole o seguinte código na célula de código:

      #@title Enable data table display
      %load_ext google.colab.data_table
      
    3. Execute a célula de código.

  6. Crie uma função para apresentar as imagens:

    1. Adicione uma célula de código ao notebook.
    2. Copie e cole o seguinte código na célula 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. Execute a célula de código.

  7. Apresentar as imagens:

    1. Adicione uma célula de código ao notebook.
    2. Copie e cole o seguinte código na célula 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. Execute a célula de código.

      Os resultados devem ter um aspeto semelhante ao seguinte:

      Imagens que mostram objetos do Metropolitan Museum of Art.

  8. Guarde o bloco de notas como met-image-analysis.

Crie o modelo remoto

Crie um modelo remoto que represente um modelo de incorporação multimodal do Vertex AI alojado:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta:

    CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'multimodalembedding@001');

    A consulta demora vários segundos a ser concluída. Após a conclusão, o modelo multimodal_embedding_model aparece no conjunto de dados bqml_tutorial no painel Explorador. Uma vez que a consulta usa uma declaração CREATE MODEL para criar um modelo, não existem resultados da consulta.

Gere incorporações de imagens

Gere incorporações a partir das imagens na tabela de objetos através da função ML.GENERATE_EMBEDDING e, em seguida, escreva-as numa tabela para utilização num passo seguinte. A geração de incorporações é uma operação dispendiosa, pelo que a consulta usa uma subconsulta que inclui a cláusula LIMIT para limitar a geração de incorporações a 10 000 imagens, em vez de incorporar o conjunto de dados completo de 601 294 imagens. Isto também ajuda a manter o número de imagens abaixo do limite de 25 000 para a função ML.GENERATE_EMBEDDING. Esta consulta demora aproximadamente 40 minutos a ser executada.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte 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))

Corrija quaisquer erros de geração de incorporações

Verifique e corrija quaisquer erros de geração de incorporações. A geração de incorporações pode falhar devido a quotas de IA generativa no Vertex AI ou indisponibilidade do serviço.

A função ML.GENERATE_EMBEDDING devolve detalhes de erros na coluna ml_generate_embedding_status. Esta coluna está vazia se a geração de incorporações tiver sido bem-sucedida ou contém uma mensagem de erro se a geração de incorporações tiver falhado.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta para ver se houve falhas na geração de incorporações:

    SELECT DISTINCT(ml_generate_embedding_status),
      COUNT(uri) AS num_rows
    FROM bqml_tutorial.met_image_embeddings
    GROUP BY 1;
  3. Se forem devolvidas linhas com erros, elimine todas as linhas em que a geração de incorporações falhou:

    DELETE FROM `bqml_tutorial.met_image_embeddings`
    WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';

Crie um índice vetorial

Opcionalmente, pode usar a declaração CREATE VECTOR INDEX para criar o índice de vetores na coluna ml_generate_embedding_result da tabela met_images_embeddings.met_images_index Um índice vetorial permite-lhe realizar uma pesquisa vetorial mais rapidamente, com a desvantagem de reduzir a capacidade de memorização e, por isso, devolver resultados mais aproximados.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte 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. O índice vetorial é criado de forma assíncrona. Para verificar se o índice vetorial foi criado, consulte a vista INFORMATION_SCHEMA.VECTOR_INDEXES e confirme que o valor coverage_percentage é superior a 0 e que o valor last_refresh_time não é 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';

Gere uma incorporação para o texto de pesquisa

Para pesquisar imagens que correspondam a uma string de pesquisa de texto especificada, tem de criar primeiro uma incorporação de texto para essa string. Use o mesmo modelo remoto para criar a incorporação de texto que usou para criar as incorporações de imagens e, em seguida, escreva a incorporação de texto numa tabela para usar num passo seguinte. A string de pesquisa é pictures of white or cream colored dress from victorian era.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte 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
      )
    );

Use a função VECTOR_SEARCH para fazer uma pesquisa semântica de imagens que correspondam melhor à string de pesquisa representada pela incorporação de texto.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta para fazer uma pesquisa semântica e escrever os resultados numa tabela:

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

Visualize os resultados da pesquisa semântica

Visualize os resultados da pesquisa semântica através de um bloco de notas.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. Abra o notebook met-image-analysis que criou anteriormente.

  3. Visualize os resultados da pesquisa vetorial:

    1. Adicione uma célula de código ao notebook.
    2. Copie e cole o seguinte código na célula de código:

      query = """
        SELECT * FROM `bqml_tutorial.vector_search_results`
        ORDER BY distance;
      """
      
      printImages(client.query(query))
      
    3. Execute a célula de código.

      Os resultados devem ter um aspeto semelhante ao seguinte:

      Imagens devolvidas de uma consulta de pesquisa vetorial multimodal.

Limpar

  1. In the Trusted 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.