Fazer previsões com modelos do scikit-learn no formato ONNX

Neste tutorial, mostramos como importar um modelo Open Neural Network Exchange (ONNX) treinado com scikit-learn. Você importa o modelo para um conjunto de dados do BigQuery e o usa para fazer previsões com uma consulta SQL.

O ONNX fornece um formato uniforme projetado para representar qualquer framework de machine learning (ML). Com o suporte do BigQuery ML para ONNX, é possível fazer o seguinte:

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

Objetivos

Custos

Neste documento, você vai 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 um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  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 role (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 role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  4. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  5. Ative as APIs BigQuery e Cloud Storage.

    Funções necessárias para ativar APIs

    Para ativar APIs, você precisa da permissão serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.

    Ativar as 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 terá todas as permissões necessárias do Identity and Access Management (IAM) para concluir este tutorial.

Se você estiver usando um projeto atual, faça o seguinte:

Verifique se você tem os seguintes papéis no projeto:

Verificar os papéis

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

    Acessar IAM
  2. Selecione o projeto.
  3. Na coluna Principal, encontre todas as linhas que identificam você ou um grupo no qual você está incluído. Para saber em quais grupos você está incluído, entre em contato com o administrador.

  4. Em todas as linhas que especificam ou incluem você, verifique a coluna Papel para ver se a lista de papéis inclui os papéis necessários.

Conceder os papéis

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

    Acessar IAM
  2. Selecione o projeto.
  3. Clique em Conceder acesso.
  4. No campo Novos principais, digite seu identificador de usuário. Normalmente, é o endereço de e-mail de uma Conta do Google.

  5. Clique em Selecionar um papel e pesquise o papel.
  6. Para conceder outros papéis, adicione-os clicando em Adicionar outro papel.
  7. Clique em Salvar.

Para mais informações sobre as permissões do IAM no BigQuery, consulte Permissões do IAM.

Opcional: treinar um modelo e convertê-lo para o formato ONNX

Os exemplos de código a seguir mostram como treinar um modelo de classificação com scikit-learn e como converter o pipeline resultante para o formato ONNX. Este tutorial usa um modelo de exemplo pré-criado armazenado em gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx. Não é necessário concluir essas etapas se você estiver usando o modelo de amostra.

Treinar um modelo de classificação com o scikit-learn

Use o exemplo de código a seguir para criar e treinar um pipeline do scikit-learn no conjunto de dados Iris. Para instruções sobre como instalar e usar o scikit-learn, consulte o guia de instalação do scikit-learn.

import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

data = load_iris()
X = data.data[:, :4]
y = data.target

ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()

pipe = Pipeline([('scaler', StandardScaler()),
                ('clr', RandomForestClassifier())])
pipe.fit(X, y)

Converter o pipeline em um modelo ONNX

Use o exemplo de código a seguir em sklearn-onnx para converter o pipeline do scikit-learn em um modelo ONNX chamado pipeline_rf.onnx.

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}

# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
   ('sepal_length', FloatTensorType([None, 1])),
   ('sepal_width', FloatTensorType([None, 1])),
   ('petal_length', FloatTensorType([None, 1])),
   ('petal_width', FloatTensorType([None, 1])),
]

# Convert the model.
model_onnx = convert_sklearn(
   pipe, 'pipeline_rf', initial_types=initial_types, options=options
)

# And save.
with open('pipeline_rf.onnx', 'wb') as f:
 f.write(model_onnx.SerializeToString())

Faça o upload do modelo ONNX para o Cloud Storage.

Depois de salvar o modelo, faça o seguinte:

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

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

  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.

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

bq

Para criar um conjunto de dados, use o comando bq mk --dataset.

  1. Crie um conjunto de dados chamado bqml_tutorial com o local dos dados definido como US.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  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"
  }
}

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.

import google.cloud.bigquery

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

Importar o modelo ONNX para o BigQuery

As etapas a seguir mostram como importar o modelo ONNX de exemplo do Cloud Storage usando uma instrução CREATE MODEL.

Para importar o modelo do ONNX para seu conjunto de dados, selecione uma das seguintes opções:

Console

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

    Acessar o BigQuery Studio

  2. 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, substitua BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.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: O í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 para "imported_onnx_model"

bq

  1. 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, substitua BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Quando a operação for concluída, uma mensagem semelhante a esta será exibida: Successfully created model named imported_onnx_model.

  2. Depois de importar o modelo, verifique se ele aparece no conjunto de dados.

    bq ls -m bqml_tutorial

    O resultado será o seguinte:

    tableId               Type
    --------------------- -------
    imported_onnx_model  MODEL

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.

Importe o modelo usando o objeto ONNXModel.

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID
# You can change the location to one of the valid locations: https://cloud.google.com/bigquery/docs/locations#supported_locations
bigframes.options.bigquery.location = "US"

imported_onnx_model = ONNXModel(
    model_path="gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx"
)

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.

Fazer previsões com o modelo ONNX importado

Depois de importar o modelo ONNX, use a função ML.PREDICT para fazer previsões com ele.

A consulta nas etapas a seguir usa imported_onnx_model para fazer previsões com base nos dados de entrada da tabela iris no conjunto de dados público ml_datasets. O modelo ONNX espera quatro valores FLOAT como entrada:

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

Essas entradas correspondem às initial_types definidas quando você converteu o modelo para o formato ONNX.

As saídas incluem as colunas label e probabilities, além das colunas da tabela de entrada. label representa o rótulo de classe previsto. probabilities é uma matriz de probabilidades que representa probabilidades para cada classe.

Para fazer previsões com o modelo ONNX importado, escolha uma das seguintes opções:

Console

  1. Acesse a página do BigQuery Studio.

    Acessar o BigQuery Studio

  2. No editor de consultas, insira esta consulta que usa a função ML.PREDICT.

    SELECT *
      FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
        (
        SELECT * FROM `bigquery-public-data.ml_datasets.iris`
        )
    )

    Os resultados da consulta são semelhantes a estes:

    A saída da consulta ML.PREDICT

bq

Execute a consulta que usa ML.PREDICT.

bq query --use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'

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.

Use a função predict para executar o modelo ONNX.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.ml_datasets.iris")
predictions = imported_onnx_model.predict(df)
predictions.peek(5)

O resultado será semelhante ao seguinte:

A saída da função de previsão

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. No console Google Cloud , acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

gcloud

    Excluir um projeto do Google Cloud :

    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.

A seguir