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:
- Criar uma tabela de objetos do BigQuery sobre dados de imagem em um bucket do Cloud Storage.
- Analisar os dados da imagem usando um bloco do Colab Enterprise no BigQuery.
- Criar um
modelo remoto
do BigQuery ML
direcionado ao
modelo de fundação
multimodalembeddingda Vertex AI. - Uso do modelo remoto com a função
AI.GENERATE_EMBEDDINGpara gerar embeddings a partir das imagens na tabela de objetos. - Corrija todos os erros de geração de embedding.
- Opcionalmente, criar um índice vetorial para indexar os embeddings de imagem.
- Criar um embedding de texto para uma determinada string de pesquisa.
- Usar a
função
VECTOR_SEARCHpara realizar uma pesquisa semântica de embeddings de imagens semelhantes ao embedding de texto. - Visualização dos resultados usando um notebook.
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.getIamPolicyeresourcemanager.projects.setIamPolicy - Crie uma tabela de objetos:
bigquery.tables.createebigquery.tables.update - Crie um modelo e execute a inferência:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateDatabigquery.models.updateMetadata
- Criar e usar notebooks:
resourcemanager.projects.getresourcemanager.projects.listbigquery.config.getbigquery.jobs.createbigquery.readsessions.createbigquery.readsessions.getDatabigquery.readsessions.updatedataform.locations.getdataform.locations.listdataform.repositories.create
.dataform.repositories.listdataform.collections.createdataform.collections.listaiplatform.notebookRuntimeTemplates.applyaiplatform.notebookRuntimeTemplates.getaiplatform.notebookRuntimeTemplates.listaiplatform.notebookRuntimeTemplates.getIamPolicyaiplatform.notebookRuntimes.assignaiplatform.notebookRuntimes.getaiplatform.notebookRuntimes.listaiplatform.operations.listaiplatform.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.
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
-
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ãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
-
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ãoserviceusage.services.enable. Saiba como conceder papéis.
crie um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar seu modelo de ML.
Console
No console do Google Cloud , acesse a página BigQuery.
No painel Explorer, clique no nome do seu projeto.
Clique em Conferir ações > Criar conjunto de dados.
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.
Crie um conjunto de dados chamado
bqml_tutorialcom o local dos dados definido comoUS.bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
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.
No console do Google Cloud , acesse a página BigQuery.
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.
No console do Google Cloud , acesse a página BigQuery.
Configure o notebook:
- Adicione uma célula de código ao notebook.
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_IDpelo nome do projeto que você está usando para este tutorial.Execute a célula de código.
Ative a exibição da tabela:
- Adicione uma célula de código ao notebook.
Copie e cole o seguinte código na célula de código:
#@title Enable data table display %load_ext google.colab.data_tableExecute a célula de código.
Crie uma função para mostrar as imagens:
- Adicione uma célula de código ao notebook.
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()Execute a célula de código.
Mostre as imagens:
- Adicione uma célula de código ao notebook.
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))Execute a célula de código.
A resposta deve ficar assim:
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:
No console do Google Cloud , acesse a página BigQuery.
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_modelque aparece no conjunto de dadosbqml_tutorial. Como a consulta usa uma instruçãoCREATE MODELpara 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.
No console do Google Cloud , acesse a página BigQuery.
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.
No console do Google Cloud , acesse a página BigQuery.
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;
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.
No console do Google Cloud , acesse a página BigQuery.
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');
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_INDEXESe confirme se o valor decoverage_percentageé maior que0. e o valor delast_refresh_timenão forNULL: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.
No console do Google Cloud , acesse a página BigQuery.
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 ) );
Realizar uma pesquisa semântica de conversão de texto em imagem
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.
No console do Google Cloud , acesse a página BigQuery.
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.
No console do Google Cloud , acesse a página BigQuery.
Abra o notebook
met-image-analysisque você criou anteriormente.Visualize os resultados da pesquisa de vetor:
- Adicione uma célula de código ao notebook.
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))Execute a célula de código.
A resposta deve ficar assim:
Limpar
- No console Google Cloud , acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.