Gerar e pesquisar embeddings multimodais

Neste tutorial, mostramos como gerar embeddings multimodais para imagens e texto usando o BigQuery e a Vertex AI e, em seguida, usar esses embeddings para realizar uma pesquisa semântica de conversão de texto em imagem.

Este tutorial abrange as seguintes tarefas:

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

Funções exigidas

Para seguir este tutorial, você precisa dos seguintes papéis do Identity and Access Management (IAM):

  • Criar e usar conjuntos de dados, conexões, modelos e notebooks do BigQuery: administrador do BigQuery Studio (roles/bigquery.studioAdmin).
  • Conceda permissões à conta de serviço da conexão: administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin).

Esses papéis predefinidos contêm as permissões necessárias para executar as tarefas neste documento. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

  • Criar um conjunto de dados: bigquery.datasets.create
  • Criar, delegar e usar uma conexão: bigquery.connections.*
  • Defina a conexão padrão: bigquery.config.*
  • Defina as permissõ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

Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do 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 gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Para mais informações, consulte Preços do BigQuery na documentação do BigQuery.

Para mais informações sobre preços da Vertex AI, consulte esta página.

Antes de começar

  1. No console do Google Cloud , na página do seletor de projetos, selecione ou crie um projeto do Google Cloud .

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.

    Acessar o seletor de projetos

  2. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  3. Ative as APIs BigQuery, BigQuery Connection e Vertex AI.

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador de uso do serviço (roles/serviceusage.serviceUsageAdmin), que contém a permissão serviceusage.services.enable. Saiba como conceder papéis.

    Ativar as APIs

crie um conjunto de dados

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

Console

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

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

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

    • Para o código do conjunto de dados, insira bqml_tutorial.

    • Em Tipo de local, selecione Multirregião e EUA.

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

bq

Para criar um conjunto de dados, use o comando bq mk --dataset.

  1. Crie um conjunto de dados chamado bqml_tutorial com o local dos dados definido como US.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Confirme se 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"
  }
}

Criar a tabela de objetos

Crie uma tabela de objetos sobre as imagens de arte no bucket gcs-public-data--met público do Cloud Storage. Com a tabela de objetos, é possível analisar as imagens sem movê-las do Cloud Storage.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

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

Analise os dados da imagem

Crie um notebook Colab Enterprise no BigQuery para explorar os dados da imagem.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. Crie um notebook usando o editor do BigQuery.

  3. Conecte o notebook ao ambiente de execução padrão.

  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 você está usando para este tutorial.

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

  5. Ative a exibição da tabela:

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

      A resposta deve ficar assim:

      Imagens que mostram objetos do Metropolitan Museum of Art.

  8. Salve o notebook como met-image-analysis.

Criar o modelo remoto

Crie um modelo remoto que represente um modelo de incorporação multimodal hospedado da Vertex AI:

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

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

    A consulta leva alguns segundos para ser concluída. Depois disso, você pode acessar o modelo multimodal_embedding_model que aparece no conjunto de dados bqml_tutorial. Como a consulta usa uma instrução CREATE MODEL para criar um modelo, não há resultados de consulta.

Gerar embeddings de imagem

Gere embeddings das imagens na tabela de objetos usando a função AI.GENERATE_EMBEDDING. Depois, grave-os em uma tabela para usar em uma etapa a seguir. A geração de embedding é uma operação cara. Por isso, a consulta usa uma cláusula LIMIT para limitar a geração de embeddings a 10.000 imagens, em vez de incorporar o conjunto de dados completo de 601.294 imagens. Isso também ajuda a manter o número de imagens abaixo do limite de 25.000 para a função AI.GENERATE_EMBEDDING. Essa consulta leva aproximadamente 40 minutos para ser executada.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

    CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings`
    AS
    SELECT *
    FROM
      AI.GENERATE_EMBEDDING(
        MODEL `bqml_tutorial.multimodal_embedding_model`,
        (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))

Corrigir erros de geração de embedding

Verifique e corrija erros de geração de incorporação. A geração de embeddings pode falhar por causa das cotas de IA generativa na Vertex AI ou da indisponibilidade de serviços.

A função AI.GENERATE_EMBEDDING retorna detalhes do erro na coluna status. Essa coluna estará vazia se a geração de incorporação tiver sido bem-sucedida ou conterá uma mensagem de erro se a geração de incorporação falhar.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

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

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

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

Criar um índice vetorial

Também é possível usar a instrução CREATE VECTOR INDEX para criar o índice de vetor met_images_index na coluna embedding da tabela met_images_embeddings. Um índice vetorial permite realizar uma pesquisa de vetor mais rapidamente, com a desvantagem de reduzir o recall e retornar resultados mais aproximados.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

    CREATE OR REPLACE
      VECTOR INDEX `met_images_index`
    ON
      bqml_tutorial.met_image_embeddings(embedding)
      OPTIONS (
        index_type = 'IVF',
        distance_type = 'COSINE');
  3. O índice de vetor é criado de forma assíncrona. Para verificar se o índice de vetor foi criado, consulte a visualização INFORMATION_SCHEMA.VECTOR_INDEXES e confirme se o valor de coverage_percentage é maior que 0. e o valor de last_refresh_time não for 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';

Gerar um embedding para o texto de pesquisa

Para pesquisar imagens que correspondam a uma string de pesquisa de texto especificada, primeiro crie um embedding de texto para essa string. Use o mesmo modelo remoto para criar o embedding de texto usado para gerar os embeddings de imagem e, em seguida, grave o embedding de texto em uma tabela para uso em uma etapa seguinte. A string de pesquisa é pictures of white or cream colored dress from victorian era.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

    CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding`
    AS
    SELECT * FROM AI.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 realizar uma pesquisa semântica de imagens que melhor correspondem à string de pesquisa representada pelo embedding de texto.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No editor de consultas, execute a consulta a seguir para fazer uma pesquisa semântica e gravar os resultados em uma 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`,
        'embedding',
        TABLE `bqml_tutorial.search_embedding`,
        'embedding',
        top_k => 3);

Visualizar os resultados da pesquisa semântica

Visualizar os resultados da pesquisa semântica usando um notebook.

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

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

  3. Visualize os resultados da pesquisa de vetor:

    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.

      A resposta deve ficar assim:

      Imagens retornadas de uma consulta de pesquisa de vetor multimodal.

Limpar

  1. No console Google Cloud , acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.