O Open Neural Network Exchange (ONNX) oferece um formato uniforme concebido para representar qualquer framework de aprendizagem automática. O suporte do BigQuery ML para ONNX permite-lhe:
- Prepare um modelo com a sua framework favorita.
- Converta o modelo no formato de modelo ONNX.
- Importe o modelo ONNX para o BigQuery e faça previsões com o BigQuery ML.
Este tutorial mostra como importar modelos ONNX preparados com o PyTorch para um conjunto de dados do BigQuery e usá-los para fazer previsões a partir de uma consulta SQL.
Objetivos
- Importe um modelo pré-preparado com o PyTorch.
- Converta o modelo para o formato ONNX com torch.onnx.
- Use a declaraçã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, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
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.
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.
-
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Cloud Storage 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. - Certifique-se de que tem as autorizações necessárias para realizar as tarefas descritas neste documento.
- BigQuery Studio Admin (
roles/bigquery.studioAdmin
) - BigQuery Connection Admin (
roles/bigquery.connectionAdmin
) - Storage Admin
(roles/storage.admin)
-
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.
-
In the Google Cloud console, go to the IAM page.
Aceder ao IAM - Selecione o projeto.
- Clique em Conceder acesso.
-
No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.
- Na lista Selecionar uma função, selecione uma função.
- Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
- Clique em Guardar.
- Crie um contentor do Cloud Storage para armazenar o modelo.
- Carregue o modelo ONNX para o seu contentor do Cloud Storage.
Na Google 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.
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
Na Google Cloud consola, aceda à página BigQuery Studio.
No editor de consultas, introduza a seguinte declaraçã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 carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substituaBUCKET_PATH
pelo seguinte valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Quando a operação estiver concluída, é apresentada uma mensagem semelhante à seguinte:
Successfully created model named imported_onnx_model
.O novo modelo é apresentado no painel Recursos. Os modelos são indicados pelo ícone de modelo:
Se selecionar o novo modelo no painel Recursos, as informações sobre o modelo aparecem junto ao editor de consultas.
Importe o modelo ONNX do Cloud Storage introduzindo a seguinte declaraçã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 carregou para o Cloud Storage. Se estiver a usar 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 este é apresentado no conjunto de dados.
bq ls bqml_tutorial
O resultado é semelhante ao seguinte:
tableId Type --------------------- ------- imported_onnx_model MODEL
- Crie um contentor do Cloud Storage e carregue uma imagem de um peixe dourado.
- Crie uma associação de recursos da nuvem que seja usada para aceder à tabela de objetos.
- Conceda acesso à conta de serviço da associação de recursos.
- Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.
Clique em
Criar.Na página Criar um depósito, introduza as informações do depósito.
Na secção Começar, faça o seguinte:
Na caixa, introduza
bqml_images
.Clique em Continuar.
Na secção Escolha onde quer armazenar os seus dados, faça o seguinte:
Para Tipo de localização, selecione Várias regiões.
No menu do tipo de localização, selecione EUA (várias regiões nos Estados Unidos).
Clique em Continuar.
Na secção Escolha uma classe de armazenamento para os seus dados:
Selecione Definir uma classe predefinida.
Selecione Padrão.
Clique em Continuar.
Nas restantes secções, mantenha os valores predefinidos.
Clique em Criar.
- Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.
Na lista de contentores, clique em
bqml_images
.No separador Objetos do contentor, execute uma das seguintes ações:
Arraste o ficheiro do ambiente de trabalho ou do gestor de ficheiros para o painel principal na consola Google Cloud .
Clique em Carregar > Carregar ficheiros, selecione o ficheiro de imagem que quer carregar na caixa de diálogo apresentada e, de seguida, clique em Abrir.
OBJECT_LOCATION
: o caminho local para o ficheiro de imagem. Por exemplo,Desktop/goldfish.jpg
.IMAGE_NAME
: o nome da imagem. Por exemplo,goldfish.jpg
.Aceda à página do BigQuery Studio.
No painel Explorador, clique em
Adicionar dados.É apresentada a caixa de diálogo Adicionar dados.
No painel Filtrar por, na secção Tipo de origem de dados, selecione Bases de dados.
Em alternativa, no campo Pesquisar origens de dados, pode introduzir
Vertex AI
.Na secção Origens de dados em destaque, clique em Vertex AI.
Clique no cartão da solução Modelos da Vertex AI: federação do BigQuery.
Na lista Tipo de ligação, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (recurso da nuvem).
No campo ID da associação, introduza
bqml_tutorial
.Verifique se a opção Várias regiões: EUA está selecionada.
Clique em Criar associação.
Na parte inferior da janela, clique em Aceder à associação. Em alternativa, no painel Explorador, expanda Ligações externas e, de seguida, clique em
us.bqml_tutorial
.No painel Informações de associação, copie o ID da conta de serviço. Precisa deste ID quando configurar as autorizações para a associação. Quando cria um recurso de ligação, o BigQuery cria uma conta de serviço do sistema exclusiva e associa-a à ligação.
Crie uma associação:
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Substitua
PROJECT_ID
pelo ID do seu projeto.Google Cloud O parâmetro--project_id
substitui o projeto predefinido.Quando cria um recurso de ligação, o BigQuery cria uma conta de serviço do sistema única e associa-a à ligação.
Resolução de problemas: se receber o seguinte erro de ligação, atualize o SDK do Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Obtenha e copie o ID da conta de serviço para utilização num passo posterior:
bq show --connection PROJECT_ID.us.bqml_tutorial
O resultado é semelhante ao seguinte:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Aceda à página IAM e administrador.
Clique em
Conceder acesso.No campo Novos membros, introduza o ID da conta de serviço da associação de recursos do Google Cloud que copiou anteriormente.
No campo Selecionar uma função, escolha Cloud Storage e, de seguida, selecione Administrador de objetos de armazenamento.
Clique em Guardar.
Aceda à página do BigQuery Studio.
No editor de consultas, introduza 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 ficheiro de imagem, por exemplo,goldfish.jpg
.Quando a operação estiver concluída, é apresentada uma mensagem como
This statement created a new table named goldfish_image_table
.Crie a tabela de objetos introduzindo a seguinte declaraçã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 ficheiro de imagem, por exemplo,goldfish.jpg
.Depois de criar a tabela de objetos, verifique se esta aparece no conjunto de dados.
bq ls bqml_tutorial
O resultado é semelhante ao seguinte:
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Aceda à página do BigQuery Studio.
No editor de consultas, introduza 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 aos seguintes:
- 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.
- 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.
- Para mais informações sobre a importação de modelos ONNX, consulte
A declaração
CREATE MODEL
para modelos ONNX. - Para mais informações sobre os conversores ONNX disponíveis e tutoriais, consulte o artigo Converter para o formato ONNX.
- Para uma vista geral do BigQuery ML, consulte o artigo Introdução ao BigQuery ML.
- Para começar a usar o BigQuery ML, consulte o artigo Crie modelos de aprendizagem automática no BigQuery ML.
Funções necessárias
Se criar um novo projeto, é o proprietário do projeto e são-lhe concedidas todas as autorizações de gestão de identidade e de acesso (IAM) necessárias para concluir este tutorial.
Se estiver a usar um projeto existente, faça o seguinte.
Make sure that you have the following role or roles on the project:
Check for the roles
Grant the roles
Para mais informações acerca das autorizações de IAM no BigQuery, consulte Autorizações de IAM.
Opcional: treine um modelo e converta-o para o formato ONNX
Os exemplos de código seguintes 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 tem de
concluir estes passos se estiver a usar o modelo de exemplo.
Crie um modelo de visão do PyTorch para classificação de imagens
Use o exemplo de código seguinte para importar um modelo resnet18 pré-treinado do PyTorch que aceita dados de imagens descodificados devolvidos pelas funções ML.DECODE_IMAGE
e ML.RESIZE_IMAGE
do BigQuery ML.
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()
)
Converta o modelo para o formato ONNX
Use o exemplo seguinte para exportar o modelo de visão do PyTorch com torch.onnx. O nome do ficheiro ONNX exportado é 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
Carregue o modelo ONNX para o Cloud Storage
Depois de guardar o modelo, faça o seguinte:
Crie um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o seu modelo de ML.
Consola
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
.
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.
Importe o modelo ONNX para o BigQuery
Os passos seguintes mostram como importar o modelo ONNX de exemplo do
Cloud Storage para o seu conjunto de dados através de uma declaração CREATE MODEL
.
Consola
bq
Para mais informações sobre a importação de modelos ONNX para o BigQuery, incluindo os requisitos de formato e armazenamento, consulte a declaração CREATE MODEL
para importar modelos ONNX.
Crie uma tabela de objetos no BigQuery para analisar dados de imagens
Uma tabela de objetos é uma tabela só de leitura sobre objetos de dados não estruturados que residem no Cloud Storage. As tabelas de objetos permitem-lhe analisar dados não estruturados do BigQuery.
Neste tutorial, vai usar a função ML.PREDICT
para gerar a etiqueta de classe prevista de uma imagem de entrada armazenada num contentor do Cloud Storage.
Para criar a tabela de objetos, tem de fazer o seguinte:
Crie um contentor e carregue uma imagem
Siga estes passos para criar um contentor do Cloud Storage e carregar uma imagem de um peixe dourado.
Consola
Linha de comandos
Introduza o seguinte comando gcloud storage buckets create
:
gcloud storage buckets create gs://bqml_images --location=us
Se o pedido for bem-sucedido, o comando devolve a seguinte mensagem:
Creating gs://bqml_images/...
Carregue uma imagem para o seu contentor do Cloud Storage
Depois de criar o contentor, transfira uma imagem de um peixe dourado e carregue-a para o seu contentor do Cloud Storage.
Conclua os seguintes passos para carregar a imagem:
Consola
Linha de comandos
Introduza o seguinte comando gcloud storage cp
:
gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Substitua o seguinte:
Se for bem-sucedido, a resposta é semelhante à seguinte:
Completed files 1/1 | 164.3kiB/164.3kiB
Crie uma ligação de recursos do Google Cloud ao BigQuery
Tem de ter uma ligação de recursos da nuvem para estabelecer ligação à tabela de objetos que vai criar mais tarde neste tutorial.
As associações de recursos da nuvem permitem-lhe consultar dados armazenados fora do BigQuery em Google Cloud serviços como o Cloud Storage ou o Spanner, ou em origens de terceiros, como a AWS ou o Azure. Estas ligações externas usam a API BigQuery Connection.
Siga estes passos para criar a associação de recursos da nuvem.
Consola
bq
Configure o acesso à ligação
Conceda a função de administrador de objetos de armazenamento à conta de serviço da ligação de recursos do Cloud. Tem de conceder esta função no mesmo projeto onde criou o ponto final do modelo remoto.
Para conceder a função, siga estes passos:
Crie a tabela de objetos
Siga estes passos para criar uma tabela de objetos denominada goldfish_image_table
com a imagem do peixe dourado que carregou para o Cloud Storage.
Consola
bq
Para mais informações, consulte o artigo Crie tabelas de objetos.
Faça previsões com o modelo ONNX importado
Usa a seguinte consulta que contém a função ML.PREDICT
para fazer previsões a partir de dados de imagens na tabela de objetos de entrada goldfish_image_table
. Esta consulta produz a etiqueta de classe prevista da imagem de entrada com base no dicionário de etiquetas do ImageNet.
Na consulta, a função ML.DECODE_IMAGE
é necessária para descodificar os dados de imagem de modo que possam ser interpretados por ML.PREDICT
. A função ML.RESIZE_IMAGE
é chamada para redimensionar a imagem de forma a ajustar-se ao tamanho da entrada do modelo (224*224).
Para mais informações sobre a execução da inferência em tabelas de objetos de imagens, consulte o artigo Executar inferência em tabelas de objetos de imagens.
Para fazer previsões a partir dos dados de imagens, faça o seguinte.
Consola
bq
Introduza o seguinte 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 incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Elimine o projeto
Consola
gcloud
Elimine recursos individuais
Em alternativa, para remover os recursos individuais usados neste tutorial, faça o seguinte: