Gerar e pesquisar embeddings multimodais
Este tutorial mostra como gerar embeddings multimodais para imagens e texto usando o BigQuery e a Vertex AI e, em seguida, usar estes embeddings para realizar uma pesquisa semântica de texto para 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
VECTOR_SEARCHfunção para 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 do Cloud Storage
gcs-public-data--met.
Funções exigidas
Para seguir este tutorial, você precisa das seguintes funções do Identity and Access Management (IAM) roles:
- Criar e usar conjuntos de dados, conexões, modelos e notebooks do BigQuery:
administrador do BigQuery Studio (
roles/bigquery.studioAdmin). - Conceder 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.* - Definir a conexão padrão:
bigquery.config.* - Definir permissões da conta de serviço:
resourcemanager.projects.getIamPolicyeresourcemanager.projects.setIamPolicy - Criar uma tabela de objetos:
bigquery.tables.createebigquery.tables.update - Criar um modelo e executar 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 sua projeção de uso, utilize a calculadora de preços.
Para mais informações, consulte Preços do BigQuery em a documentação do BigQuery.
Para mais informações sobre preços da Vertex AI, consulte esta página.
Antes de começar
-
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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enablepermission. Learn how to grant roles.
crie um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o modelo de ML.
Console
No Google Cloud console, acesse a página BigQuery.
No painel Explorer, clique no nome do seu projeto.
Clique em Ver 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 (várias regiões nos Estados Unidos).
Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.
bq
Para criar um novo conjunto de dados, utilize o
comando bq mk
com a sinalização --location. Para obter uma lista completa de parâmetros, consulte a
bq mk --dataset referência
comando.
Crie um conjunto de dados chamado
bqml_tutorialcom o local de dados definido comoUSe uma descrição deBigQuery ML tutorial dataset:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
Em vez de usar a sinalização
--dataset, o comando usa o atalho-d. Se você omitir-de--dataset, o comando será padrão para criar um conjunto de dados.Confirme se o conjunto de dados foi criado:
bq ls
API
Chame o datasets.insert
método 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 Google Cloud console, 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 Google Cloud console, 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 Google Cloud console, 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
multimodal_embedding_modelmodelo que aparece nobqml_tutorialconjunto de dados. 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 Google Cloud console, 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 Google Cloud console, 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 Google Cloud console, 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 Google Cloud console, 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 texto para imagem
Use a função
VECTOR_SEARCH `VECTOR_SEARCH`
para realizar uma pesquisa semântica de imagens que melhor correspondem à string de pesquisa
representada pelo embedding de texto.
No Google Cloud console, acesse a página BigQuery.
No Editor de consultas, execute a seguinte consulta para realizar 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
Visualize os resultados da pesquisa semântica usando um notebook.
No Google Cloud console, 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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.