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:
- Criar uma tabela de objetos do BigQuery com dados de imagens num contentor do Cloud Storage.
- Explorar os dados de imagens através de um bloco de notas do Colab Enterprise no BigQuery.
- Criar um modelo remoto do BigQuery ML
que segmenta o modelo de base da Vertex AI
multimodalembedding
. - Usando o modelo remoto com a função
ML.GENERATE_EMBEDDING
para gerar incorporações a partir das imagens na tabela de objetos. - Corrija quaisquer erros de geração de incorporações.
- Opcionalmente, criar um índice vetorial para indexar as incorporações de imagens.
- Criar uma incorporação de texto para uma determinada string de pesquisa.
- Usando a função
VECTOR_SEARCH
para realizar uma pesquisa semântica de incorporações de imagens semelhantes à incorporação de texto. - Visualizar os resultados através de um bloco de notas.
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
eresourcemanager.projects.setIamPolicy
- Crie uma tabela de objetos:
bigquery.tables.create
ebigquery.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
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Trusted 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.enable
permission. Learn how to grant roles.
Crie um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o seu modelo de ML.
Consola
Na Trusted Cloud consola, aceda à página BigQuery.
No painel Explorador, clique no nome do projeto.
Clique em
Ver ações > Criar conjunto de dadosNa 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
.
Crie um conjunto de dados com o nome
bqml_tutorial
com a localização dos dados definida comoUS
e uma descrição deBigQuery 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.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.
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.
Na Trusted Cloud consola, aceda à página BigQuery.
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.
Na Trusted Cloud consola, aceda à 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_ID
pelo nome do projeto que está a usar para este tutorial.Execute a célula de código.
Ativar apresentação de tabelas:
- 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_table
Execute a célula de código.
Crie uma função para apresentar 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.
Apresentar 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.
Os resultados devem ter um aspeto semelhante ao seguinte:
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:
Na Trusted Cloud consola, aceda à página BigQuery.
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 dadosbqml_tutorial
no painel Explorador. Uma vez que a consulta usa uma declaraçãoCREATE 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.
Na Trusted Cloud consola, aceda à página BigQuery.
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.
Na Trusted Cloud consola, aceda à página BigQuery.
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;
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.
Na Trusted Cloud consola, aceda à página BigQuery.
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');
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 valorcoverage_percentage
é superior a0
e que o valorlast_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
.
Na Trusted Cloud consola, aceda à página BigQuery.
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 ) );
Efetue uma pesquisa semântica de texto para imagem
Na Trusted Cloud consola, aceda à página BigQuery.
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.
Na Trusted Cloud consola, aceda à página BigQuery.
Abra o notebook
met-image-analysis
que criou anteriormente.Visualize os resultados da pesquisa vetorial:
- 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.
Os resultados devem ter um aspeto semelhante ao seguinte:
Limpar
- In the Trusted 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.