Faça previsões com modelos PyTorch no formato ONNX


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

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.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

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

  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.

    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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  4. Verify that billing is enabled for your Google Cloud project.

  5. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  6. Certifique-se de que tem as autorizações necessárias para realizar as tarefas descritas neste documento.
  7. 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

    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.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.
    8. 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

      1. Na Google Cloud consola, aceda à página BigQuery.

        Aceda à página do BigQuery

      2. No painel Explorador, clique no nome do projeto.

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

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

      1. Crie um conjunto de dados com o nome bqml_tutorial com a localização dos dados definida 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 omitir -d e --dataset, o comando cria um conjunto de dados por predefinição.

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

      import google.cloud.bigquery
      
      bqclient = google.cloud.bigquery.Client()
      bqclient.create_dataset("bqml_tutorial", exists_ok=True)

      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

      1. Na Google Cloud consola, aceda à página BigQuery Studio.

        Aceda ao BigQuery Studio

      2. 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, substitua BUCKET_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: O ícone do modelo no painel Recursos. Se selecionar o novo modelo no painel Recursos, as informações sobre o modelo aparecem junto ao editor de consultas.

        O painel de informações para `imported_onnx_model`.

      bq

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

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

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

      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

      1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

        Aceda a Recipientes

      2. Clique em Criar.

      3. Na página Criar um depósito, introduza as informações do depósito.

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

          1. Na caixa, introduza bqml_images.

          2. Clique em Continuar.

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

          1. Para Tipo de localização, selecione Várias regiões.

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

          3. Clique em Continuar.

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

          1. Selecione Definir uma classe predefinida.

          2. Selecione Padrão.

          3. Clique em Continuar.

        4. Nas restantes secções, mantenha os valores predefinidos.

      4. Clique em Criar.

      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

      1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

        Aceda a Recipientes

      2. Na lista de contentores, clique em bqml_images.

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

      Linha de comandos

      Introduza o seguinte comando gcloud storage cp:

      gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME

      Substitua o seguinte:

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

      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

      1. Aceda à página do BigQuery Studio.

        Aceda ao BigQuery Studio

      2. No painel Explorador, clique em Adicionar dados.

        É apresentada a caixa de diálogo Adicionar dados.

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

      4. Na secção Origens de dados em destaque, clique em Vertex AI.

      5. Clique no cartão da solução Modelos da Vertex AI: federação do BigQuery.

      6. Na lista Tipo de ligação, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (recurso da nuvem).

      7. No campo ID da associação, introduza bqml_tutorial.

      8. Verifique se a opção Várias regiões: EUA está selecionada.

      9. Clique em Criar associação.

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

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

      bq

      1. 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...
        
      2. 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"}
        

      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:

      1. Aceda à página IAM e administrador.

        Aceda a IAM e administração

      2. Clique em Conceder acesso.

      3. No campo Novos membros, introduza o ID da conta de serviço da associação de recursos do Google Cloud que copiou anteriormente.

      4. No campo Selecionar uma função, escolha Cloud Storage e, de seguida, selecione Administrador de objetos de armazenamento.

      5. Clique em Guardar.

      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

      1. Aceda à página do BigQuery Studio.

        Aceda ao BigQuery Studio

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

      bq

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

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

      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

      1. Aceda à página do BigQuery Studio.

        Aceda ao BigQuery Studio

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

        Os resultados da consulta ML.PREDICT

      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

      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

      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.

      Elimine recursos individuais

      Em alternativa, para remover os recursos individuais usados neste tutorial, faça o seguinte:

      1. Elimine o modelo importado.

      2. (Opcional) Elimine o conjunto de dados.

      3. Elimine a associação de recursos do Google Cloud.

      4. Elimine o contentor do Cloud Storage.

      O que se segue?