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, você pode fazer o seguinte:

  • Treine um modelo usando seu framework favorito.
  • Converta o modelo no formato ONNX.
  • Importe o modelo ONNX para o BigQuery e faça previsões usando o BigQuery ML.

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

  1. Crie um conjunto de dados chamado bqml_tutorial com o local dos 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"
  }
}

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á assim:

    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 aos initial_types definidos 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