O Open Neural Network Exchange (ONNX) fornece um formato uniforme projetado para representar qualquer framework de machine learning. 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.
Opcional: treinar um modelo e convertê-lo para o formato ONNX
Os exemplos de código a seguir mostram como importar um modelo de classificação pré-treinado para o PyTorch e como converter o modelo resultante no 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 amostra.
Criar um modelo de visão PyTorch para classificação de imagens
Use o exemplo de código a seguir 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 no formato ONNX
Use o exemplo a seguir para exportar o modelo de visão PyTorch usando
torch.onnx. O arquivo ONNX exportado é chamado de 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.
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
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
referência
comando bq mk --dataset
.
Crie um conjunto de dados chamado
bqml_tutorial
com o local dos 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" } }
BigQuery DataFrames
Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.
Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.
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 seguinte instrução
CREATE MODEL
.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Substitua
BUCKET_PATH
pelo caminho para o 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
.Seu 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
Importe o modelo ONNX do Cloud Storage inserindo 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 para o 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 -m 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. Com as tabelas de objetos, é possível 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 peixe dourado.
- Crie uma conexão de recursos do Cloud que será usada para acessar a tabela de objetos.
- Conceda acesso à conta de serviço da conexão de recursos.
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 peixe 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 Escolher uma classe de armazenamento para os 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/...
Fazer 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 peixe dourado e faça upload dela para o bucket do Cloud Storage.
Siga estas etapas para fazer 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 Fazer upload > Fazer upload de 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 será criada mais adiante neste tutorial.
As conexões de recursos do Google Cloud permitem consultar dados armazenados fora do BigQuery em serviços como Cloud Storage ou Spanner, ou em fontes de terceiros, como AWS ou Azure. Google Cloud Essas conexões externas usam a API BigQuery Connection.
Siga estas etapas para criar sua conexão de recurso do Cloud.
Console
Acesse a página do BigQuery Studio.
No painel à esquerda, clique em
Explorer:Se o painel esquerdo não aparecer, clique em
Expandir painel esquerdo para abrir.No painel Explorer, clique em
Adicionar dados.A caixa de diálogo Adicionar dados é aberta.
No painel Filtrar por, na seção Tipo de fonte de dados, selecione Bancos de dados.
Como alternativa, no campo Pesquisar fontes de dados, insira
Vertex AI
.Na seção Fontes de dados em destaque, clique em Vertex AI.
Clique no card da solução Modelos da Vertex AI: federação do BigQuery.
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 Multirregião — EUA está selecionada.
Clique em Criar conexão.
Na parte de baixo da janela, clique em Acessar conexão. Como alternativa, no painel Explorer, clique em Conexões e em
us.bqml_tutorial
.No painel Informações da conexão, copie o ID da conta de serviço. Você precisa desse ID ao configurar as permissões da 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 Google Cloud ID do projeto. 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 recursos do Cloud. Conceda essa função no mesmo projeto em que você fez upload dos arquivos de imagem.
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 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 ao 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, você vai receber uma mensagem como
This statement created a new table named goldfish_image_table
.
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 em 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 base nos dados de imagem, faça o seguinte:
Console
Acesse a página do BigQuery Studio.
No editor de consultas, insira a seguinte consulta
ML.PREDICT
.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))'