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

Informações gerais

O Open Neural Network Exchange (ONNX) fornece um formato uniforme projetado para representar qualquer framework de machine learning. 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. Para mais informações, consulte Como converter para o formato 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 scikit-learn para um conjunto de dados do BigQuery e usá-los para fazer predições com base em uma consulta SQL. Importe modelos do ONNX usando estas interfaces:

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.

Objetivos

Com este tutorial, você vai:

  • Crie e treine modelos com o scikit-learn.
  • Converta os modelos para o formato ONNX usando sklearn-onnx.
  • Importe os modelos ONNX para o BigQuery e faça previsões.

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

Crie e treine um pipeline do scikit-learn no conjunto de dados Iris:

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 modelo no formato ONNX e salvar

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

Crie um bucket do Cloud Storage para armazenar o arquivo de modelo ONNX e, em seguida, faça upload do arquivo de modelo ONNX salvo no bucket do Cloud Storage. Para mais informações, consulte Fazer upload de objetos de um sistema de arquivos.

Importar o modelo ONNX para o BigQuery

Esta etapa pressupõe que você fez upload do modelo ONNX para o bucket do Cloud Storage. Um modelo de exemplo é armazenado em gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

Console

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

    Acesse a página do BigQuery

  2. No editor de consultas, insira uma instrução CREATE MODEL como a seguinte.

     CREATE OR REPLACE MODEL `mydataset.mymodel`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://bucket/path/to/onnx_model/*')
    

    Exemplo:

     CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')
    

    A consulta anterior importa o modelo ONNX localizado em gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx como um modelo do BigQuery chamado imported_onnx_model.

  3. Agora, seu novo modelo aparecerá no painel Recursos. À medida que você expande cada um dos conjuntos de dados em um projeto, os modelos são listados junto a outros recursos do BigQuery nos conjuntos de dados. Os modelos são indicados pelo ícone do modelo: ícone do modelo.

  4. Se você selecionar o novo modelo no painel Recursos, as informações sobre o modelo serão exibidas abaixo do Editor de consultas.

    informações do modelo onnx

bq

Para importar um modelo ONNX do Cloud Storage, execute uma consulta em lote inserindo um comando como este:

bq query \
--use_legacy_sql=false \
"CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://bucket/path/to/onnx_model/*')"

Exemplo:

bq query --use_legacy_sql=false \
"CREATE OR REPLACE MODEL
  `example_dataset.imported_onnx_model`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')"

Depois de importar o modelo, ele deve aparecer na saída de bq ls [dataset_name]:

$ bq ls example_dataset

       tableId          Type    Labels   Time Partitioning
 --------------------- ------- -------- -------------------
  imported_onnx_model   MODEL

API

Insira um novo job e preencha a propriedade jobs#configuration.query como no corpo da solicitação a seguir:

{
  "query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
}

Fazer previsões com o modelo ONNX importado

Console

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

    Acesse a página do BigQuery

  2. No Editor de consultas, insira uma consulta usando ML.PREDICT (em inglês) da seguinte maneira.

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

    A consulta anterior usa o modelo chamado imported_onnx_model no conjunto de dados example_dataset no projeto atual para fazer predições de dados de entrada na tabela pública iris do conjunto de dados ml_datasets no projeto bigquery-public-data. . Nesse caso, o modelo ONNX espera quatro entradas flutuantes: sepal_length, sepal_width, petal_length, petal_width, que correspondem ao initial_types definido na etapa. 2, portanto, a subconsulta SELECT de toda a tabela bigquery-public-data, que contém essas quatro colunas de entrada.

    O modelo gera as colunas label e probabilities, bem como as colunas da tabela de entrada.

    • label representa o rótulo de classe previsto.
    • probabilities é uma matriz de probabilidades que representa probabilidades para cada classe.

    O resultado é semelhante a este:

    Resultados da consulta

bq

Para fazer previsões a partir de dados de entrada na tabela input_data, insira um comando como este a seguir, usando o modelo importado my_model do ONNX:

bq query \
--use_legacy_sql=false \
'SELECT *
 FROM ML.PREDICT(
   MODEL `my_project.my_dataset.my_model`,
   (SELECT * FROM input_data))'

Exemplo:

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

API

Insira um novo job e preencha a propriedade jobs#configuration.query como no corpo da solicitação a seguir:

{
  "query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}

A seguir