Fazer previsões com modelos PyTorch no formato ONNX


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

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. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

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

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Make sure that billing is enabled for your Google Cloud project.

  5. Enable the BigQuery, BigQuery Connection, and Cloud Storage APIs.

    Enable the APIs

  6. 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:

Check for the roles

  1. In the Google Cloud console, go to the IAM page.

    Go to IAM
  2. Select the project.
  3. 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.

  4. 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

  1. In the Google Cloud console, go to the IAM page.

    Acessar o IAM
  2. Selecionar um projeto.
  3. Clique em CONCEDER ACESSO.
  4. No campo Novos principais, insira seu identificador de usuário. Normalmente, é o endereço de e-mail de uma Conta do Google.

  5. Na lista Selecionar um papel, escolha um.
  6. Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.
  7. Clique em Salvar.
  8. 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:

Criar um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar seu modelo de ML.

Console

  1. No Console do Google Cloud, acesse a página BigQuery.

    Acesse a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

  3. Clique em Conferir ações > Criar conjunto de dados.

    Opção do menu "Criar conjunto de dados".

  4. 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.

    Página "Criar conjunto de dados" com os valores preenchidos.

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.

  1. Crie um conjunto de dados chamado bqml_tutorial com o local de dados definido como US e uma descrição de BigQuery 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.

  2. 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

  1. No console do Google Cloud, acesse a página BigQuery Studio.

    Acessar o BigQuery Studio

  2. 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, substitua BUCKET_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: Ícone do modelo no painel "Recursos". Se você selecionar o novo modelo no painel Recursos, as informações sobre o modelo vão aparecer ao lado do Editor de consultas.

    O painel de informações de "imported_onnx_model".

bq

  1. 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, substitua BUCKET_PATH por este valor: gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.

  2. 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

  1. No Console do Google Cloud, acesse a página Buckets do Cloud Storage.

    Acessar buckets

  2. Clique em Criar.

  3. Na página Criar um bucket, insira as informações do seu bucket.

    1. Na seção Começar, faça o seguinte:

      1. Na caixa, digite bqml_images.

      2. Clique em Continuar.

    2. Na seção Escolha onde armazenar seus dados, faça o seguinte:

      1. Em Tipo de local, selecione Multirregional.

      2. No menu do tipo de local, selecione EUA (várias regiões nos Estados Unidos).

      3. Clique em Continuar.

    3. Na seção Escolha uma classe de armazenamento para seus dados:

      1. Selecione Definir uma classe padrão.

      2. Selecione Padrão.

      3. Clique em Continuar.

    4. Nas outras seções, deixe os valores padrão.

  4. 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

  1. No Console do Google Cloud, acesse a página Buckets do Cloud Storage.

    Acessar buckets

  2. Na lista de buckets, clique em bqml_images.

  3. 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

  1. Acesse a página do BigQuery Studio.

    Acessar o BigQuery Studio

  2. Para criar uma conexão, clique em Adicionar e em Conexões com fontes de dados externas.

  3. Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (Cloud Resource).

  4. No campo ID da conexão, insira bqml_tutorial.

  5. Verifique se a opção Multirregional — EUA está selecionada.

  6. Clique em Criar conexão.

  7. 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.

  8. 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

  1. 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...
    
  2. 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:

  1. Acessar a página AM e administrador

    Acessar IAM e administrador

  2. Clique em Conceder acesso.

  3. No campo Novos principais, insira o ID da conta de serviço da conexão de recursos do Cloud que você copiou anteriormente.

  4. No campo Selecionar um papel, escolha Cloud Storage e, em seguida, selecione Administrador de objetos do Storage.

  5. 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

  1. Acesse a página do BigQuery Studio.

    Acessar o BigQuery Studio

  2. 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

  1. 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.

  2. 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

  1. Acesse a página do BigQuery Studio.

    Acessar o BigQuery Studio

  2. 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:

    Os resultados da consulta ML.PREDICT

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. 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:

  1. Exclua o modelo importado.

  2. (Opcional) Exclua o conjunto de dados.

  3. Exclua a conexão do recurso do Cloud.

  4. Exclua o bucket do Cloud Storage.

A seguir