O Open Neural Network Exchange (ONNX) fornece um formato uniforme projetado para representar qualquer framework de aprendizado de máquina. O suporte do BigQuery ML para ONNX permite que você:
- Treine um modelo usando seu framework favorito.
- Converta o modelo no formato de modelo ONNX.
- Importe o modelo ONNX para o BigQuery e faça previsões usando o BigQuery ML.
Neste tutorial, mostramos como importar modelos ONNX treinados com PyTorch em um conjunto de dados do BigQuery e usá-los para fazer previsões a partir de uma consulta SQL.
Objetivos
- Importe um modelo pré-treinado usando o PyTorch.
- Converta o modelo para o formato ONNX usando torch.onnx.
- Use a instrução
CREATE MODEL
para importar o modelo ONNX para o BigQuery. - Use a função
ML.PREDICT
para fazer previsões com o modelo ONNX importado.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Cloud Storage APIs.
- Verifique se você tem as permissões necessárias para realizar as tarefas neste documento.
Funções exigidas
Se você criar um projeto, será o proprietário dele e receberá todas as permissões do Identity and Access Management (IAM) necessárias para concluir este tutorial.
Se você estiver usando um projeto, faça o seguinte:
Make sure that you have the following role or roles on the project:
- BigQuery Studio Admin (
roles/bigquery.studioAdmin
) - BigQuery Connection Admin (
roles/bigquery.connectionAdmin
) - Storage Admin
(roles/storage.admin)
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Acessar o IAM - Selecionar um projeto.
- Clique em CONCEDER ACESSO.
-
No campo Novos principais, insira seu identificador de usuário. Normalmente, é o endereço de e-mail de uma Conta do Google.
- Na lista Selecionar um papel, escolha um.
- Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.
- Clique em Salvar.
Para mais informações sobre as permissões do IAM no BigQuery, consulte Permissões do IAM.
Opcional: treine um modelo e o converta para o formato ONNX
Os exemplos de código abaixo mostram como importar um modelo de classificação
pré-treinado para o PyTorch e como converter o modelo resultante para o formato ONNX. Este
tutorial usa um modelo de exemplo pré-criado armazenado em
gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
. Não é necessário
concluir essas etapas se você estiver usando o modelo de exemplo.
Criar um modelo de visão PyTorch para classificação de imagens
Use o exemplo de código abaixo para importar um modelo resnet18 pré-treinado do PyTorch
que aceita dados de imagem decodificados retornados pelas funções do BigQuery ML
ML.DECODE_IMAGE
e ML.RESIZE_IMAGE
.
import torch
import torch.nn as nn
# Define model input format to match the output format of
# ML.DECODE_IMAGE function: [height, width, channels]
dummy_input = torch.randn(1, 224, 224, 3, device="cpu")
# Load a pretrained pytorch model for image classification
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)
# Reshape input format from [batch_size, height, width, channels]
# to [batch_size, channels, height, width]
class ReshapeLayer(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
x = x.permute(0, 3, 1, 2) # reorder dimensions
return x
class ArgMaxLayer(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
return torch.argmax(x, dim=1)
final_model = nn.Sequential(
ReshapeLayer(),
model,
nn.Softmax(),
ArgMaxLayer()
)
Converter o modelo para o formato ONNX
Use o exemplo a seguir para exportar o modelo de visão PyTorch usando
torch.onnx. O arquivo ONNX exportado é chamado resnet18.onnx
.
torch.onnx.export(final_model, # model being run
dummy_input, # model input
"resnet18.onnx", # where to save the model
opset_version=10, # the ONNX version to export the model to
input_names = ['input'], # the model's input names
output_names = ['class_label']) # the model's output names
Faça o upload do modelo ONNX para o Cloud Storage.
Depois de salvar o modelo, faça o seguinte:
- Crie um bucket do Cloud Storage para armazenar o modelo.
- Faça upload do modelo ONNX para seu bucket do Cloud Storage.
Criar 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 (várias regiões nos Estados Unidos).
Os conjuntos de dados públicos são armazenados na multirregião
US
. Para simplificar, armazene seus conjuntos de dados no mesmo local.- 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
referência
comando bq mk --dataset
.
Crie um conjunto de dados chamado
bqml_tutorial
com o local de dados definido 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 você omitir-d
e--dataset
, o comando vai criar um conjunto de dados por padrão.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" } }
Importar o modelo ONNX para o BigQuery
As etapas a seguir mostram como importar o modelo ONNX de exemplo do Cloud Storage para seu conjunto de dados usando uma instrução CREATE MODEL
.
Console
No console do Google Cloud, acesse a página BigQuery Studio.
No editor de consultas, insira a instrução
CREATE MODEL
abaixo.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Substitua
BUCKET_PATH
pelo caminho do modelo que você fez upload para o Cloud Storage. Se você estiver usando o modelo de exemplo, substituaBUCKET_PATH
pelo seguinte valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Quando a operação for concluída, uma mensagem semelhante a esta será exibida:
Successfully created model named imported_onnx_model
.O novo modelo vai aparecer no painel Recursos. Os modelos são indicados pelo ícone:
Se você selecionar o novo modelo no painel Recursos, as informações sobre o modelo vão aparecer ao lado do Editor de consultas.
bq
Para importar o modelo ONNX do Cloud Storage, insira a seguinte instrução
CREATE MODEL
.bq query --use_legacy_sql=false \ "CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')"
Substitua
BUCKET_PATH
pelo caminho do modelo que você fez upload para o Cloud Storage. Se você estiver usando o modelo de exemplo, substituaBUCKET_PATH
por este valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Depois de importar o modelo, verifique se ele aparece no conjunto de dados.
bq ls bqml_tutorial
O resultado será assim:
tableId Type --------------------- ------- imported_onnx_model MODEL
Para mais informações sobre como importar modelos ONNX para o BigQuery,
incluindo requisitos de formato e armazenamento, consulte A instrução CREATE MODEL
para
importar modelos ONNX.
Criar uma tabela de objetos no BigQuery para analisar dados de imagem
Uma tabela de objetos é uma tabela somente leitura sobre objetos de dados não estruturados que residem no Cloud Storage. As tabelas de objetos permitem analisar dados não estruturados do BigQuery.
Neste tutorial, você vai usar a função ML.PREDICT
para gerar o rótulo de classe
previsto de uma imagem de entrada armazenada em um bucket do Cloud Storage.
Para criar a tabela de objetos, faça o seguinte:
- Crie um bucket do Cloud Storage e faça upload de uma imagem de um peixinho dourado.
- Crie uma conexão de recursos do Cloud usada para acessar a tabela de objetos.
- Conceda acesso à conta de serviço da conexão de recurso.
Criar um bucket e fazer upload de uma imagem
Siga estas etapas para criar um bucket do Cloud Storage e fazer upload de uma imagem de um peixinho dourado.
Console
- No Console do Google Cloud, acesse a página Buckets do Cloud Storage.
Clique em
Criar.Na página Criar um bucket, insira as informações do seu bucket.
Na seção Começar, faça o seguinte:
Na caixa, digite
bqml_images
.Clique em Continuar.
Na seção Escolha onde armazenar seus dados, faça o seguinte:
Em Tipo de local, selecione Multirregional.
No menu do tipo de local, selecione EUA (várias regiões nos Estados Unidos).
Clique em Continuar.
Na seção Escolha uma classe de armazenamento para seus dados:
Selecione Definir uma classe padrão.
Selecione Padrão.
Clique em Continuar.
Nas outras seções, deixe os valores padrão.
Clique em Criar.
Linha de comando
Digite este comando gcloud storage buckets create
:
gcloud storage buckets create gs://bqml_images --location=us
Se a solicitação for bem-sucedida, o comando retornará a seguinte mensagem:
Creating gs://bqml_images/...
Faça upload de uma imagem para o bucket do Cloud Storage
Depois que o bucket for criado, faça o download de uma imagem de um peixinho dourado e faça upload dela para o bucket do Cloud Storage.
Siga estas etapas para fazer o upload da imagem:
Console
- No Console do Google Cloud, acesse a página Buckets do Cloud Storage.
Na lista de buckets, clique em
bqml_images
.Na guia Objetos do bucket, faça o seguinte:
Arraste o arquivo da área de trabalho ou do gerenciador de arquivos para o painel principal no console do Google Cloud.
Clique em Enviar > Enviar arquivos, selecione o arquivo de imagem que você quer enviar na caixa de diálogo exibida e clique em Abrir.
Linha de comando
Digite este comando gcloud storage cp
:
gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Substitua:
OBJECT_LOCATION
: o caminho local para o arquivo de imagem. Por exemplo,Desktop/goldfish.jpg
.IMAGE_NAME
: o nome da imagem. Por exemplo,goldfish.jpg
.
Se a operação for bem-sucedida, a resposta será semelhante a esta:
Completed files 1/1 | 164.3kiB/164.3kiB
Criar uma conexão de recursos do Cloud do BigQuery
Você precisa ter uma conexão de recursos do Cloud para se conectar à tabela de objetos que você vai criar mais adiante neste tutorial.
As conexões de recursos do Cloud permitem consultar dados armazenados fora do BigQuery em serviços do Google Cloud Google Cloud, como o Cloud Storage ou o Spanner, ou em fontes de terceiros, como AWS ou Azure. Essas conexões externas usam a API BigQuery Connection.
Siga estas etapas para criar a conexão de recurso do Cloud.
Console
Acesse a página do BigQuery Studio.
Para criar uma conexão, clique em
Adicionar e em Conexões com fontes de dados externas.Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (Cloud Resource).
No campo ID da conexão, insira
bqml_tutorial
.Verifique se a opção Multirregional — EUA está selecionada.
Clique em Criar conexão.
Na parte de baixo da janela, clique em Acessar conexão. Como alternativa, no painel Explorer, expanda Conexões externas e clique em
us.bqml_tutorial
.No painel Informações da conexão, copie o ID da conta de serviço. Você vai precisar desse ID ao configurar as permissões para a conexão. Quando você cria um recurso de conexão, o BigQuery cria uma conta de serviço do sistema exclusiva e a associa à conexão.
bq
Criar uma conexão
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud. O parâmetro--project_id
substitui o projeto padrão.Quando você cria um recurso de conexão, o BigQuery cria uma conta de serviço do sistema exclusiva e a associa à conexão.
Solução de problemas: se você receber o seguinte erro de conexão, atualize o SDK Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupere e copie o ID da conta de serviço para uso em uma etapa posterior:
bq show --connection PROJECT_ID.us.bqml_tutorial
O resultado será assim:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Configurar o acesso à conexão
Conceda o papel de administrador de objetos do Storage à conta de serviço da conexão de recurso do Cloud. É necessário conceder essa função no mesmo projeto em que você criou o endpoint do modelo remoto.
Para conceder o papel, siga estas etapas:
Acessar a página AM e administrador
Clique em
Conceder acesso.No campo Novos principais, insira o ID da conta de serviço da conexão de recursos do Cloud que você copiou anteriormente.
No campo Selecionar um papel, escolha Cloud Storage e, em seguida, selecione Administrador de objetos do Storage.
Clique em Salvar.
Criar a tabela de objetos
Siga estas etapas para criar uma tabela de objetos chamada goldfish_image_table
usando a imagem dourada que você enviou para o Cloud Storage.
Console
Acesse a página do BigQuery Studio.
No editor de consultas, insira esta consulta para criar a tabela de objetos.
CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table` WITH CONNECTION `us.bqml_tutorial` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://bqml_images/IMAGE_NAME'], max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC');
Substitua
IMAGE_NAME
pelo nome do arquivo de imagem, por exemplo,goldfish.jpg
.Quando a operação for concluída, uma mensagem como
This statement created a new table named goldfish_image_table
vai aparecer.
bq
Crie a tabela de objetos inserindo a seguinte instrução
CREATE EXTERNAL TABLE
.bq query --use_legacy_sql=false \ "CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table` WITH CONNECTION `us.bqml_tutorial` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://bqml_images/IMAGE_NAME'], max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC')"
Substitua
IMAGE_NAME
pelo nome do arquivo de imagem, por exemplo,goldfish.jpg
.Depois de criar a tabela de objetos, verifique se ela aparece no conjunto de dados.
bq ls bqml_tutorial
O resultado será assim:
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Para mais informações, consulte Criar tabelas de objetos.
Fazer previsões com o modelo ONNX importado
Use a consulta a seguir, que contém a função ML.PREDICT
, para fazer previsões com base nos dados de imagem na tabela de objetos de entrada goldfish_image_table
. Essa consulta gera o rótulo de classe previsto da imagem de entrada com base no dicionário de rótulos do ImageNet.
Na consulta, a função ML.DECODE_IMAGE
é necessária para decodificar os dados da imagem para que ela possa ser interpretada por
ML.PREDICT
. A função ML.RESIZE_IMAGE
é chamada para
redimensionar a imagem para se ajustar ao tamanho da entrada do modelo (224*224).
Para mais informações sobre como executar a inferência em tabelas de objetos de imagem, consulte Executar inferência em tabelas de objetos de imagem.
Para fazer previsões com os dados da imagem, faça o seguinte.
Console
Acesse a página do BigQuery Studio.
No editor de consultas, insira a consulta
ML.PREDICT
a seguir.SELECT class_label FROM ML.PREDICT(MODEL
bqml_tutorial.imported_onnx_model
, ( SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA), 224, 224, FALSE) AS input FROM bqml_tutorial.goldfish_image_table))Os resultados da consulta são semelhantes a estes:
bq
Digite este comando bq query
:
bq query --use_legacy_sql=false \
'SELECT
class_label
FROM
ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
(
SELECT
ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
224,
224,
FALSE) AS input
FROM
bqml_tutorial.goldfish_image_table))'
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
Console
- 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.
gcloud
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Excluir recursos individuais
Como alternativa, para remover os recursos individuais usados neste tutorial, faça o seguinte:
A seguir
- Para mais informações sobre como importar modelos ONNX, consulte
A instrução
CREATE MODEL
para modelos ONNX. - Para mais informações sobre conversores e tutoriais ONNX disponíveis, consulte Como converter para o formato ONNX.
- Para uma visão geral sobre ML do BigQuery, consulte Introdução ao ML do BigQuery.
- Para começar a usar o BigQuery ML, consulte Criar modelos de machine learning no BigQuery ML.